I2Cを使う

Raspberry Pi でのI2Cのセットアップとその使い方。

Raspberry pi の準備

先ず、ハードウェア的にI2Cが使える様にする必要が有ります。GUIとCUIでのやり方が有りますが、GUIでのやり方は、”UbuntuからSSHでつなぐ” を参考にして下さい。ここではCUIでの設定の仕方を説明します。

  1. ターミナルで、”sudo raspi-config”と入力
  2. 3行目の、”Interface Options ……”を選ぶ
  3. 5行目の、”P5 I2C …..”を選ぶ
  4. I2Cを有効にするか聞いて来るので、”はい”を選ぶ
  5. I2Cが有効になったので、”了解”を選ぶ
  6. 初期画面に戻るので、”Finish”を選んで終了。

I2C用GPIOピン

I2Cには4ピン必要でRaspberry Piでは信号用にGPIO2,3が使用されます。電源はI2Cの機器の仕様に合わせて、5Vまたは3.3Vになります。

  • 電源
  • SCL(クロック)
  • SDA(データ) 
  • GND

試しにI2C機器をつなぐ

ここにある、”ADT7410温度測定モジュール”をRaspberry Pi に接続します。Raspberry Piには2系統のI2Cが有り、それぞれをI2C-0,I2C-1と読んでいます。I2C-1のSCL/SDAピンは上記の様に5/3ピン。I2C-0は28/27ピンとなります。今回は、”I2C-1″につなぎます。またこの機器の電源は3.3Vです。注意して下さい。4本の線を接続して取り付け完了です。

Raspberry Piからの機器の確認

ターミナルで、”i2cdetect -y 1” と実行して下さい。これは、”I2C-1につながっているI2C機器のアドレスを表示しない”と言うコマンドです。実行後、右図の画面が表示されます。この機器のI2Cアドレスは、”0x48″ ですので、Raspberry Piは機器の接続を正しく認識しています。

Pythonで通信の確認

SMBusライブラリで下記のコマンドが使用可能になります。

  • Read系
    • read_byte(int addr)
    • read_byte_data(int addr,char cmd)
    • read_word_data(int addr,char cmd)
    • read_block_data(int addr,char cmd)
  • Write系
    • write_byte(int addr,char val)
    • write_byte_data(int addr,char cmd,char val)
    • write_word_data(int addr,char cmd,int val)
    • write_block_data(int addr,char cmd,long vals[])

”ADT7410”を使って温度を測定するプログラムはこんな感じになります。


import smbus

bus = smbus.SMBus(1)
adt7410_addr = 0x48
adt7410_r_no = 0x00
adt7410_conf = 0x03

# 13bit mode
bus.write_byte_data(adt7410_addr, adt7410_conf, 0x00)
word_data = bus.read_word_data(adt7410_addr, adt7410_r_no)

data = (word_data & 0xff00) >> 8 | (word_data & 0xff) << 8
data /= 128 

print(data)
  • 9行目: 13ビットモードを指定
  • 10行目: データの読み出し
  • 12,13行目: データの換算