pyftdiでI2C通信

pyftdiでI2Cデバイスをつなげてみました。

接続したデバイスは昔秋月で買ったLPS331使用の大気圧センサモジュールです。

回路はこんな感じ。

右側のがLPS331使用の大気圧センサモジュール。真ん中のLEDは使用していません。

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

from os import environ
import sys
from pyftdi.i2c import I2cController
from time import sleep

class LPS331(object):
    """
    """

    def __init__(self):
        self._i2c = I2cController()

    def open(self):
        url = environ.get('FTDI_DEVICE', 'ftdi://ftdi:232h/1')
        self._i2c.configure(url,frequency=400000)
        self._port = self._i2c.get_port(0x5c)

    def close(self):
        pass

    def init(self):
        port = self._port
        port.write([0x10,0x6A])		# Pres Average 512 / Temp Average 64
        port.write([0x20,0xF4])		# ODR=25Hz、BDU=1
    
    def read(self):
        port = self._port
        out1 = port.exchange([0x08],1)
        out2 = port.exchange([0x09],1)
        out3 = port.exchange([0x0a],1)
        refp = (out1[0] + out2[0]*256 + out3[0]*65536)/4096.0
        out1 = port.exchange([0x28],1)
        out2 = port.exchange([0x29],1)
        out3 = port.exchange([0x2a],1)
        pres = (out1[0] + out2[0]*256 + out3[0]*65536)/4096.0
        out1 = port.exchange([0x2b],1)
        out2 = port.exchange([0x2c],1)
        out = (out1[0] + out2[0]*256) 
        if out >= 0x8000 : out -= 0x10000
        temp = 42.5 + out/480.0
        return(refp,pres,temp)
        
if __name__ == '__main__':
    lps331 = LPS331()
    lps331.open()
    lps331.init()
    while True:
        (refp,pres,temp) = lps331.read()
        print(refp,pres,temp)
        sleep(1)

実行すると

$ python ftdi-lps331.py 
0.0 1012.830078125 27.485416666666666
0.0 1012.68212890625 27.504166666666666
0.0 1012.84716796875 27.525
0.0 1012.838134765625 27.508333333333333
0.0 1012.654296875 27.541666666666664
0.0 1012.570556640625 27.53125

という感じで気圧と気温を取得できました。

これでデスクトップPCでもI2Cデバイスの評価などができて便利そうです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)