![]()
22.I/Oポートの拡張 (2020.10.11)
Raspberry Piの応用の準備として、まずはI/Oポートの拡張をしたいと思います。調べたところ、IOエキスパンダ(MCP23017)というデバイスを使えば簡単に増設できることがわかり、価格も100円程度と安いようなので利用してみることにしました。Raspberry PiとはI2Cを使って通信を行います。IOエキスパンダには16個のポートがあり、 Raspberry Pi1台に対して最大で8個まで増設できるとのことです。つまり16×8=128ポートまで増やせるわけです。これだけあればポートが不足することはまず無いと思います。
MCP23017の資料を下図に示します。上がICのピン配列、下がレジスタのアドレス表です。通常は図のBANK0を使用しますが、BANK1に切り替えて使用することもできます。パワーオンリセット回路は内蔵しているようですが、通常使用ではHに固定しておきます。


今回は実験なので、IOエキスパンダを1個(16ポート)で行います。I2CでのセレクトではA0~A2を全てL(GND)に固定して、本デバイスのI2Cの下位アドレスを0にしています。ターミナルでアドレスを確認したところ、20Hになっていました。応用的には十分にポートを確保するために、2個(32ポート)または4個(64ポート)使ってシステムを組みたいところです。入出力は自由に設定できますが、今回はPORTAの全8ポートを出力に、PORTBの全8ポートを入力にします。出力を確認しやすいようにPORTAにはLED(8個)を、簡単に入力するためにPORTBにはディップスイッチ(8bit)を付けます。
実験とは言えブレッドボードで配線するには大掛かりになるので、市販の蛇の目基板に組むことにしました。入力ポートに関しては、誤って出力に設定して回路をショートしないように、回路上に保護抵抗を入れています。入力側の回路次第では閾値に問題が出る場合があるため、実用回路では抵抗値等も再検討すべきだと思われます。ただし、取り扱いミスに注意すれば本来は不要なものです。因みにアナログテスターでスイッチ部の電圧を測ろうとすると、OFF(High)でもかなり電圧が下がってLowと判断してしまいました。実験ではディップスイッチの状態を調べて、対応するビットのLEDを点灯/消灯します。
テストボードの全景
拡大図(スイッチ-LEDの点灯比較)
簡単なテストプログラムを書いてみました。PORTBのスイッチの状態を調べ、PORTAのLEDを点灯または消灯するものです。無限ループで繰り返し処理を続け、キーボード割り込みで終了します。

プログラムではtimeモジュールをインポートしていますが、今回は関連する関数は使いません。テスト時に時間待ちを入れた時の名残りです。このハードを使ってLEDをフラッシュさせたり、スイッチの状態によって点灯状態を制御したりと、プログラム次第で様々な処理をさせることができます。上記プログラムを元にすれば色々と応用が利くと思うので、今後も入出力の実験に使いたいと思います。今回は一連の全ポートを入力か出力に分けましたが、本来はビット単位で入出力をコントロールできるので、実使用では状況に応じて有効にポートを利用すると良いでしょう。
![]()