出典:Raspberry PiでI2C通信をする

I2Cの使い方

I2Cの配線

 I2Cは 2本のシングルクロック(SCL)とシングルデータ(SDA)ライン配線で通信する方式で、下記のように配線。

Raspberry Pi SDL ----- デバイス SDL
Raspberry Pi SDA ----- デバイス SDA
Raspberry Pi GND ----- デバイス GND

 I2Cはマスター/スレーブ運転。
 Raspberry Piでデバイスを制御するという使い方なので、Raspberry Piがマスターに。

I2Cを有効に

「設定」>「Raspberry Piの設定」>「インターフェイス」>「I2C:」を有効に、確認は以下。
 sudo raspi-configコマンドで設定しても良い。

pi@raspberrypi:~ $ lsmod | grep i2c
i2c_bcm2835            16384  0
i2c_dev                20480  0
pi@raspberrypi:~ $ ls -l /dev | grep i2c
crw-rw----  1 root i2c      89,   1  3月 26 09:12 i2c-1
制御するデバイスのアドレスを確認

 I2Cは複数台接続が可能。そのため、デバイスには識別するためのアドレスがあり、下記のコマンドを実行して、アドレスを調べる。

$ sudo i2cdetect -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: -- -- -- -- -- -- -- 77
このデバイスのアドレスが、 0x77 ということがわかる。
i2cgetコマンド

 I2Cデバイスからデータを読み込む

i2cget -y 1 デバイスアドレス 読み込みたいデータのアドレス
$ sudo i2cget -y 1 0x77 0x01
i2csetコマンド

 I2Cデバイスからデータを書き込む

i2cset -y 1 デバイスアドレス 書き込みたいアドレス 書き込みたいデータ
$ sudo i2cset -y 1 0x77 0x06 0xF0

PythonプログラムでI2C制御

 smbusモジュールがインストールされてない場合は、下記コマンドでインストール。

$ pip install smbus
# ic2_test.py
import smbus
import time

#SMBusの引数に1を指定する。Raspberry Piのi2cバスの番号
i2c = smbus.SMBus(1)
#デバイスのアドレス 0x77
addr = 0x77

#1バイト データの書き込み
#i2c.write_byte_data アドレス 書き込みたいデータのアドレス 書き込むデータ
i2c.write_byte_data(addr, 0x06, 0xF0)

#複数バイト データ書き込み
#i2c.write_i2c_block_data アドレス 書き込みたいデータのアドレス 書き込むデータ(配列)
i2c.write_i2c_block_data(addr, 0x07, [0x02, 0x01])

#1バイト データ読み込み 
#コマンドフォーマット アドレス 読み込みたいデータのアドレス
data = i2x.read_byte_data(addr, 0x05)
print(data)

#複数バイト データ読み込み
#i2c.read_i2c_block_data アドレス 読み込みたいデータのアドレス データ数
data = i2c.read_i2c_block_data(addr, 0x01, 1)
print(data)

I2Cのプルアップ抵抗

 I2Cは 2本のシングルクロック(SCL)とシングルデータ(SDA)ライン配線で通信する方式。
 Raspberry Pi 3は、この2線はともに1.8kΩで3.3Vにプルアップされている。
 接続する機器にもプルアップ抵抗が付いてる場合は、抵抗値により波形がきれいな方形波にならず、通信エラーになってしまう場合があるそうで。
 たまに通信エラーになるという現象も起きているので、I2Cを使う場合は、オシロスコープで波形を確認が望ましいらしい。