Armadillo-640で、I2C通信の熱電対温度センサ(MCP9600)からデータ取得を取得してみました。
ここでは、MCP9600熱電対温度センサモジュールを使用しました。
プログラムは、pythonで作成しています。
1.Armadillo-640のCON9のI2Cを有効化
Armadillo-640: 機能拡張用インターフェース(CON9)の使用例 ~ I2Cへの割り当て ~を参考にCON9のI2Cを有効にします。
上記ブログでは、I2C2、I2C3を有効化してますが、以下では、I2C2を使用した場合で説明します。
2.Armadillo-640と熱電対温度センサモジュールを接続
MCP9600熱電対温度センサモジュールを
Armadillo-640のCON9のI2C2
に、下図のように接続します。
3.pythonのインストール
Armadillo-640:pythonを動かすを参考にインストールします。
Armadillo-640をインターネットに接続できるネットワークに有線LANで接続します。
以下、Armadillo-640のコンソール上での操作になります。
root@armadillo:~# apt-get update
root@armadillo:~# apt-get upgrade
root@armadillo:~# apt-get install python
上記のコマンドの場合、python2がインストールされます。
python3をインストールする場合は、下記のコマンドになります。
root@armadillo:~# apt-get install python3
4.python-smbusのインストール
pythonでI2C通信するためのpython-smbusパッケージをインストールします。
python2の場合
root@armadillo:~# apt-get install python-smbus
python3の場合
root@armadillo:~# apt-get install python3-smbus
5.I2C通信の熱電対温度センサ(MCP9600)からデータを取得
下記の内容のファイルを作成します。
(後述の説明上、このファイル名を"tsens_mcp9600.py"とします。)
import smbus
from time import sleep
# I2C device: /dev/i2c-1
bus = smbus.SMBus(1)
# MCP9600: slave address
address_mcp9600 = 0x67
# MCP9600: register
reg_devid = 0x20
reg_temp = 0x00
# Get Temperature
try:
devid = bus.read_byte_data(address_mcp9600, reg_devid)
print('Device ID: 0x%02x' % (devid))
print('********************')
while True:
block = bus.read_i2c_block_data(address_mcp9600, reg_temp, 2)
temp_sign = block[0] & 0x80
temp_upper = block[0] * 16
temp_lower = block[1] * 0.0625
temp = temp_upper + temp_lower
if temp_sign == 0x80:
temp = (4096 - temp) * -1
print('Temp: %2.2f' % (temp))
sleep(1)
except KeyboardInterrupt:
pass
上記で作成した"tsens_mcp9600.py"を下記のようにpythonで実行すると、約1秒ごとに温度がコンソールに表示されます。
python2の場合
root@armadillo:~# python tsens_mcp9600.py
Device ID: 0x40
********************
Temp: 20.81
Temp: 20.75
Temp: 20.69
python3の場合
root@armadillo:~# python3 tsens_mcp9600.py
Device ID: 0x40
********************
Temp: 21.12
Temp: 21.12
Temp: 21.06
終了するときは、Ctrl+Cです。
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
6.tsens_mcp9600.pyの補足
# I2C device: /dev/i2c-1
bus = smbus.SMBus(1)
smbus.SMBusは、チャネルを引数とします。
I2C2を使用する際のデバイスファイルが、/dev/i2c-1の場合、上記のような記述になります。
例えば、I2C3を使用する際のデバイスファイルは、/dev/i2c-2になるので、
# I2C device: /dev/i2c-2
bus = smbus.SMBus(2)
のように記述します。
# MCP9600: slave address
address_mcp9600 = 0x67
MCP9600のアドレス(0x67)を指定しています。
# MCP9600: register
reg_devid = 0x20
reg_temp = 0x00
MCP9600のデータシートに記載されている内部アドレスを参考に
デバイスID:0x20
温度:0x00
を指定しています。
devid = bus.read_byte_data(address_mcp9600, reg_devid)
では、デバイスIDを読み出しています。
block = bus.read_i2c_block_data(address_mcp9600, reg_temp, 2)
では、温度を読み出しています。
読み出した温度を、MCP9600のデータシートの情報を参考に[℃]の単位に変換しています。