Re: The history of "M&Y"

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

EV3ねた その11 ROBOT-C でI2C通信 続き

2020-05-03 | EV3ねた

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

 

EV3に接続したI2Cセンサー(TPA-81)の読み取りについて、実験をしています。

これまでの現象をまとめると・・・

①プログラムを実行しても、センサーからの値が読み込まれない。
②何度も読み込みを実行している最中に、SCLの線を抜き差しすると、それ以降はセンサーの値が読みこまれるようになる。
③そのまま、センサーの電源を一旦切っても(その後に再びON)、センサーの値は読み込まれる。
④EV3とセンサーの間の線を一旦外すと(その後に再接続)センサーからの値が読み込まれない。

こんな感じです。

で・・・分かったことは、センサーの値が読み込まれない間は、(EV3のポート情報を確認すると)ポート1は UNKNOWN になっているのですが、②でSCLの線を抜き差しして、センサーの値が読みこまれるようになった後は、ポート1は IIC-BYTE と表示されていました。

これは、EV3がポート1を I2C機器と認識したから、通信ができるのだと思うのですが・・・どうやったら、プログラムからポート1を I2C機器(IIC-BYTE) に設定できるのでしょうか!?

プログラムの最初に書く

#pragma config(Sensor, S1,     TPA81,          sensorEV3_GenericI2C)

 sensorReset(S1);
 SensorType[S1] = sensorEV3_GenericI2C;

などを入れてみても、何も変わりません。

 

で、SCLの信号線にLEDを付けて、通信を目で確認できるようにしてみて分かったのですが・・・

電源を入れてすぐや、EV3とセンサーの間のケーブルを抜き差しすると・・・SCLの信号がピロピロと点滅しっぱなしになります。これは、ポートに接続したセンサーをEV3が勝手に判断する何らかの手順があるように思います。

(TPA-81は、その手順に従っていないので、UNKNOWN になってしまうのではないかと・・・)

 

じゃあ、その手順に従って信号を返せば、Arduino との通信もできるのではないか・・・と、逆に希望がわいてきました。

 

もう、意地になって、ググっていくと・・・

[Mindstorms]EV3 nicosensor

https://sites.google.com/site/yugenkaisyanico/nicosensor_ev3

というページに、とっても役に立つ情報が書かれていました。

 

 

以下にコピペします。

I2C通信は常にマスター側(インテリジェントブロック側)に主導権があります。最初はマスター→スレーブに送信します。送信データの1バイト目の値がスレーブアドレスです。これが適合しないと返信しないという決まりがあります。NXT超音波センサのスレーブアドレスは0x02です。送信データの2バイト目がコマンドです。
センサを接続すると、最初にインテリジェントブロックからセンサに対して2つのコマンドが送られます。
Product ID(0x08)とRead Sensor Type(0x10)です。
そこで、NXT超音波センサと同じ内容を返します。
Product ID(0x08)→"LEGO"(0x4C, 0x45, 0x47, 0x4F, 0x00)
Read Sensor Type(0x10)→"Sonar"(0x53, 0x6F, 0x6E, 0x61, 0x72, 0x00)
Product IDが正しい場合、インテリジェントブロックからはNXT超音波センサ「NXT-US-CM」として認識されます。
Product IDが不明だと「IIC-BYTE」となります。I2C通信そのものに失敗すると「UNKNOWN」となり、以後、通信をしてくれません。
NXTは接続にProduct IDなどの問い合わせがありません。過去に製作したnicosensorは、このコマンドの応答機能を実装していませんでした。この機能を追加するとEV3へ対応できます。
距離測定のコマンドはRead Measurement Byte 0(0x42)です。測定値は1バイト(0~255)です。有効範囲は1~254となります。

 いや~、私が悩みに悩んでいたことが、あっさり書かれていて、逆に拍子抜けです。

nicosensorは、かつて、NXT用の自作センサーを接続するきっかけを提供してくださった、記事です。これがEV3に対応したということですね。

分かったことは・・・

EV3は(NXTと違って 笑)賢いので、ポートにセンサーが接続されると、勝手に「おいおい何を接続したんだ?」と勝手に調べます。で、接続したのがLEGOの超音波センサーなら「ポート1にLEGOのNXT用の超音波センサーが接続されました」と勝手に認識してくれるのでしょう。ここで、接続したけど「LEGOの超音波センサーだよ」と認識できない時は、IIC-BYTEになるようです。(うまく接続しないと UNKNOWNのまま、なのでしょう)

ということで、単にI2Cのセンサーを接続してもダメなことが分かりました。

ちゃんと、(接続時に)EV3の問いかけに対して、回答を送らないと通信をしてくれない・・・ということですね。

(ただ、なぜ、SCLの線を抜き挿しすると、それ以降の通信をしてくれるのかは、謎のままです・・・)

 

しかも、nicosensorのページには、Arduino側のプログラムもダウンロードできるようになっていて、至れり尽くせりです・・・

では、早速、Arduinoに接続して実験をしてみます・・・わくわく

 

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

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