Quick2Wire(3)

Quick2WireでI2C通信を行うのは簡単で、基本的にはI2CMasterオブジェクトのtransactionメソッドを使用するだけで済む。このメソッドの引数としてI2Cデバイスに対する読み書きを記述する。

説明するよりも実際のコードを見たほうがたぶん早い。お馴染みの温度センサーADT7410をRaspberry PiのI2Cポートに接続して、温度を読み出すプログラムは以下のようになる。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from quick2wire import i2c
from time import sleep

ADT_ADDR = 0x48

def get_temp(addr):
    with i2c.I2CMaster() as bus:
        data = bus.transaction(
                    i2c.writing_bytes(addr, 0x00),
                    i2c.reading(addr, 2))
        h = data[0][0]
        l = data[0][1]
        t = (h << 8 | l) >> 3
        if t & 0x1000:
            t = -((t - 1) ^ 0x1FFF)
        return round(t / 16.0, 2)

if __name__ == '__main__':
    try:
        while True:
            print("current temperature -> %7.2f" % get_temp(ADT_ADDR))
            sleep(1)
    except IOError as err:
        print('\nIOError: {0}'.format(err))            
    except KeyboardInterrupt:
        print('\nbreak')

with文でI2CMasterオブジェクトを作成して、transactionメソッドのパラメータとしてI2CデバイスへのRead/Writeを記述する。これは複数並べて書くことができるので、戻り値は必ず二次元配列(リスト)になる。アドレスが異なるデバイスへのアクセスを記述することもできる。たとえば

with i2c.I2CMaster() as bus:
    data = bus.transaction(
                i2c.writing_bytes(0x48, 0x00),
                i2c.reading(0x48, 2),
                i2c.writing_bytes(0x5c, 0x28),
                i2c.reading(0x5c, 1),
                i2c.writing_bytes(0x5c, 0x29),
                i2c.reading(0x5c, 1),
                i2c.writing_bytes(0x5c, 0x2A),
                i2c.reading(0x5c, 1))

このように書くと、以下のようなデータが帰ってくる

0x48のレジスタ0x00の値 0x48のレジスタ0x01の値
0x5cのレジスタ0x28の値 無効
0x5cのレジスタ0x29の値 無効
0x5cのレジスタ0x2Aの値 無効

複数のI2Cデバイスがぶら下がっているような場合や、一つのI2Cデバイスでも複数のレジスタに同時にアクセスしなければならないような場合に、まとめて記述する事ができるので便利ではないかと思う。ただし、その場合はエラー処理で注意が必要になるかも知れない。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中