この記事の内容はRaspberry Pi 4と3の両方で動作確認済みです
ブログ管理者のP.Hです!
今回はI2Cの使い方を説明したいと思います。複数デバイスを制御したいときに便利な方式になります。
- I2Cの配線
- I2Cを有効にする
- 制御するデバイスのアドレスを確認する
- I2Cデバイスからデータを読み込む
- I2Cデバイスからデータを書き込む
- PythonプログラムでI2C制御
- I2Cのプルアップ抵抗
それでは、I2Cの使い方を紹介していきます。
I2Cの配線
II2Cは 2本のシングルクロック(SCL)とシングルデータ(SDA)ライン配線で通信する方式です。下記のように配線をします。
- Raspberry Pi SDL ----- デバイス SDL
- Raspberry Pi SDA ----- デバイス SDA
- Raspberry Pi GND ----- デバイス GND
I2Cはマスター/スレーブ運転になります。Raspberry Piでデバイスを制御するという使い方になると思いますので、Raspberry Piがマスターになります。
I2Cを有効にする
まず、sudo raspi-config
コマンドを実行して、I2C機能を有効にします。
5 Interfacing Options ⇒ P5 I2C
と進み, YES
を選択します。その後、リブートします。
制御するデバイスのアドレスを確認する
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: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- --
このデバイスのアドレスが、 0x68 ということがわかります。
I2Cデバイスからデータを読み込む
i2cgetコマンドでデータを読み込むことができます 。
- コマンドフォーマット: i2cget -y 1 デバイスアドレス 読み込みたいデータのアドレス
以下はコマンドの例になります。
$ sudo i2cget -y 1 0x68 0x01
I2Cデバイスからデータを書き込む
i2csetコマンドでデータを書き込むことができます。
- コマンドフォーマット: i2cset -y 1 デバイスアドレス 書き込みたいアドレス 書き込みたいデータ
以下はコマンドの例になります。
$ sudo i2cset -y 1 0x68 0x06 0xF0
PythonプログラムでI2C制御
smbusモジュールがインストールされてない場合は、下記コマンドでインストールしてください。
$ pip install smbus
下記コードのコメントを見ると理解できると思います。
import smbus import time #SMBusの引数に1を指定する。Raspberry Piのi2cバスの番号 i2c = smbus.SMBus(1) #デバイスのアドレス 0x68 addr = 0x68 #1バイト データの書き込み #コマンドフォーマット アドレス 書き込みたいデータのアドレス 書き込むデータ i2c.write_byte_data(addr, 0x06, 0xF0) #複数バイト データ書き込み #コマンドフォーマット アドレス 書き込みたいデータのアドレス 書き込むデータ(配列) i2c.write_i2c_block_data(addr, 0x07, [0x02, 0x01]) #1バイト データ読み込み #コマンドフォーマット アドレス 読み込みたいデータのアドレス data = i2x.read_byte_data(addr, 0x05) print(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を使う場合は、オシロスコープで波形を確認することをおすすめします。
注意事項
- RaspberryPiのプルアップの電圧は3.3Vです。5V機器を接続する場合は、3.3V⇔5V変換をする必要があります。