注目の投稿

移転

移転しました(2020.03) →  https://akehi.github.io/ ---- ・GitHub Pages使ってみたかった ・HTMLファイルをそのまま公開できるのが手軽でいいなと思った ・・JupyterとかMarkdown+PlantUMLとかで書い...

ラベル GPSロボットカーコンテスト2017 の投稿を表示しています。 すべての投稿を表示
ラベル GPSロボットカーコンテスト2017 の投稿を表示しています。 すべての投稿を表示

2017/10/22

GPSロボットカーコンテスト2017まとめ

1.台風の接近により中止

技術交流会として,機体構成とその特徴についての発表会があった.
自分の発表資料は以下

https://docs.google.com/presentation/d/1oYFm3Nsqm9fn4pTbdHUADZbymoTgzz2OGPZY9DazVYQ/edit?usp=sharing

時間切れでブログの宣伝までたどり着かなかったのが悔やまれる.

2017/10/02

試走会まとめ

センターサークルでアピールする方法考えてなかった.
・やっべ

SSHログイン

自動ログイン + パスワード認証不要に設定
http://robonchu.hatenablog.com/entry/2017/04/02/121229

ログイン後しばらく放置しているとpingすら通らなくなる.
wifiドングルがスリープだか省電力だかに入るという話をどこかで聞いた気がするのでその内対処する

暫定は以下の方法で対処
・起動後すぐにSSHでログイン
・PC側に向かってpingを投げさせる

Nios flashからのブート

以下のマニュアルがよくまとまっていて分かりやすい
https://www.altera.com/en_US/pdfs/literature/an/an730.pdf

がしかし,マニュアルのoption2を忠実になぞってもうまくいかない.
・実行後しばらくは正常動作するが,しばらくするとフリーズする
・PCからjtag経由でRAMにプログラムを書き込むと正常に動作する.

どうやら,printf()が入っているとフリーズするようだ.以下の状況も確認済み
・PCからjtag経由でRAMにプログラムを書き込み,jtag用ケーブルを抜くとフリーズする

flashからのブートもprintf()無しで動作するか確認予定.

タミヤESCをpwm制御


タミヤのESC周りの仕様がややこしいので整理.

2017/09/24

altera_spi_core と bcm2835

nios側でspiデータが来るのをポーリングで待つように処理したところ,RPi側からbcm2835_spi_transfern()でデータを送信したときにSPIcoreのROE (Receiver Overrun Error)が立ってしまう.ROEはniosでデータ読み出しする前に,次のspiデータを受信してしまうと発生する.

仕方なくbcm2835_spi_transfer()で1byteずつ送信し,byte間をbcm2835_delayMicroseconds()で埋めた.ある程度delayを増やすと上手く行く.しかし,安定して通信できるのがbcm2835_delayMicroseconds(2000)あたり.これより小さいとうまくいかない.この設定でスマホからRPi→FPGA→サーボを操作すると,体感0.1secくらいのもっさり感がある.


bcm2835 RPiライブラリ仕様

transfern()のbyte間が0.4us程度.かなり短い

短絡評価

C言語の論理演算子は無駄な式の評価をカットする仕様になっている.

ex) 以下を実行すると何も出力されない
false && printf(“aa”)
true  || printf(“aa”)
→第一項を評価した段階で式全体の論理が確定するから第二項は評価されない

ex) 以下を実行すると”aa”が出力される
false ||   printf(“aa”)
true  && printf(“aa”)
→第一項を評価した段階で式全体の論理が確定しないから第二項の評価に入る

詳細は以下に詳しい.
参考:
https://qiita.com/gyu-don/items/a0aed0f94b8b35c43290

参考ページにある以下の書き方は玄人っぽい.
a || doSomething()
でも残念ながら以下の書き方はできない.
a || return 0;
returnは関数でなく予約語だから.

2017/09/17

BlueTooth経由でRPiと通信4 (#includeの歴史)

ことの始まり:
demo_rx.c 内部で#include ”ros/ros.h”をするとコンパイルエラーが起きた.
(demo_rx.cを改造して,受信データをROSmsgs経由で他のノードに転送したかった)

エラー内容:
#include <string> がno such file
→拡張子なしファイルのincludeとは?

調査結果:
C++がCに対して後方互換性を保つための記述方法.
効果は,標準関数が全て名前空間 [std::] に属してしまうことで生じる不整合の解消.

以下のページが分かりやすい.知らなかった・・・
https://oshiete.goo.ne.jp/qa/6138437.html

対策:
demo_rx.cはC言語ファイルなのに,”ros/ros.h”の内部でC++の表現が含まれているのが問題.
→demo_rx.c の拡張子を.cppにすることで解決

BlueTooth経由でRPiと通信3 (ROSでRS232)

BlueToothのSPPで通信すると,RPi側からはただのシリアルポートに見える.
ROSの上で通信したいので,C/C++でRS232通信ができるライブラリを適当に引っ張ってくる.今回は以下を利用.
https://www.teuniz.net/RS-232/

ファイルセット内のrx232.cを見ると,cahr *comports[] という変数に/dev/tty**等のCOMポート名の一覧が定義されている.
ライブラリ使用時には*comports[]のインデックスを指定してポートオープンをする作りになっている.
リストには/dev/rfcomm0 が定義されていないので,先頭のポートを書き換えたら通信成功.
しかもdemo_rx.cがそのまま利用できた.
→ baud=9600,  data=8bit, parity=None,  Stop=1,  flow=None

2017/09/03

BlueTooth経由でRPiと通信2 (RPiとの接続)

BLTドングルはこのページと同じものを購入.


Ubuntu Mate にはbluetooth に必要なパッケージが完備されているようで,ソフトウェア導入は必要なかった.
ドングルを挿入すると,BLT設定GUIであるBluemanが自動で起動する.
しかし,GUI経由で接続すると無線オーディオやアクセスポイントとしてのプロファイルが適用されてしまい,Serial Port Profileでの接続ができなかった.


SPP接続するためにはrfcommを使用する必要があるようだ.以下のページをなぞればOK


最終的な接続の流れは以下
・(RPi) rfcomm listen
→(Android) BLT connect

→(RPi) COM Open



追記
端末を落とすと実行権限等色々リセットされる.
sudo chmod 777 /var/run/sdp
sudo sdptool add --channel=22 SP

このあたりは毎回端末起動時に実行するようにしないとBT接続できない.

BlueTooth経由でRPiと通信1 (スマホ側)

androidアプリに BlueTooth Serial Controllerというナイスなアプリを発見


画面にボタンが配置されていて,それぞれのボタンにBluetoothSPP経由で送信するデータを設定可能.
QZSSスクランブル用の機体もこれで手動操作できそう.


機体データフローとしては以下を目指す.
・スマホ側はBLT Serial Controllerで送信
・ros側でcomポート読み込み→ros内のmsgに乗せてSPI nodeに伝達
・FPGA側でSPI Slaveとして受信して各種アクチュエータを駆動

機体側ステータスをスマホ側に送信できればより良い.

ROSnodeのroot実行

rosrunコマンドはsudo rosrunができない.
bcm2835はroot権限が必要.
なので,実行ファイルのオーナー変更等の操作が必要
以下のHPに詳細あり.


以下の操作で,bcm2835を含むnodeを実行できた.
cd devel/lib/my_pkg     # cd to the directory with your node
sudo chown root:root my_node # change ownship to root
sudo chmod a+rx my_node      # set as executable by all
sudo chmod u+s my_node       # set the setuid bit

追記

catkin_makeする度に実行しなくてはいけないので自動実行する仕組みが必要あり

2017/08/29

SPI Slave

・mosiポートに到達した波形とrx レジスタの値が一致しない
・tx レジスタにセットした値がmisoポートから出力されない

同様の質問をフォーラムで発見
https://alteraforum.com/forum/showthread.php?t=42909
→Qsys optionの Insert_SynchronizerをEnableにしたら解決したらしい.
手元の実機でも同様の結果が得られた.

Depth=2とか3とかから察するにClock Domain CrossingのためにDFFを挿入するオプションではないかと予想.
MasterモードのときはNiosクロックを分周してSPIクロックを作っているようなので,タイミング的に上手く動作するようなHDLデザインになっているのだろう.逆に外部のクロックソース駆動のSlaveモードではSyncronizerが必須ということか.



追記
RTLViewerで見ると外部CLKソース入力の直後にD-FFが2つ挿入されていた.予想は当たっていたようだ.
D-FF2つをまとめたコンポーネントとしてaltera_std_synchonizerが提供されているっぽい.使い方は以下のフォーラム参照.今度使ってみよう.
https://alteraforum.com/forum/showthread.php?t=22230

機体に荷台作成

アクリルをカットして土台を作成.

透明を買ったと思ったら白を買っていた.ださい.


Nios マルチコアシステム

Qsys
・Nios設定にてreset vector (ブート位置)が被らないように手動で入力する.
参考文献(https://www.altima.jp/members/japanese/download/nios2_sw_sc2_v10.pdf)ではreset vector , expection vector 共に +0x60000している.これでプログラム(ソフトウェア・イメージ)を同じメモリに格納できる.
・通常reset vectorはon chip flash 等の不揮発領域を指定するが,flashの書き込み寿命が気になったり,気軽にデバッグしたい場合にはon chip memoryやsdram controllerなどでも良い.
・expection vectorはRAM領域推奨(な気がする)
・各CPUに対してJTAGモジュールが必要

Eclipce BSP
・CPUを複数含むsopcinfoファイルからCプロジェクトを生成すると,どのCPUに対するBSPかを選択できる.
・Linker ScriptタブのLinker Regionsにメモリの使用可能領域が表示されている.この領域をそれぞれのCPUのBSPと見比べて,Qsysで入力した通りになっているか裏付けができる.
・あとはLinkerSectionのMappingを上手いこと設定する.ここの設定はプログラム実行時にどこのメモリを使うか?(ソフトウェア実行領域)なので基本的にはsdram等の大容量なやつが指定されるはず

・賢いことに,複数のプロジェクトでソフトウェア実行領域が被らないようにしてくれるらしい.

・ここまでで各CPUから独立にLチカするくらいはできる.


--ここから未確認.要検証
・プロジェクト間でデータを共有したい場合には共有メモリを使う.共有メモリといってもQsysでon chip memoryを追加して,二つのCPUからMMslaveインターフェースに結線するだけ.

・Nios上でon chip memory のAPIを叩いて,指定アドレスへのデータ書き込みを行う.このアドレスに別のCPUから読み込みを行えばデータ共有が可能になる.

・が,排他制御は必要.ハードウェアMutexというシンプルな仕組み(IP)が有るようなのでQsysに追加.

I2C独立駆動

I2C通信がかなり遅い(100kHz) のでI2Cデバイスとのデータ通信もハードウェアにバックグラウンドでやらせて、Niosは値を必要なときに引っ張ってくるだけ、という設計にしたい(つまりメイン処理のCPUを介さずにI2Cコントロールをしたい)
→結局Niosを2つ積んでマルチコアシステムを採用した.

I2C独立システム化の潰えた計画達
1.altera_avalon_I2C_Master + DMAC
マニュアル上ではFIFO内蔵+Avalon_STインターフェース(DMAインターフェース)が提供されているようだ.これは熱い.

→そもそもalteraのI2CモジュールからI2C波形が出力できなかった.
TFR_CMDレジスタをIOWRで直接叩いても反応なし.
仕様理解不足か?

driverとして自動でリンクされるCソースは内部向け関数と外部向け関数が混在していてとても分かりにくくて苦行.
とりあえず i2c_open()みたいな関数に対して”/dev/i2c” (i2cはコアの名前.デフォではi2c_0になってるやつ)を渡せばBase Address等が格納された構造体が帰ってくる.構造体を適宜渡しながらライブラリを叩けば良さそう.が,やはりI2C波形は出なかった.

参考文献が少ない(というかほぼ無い)ので諦めた

2.  I2C_Master(opencore.org) + 自作のavalon_MMslave to avalon_MMmaster
opencoresのI2Cモジュールはかなりシンプルで分かりやすい.動作確認OK.
あとはメインCPUを介さずにI2C通信し続ける部分が必要.
avalon_MMインターフェースしか提供されていないので,このモジュールにavalon_MMmasterとしてコマンドを送り続けるモジュールが必要.
→そんな気力はない.

車体オドメータ取り付け

大会で使えるかわからないが,デバッグやモデリング等で非常に使い勝手が良いと思うのでオドメータを取り付けることにした.
せっかくなので両輪につけてみたい.

候補としては,
エンコーダ : 軸動力の伝達が大変.高分解能
フォトインタラプタ : 設置スペースが大きい.高分解能.
磁石 :分解能が低い.取り付け簡単

→取り付け難易度からホール素子を採用.
秋月のUS1881LUAを使用した.http://akizukidenshi.com/catalog/g/gI-05274/

内蔵のシュミットトリガにより,磁石を近づけた後に離してもスイッチは切り替わらない.切り替えるには逆の極を近づける必要がある.

早速グルーガンで100均のネオジム磁石をタイヤに8個,N/S極交互に貼り付けた.意外とタイヤが重くなった.


実測では最高速度にて121pulse/secを記録
(121pulse/8pole=15rps,タイヤ周長実測36cmより,540cm/sec= 5.4 m/s=19.4 km/h →だいたい感覚と一致する)

速度算出は,指定時間内のパルス数を出力することにした.
1パルスあたりの時間ではばらつきが出るため←すると直近の数パルスあたりの時間を取得する必要がある←直近の数パルス平均=移動平均のHDL実装が難しそう.
指定時間内のパルス数であれば,時間毎にパルス数のラッチとリセットを繰り返せば良いので楽.




Nios RPi通信構想

I2C通信がどうしてもボトルネック→遅い上に複数センサのシーケンシャル読み込みだから
検討するとマージン多めにとって1スキャンあたり1000bit必要= 100Hz程度の周期になる。
RPiからのアクセスなら十分だけど、他に何かしたいときに100Hz限界じゃ寂しい。
→I2Cデバイスとのデータ通信もハードウェアにバックグラウンドでやらせて、Niosは値を必要なときに引っ張ってくるだけ、という思想にする。これならavalon busのclk=50MHzでデータ取ってこられる。

→そうすると、SPIの監視→リクエストあったらデータ取得→転送の流れでも1スキャンを数10〜数百kHzくらいは取れるんじゃないかと思う。プログラムもシンプルになる。

車体選定

購入したのは以下
タミヤ セミアッセンブルシリーズ No.5 SA 電動RCカー完成シャーシセット (WR-02シャーシ プロポ付き) \1万6000@amazon
http://www.tamiya.com/japan/products/57985wr02set_fin/index.htm

選定理由
・amazonで売ってる
・ボディ要らないからその分安くしたかった←どうせセンサのせるために外すから
・でこぼこ芝生も走れそう
・WR-02シャーシは改造した実例がたくさんヒットする。あまり深入りするとお金が飛んでいくのでやらないけど。余力があれば以下の改造くらいはやっておこうかな。
・軸受けをボールベアリングにする
・ステア周りの剛性を高くする

追記
軸受けをボールベアリングにした.(タミヤ HOP-UP OPTIONS OP-8 1150ラバーシールベアリング)
前輪がトゥルトゥルになった.
後輪はデフが入っていて手で回しても相変わらず重い感じであまり違いが分からなかった.