Re: The history of "M&Y"

Team "M&Y" and "花鳥風月"
the soliloquy of the father
毎日更新!

EV3ねた その12 ROBOT-C でI2C通信 できそう・・・

2020-05-06 | EV3ねた

前の記事はこちら EV3ねた その11 ROBOT-C でI2C通信 続き

 

じゃあ、

[Mindstorms]EV3 nicosensor

のところにあった、プログラムを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通信 出来てた!

 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする