Re: The history of "M&Y"

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

EV3ねた その10 ROBOT-C でI2C通信

2020-05-02 | EV3ねた

前の記事はこちら 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通信 続き

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« EV3ねた その9 ROBOT-C を使... | トップ | EV3ねた その11 ROBOT-C でI... »
最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。

EV3ねた」カテゴリの最新記事