NXTインテリジェントブロックにキーボードをつなげたいと思っているのですが、手近な方法としてはオリジナルセンサとしてI2Cで通信することです。
そこで、I2C通信とはどんなものかについて、下調べしてみました。
「I2C」とはフィリップス社の決めた通信規格の一つです。Atmelではわざと名前を変えて「TWI」と呼んだりします。同期式なのに2本(GND入れたら3本ですが)だけの線で通信できる点、双方向に通信できる点、バス接続できる点などが特徴です。
NXTの純正パーツの中では「超音波センサ」だけがI2Cを採用しています。
以下が超音波センサから距離データを読み取るプログラムです。例によってNXCで作ってみました。
#include "NXCDefs.h"
#define IN_I2C IN_1
#define INCNT 1byte writebuf[] = {0x02, 0x42 };
byte readbuf[INCNT];task main()
{
int readcnt = INCNT;
SetSensorLowspeed (IN_I2C);
while (true)
{
I2CBytes(IN_I2C, writebuf, readcnt, readbuf);
ClearScreen();
NumOut(50,20,readbuf[0]);
Wait(500);
}
}
、、、距離を読むだけなのに長いプログラムになっています。内部で行っているはずの処理をわざわざユーザー側が行っているためです。
writebufに格納している値の1バイト目の0x02はSLAといって超音波センサの持っている固有のアドレスです。
2番目の0x42は距離データを取得するためのコマンドになっています。
本当は再接続のためにSLA+R(0x03)が必要なのですが、writebufに格納する必要はありません。おそらく「I2CBytes」関数が勝手に送っているようです。
これらのコマンドについては、レゴ社のサイトで配っているpdf(Hardware Developer Kit)に書いてあります。
http://mindstorms.lego.com/Overview/nxtreme.aspx
ちんぷんかんぷんかもしれませんが、タダで入手できるのでご覧になってみてはいかがでしょうか。
実行結果です。超音波センサによる距離データが表示されています。
これらの技術を応用すると、オリジナルのセンサを取り付けることができるようになります。