前の記事はこちら EV3ねた その9 ROBOT-C を使ってみる
さて・・・ROBOT-Cが使えるようになったのですが・・・
本来の目的である、EV3とArduinoの通信ができるか、の研究を続けます。
まず、ROBOT-Cの普通の操作を覚えなければならないのですが、これは簡単でした。
プログラムを入力して、「Compile Program」ボタンでコンパイルします。このときに、エラーがあれば、表示されるのですが・・・エラーが無い時に、ノーリアクションなので、コンパイルが終わったのか、終わらないのか、とっても不安になります。(一応、下の方のメッセージエリアに「File "xxx.c" compiled on 日付 時刻」が表示されるので、コンパイルが終わったよ、アピールはあるのですが・・・)
次に、「Download to Robot」ボタンで、EV3に転送します。すると、「Program Debug」というパネルが表示されて、その中の「Start」ボタンで実行します。
さて、一通り操作に慣れたところで肝心のI2C通信のプログラムを研究します。
ただ、いきなりArduinoとの通信をするには、不明点が多いので、まずは普通のI2Cセンサーを接続してみます。
NXTと直接接続した実績のある、非接触型温度センサー(サーモパイル)のTPA-81を接続しています。
ハード的な接続は簡単です。
EV3のポート1とブレッドボードを結んで・・・4本の線をセンサー(TPA-81)に接続します。
EV3 TPA-81
青 SDA <---> SDA
緑 SCL <---> SCL
黄 VBUS <---> +5V
赤 GRND <---> GND
さて、ハード的な接続は簡単にできたのですが・・・そう簡単にはセンサーの値を読み込んでくれません。
NXCの I2Cbyte( ) のような関数があるハズ・・・と思っていたのですが・・・ROBOT-CのHELPで検索しても出てきません。(もしかしたら・・・ROBOT-Cでは、I2Cを直接扱うことができないの? と真面目に思いましたよ)
http://www.robotc.net/download/lego/
に、貼りついている ROBOTC for LEGO MINDSTORMS 4.0 Users Guide にも、I2C関係の関数は記載されていません。
せっかく、ROBOT-Cをインストールしたのに、ガックシです。
でも、あくらめずに、ググってみると・・・
http://www.robotc.net/wikiarchive/NXT_I2C_Sensors
こんなページが見つかりました。
ここには、
nI2CBytesReady
nI2CRetries
nI2CStatus
readI2CReply
sendI2CMsg
これらが掲載されていました。ただ、NXT用の関数のリファレンスのようで、EV3で使えるかどうかは不明です。
readI2CReply と sendI2CMsg は、まさしくI2Cの通信を行うものなので、これがあれば I2C 通信ができそうです。
何も考えずに ROBOT-C のプログラムに readI2CReply と sendI2CMsg を打ち込んでみると・・・ちゃんと、関数名として認識して紺色の太字になったので、EV3でも使えそうと期待が高まりました。
で、この関数を使ったサンプルを探して、ネットをさまよいました。
が・・・全然ありません。
やっと探したのが、ここ・・・
https://engmuhannadalkhudari.wordpress.com/2016/02/11/nxtev3-arduino-i2c-ultimate-guide/
ここに、EV3とArduinoの接続のことが書かれているようです。(ただ英語なので、よくわかんない)
EV3側のプログラムは EV3-SW で書かれているようなのですが・・・下の方にROBOT-Cのプログラムがありました。
これを、解析して、作ったのがこれ・・・です。
task main()
{
int i;
char Wbuf[3] = {2,0xD0,0x02};
char Rbuf[8];
while(true)
{
sendI2CMsg(S1,Wbuf,8);
wait1Msec(20);
readI2CReply(S1,Rbuf,8);
eraseDisplay();
for(i=0;i<8;i++)
displayBigTextLine(i*2," %d : %d",i,Rbuf[i]);
wait1Msec(500);
}
}
自分への備忘録として解説を入れておきます・・・
sendI2CMsg関数の第1パラメータはポート番号(S1とかS2)、第2パラメータは送るデータの配列のアドレス、第3パラメータは受信するデータの数
送る配列には、データ数、I2Cのアドレス、渡すデータ・・・を格納します。上のプログラムでの「2,0xD0,0x02」は、2個のデータを渡す、I2Cアドレスは0xD0、渡すデータは2で、合計3バイトを送ります。
readI2CReply関数の第1パラメータはポート番号、第2パラメータはI2C機器から受け取るデータの格納配列のアドレス、第3パラメータは受信するデータの数
さて、このプログラムで、TPA-81の値が読み取れるっちゃ読み取れるのですが・・・安定しません。
というか、電源を入れた直後は、通信ができません。(一旦読み取った値が変化しません)
で・・・SCLの線を抜き差しすると、何故か値を読み取るようになります。
何で?
まだまだ研究が必要なようです。
続きの記事はこちら EV3ねた その11 ROBOT-C でI2C通信 続き