Translate

2019年11月14日木曜日

I2C 通信の smbus ベースのコードをpigpioに移植中にi2c_read_i2c_block_dataではまる

Python で MPU9250 を使おうとして、
以下のリポジトリを発見。

https://github.com/FaBoPlatform/FaBo9AXIS-MPU9250-Python

ただ、既存コードを pigpio ベースで行っているので、
Apache-2.0ライセンスでもあることから、
コードを書き換えてみようとためしてみた。

pigpioのi2c関連の関数は、
pigpio.pi()で取得したオブジェクトに
smbus とほとんど同じ名前で同じ機能があるので
ほいほいと書き換えていった..

引数のアドレスをpigpioハンドラにすれば
ほとんど変更いらずだわ..

..と、思っていたのだけど..

smbusの

read_i2c_block_data(addr, cmd)

の戻り値が

long[]

になっているのに対し、

pigpio の

i2c_read_i2c_block_data(handle, reg, count)

の戻り値は

Tupple

1要素目が0以上が正常読み込みしたことをあらわし、
負値の場合はエラーコードになる。

そして2要素目が取得した値なのだけど..
これがbytearrayになってる..


..めんどくさー



おきをつけあれ。


ちなみに..私は以下のラップ関数で逃げました。

ご参考まで。

def read_i2c_block_data(pi, handler, reg, count):
    """
    SMBusのread_i2c_block_dataと戻り値を合わせるための関数。
    引数:
        handler     pigpio I2C ハンドラ
        reg         デバイスレジスタ
        count       読み込むバイト数
    戻り値:
        int[]       read_i2c_block_dataの戻り値はlong[]だがpython3
                    なのでint[]
    例外:
        ConnectionError エラーの場合
    """
    if pi is None:
        try:
            import pigpio
        except:
            raise
        pi = pigpio.pi()
    (b, d) = pi.i2c_read_i2c_block_data(handler, reg, count)
    if b >= 0:
        data = []
        for i in range(count):
            value = int(d[i])
            data.append(value)
        return data
    else:
        raise ConnectionError('Error:{} in i2c_read_i2c_block_data'.format(
            str(b)))


誤りがあれば、コメント欄にご指摘ください。

0 件のコメント:

既存アプリケーションをK8s上でコンテナ化して動かす場合の設計注意事項メモ

既存アプリをK8sなどのコンテナにして動かすには、どこを注意すればいいか..ちょっと調べたときの注意事項をメモにした。   1. The Twelve Factors (日本語訳からの転記) コードベース   バージョン管理されている1つのコードベースと複数のデプロイ 依存関係 ...