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を使う場合は、オシロスコープで波形を確認が望ましいらしい。