注目の投稿

移転

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

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ラバーシールベアリング)
前輪がトゥルトゥルになった.
後輪はデフが入っていて手で回しても相変わらず重い感じであまり違いが分からなかった.

bcm2835-1.52

一発OK
最初からこれ使えばよかった。
gpioみたいにコマンドからは使えないけれどサンプルソースがあるので問題なし

SPIで使うピン番号はそれぞれヘッダでマクロ化されている。
ヘッダ見ると各RPiバージョンによってGPIOピンの割り付けが定義されている。
きっとRPiバージョンを読み取って自動割り付けしてくれているはずだと信じている。

SDOとSDIをショートさせるとSPI通信のセルフチェックができるという小技が自分の中で地味に革命的
公式リファレンスがソースから自動生成しているっぽくてかっこいい。

WiringPi

Mate 標準の2.32を使った
が、最新のkernelに対応してないのでapt-get upgradeには注意。自分は手遅れだったので、以前のカーネルにダウングレードした。
WiringPiをつかって端末からgpio -v xxxを実行するときのピン番号はRPiのピン番号と一致する。
WiringPiをCから叩くときに指定するピン番号とRPi上のピン番号は一致しない。
https://projects.drogon.net/raspberry-pi/wiringpi/pins/

ヘッダは wiringPi.hを基本に、SPIやPWMなど用途に応じて個別に存在する
コンパイルは -lwiringPi というオプションが最低限必要

SPI通信しようとしたらエラー発生
gpio load spi がunable to load modulesになる
raspi-configからspi enableにして、lsmod | grep spi で spi_bcm2835が出てくる。
が、WiringPi 2.32 のgpio.cを見ているとspi_bcm2708を探している。
→最新版の2.44を見ると2835の文字がちらほら見えるので最新版インストールすることにした

が、結局Lチカはできるもののgpio spi loadエラー回避できず。
諦めた。

Raspberry Piセットアップ

家に余っているのでRaspberry Pi2 Model B を使う。
Raspberry PiにROSを入れたい。
OSはRaspbian ではなくて、Ubuntu Mateを入れると、Ros Kineticが簡単に入る。

実際に入れてみた
・起動時エラー出る。systemctl status system-module-serviceで確認できる。とりあえず放置。
・RPi2にはデスクトップ描画がちょっと重いかもしれない。
・デスクトップ背景がかっこいい
・ネットの設定にGUIが使えてRaspbianよりも楽
・あとSD容量フルで使うためのひと手間とかもなくて楽。
・WringPiがデフォルトで入っている。 (追記:spidevが使えなかったから特に利点ではなかった)
・ROSも躓くことなく無事導入できた。

今度からROSとか関係なしにRPi使うときは Ubuntu Mateを使おうと思った。

RPi3とかRPi2 Model B+にはROSインストール済みのイメージファイルが公開されているのでもし新規で買うならどちらかにする。
Model B+用に公開されているイメージはModel B でも使えないのだろうか。試せば良かった。