2011/07/29(金)RTnoをmbedに移植した
2011/07/29 22:20
RTnoはArduino上でRTコンポーネントを開発するためのライブラリです.
手軽なIOとしてRTコンポーネントを作ることができるのはとても良いのですが,如何せんArduinoだと気が利いた玩具くらいが限界だと感じるのでmbedに移植してみました.
移植とはいっても綺麗にクラス分けされていたので,作業としては通信周りとあとはちょこちょこくらいでさくっと終了です.
プログラム
元々のRTnoと同じくRTnoProxyを利用します.勘違いで古いバージョンを使ってただけでした(・ω<)-☆
雛形
RTno_Template雛形です.
これを色々と書き換えてRTコンポーネントにすることができるのです.
IO制御のサンプル
RTno_digitalInOutポート仕様
名称 | I/O | データタイプ | 意味 |
---|---|---|---|
led | IN | TimedLongSeq | mbed上のLED制御 |
in0 | OUT | TimedLongSeq | p5~p10のポート入力を知る |
out0 | OUT | TimedLongSeq | p15~p20のポート出力制御 |
使い方
大体想像通りの動きだと思うので,ここではledポートだけを使ってみます.rtm-naming-serviceとRT System Builderはあらかじめ起動しているものとします.
rtc.conf内を
corba.nameservers:localhost exec_cxt.periodic.rate:500.0 Test.RTnoProxy.config_file: RTnoProxy.conf logger.enable:NORTnoProxy.conf内を
conf.default.comport:\\\\.\\COM34 conf.default.baudrate:115200とします,COM番号など環境に依る部分は適宜書き換えてください.
そうしたら,RTnoProxyCompとDataPortTestCompを起動します.
RT System Builder上でRTnoProxyCompのledとDataPortTestCompのlongSeqOutを繋いで,どちらも状態をActiveにします.
次に画像のようにDataPortTestComp上で
L 4 1 0 1 0と入力すると
mbed上のLEDが光るという寸法です.
同じような感じでin0ポートでmbed上での入力が知れたり,out0ポートでmbed上のデジタル出力を制御できたりします.
モータ制御のサンプル
RTno_MotorControl今度はエンコーダ付きモータであるRDO-29B54AふたつをSabertooth2X25で制御してみたサンプルです.
ポート仕様
名称 | I/O | データタイプ | 意味 |
---|---|---|---|
encorder | OUT | TimedLongSeq | モータの現在のエンコーダ値を知る |
position | IN | TimedLongSeq | モータの入力値の位置まで動かす |
回路図
読みにくくてすいません.
sabertooth2x25のDIPスイッチは2,3,5番をONにした状態です.
使い方
rtm-naming-serviceとRT System Builderはあらかじめ起動しているものとします.rtc.conf内を
corba.nameservers:localhost exec_cxt.periodic.rate:500.0 Test.RTnoProxy.config_file: RTnoProxy.conf logger.enable:NORTnoProxy.conf内を
conf.default.comport:\\\\.\\COM34 conf.default.baudrate:115200とします,COM番号など環境に依る部分は適宜書き換えてください.
RTnoProxyCompとDataPortTestCompを起動します.
RT System Builder上でRTnoProxyCompのencoderとDataPortTestCompのlongSeqIn,RTnoProxyCompのpositionとDataPortTestCompのlongSeqOutを繋いで,どちらも状態をActiveにします.
次に画像のようにDataPortTestComp上で
L 2 1000 -2000と打ち込むとモータが動き出し,しばらくして目的の位置に達したら停止します.
DataPortTestComp上でvと打ち込むと現在のエンコーダ値を見ることができて,大体指定の位置に動いたんだなということがわかります.
どうでしょう.これくらいのことができれば結構本格的なRTコンポーネントを使った機器まで作れそうな気がしますよね.
既知の問題点
ポートは配列しか扱えない手元のJapaninoでオリジナルのRTnoを使用してもそうなので,RTnoの元々の仕様なのかも……?違うようです.もう一回確認してみます- 解決してアップーデートしました.(8/1)
シリアル通信をバッファリングしてないMODSERIALなどのバッファ付きの通信を使いたかったけど,うまいこと動かなかった.うーん.- 通信待ちでタイムアウトしない以外は問題なさそう…?
- Arduino側の仕様に併せているためTimedDouble型を内部でfloat型として扱っている.精度が半分になって勿体無いなぁ.
- RTnoProxyに手を入れるしか….