Raspberry Pi & Python 開発ブログ ☆彡

Raspberry PiとPythonの基本的な使い方をわかりやすく解説。初心者、入門者必見!!

Raspberry PiでI2C通信をする

i2c basic

この記事の内容はRaspberry Pi 4と3の両方で動作確認済みです

ブログ管理者のP.Hです!

今回は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変換をする必要があります。