CircuitPython 10行プログラミング (12) LチカMCP23017
Trinket M0マイコン・ボードとCircuitPythonを使って、GPIOを利用しようにもポート数が5本しかありません。ここでは、I2Cインターフェース経由でたくさんのGPIOを利用できるMCP23017を使います。
マイクロチップのMCP23017は「シリアル インターフェイス内蔵 16 ビット I/O エクスパンダ」と呼ばれています。I2Cバス用がMCP23017で、SPIバス用がMCP23S17です。どちらもGPIOは16本あります。8本のMCP23008/MCP23S08もあります。
I2Cバス用は、スレーブ・アドレスをA0、A1、A2端子の3本をHIGHもしくはLOWすることで設定できるので、最大8個のデバイスを同時に利用できます。
●MCP23017のおもなスペック
- 電源電圧 1.8~5.5V
- インターフェース周波数 100/400kHz、1.7MHz
- 初期状態 入力
- 各ピンの電流 シンク/ソース共に最大25mA
- 出力LOW Vol 0.6V(最大)
- 出力HIGH Voh Vdd-0.7V(最小)
●ピン配置と接続
A0、A1、A2をGNDにつないだので、スレーブ・アドレスは0x20です。
●プログラム
adafruit_mcp230xxライブラリでは、インスタンスを生成するMCP23017(i2c)のデフォルトのスレーブ・アドレスは0x20です。
「LED+電流制限抵抗」をGPA0、GPA1、GPA2端子にそれぞれつなぎます。プログラムを実行した結果、端子と指定番号の関係は下記のようになっていると思われます。
- 端子名 ピン番号
- GPA0 get_pin(0)
- GPA1 get_pin(1)
- GPA2 get_pin(2)
- GPA3 get_pin(3)
- GPA4 get_pin(4)
- GPA5 get_pin(5)
- GPA6 get_pin(6)
- GPA7 get_pin(7)
import board
import busio
import adafruit_mcp230xx
import time
import digitalio
i2c = busio.I2C(board.SCL, board.SDA)
#while not i2c.try_lock():
# pass
#print(i2c.scan())
mcp = adafruit_mcp230xx.MCP23017(i2c)
while 1:
i = 0
for i in range(2):
pin = mcp.get_pin(i)
pin.direction = digitalio.Direction.OUTPUT
pin.value = True # GPIO0 / GPIOA0 to high logic level
print('high')
time.sleep(1)
pin.value = False # GPIO0 / GPIOA0 to low logic level
for文のrangeを15まで増やし、GPB0、GPB1、GPB2、GPB3、GPB4、GPB5、GPB6、GPB7の各端子にLEDと電流制限抵抗をつないで実行しました。ピン番号は、連続して指定できることがわかりました。
- 端子名 ピン番号
- GPB0 get_pin(8)
- GPB1 get_pin(9)
- GPB2 get_pin(10)
- GPB3 get_pin(11)
- GPB4 get_pin(12)
- GPB5 get_pin(13)
- GPB6 get_pin(14)
- GPB7 get_pin(15)
●入力に使うときの記述
GPA7端子を入力に使います。保存し、GPA7を3.3VへつなぐとTrue、GNDへつなぐとFalseが出力されます。
import digitalio
import busio
import board
import time
import adafruit_mcp230xx
i2c = busio.I2C(board.SCL, board.SDA)
mcp = adafruit_mcp230xx.MCP23017(i2c)
pin = mcp.get_pin(7) # GPA7
pin.direction = digitalio.Direction.INPUT
pin.pull = digitalio.Pull.UP
while 1:
print(pin.value)
time.sleep(2)