工作好きな情報系の雑記

Raspberry PiとArduino間で、Pythonを使ったI2Cでのデータ列の送受信

研究の一環で、Raspberry PiとArduino間で、I2Cを使ってある程度まとまったデータ列の送受信をすることになった。
ただ、動かすまでが大変だった…

何せ詳しいリファレンスが探しても出てこないのだ。
使えるメソッドを表にしてくれてるサイトはあったのでどんなメソッドを使えばいいのかは分かっていたものの、詳しい説明がないからどうしようもない。
cmdが一体何に使われているのかとか、Arduino側ではどう認識されるのかとか、どっこにも書いてなくて途方に暮れてた。

ちなみに見つけたリファレンスっぽいサイトは以下。

オシロで観測した波形を載せてたり、write_i2c_block_dataのコード例が載ってたりしてちょっと参考になったサイト↓


最終的には、なんとかArduino Forumの中で答えにたどり着いた。
この人のテストプログラムがあってよかった。
動いた時はびっくりした。

onRequest and onReceive as slave with Raspberry Pi Master
[I2C] onRequest and onReceive as slave with Raspberry Pi Master - 

上記を参考にして例示用のコードを書いたので、参考にしてみてほしい。

にしてもさー、read_block_dataの第3引数に受信するバイト数を指定できるとか、公式っぽいリファレンスには一切載ってないんだけど。
いや、バイト数指定できることはさっきのちょっと参考になったサイトに書いてあったけど、何のために指定するのか書いてないんだけど。
見つけた人はすごいけど、その前に実装した引数くらいきちんと使えるようにリファレンスに載せてくれよ…

しかもさぁ、どんな長さのバイト数でも受信できるみたいに書いといて32バイトまで(受信だけならcmd含め33バイト)しか読めないってどういう事よ〜。ちゃんと書いとけよぉ〜〜。

んあーー!!!
リファレンスの少ないライブラリとかメソッド使うのちょ〜〜〜苦労するんなああぁあぁぁもぉぉ!!!!!


追記(2018/07/12);

>>どんな長さのバイト数でも受信できるみたいに書いといて
あらためて確認してみたら、ここにはちゃんと書いてあったね…
まぁメソッド名微妙に違うし関係ないと思ってたのかな。

I2C block transactions do not limit the number of bytes transferred but the SMBus layer places a limit of 32 bytes.

あと、この投稿をした1ヶ月後くらいに各メソッドを日本語訳してくださった方がいらっしゃるようだ。
英語を読みたくない人は参照すると良いかもしれない。

趣味が趣味なので,Raspberry piとPythonで I2 Cを使うことが多い. しかしいつもコマンドを忘れるので,自分のメモ用として今回の記事を書きます. 実際にRaspberry piでI2 Cを使う際の設定なども書いていきます. 実行環境としては Raspberry pi 3 + Python 3.6.0 です. Raspberry pi側の設定 まずはPythonのI2 Cライブラリをインストール $ sudo apt-get update $ sudo apt-get install i2c-tools これでとりあえずPythonのI2 Cを使用するライブラリをインストールし…
PythonでI2Cを使う際のコマンドをまとめた - バグだらけ会津若松 - バグだらけ会津若松

この方が参考にしたリファレンスもコード例が載ってたりしてマシな感じ。
でも相変わらずread_block_dataの第3引数については書いてないし、各引数の意味も書いてないのでアレではあるが…

 

 

モバイルバージョンを終了