2011/12/12(月)mbed向けにAD-128160-UARTのライブラリ作った
2011/12/12 18:14
このLCDの特徴としては
- 3.3V単電源で駆動できる
- 少ない信号線で制御できる(txとresetの二線のみ)
- 点、直線、四角形、円などの図形を高速に描画できる
- ASCIIフォントが組み込まれている。(設定を行うことで日本語も書き込めるみたいです)
- miniUSB端子が付いており、PCからもコマンドを送ることで制御できる
というようにスペック上は魅力あふるるLCDなのですが、発売後数ヶ月経ってもaitendoが碌にデータシートを公開していないため、これまでは真っ暗な液晶を眺めながら可能性を想像する程度の置物レベルの価値しかありませんでした。
現在はGingaXさんが使い方をまとめてくださって、基本的な使い方はわかるようになったので今回はmbed用にライブラリをつくってみたという次第です。
使ってみる
写真
回路図
プログラム
#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にもあっさり対応できてます。
画像も表示させてみる
どのくらいの発色なんかなーと16bit bitmapデータを作って表示させてみました。
まーまー綺麗に表示できますね。
こちらのプログラムも一応ここに置いておきます。
試すときの128x128の16bit bitmapは各自準備してください。。
2011/08/22(月)rosserial_arduinoをmbedへ移植
2011/08/23 02:40
そしてふらふら探してみるとRTnoのROS版みたいなものでrosserialというROSノード?があるんですね。
例によって反射的にmbedに移植してしまいましたので下に置いておきます。
まぁ自分以外にこれを求めている人がいるか甚だ疑問があるところですが……。
プログラム
rosserial_mbedrosserial_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
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に手を入れるしか….
2010/08/17(火)mbedでロータリーエンコーダを読んでみた
2010/08/18 05:53
このライブラリはロータリーエンコーダのパルス数を数えるためのものなようです。
ロータリーエンコーダは使う予定があるので、試しに使ってみました。
ロータリーエンコーダとは
ロータリーエンコーダとは回転量を測定するために使われるセンサです。安価で扱いが簡単なインクリメンタル式と高価なアブソリュート式の二種類があり、今回扱うものはインクリメンタル式の方です。*1インクリメンタル式のロータリーエンコーダは軸が一定量回転するごとに位相がずれたA相とB相のパルスを出力します。A相とB相は回転方向によって出力タイミングが逆の関係になるため、どちらの方向へどれだけ回っているのかということを計測することができるわけですね。
また、A相、B相の立ち上がり立下りから1周期分のパルス出力で4個の分解能を取ることができるため、エンコーダ分解能は出力パルスの4倍ということになります。
つまり、360度回転する間に24パルス出力するロータリーエンコーダであれば
360[deg] / (24[pulse]*4) = 3.75[deg]
の分解能があると計算できます。
QEIライブラリを使ってみる
QEIはQuadrature Encoder Interfaceの略でインクリメンタル式のロータリーエンコーダを読むためのライブラリです。今回はとりあえず手元にあった秋月で200円で売っているエンコーダの出力パルス数を計測し、キャラクタLCDに表示するものを作ってみました。
回路図
プログラム
QEI_test#include "QEI.h" #include "TextLCD.h" TextLCD lcd(p5, p6, p11, p12, p13, p14); // rs, e, d0-d3 Serial pc(USBTX, USBRX); #define ROTATE_PER_REVOLUTIONS 24 //Use X4 encoding. QEI wheel(p30, p29, NC, ROTATE_PER_REVOLUTIONS, QEI::X4_ENCODING); //Use X2 encoding by default. //QEI wheel (p30, p29, NC, 624); int main() { while(1){ wait(0.1); lcd.printf("Pulses: %07d\n", wheel.getPulses()); lcd.printf("Rotate: %04.3f\n", (double)wheel.getPulses()/(ROTATE_PER_REVOLUTIONS*4)); } }
それでは要点の説明です。
#define ROTATE_PER_REVOLUTIONS 24 //Use X4 encoding. QEI wheel(p30, p29, NC, ROTATE_PER_REVOLUTIONS, QEI::X4_ENCODING);QEIのインスタンスを生成しています。
第一、第二引数にA相のピン、B相のピンを設定します。
第三引数はオプションで回転数を数えるピンがあればそれを設定するようです。
第四引数はロータリーエンコーダが一回転あたり何パルス出力するかを設定しています。*2
第五引数はモードを設定しています。X4_ENCODINGモードであればロータリーエンコーダの分解能を完全に使って1パルス出力で4カウント増加します。X2_ENCODINGモードであれば、ロータリーエンコーダの分解能を半分にして1パルス出力で2カウント増加します。おそらくX2_ENCODINGモードにすると周波数が高い時に取りこぼしが少なくなると考えられるので、分解能があまり必要でなく精度が必要な場合はこちらを使うという風に使い分けるのだと思います。
lcd.printf("Pulses: %07d\n", wheel.getPulses()); lcd.printf("Rotate: %04.3f\n", (double)wheel.getPulses()/(ROTATE_PER_REVOLUTIONS*4));キャラクタLCDに出力しています。
1行目ではwheel.getPulses()メソッドによって初期状態から現在のどちら方向にどのくらい回ったかというのを取得しています。
2行目では軸が何回転したかというのを計算して表示しています。
終わりに
機械接点式のロータリーエンコーダであるため、チャタリングというノイズがのり速く回したりするとどんどん実際の回転数とズレが出てきてしまいますね。X2_ENCODINGモードだとちょっとましになるのかな…?準備が出来たら次はこのモータで計測を行ってみたいと思ってます。
参考
ロータリーエンコーダを使う2010/07/04(日)mbedでZY-FGD1442701V1を動かしてみた その2
2010/07/04 22:52
SDカードまたはmbedのフラッシュメモリから16bitビットマップ画像を読み取るということをしています。
16bitビットマップ画像(R5 G5 B5)はこちらを参考にGimp2を使って準備しました。
動かしてみたところ
色数が65536色だけあって、表示は思っていたよりもずっと綺麗です。
回路図
相変わらずカオスな回路図ですみません…。
SDカード、液晶共にVccはmbedのVoutと接続しています。
mbed内のフラッシュメモリを使う場合はSDカード部分は必要ありません。
プログラム
SDカードから読み込みをする場合ZY_FGD1442701V1_sample2
mbedのフラッシュメモリから読み込みをする場合
ZY_FGD1442701V1_sample2_local
今回のプログラムはここに置いておきます。
SDカードまたはmbedのフラッシュメモリ内に作成したビットマップ画像をsample.bmpという名前で置いておけば液晶に表示されるはずです。
処理について
単純に、ビットマップ画像を2ビットずつ読み込んで、液晶に2ビット送信して…という処理をしています。初期化はデモプログラムの時とほとんど同じですが、そのままだと画像が反転して表示されたので
WriteCOM(0x36);//MV,MX,MY,RGB WriteDAT(0xC8);の部分を
WriteCOM(0x36);//MV,MX,MY,RGB WriteDAT(0x88);とだけ変えました。
このへんの詳細はデータシートのP60あたりに載っています。
また、16bitビットマップの取り扱いについてはbeizのノート@ ウィキさんを参考にさせて頂きました。
参考というかそのまま(^^;