前の記事はこちら EV3ねた その11 ROBOT-C でI2C通信 続き
じゃあ、
のところにあった、プログラムをArduinoに入れて、EV3と接続してみます。
ハード的な接続は nicosensor のページの回路図にあるように
EV3 Arduino
青 SDA <---> D2 (100kΩの抵抗をプルアップ接続)
緑 SCL <---> D3 (100kΩの抵抗をプルアップ接続)
黄 VBUS <---> +5V
赤 GRND <---> GND
です。
(私は、常識的に SDA:A4 SCL:A5 と接続してしまって、動かなくて悩みました 苦笑)
う~ん、やっぱり、通信できない・・・
いろいろやってみると・・・SDAのところに接続しているプロアップの100KΩの抵抗を抜き差しすると、「NXT用超音波センサー」に偽装できることが分かりました。
ただ、一旦超音波センサーと認識されても、ケーブルを抜き差しすると、やっぱり UNKNOWN になっちゃいます。
何ででしょうか!?
さらに、いろいろと試すと・・・EV3の電源OFFの状態の時からArduinoを接続したままで、(EV3の)電源を入れると、(起動までにけっこうな時間が掛かりますが)何もせずに超音波センサーに偽装できることが分かりました。
さらに・・・
私は、Arduinoの電源をEV3のポートから(6本の信号線から)供給していたのですが・・・Arduino自体にPCから給電すれば、普通に使えることが分かりました。
ということは、EV3のポートから給電する方法は(電力不足!?)で使えないということなんでしょうか?
折角、EV3とArduinoを接続できても、Arduino用に別にバッテリーを搭載する必要があるとすると、魅力が半減ですねぇ。
ということで、[Mindstorms]EV3 nicosensorに掲載されていたプログラムで、少なくとも EV3とArduinoの接続はできました。ただ、このプログラムでは、あくまでも1つの(センサー)の値が渡るだけであり、沢山のセンサーを制御するためには、もっと工夫をしなければなりません。
でも、とりあえず、「通信ができた」ということで、一歩前進です。(ふぅ)
さらに調べていくと・・・どうして EV3 と Arduino を接続したままで、EV3の電源を入れると通信ができるのかが分かりました。EV3は、ポートにセンサーをつなぐと、すぐに(即座に!)何のセンサーを接続したかを判断するために、Product ID(0x08)とRead Sensor Type(0x10)を送信します。(超音波)センサー側は、0x08に対して”LEGO"、0x10に対して”Sonar”を返すと、それを受け取って、「ああ、ポートにはNXT用の超音波センサーが接続されたな・・・」と判断するようです。
しかし、Arduinoの電源をEV3のポートから供給すると、(Arduinoの起動にちょっとだけ時間が掛かるため)EV3から Product IDとRead Sensor Type が送られていることを認識できずに、対応する正しいデータを返送できずに、UNKNOWNになってしまう・・・という筋書きのようです。
(私が使用しているEV3は電源がNi-H電池なので、EV3のポートからの電源供給の電圧が低くてダメなのかと。だからわざわざアルカリ乾電池を買ってきたのに・・・)
だから、接続してから・・・ 0x08 0x10 0x41 0x42 0x42 0x42・・・と EV3⇒Arduino に通信するのですが・・・Arduino側では、初めの方の 0x08 0x10 0x41 を認識できずに 0x42 0x42 0x42 だけを受け取っています。
さらに分かったことは・・・ 0x42 0x42 0x42 だけを受け取って、UNKNOWN になっているポートに普通の超音波センサーで読み取るプログラムを実行すると、 0x08 0x10 の儀式を経ていないにも関わらず、それ以降は超音波センサーとして認識されました。
例えば、こういうプログラム
#pragma config(Sensor, S1, NXTSONAR, sensorSONAR)
//*!!Code automatically generated by 'ROBOTC' configuration wizard !!*//
task main()
{
int i;
while(true)
{
i=SensorValue[S1];
eraseDisplay();
displayBigTextLine( 5," %3d cm",i );
wait1Msec(500);
}
}
ということで、EV3とArduino で通信ができたっちゃできたのですが・・・まだまだですね。
EV3が0x42 を間断なく送信している姿がけなげですが・・・無駄のような気がします。(私は根がケチなので・・・)
この、休みなく送信する 0x42 をどうにかできませんかねぇ・・・
ちなみに、IIC-BYTE になると、ポートビューではこんな感じです。
NXTの超音波センサーとして認識されると、ポートビューでリアルタイムに値が表示されます。
本日のまとめ・・・
EV3に接続したセンサーを「NXTの超音波センサー」として、偽装するには、接続直後にEV3が送信する 0x08,0x10 にセンサーが側を返信する必要があります。超音波センサーとして認識されると、EV3のポートビューでセンサーの値を確認できます。0x08 や 0x10 に返信しないと UNKNOWN になりますが、0x42に返信するとそれ以降は、超音波センサーとして認識されて通信ができます。
(ポートビューを使わないのであれば、0x08 や 0x10 に返信する必要はない・・・)
続きの記事はこちら EV3ねた その13 ROBOT-C でI2C通信 出来てた!