PythonでI2Cを使う際のコマンドをまとめた

趣味が趣味なので,Raspberry piPythonで 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の設定画面を開きます.

f:id:flying_hato_bus:20170802193218p:plain

ここの 5.Interfacing Optionを選択.すると,色々なものを有効/無効化するところに遷移するので.この先の P5 I2Cを選択

f:id:flying_hato_bus:20170802193310p:plain

この先で色々聞いてくるので,適当に 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. (トランザクションデータをブロックで書き出し)

なんか絶対和訳を間違っている気がします.(気にしない)

何か間違いがあった場合,コメント等で教えてもらえると幸いです.