2011/12/12(月)mbed向けにAD-128160-UARTのライブラリ作った

2011/12/12 18:14 mbedimportnucho
aitendoには高速1.77インチ液晶モジュールというとても便利そうなLCDモジュールが売っています。

このLCDの特徴としては
  • 3.3V単電源で駆動できる
  • 少ない信号線で制御できる(txとresetの二線のみ)
  • 点、直線、四角形、円などの図形を高速に描画できる
  • ASCIIフォントが組み込まれている。(設定を行うことで日本語も書き込めるみたいです)
  • miniUSB端子が付いており、PCからもコマンドを送ることで制御できる
などなど嬉しいことずくめです。これは一家にひとつ常備しておかなくてはなりませんね。知りませんけど。

というようにスペック上は魅力あふるるLCDなのですが、発売後数ヶ月経ってもaitendoが碌にデータシートを公開していないため、これまでは真っ暗な液晶を眺めながら可能性を想像する程度の置物レベルの価値しかありませんでした。
現在はGingaXさんが使い方をまとめてくださって、基本的な使い方はわかるようになったので今回はmbed用にライブラリをつくってみたという次第です。

使ってみる

写真

RIMG0592_org

回路図

AD_128160_UART_circuit

プログラム

#include "mbed.h"
#include "AD128160.h"

AD128160 lcd(p9,p20);//tx reset

//2バイトRGBをつくるための関数
int rgb565(int r, int g,int b)
{
    int rgb;
    
    rgb = (r & 0xF8) << 8;        /* RRRRR----------- */
    rgb |= (g & 0xFC) << 3;       /* -----GGGGGG----- */
    rgb |= b >> 3;                /* -----------BBBBB */
    
    return rgb;
}

int main() {
    lcd.backgroudColor(rgb565(255,0,0));//文字の背景色を赤に設定
    lcd.locate(2,lcd.rows()/2);         //大体真ん中あたりに移動して
    lcd.printf("Hello World!\n");       //お馴染みの文を表示
    
    lcd.color(rgb565(0,255,0)); //図形の色を緑に設定
    lcd.box(12,76,116,100,0);   //塗りつぶしなしで矩形表示
    lcd.box(8,120,124,146,1);   //塗りつぶしありで矩形表示
    
    lcd.color(rgb565(255,0,0)); //図形の色を赤に設定
    lcd.circle(16,40,16,0);     //塗りつぶしなしで円表示
    lcd.circle(48,40,16,1);     //塗りつぶしありで円表示
    lcd.circle(80,40,16,1);     //塗りつぶしありで円表示
    lcd.circle(112,40,16,0);    //塗りつぶしなしで円表示
}
細かいライブラリの使い方なんかはクラスリファレンスを読んでください。
ライブラリをつくるときにStreamクラスを継承して_putc()メンバー関数をLCDにあわせて作成することでprintfにもあっさり対応できてます。

画像も表示させてみる

RIMG0595_org
どのくらいの発色なんかなーと16bit bitmapデータを作って表示させてみました。
まーまー綺麗に表示できますね。

こちらのプログラムも一応ここに置いておきます。
試すときの128x128の16bit bitmapは各自準備してください。。

2011/08/22(月)rosserial_arduinoをmbedへ移植

2011/08/23 02:40 ROSnucho
こないだまでちょっとRTMを触ってたんですが、世界的にはROSの方が流行ってそうということで浮気してます。ちなみに勉強する上でこちらが参考になりました。
そしてふらふら探してみるとRTnoのROS版みたいなものでrosserialというROSノード?があるんですね。

例によって反射的にmbedに移植してしまいましたので下に置いておきます。
まぁ自分以外にこれを求めている人がいるか甚だ疑問があるところですが……。

プログラム

rosserial_mbed
rosserial_arduinoに付いてきてたexamplesごと移植したコードです。まず試したいときはこちらをインポートしてください。
ただし全てのexampleが完全に動作かどうかはチェックできてないのでご注意を。。。
なお、初期状態ではHelloWorldのexampleが実行されるようになってます。

rosserial_mbed_lib
examplesだけ取り除いたものです。
ライブラリとして使いたいときはこちらをご利用ください。

使い方

基本的にはrosserial_arduinoのチュートリアルを参考にすればオッケーだと思います。
ここではとりあえず、一番基本的なところのHelloWorldの使い方だけ載っけておきます。

HelloWorld

コンソール上で
roscore
とroscoreを実行して
rosrun rosserial_python serial_node.py /dev/ttyACM0
とmbedの繋がっているポートを指定してserial_node.pyを実行します。
うまく繋がっていれば
rostopic echo chatter
とすると、mbedからstringのデータが送られてきます。

その他は本家のチュートリアルとソースを照らし合わせながらやってみてください。
これを利用して自作ロボットをROSの枠組みで動かすとか楽しそうですよね。

2011/07/29(金)RTnoをmbedに移植した

2011/07/29 22:20 RTMimportnucho
現在は作者さまの方でmbedに対応していらっしゃるので,そちらを使用した方が良いと思われます.

RTnoはArduino上でRTコンポーネントを開発するためのライブラリです.
手軽なIOとしてRTコンポーネントを作ることができるのはとても良いのですが,如何せんArduinoだと気が利いた玩具くらいが限界だと感じるのでmbedに移植してみました.

移植とはいっても綺麗にクラス分けされていたので,作業としては通信周りとあとはちょこちょこくらいでさくっと終了です.

プログラム

元々のRTnoと同じくRTnoProxyを利用します.
ただ私の場合はインストーラ形式で提供されているRTnoProxyが動かなかったので,ソースからコンパイルしたものを使用しました.
勘違いで古いバージョンを使ってただけでした(・ω<)-☆

雛形

RTno_Template
雛形です.
これを色々と書き換えてRTコンポーネントにすることができるのです.

IO制御のサンプル

RTno_digitalInOut
ポート仕様
名称I/Oデータタイプ意味
ledINTimedLongSeqmbed上のLED制御
in0OUTTimedLongSeqp5~p10のポート入力を知る
out0OUTTimedLongSeqp15~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:NO
RTnoProxy.conf内を
conf.default.comport:\\\\.\\COM34
conf.default.baudrate:115200
とします,COM番号など環境に依る部分は適宜書き換えてください.

そうしたら,RTnoProxyCompとDataPortTestCompを起動します.

digitalInOut1
RT System Builder上でRTnoProxyCompのledとDataPortTestCompのlongSeqOutを繋いで,どちらも状態をActiveにします.

digitalInOut2
次に画像のようにDataPortTestComp上で
L
4
1
0
1
0
と入力すると

IMG_20110729_204612
mbed上のLEDが光るという寸法です.
同じような感じでin0ポートでmbed上での入力が知れたり,out0ポートでmbed上のデジタル出力を制御できたりします.

モータ制御のサンプル

RTno_MotorControl
今度はエンコーダ付きモータであるRDO-29B54AふたつをSabertooth2X25で制御してみたサンプルです.
ポート仕様
名称I/Oデータタイプ意味
encorderOUTTimedLongSeqモータの現在のエンコーダ値を知る
positionINTimedLongSeqモータの入力値の位置まで動かす
回路図
RTno_MotorControl_schematic
読みにくくてすいません.
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:NO
RTnoProxy.conf内を
conf.default.comport:\\\\.\\COM34
conf.default.baudrate:115200
とします,COM番号など環境に依る部分は適宜書き換えてください.


RTnoProxyCompとDataPortTestCompを起動します.
MotorControl1
RT System Builder上でRTnoProxyCompのencoderとDataPortTestCompのlongSeqIn,RTnoProxyCompのpositionとDataPortTestCompのlongSeqOutを繋いで,どちらも状態をActiveにします.

MotorControl2
次に画像のようにDataPortTestComp上で
L
2
1000
-2000
と打ち込むとモータが動き出し,しばらくして目的の位置に達したら停止します.

MotorControl3
DataPortTestComp上でvと打ち込むと現在のエンコーダ値を見ることができて,大体指定の位置に動いたんだなということがわかります.
どうでしょう.これくらいのことができれば結構本格的なRTコンポーネントを使った機器まで作れそうな気がしますよね.

既知の問題点

  • ポートは配列しか扱えない
    • 手元のJapaninoでオリジナルのRTnoを使用してもそうなので,RTnoの元々の仕様なのかも……?違うようです.もう一回確認してみます
    • 解決してアップーデートしました.(8/1)
  • シリアル通信をバッファリングしてない
    • MODSERIALなどのバッファ付きの通信を使いたかったけど,うまいこと動かなかった.うーん.
    • 通信待ちでタイムアウトしない以外は問題なさそう…?
  • Arduino側の仕様に併せているためTimedDouble型を内部でfloat型として扱っている.精度が半分になって勿体無いなぁ.
    • RTnoProxyに手を入れるしか….