ブログ

Armadillo-640:I2C通信の熱電対温度センサ(MCP9600)からデータ取得(python編)

at_kazutaka.bito
2019年2月5日 10時59分

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