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)