注目の投稿

移転

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

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する度に実行しなくてはいけないので自動実行する仕組みが必要あり