python-peripheryを使ってみる

GPIO入出力ポートの拡張

ディジタルポートを拡張したい場合があります。
そこで、i2cの調査を兼ねてMCP23017を使って入出力ポートを拡張してみました。

python-peripheryのi2c制御は書式が複雑です。
基本は以下の書式です。
i2c = I2C(デバイスファイル名)
address = I2C.Message([レジスターアドレス])
payload = I2C.Message([レジスターデータ], read=True/False)
msgs = [address, payload]
i2c.transfer(i2cアドレス, msgs)
i2c.close()

レジスターアドレス=0x20から、4バイトの連続したデータを読み込む場合、以下の様になります。
レジスターデータは意味を持たずに、リストの長さだけが重要になります。
読み込んだデータはmsgs[1].dataに戻ります。
i2c = I2C("/dev/i2c-0")
address = I2C.Message([0x20])
payload = I2C.Message([0,0,0,0], read=True)
msgs = [address, payload]
i2c.transfer(i2cアドレス, msgs)
print(msgs[1].data[0])
print(msgs[1].data[1])
print(msgs[1].data[2])
print(msgs[1].data[3])
i2c.close()

レジスターアドレス=0x20に、0x30のデータを書き込む場合、以下の様になります。
i2c = I2C("/dev/i2c-0")
address = I2C.Message([0x20])
payload = I2C.Message([0x30], read=False)
msgs = [address, payload]
i2c.transfer(i2cアドレス, msgs)
i2c.close()

1行で書くと以下の様になります。
i2c = I2C("/dev/i2c-0")
msgs = [I2C.Message([0x20])
, I2C.Message([0x30], read=False)]
i2c.transfer(i2cアドレス, msgs)
i2c.close()

PCF8574の様にレジスターアドレスが無いデバイスの場合、以下の書式となります。
i2c = I2C(デバイスファイル名)
payload = I2C.Message([レジスターデータ], read=True/False)
msgs = [payload]
i2c.transfer(i2cアドレス, msgs)
i2c.close()

レジスターアドレスが無いデバイスの場合、読み込んだデータはmsgs[0].dataに戻ります。
i2c = I2C("/dev/i2c-0")
payload = I2C.Message([0], read=True)
msgs = [payload]
i2c.transfer(i2cアドレス, msgs)
print(msgs[0].data[0])
i2c.close()



こちらに MCP23017のサンプルを公開しています。
起動時の引数でi2cデバイスファイルを指定します。
RaspberryPiで使うときは「--device /dev/i2c-1」を指定します。
各ポートの最大供給電流は25mAで、結構な明るさでLEDが光ります。
$ sudo -E python3 main.py --help
usage: main.py [-h] [-d DEVICE] [-a ADDR] [--delay DELAY]

optional arguments:
  -h, --help            show this help message and exit
  -d DEVICE, --device DEVICE
                        device file name
  -a ADDR, --addr ADDR  i2c address
  --delay DELAY         Delay time

$ sudo -E python3 main.py --device /dev/i2c-1



こちらに PCF8574のサンプルを公開しています。
起動時の引数でi2cデバイスファイルを指定します。
RaspberryPiで使うときは「--device /dev/i2c-1」を指定します。
全体で供給できる最大電流は80mAです。
各ポートに供給できる電流が小さいので、LEDはあまり明るくなりません。
$ sudo -E python3 main.py --help
usage: main.py [-h] [-d DEVICE] [-a ADDR] [--delay DELAY]

optional arguments:
  -h, --help            show this help message and exit
  -d DEVICE, --device DEVICE
                        device file name
  -a ADDR, --addr ADDR  i2c address
  --delay DELAY         Delay time

$ sudo -E python3 main.py --device /dev/i2c-1



こちらに HC595(シフトレジスター)のサンプルを公開しています。
起動時の引数でDataピン、Latchピン、ClockピンのGPIO番号を指定します。
出力しかできませんが、各ポートに35mAを流せるようです。結構な明るさでLEDが光ります。
$ sudo -E python3 main.py --help
usage: main.py [-h] [--data DATA] [--latch LATCH] [--clock CLOCK] [--delay DELAY]

optional arguments:
  -h, --help     show this help message and exit
  --data DATA    DATA GPIO
  --latch LATCH  LATCH GPIO
  --clock CLOCK  CLOCK GPIO
  --delay DELAY  Delay time


$ python3 main.py --data 23 --latch 24 --clock 25

続く
...