PythonでI2Cを使う際のコマンドをまとめた
趣味が趣味なので,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を使用するライブラリをインストールします.
そもそも最初の状態ではRaspberry piはI2 Cを使用することができないので,設定画面から有効にする.
そのためにはまず,
$ sudo raspi-config
でRaspberry piの設定画面を開きます.
ここの 5.Interfacing Option
を選択.すると,色々なものを有効/無効化するところに遷移するので.この先の
P5 I2C
を選択
この先で色々聞いてくるので,適当に enable ってすればおkです.
最後に Pythonで I2 C-busをコントロールするためのライブラリである 「Python-smbus」をインストールします.
$ sudo apt-get update $ sudo apt-get install python-smbus
これで一通りRaspberry pi でI2 Cを制御できるようになりました.
多分これで sudo i2cdetect -r -y 1
などを打つと,下のような表示がされるようになるはずです.ダメだった場合,1の部分を0に変えてみてください.
$ sudo i2cdetect -r -y 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- --
こんな画面が出てくれば大丈夫です.この画面は,実際にI2 Cデバイスが接続された際,アドレスが表示されます.
例)
0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- 64 -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- --
この場合,アドレスは 0x64
になります.
本題
と言うわけでリファレンスから抜粋,下のカッコでざっくりと和訳しています.
long write_quick(int addr)
Send only the read / write bit (読み取り/書き込みビットだけを送信)
long read_byte(int addr)
Read a single byte from a device, without specifying a device register. (デバイスレジスタを指定せずに、デバイスから1バイト読み出し)
long write_byte(int addr,char val)
Send a single byte to a device. (1バイトデバイスに送る.)
long read_byte_data(int addr,char cmd)
Read Byte Data transaction. (トランザクションデータをデバイスから読み出す)
long write_byte_data(int addr,char cmd,char val)
Write Byte Data transaction. (トランザクションデータを書き出す)
long read_word_data(int addr,char cmd)
Read Word Data transaction. (トランザクションデータを読む)
long write_word_data(int addr,char cmd,int val)
Write Word Data transaction. (ワードトランザクションデータを書き出し)
long process_call(int addr,char cmd,int val)
Process Call transaction. (プロセスを呼び出す)
long[] read_block_data(int addr,char cmd)
Read Block Data transaction. (ブロックデータトランザクションを読み取り.)
write_block_data(int addr,char cmd,long vals[])
Write up to 32 bytes to a device. This fucntion adds an initial byte indicating the length of the vals array before the valls array. Use write_i2c_block_data instead! (デバイスに最大32バイトを書き込み.ただしこの関数は,val配列の前にvals配列の長さを示す最初のバイトを追加する必要がある.代わりにwrite_i2c_block_dataを使用しなければいけない)
long[] block_process_call(int addr,char cmd,long vals[])
Block Process Call transaction.
(プロセス・コール・トランザクションをブロック.)
I2C Access Functions
long[] read_i2c_block_data(int addr,char cmd)
Block Read transaction. (トランザクションデータをブロックで読み出し)
write_i2c_block_data(int addr,char cmd,long vals[])
Block Write transaction. (トランザクションデータをブロックで書き出し)
なんか絶対和訳を間違っている気がします.(気にしない)
何か間違いがあった場合,コメント等で教えてもらえると幸いです.