やっつけな日常(20) Raspberry Pi 3、5V IO Expander動作確認

Joseph Halfmoon

前回、ラズパイ3機からとりだしたI2C配線を5V化するところの配線の接続確認で疲れてハードだけで終わってました。今回は動作確認用のソフトウエア(Python スクリプト)を走らせてIO Expander MCP23017が動作OKなことを確認します。動作確認方法は吉例LEDの点滅です。

※「やっつけな日常」投稿順 indexはこちら

やっつけ仕事よ、PCA9306のVREF2は外部5Vにするべきなのだが。。。

今回実験に使用した回路を冒頭のアイキャッチ画像に掲げましたが、心に咎めることが一つあります。

I2Cのレベル変換IC PCA9306のVREF2端子をラズパイ3の5Vに接続

していることです。本当は、外部5V電源で動いているIO Expander MCP23017に接続してある5V電源を接続するべきだと思います。手元にあった1mほどのケーブルが3本組だったので、GND、SCL、SDAに使ってVREF2用に割り当てないです。本当は「よゐこは真似しないでね」的回路です。なお、VREF2には電流を流すわけでなく参照電圧としての5Vなので多少引っ張っても大丈夫かと。知らんけど。

VREF2に外部5V電源が加えられていると良い事は、外部5V電源が立ち上がるまでPCA9306のEN端子はイネーブルにならないようになっていることです。イネーブルにならなければ3.3V側と5V側の間はハイインピーダンスとなって切り離なされます。安全です。しかし、アイキャッチ画像の回路はラズパイ側の5Vで動作させてしまっています。ラズパイ側が立ち上がると外部5V系が立ち上がっていなくても導通ONになってしまいます。まあ、やっつけ仕事でケーブルが1本足らなかったせいです。そのうち直します。今回の動作テストはやっつけなまま。

今回の実験回路

今回は、前回の回路のIO ExpanderのPINの先に16個のLED(+電流制限抵抗)を接続してあります。IO Expander側のPINをLowにすると電流流れるような設定です。そこで、ソフトウエアで半分ずつ(隣のビットと交互になるように)LEDを点灯、消灯すればラズパイ上でのソフト制御で全ビットの動作確認OKという目論見です。

MCP23017の制御方法については以下からデータシートが手に入ります。

MCP23017 16-Bit I2C I/O Expander with Serial Interface

以前ラズパイPico機にMCP23017を接続して MicroPython で制御したことがあったので、今回はその時のスクリプトをフルPython3に移植してます。オリジナルのMicroPythonコードは以下の投稿に添付してあります。

MicroPython的午睡(35) ラズパイPico、MCP23017でIO端子数拡張

実際にラズパイ3のPython3上で動かしてみたスクリプトが以下に。

import smbus
import time

i2c = smbus.SMBus(1)

IOEX0 = 0x20
IOEX1 = 0x21
IOCONA = 0x0A
IOCONB = 0x0B
IODIRA = 0x00
IODIRB = 0x01
GPIOA = 0x12
GPIOB = 0x13
OLATA = 0x14
OLATB = 0x15

device = IOEX0
#IOCON config
# BANK=0, MIRROR=0, SEQOP=1(NO ADDR POINTER INC), DISSLW=0, ...
i2c.write_byte_data(device, IOCONA, 0x20)
i2c.write_byte_data(device, IODIRA, 0x00) #OUTPUT
i2c.write_byte_data(device, IODIRB, 0x00) #OUTPUT
i2c.write_byte_data(device, OLATA,  0xFF) #LATCH=0xFF
i2c.write_byte_data(device, OLATB,  0xFF) #LATCH=0xFF

while (1):
    i2c.write_byte_data(device, OLATB,  0xAA)
    i2c.write_byte_data(device, OLATA,  0xAA)
    time.sleep(3)
    i2c.write_byte_data(device, OLATB,  0x55)
    i2c.write_byte_data(device, OLATA,  0x55)
    time.sleep(3)
動作確認結果

動作確認中の写真が以下に。左下がMCP23017の実験ボードです。右下から伸びてくる黒、茶、緑がPCA9306から1mちかく引っ張ってきているGND、SCL、SDAです。

左上にはLEDが16個ならんでおり、MCP23017の16本のIOポートに接続してます。ちょっとコネクタの反射光があってみずらいですが、8本づつ2系統にわけてあって、片側4灯毎に3秒間隔で点滅してます。予定どおり。

MCP23017DUT

実験用のスクリプトは、PC上で昨日編集してあったものをラズパイ3機に転送して動かしました。「いつものとおり」バグで止まることを予期していたら、一発完動。珍しいこともあるもんだ。元のMicroPythonスクリプトを移植しただけだからね。あったりまえか。

やっつけな日常(19) Raspberry Pi 3で5VのI2C、配線抜けてた動かない へ戻る

やっつけな日常(21) NodeRedダッシュボードからIO Expander制御 へ進む