Raspberry Pi でのI2Cのセットアップとその使い方。
Raspberry pi の準備
先ず、ハードウェア的にI2Cが使える様にする必要が有ります。GUIとCUIでのやり方が有りますが、GUIでのやり方は、”UbuntuからSSHでつなぐ” を参考にして下さい。ここではCUIでの設定の仕方を説明します。
- ターミナルで、”sudo raspi-config”と入力
- 3行目の、”Interface Options ……”を選ぶ
- 5行目の、”P5 I2C …..”を選ぶ
- I2Cを有効にするか聞いて来るので、”はい”を選ぶ
- I2Cが有効になったので、”了解”を選ぶ
- 初期画面に戻るので、”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行目: データの換算