MATLAB Answers

0

ラズベリーパイとアルディーノのI2C通信

Asked by Koura Keishi on 30 Nov 2017
Latest activity Commented on by Koura Keishi on 30 Dec 2017
ゲームパッドジョイスティックの角度をワイヤレス通信で送信送信しようとしています. 方法は添付しました資料の様に,ホストPCからジョイスティックの角度の情報を,ラズベリーパイへワイヤレスで送信し 受信した情報をアルディーノへI2Cで送信します.
本件はラズベリーパイとアルディーノのI2Cでのご相談です.添付しましたmファイルでアルディーノへ通信し,添付しましたアルディーノのプログラムで 値を受信を試みているのですが, 一応ジョイスティックの傾きの情報を送信・受信することができました.
ですが,2つの問題があります.
1長時間接続ができない
5分ほどmatlabプログラムを起動すると,以下のエラー表示がされ,通信ができなくなります.原因がわかりません.それとも長時間起動しない仕様なのでしょうか?
エラー: raspi/recvResponse (line 697) Error writing to I2C bus.
エラー: raspi.internal.i2cdev/write (line 118) recvResponse(obj.Hw);
エラー: I2C (line 15) write(i2csensor,b,'int8');
2arduino側でマイナスの数値が受信されません.
 mファイルにジョイスティックの数値表示  t = [b]  とアルディーノへ送信する  write(i2csensor,b,'int8')  を記述しており,プログラムを起動すると,プロンプトではマイナスの値も表示  されるのですが,arduinoでは以下の様に右へ傾きを大きくすると1~127,  左へ傾きを大きくすると225~128の値が表示され,マイナスが表示されません.    
左傾き大128 ~ 左傾き小255 中央0 右傾き小1  右傾き大127  
解決方法をご存知の方がらっしゃいましたら,ご教示いただけないでしょうか. どうぞよろしくお願いいたします.

  1 Comment

michio
on 1 Dec 2017
参照し易いよう画像を貼り付けます。

Sign in to comment.

2 Answers

Kei Otsuka
Answer by Kei Otsuka
on 4 Dec 2017
Edited by Kei Otsuka
on 4 Dec 2017
 Accepted Answer

ジョイスティックの値がマイナス表示されない件ですが、デバイス(送信)側が2の補数表現、Arduino(受信)側がストレートバイナリ表現を使用しているためと考えられます。 デバイス側の設定で数値表現の方法を変更できれば良いですが、そうでなければ受け取った側で処理をするしかありません。 値が128以上(8bitにおける符号bitが1)となった際に、受信した結果から256を減算して使ってみてください。

  5 Comments

Kei Otuka様
ご回答いただきありがとうございます.
添付ファイルの様に修正してみたのですが,
プログラムを実行して,十数秒経過すると,
警告: Problem using I2C interface. > In I2C_2 (line 22)
t =
0
というようcatchが実行されて数値は送られるのですが,arduinoに値が行き届いていないのか,新しい数値が表示されなくなりました.
Kei Otsuka
on 4 Dec 2017
データの受け手であるArduino側のBaudrateも変更が必要になりますが、そちらは変更済でしょうか?
Arduino側のBaudrate変更が難しい場合は、try/catchの構文の部分だけの変更を追加し、Baudrateの変更はせずに試してみてください。
Koura Keishi on 30 Dec 2017
Kei Otuka様
返信いただきありがとうございます.
上記通信時間の問題ですが,arduinoのダウングレード版を使用していたため,通信中に切れてしまうことがわかりました.
純正品で使用したところ,数時間のみの計測ですが,無事途中で通信が途切れることがなくなりました.
ありがとうございます.

Sign in to comment.


Takafumi
Answer by Takafumi
on 1 Dec 2017

とりあえす、 TimeOut の設定を、長く取ってみてください。デフォルトは10sだと思います。
i2csensor.TimeOut = 60*60;

  1 Comment

Takafumi 様
ご回答いただきありがとうございます.
TimeOutを添付いたしましたファイルの様に書いてみたのですが,
エラーが以下の様に表示され,実行できません.
エラー表示***************************************************************
クラス 'raspi.internal.i2cdev' のプロパティ 'TimeOut' が認識されません。
エラー: I2C (line 11) i2csensor.TimeOut = 60*60; ***************************************************************** i2csensor.TimeOutの書く場所が違うのでしょうか.
補足
matlabプロンプトで,
>> i2csensor = i2cdev(mypi,'i2c-1','0x08')
と入力したところ
i2csensor =
i2cdev のプロパティ:
Bus: 'i2c-1'
Address: '0x08'
というようにTimeOutが表示されません.
matlabのバージョンかそれともラズベリーパイのバージョンの影響なのでしょうか.
使用しているバージョンは,matlab2017b,raspberrypi3です.

Sign in to comment.