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)の取得のみを行っています。