ブログ

Armadillo-640:pythonでI2C通信

at_kazutaka.bito
2018年11月26日 9時36分

Armadillo-640で、pythonでI2C通信を確認してみました。
ここでは、I2C通信の加速度センサー(ADXL345)からデータを取得してみました。

1.Armadillo-640のCON9のI2Cを有効化

Armadillo-640: 機能拡張用インターフェース(CON9)の使用例 ~ I2Cへの割り当て ~を参考にCON9のI2Cを有効にします。
上記ブログでは、I2C2、I2C3を有効化してますが、以下では、I2C2を使用した場合で説明します。

2.Armadillo-640とI2C通信の加速度センサー(ADXL345)を接続

ここでは、3軸加速度センサモジュール ADXL345(SPI/IIC)を使用しました。
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通信の加速度センサー(ADXL345)からデータを取得

下記の内容のファイルを作成します。
(後述の説明上、このファイル名を"adxl345.py"とします。)

import smbus
from time import sleep
 
# I2C device: /dev/i2c-1
bus = smbus.SMBus(1)
 
# ADXL345: slave address
address_adxl345 = 0x1d
 
# ADXL345: register
reg_power_ctl = 0x2d
reg_datax = 0x32
reg_datay = 0x34
reg_dataz = 0x36
 
# Start Measure Mode
bus.write_byte_data(address_adxl345, reg_power_ctl, 0x08)
 
# Get X/Y/Z-Axis Data
try:
  while True:
    datax = bus.read_word_data(address_adxl345, reg_datax)
    datay = bus.read_word_data(address_adxl345, reg_datay)
    dataz = bus.read_word_data(address_adxl345, reg_dataz)
 
    print('********************')
    print('X-Axis: 0x%04x' % (datax))
    print('Y-Axis: 0x%04x' % (datay))
    print('Z-Axis: 0x%04x' % (dataz))
 
    sleep(0.1)
 
except KeyboardInterrupt:
  pass

上記で作成した"adxl345.py"を下記のようにpythonで実行すると、約0.1秒ごとにX/Y/Z軸の加速度がコンソールに表示されます。
python2の場合

root@armadillo:~# python adxl345.py

python3の場合

root@armadillo:~# python3 adxl345.py

終了するときは、Ctrl+Cです。

6.adxl345.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)

のように記述します。

# ADXL345: slave address

以降については、ADXL345と通信を行っています。
簡易的に、加速度の測定開始と、X/Y/Z軸の加速度データ(各2Byte)の取得のみを行っています。