« まさかのSDカードデータ消失!! | メイン | 性懲りもなく、赤道儀モータドライブ用自作コントローラの改造 »

2016年2月 9日 (火)

悪戦苦闘のI2C通信

前回に書きましたようにモータコントローラ7号機を製作中ですが、本体コントローラと手元操作ボックスをつなぐ肝心のArduino同士のI2C通信で泥沼状態を経験しました。

プログラムのデバッグにあたり、I2C通信については、マスタ→スレーブの一方向通信は、LCDキャラクタディスプレイのI2C化で経験していましたが、今回は、双方向通信となるため不安はあったのですが、それが現実のものになってしまった次第です。

今回のブログラムは5号機の改変ですので、デバックは、通信が主体となりますので、確認のためエミュレータをブレッドボードで作成して確認しながら進めました。

20160207_3283作成したエミュレータ

問題は、マスタ側(=手元操作ボックス)からの送信要求に対してスレーブ側(本体コントローラ)が返す結露防止ヒータの温度データがうまく取れないと言うことです。

スレーブ側が返すデータは、モータコントローラのBUSY状態(1byte)、温度制御の状態(1byte)、温度データ(2byte)の計4byteを返すように設定しているのですが、うまく行きません。

Arduinoのスケッチ例を見ても、1byte送信か文字列送信しかなく、複数バイトの送信方法がうまくないみたいです。

最初に書いたスケッチ

viod Send_THermo(){
       Wire.write(L6470_BUSY);                // L6470_BUSY=BUSY/nBUSYの1byteデータ(0又は1)  
       Wire.write(TEMP_CON_NOW);         // TEMP_CON_NOW=上昇/降下/制御なしの1byteデータ(0~3)  
       Wire.write(TEMP_NOW / 0x100);     // TEMP_NOW 温度データ(2byte)(0~600)  
       Wire.write(TEMP_NOW % 0x100);   // 少数点以下1位を有効とするため温度×10のデータとしている
}

結局、これでは最初の1文字だけが送信されるだけでうまくいきません。

色々と試したり、Web上で検索したりした結果、次のように書くべきだと言うことになりました。

viod Send_THermo(){  
     char c[6];

     c[0] = L6470_BUSY;              // (1又は2)  
     c[1] = TEMP_CON_NOW;       // (1~4)  
     c[2] = TEMP_NOW / 0x100;   // (10~600)  
     c[3] = TEMP_NOW % 0x100;  
     c[4] = '\0'; 
     Wire.write(c);
}

とし、文字列のポインタ渡しによる送信でうまく行きそうでした。

※この時点で、各送信データバイトに「0」があると、終端文字と解釈されて、以後のバイトデータは送信なれないことはわかっているつもりでした。

ここに至るまで、3日を要してしまいましたが、なんとかうまく送信できました。

ところが、その他の部分のデバックにかかると、2バイト目まではうまく送信できるものの、肝心の温度データが取れなくなるケースがあり、またぞろケーブルやコネクタの接触不良を疑ったりと際限がなくなってしまいました。

結論は、しごく単純なこと、温度データが256未満(25.6度未満)では、温度データの上位byteが0となって、終端文字と解釈されていただけでした。

つまり、うまく行くときは、結露防止ヒータの温度が26度以上の時で、それ以下になっていると、送信の3yte目が0となって温度データが送信されない状態になっているだけでした。

ケーブルやコネクタの方の不都合ばかりに気をとられ、こんな単純なことに思いが至らなかったことに、唖然とした次第です。

エミュレータで確認しながら作業を進めたのが正解でした。
これで、本番同士で接続して確認していたなら、なにがなにやらわからず、放り出していたかもしれません。

以後のデバッグは多少の紆余曲折はあったももの、概ね順調にすすみ、5号機では隠れていたバグ潰しもできて、ほぼ完成の状態まで仕上がっています。

7号機で手元操作ボックスから本体コントローラへ送信するコマンドは下表のとおり。
これだけで、5号機の機能はすべて動作させることが可能です。

7

さて、今週末は金曜日を有給とし、連休で帰省し、機材の調整とあわよくば遠征もと欲張っていたのですが、案の定、天気予報は最悪を示しています。

トラックバック

このページのトラックバックURL:
http://app.blog.bbiq.jp/t/trackback/562191/33736769

悪戦苦闘のI2C通信を参照しているブログ:

コメント

コメントを投稿

コメントは記事の投稿者が承認するまで表示されません。