Arduinoを使って多接点(20ch程度)コントロールを行うデバイス開発の打診が来たので、GPIOエクスパンダを使って検証をする事にしました。
GPIOエクスパンダは MCP23017 を使ったブレークアウトがありスイッチサイエンスからRaspberryPi用のものが販売されています。
半田付けも楽そうだし、これが使えるかと入手してみたのですが、、、大きさが中途半端に長くてシールドの基板に乗らない。。仕様的に2枚必要なのでこのままではArduinoには適していません。
半田付けも考えてみたらブレークアウトボードのソケットから外へケーブル引っ張り出さないといけないので手間はブレークアウトを使ってもあまりメリットないですね。
そんなわけで秋月におなじMCP23017のDIPがありますのでそいつを使ってシールドを一から半田付けして作ってみる事にしました。
丁度2個乗って良い具合です。回路とスケッチはこちらのサイトを参考にさせて頂きました。
MCP23017用のC++クラスもgithubにありますが、こちらのサンプルでは普通のWireクラスだけ使ってi2c通信を行いアクセス・コントロールさせています。GPIOのOutputだけの操作で単発のレジスタに一バイトづつ書込するだけなのでクラス化しなくても面倒はありません。
とりあえず、MCP23017一個 16ch 動作確認用のjig LEDアレイを半田付け。これが一番面倒くさい。
動作確認できました。ここではLED 8chを2系列ランダムに点灯させています。
デバッグ
しばらく動作させていると、突然点滅が停止するという事態が発生しました。リセットでは再稼働せず、電源を抜いて少しおくとまた復帰するという状況でした。
アナログ的におかしな事なっているので、他の回路をみたところスイッチサイエンスのブブレークアウトでは /RESET がプルアップされています。真似てVccでプルアップしたところ安定しました。/RESET端子のプルアップは必須の様です。