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のデータシートの情報を参考に[℃]の単位に変換しています。