Raspberry Pi 3にGPIOエキスパンダ「MCP23017」と「PC8574」を接続し、LEDを点滅させてタクトスイッチから入力して表示します。プログラム言語はPython3でライブラリ「pigpio」を使用します。Raspberry Pi 3の設定については「pigpioによるI2CとSPIインタフェースの実装」を参考にしてください。
GPIOエキスパンダ「MCP23017」の接続
GPIOエキスパンダ「MCP23017」は、ebayから購入しました。GPIOエキスパンダ「MCP23017」は、16チャンネルありそれぞれのピンを入力/出力に割り付ける事が可能で、2ピンの割り込み入力とプルアップもでき、I2Cでインタフェースします。
Raspberry Pi 3とGPIOエキスパンダ「MCP23017」間で、I2CのSDAとSCLのそれぞれに接続します。GPIOエキスパンダ「MCP23017」のVCCにはRaspberry Piの3.3Vを入力します。接続した図を次に示します。
GPIOエキスパンダ「MCP23017」のピン配置を次に示します。
次のコマンドでRaspberry Pi 3との接続を確認します。
$ i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: 20 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
- GPIOエキスパンダ「MCP23017」のアドレス – 0×20
GPIOエキスパンダ「MCP23017」のPythonスクリプト
Python3でライブラリ「pigpio」を使用して、GPIOエキスパンダ「MCP23017」のPythonスクリプト「mMCP23017.py」を作成します。MCP23017のデータシートを示します。
GPIOエキスパンダ「MCP23017」のレジスタの一覧を次に示します。
I/O方向レジスタの形式を次に示します。GPA0(21) 〜 GPA7(28)の出入力設定を行います。
I/Oポートレジスタの形式を次に示します。
出力ラッチレジスタの形式を次に示します。GPA0(21) 〜 GPA7(28)の出力制御(出力オン/オフ)を行います。
mMCP23017.py
import time
import mMCP23017
import pigpio
class MCP23017(object):
DEFAULT_ADDRESS = 0x20
REG_IODIRA = 0x00 # 入出力設定レジスタA
REG_IODIRB = 0x01 # 入出力設定レジスタB
REG_GPIOA = 0x12 # 入力レジスタB
REG_GPIOB = 0x13 # 入力レジスタB
REG_OLATA = 0x14 # 出力レジスタA
def __init__(self, pi):
self.pi = pi
self._device = pi.i2c_open(1, self.DEFAULT_ADDRESS)
def output(self):
reg_data = [self.REG_IODIRA, 0]
self.pi.i2c_write_device(self._device, reg_data)
time.sleep(2)
reg_data = [self.REG_OLATA, 0x10]
self.pi.i2c_write_device(self._device, reg_data)
time.sleep(2)
reg_data = [self.REG_OLATA, 0x0]
self.pi.i2c_write_device(self._device, reg_data)
def input(self):
reg_data = [self.REG_IODIRB, 0xff]
# reg_data = [self.REG_IODIRA, 0xff]
self.pi.i2c_write_device(self._device, reg_data)
reg_data = self.REG_GPIOB
# reg_data = self.REG_GPIOA
wc,data = self.pi.i2c_read_i2c_block_data(self._device, reg_data,2)
print("input:{:x}".format(data[0]))
time.sleep(2)
def cancel(self):
if self._device is not None:
self.pi.i2c_close(self._device)
self._device = None
if __name__ == "__main__":
pi = pigpio.pi()
if not pi.connected:
exit(0)
exp = mMCP23017.MCP23017(pi)
while True:
exp.output()
exp.input()
dac.cancel()
pi.stop()
GPIOエキスパンダ「MCP23017」のPythonスクリプトの実行
作成したPythonスクリプトを次のコマンドで実行します。タクトスイッチを押すと「0x10」、離すと「0」が表示されます。
$ python3 mMCP23017.py input:0 input:0 input:0 input:0 input:0 input:10 input:10 input:10 input:10 input:10 input:10
GPIOエキスパンダ「PC8574」の接続
GPIOエキスパンダ「PC8574」は、8チャンネルありそれぞれのピンを入力/出力に割り付ける事が可能で、I2Cでインタフェースします。
GPIOエキスパンダ「PC8574」のPythonスクリプト
Python3でライブラリ「pigpio」を使用して、GPIOエキスパンダ「PC8574」のPythonスクリプト「mPC8574.py」を作成します。PC8574のデータシートを示します。
PC8574は、I2Cを指定して、書き込みたいときは書き込みデータを、読みたいときは読み込みコマンドでそれぞれ8ビットのデータが入出力されます。1ビットごとの入出力でないので、関係のないビットはマスクして処理を行う必要があります。
mPC8574.py
# -*- coding: utf-8 -*-
import pigpio
import asyncio
import time
EXP1_ADDRESS = 0x38
class PC8574(object):
MASKPOWER = 1
MASKREADY = 2
MASKERROR = 4
def __init__(self, pidata, loggerdata, address):
self.pi = pidata
self.logger = loggerdata
self._device = pidata.i2c_open(1, address)
def output(self, data):
self.pi.i2c_write_byte(self._device, data)
self.logger.debug("_device:{} data:{:x}".format(self._device, self.pi.i2c_read_byte(self._device)))
# self.pi.i2c_write_device(self._device, [data])
def input(self):
indata = self.pi.i2c_read_byte(self._device)
self.logger.debug("input:{:x}".format(indata))
return indata
def cancel(self):
if self._device is not None:
self.pi.i2c_close(self._device)
self._device = None
if __name__ == "__main__":
pi = pigpio.pi()
if not pi.connected:
exit(0)
exp = PC8574(pi, EXP1_ADDRESS)
while True:
exp.output(0x80)
# exp.input()
dac.cancel()
pi.stop()






