Python & Raspberry Pi 開発ブログ ☆彡

Raspberry Pi 3の使い方、設定をわかりやすく解説。Raspberry Pi3 Model B(Element14版)、Raspbianを使用して開発中。

【スポンサーリンク】

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にプルアップされています。このプルアップ抵抗を付けることで、Highレベル ⇔ Lレベルを切り替わるしくみなのですが、抵抗値により波形がきれいな方形波にならず、通信エラーになってしまう場合があります。たまに通信エラーになるという現象も起きますので、I2Cを使う場合は、オシロスコープで波形を確認することをおすすめします。 また、RaspberryPiのプルアップの電圧は3.3Vです。5V機器を接続する場合は、注意が必要です。

ラズパイ ハードウェアに戻る
TOPページに戻る