M5StickC用のIO拡張モジュールを作ってみた。

M5StickCにGPIOを16本増やせるIO拡張モジュールを作ってみた。速度的にはSPI仕様のMCP23S17を使いたかったがM5StickCのIOピンが足りないので断念しI2C仕様のMCP23017を選択。I2C仕様でも1.7MHzまで行けるようなので出来るだけ高速化するためI2Cのプルアップ抵抗を1KにしオシロでSCL信号を確認してみるとM5StickCは最大でも700KHz程度が限界のようである。とりあえず1MHzを指定し実測してみると一回のR/Wに50us程度かかるようだ。SPIの10MHz指定なら数us程度なのでそれに比べるとかなり遅いがしょうがない。
遅い分、GPIOの読み込みを少しでも高速化するためにMCP23017のINT出力を有効利用できるように以前作成したライブラリを改良してみた。どういうことをしたかと言うと、GPIOの入力変化でINT出力がONになったのを検出してから実際のリードを行うようにしただけ。常時リードよりもタイミング的に最大で約50us程度は早く処理することが可能になる。って、そんなタイミングを気にする用途ってあまりないのかもしれないが...ちなみにこのモジュールもmacsbugさんのStart Adaptor機能付きとなっている。

ライブラリの仕様は、Arduino準拠であるが次の点が異なる。また、HW的にはパワーオンで全ポートが入力ポートとなるが、ライブラリ的には、pinModeで明確に入力指定する必要があることに注意。

・inputInvert() … 入力を反転させる。
・flush()…ポート出力/設定を行う。
・refresh()…ポート入力を行う。

特に違う点は、実際に入出力を行うためにはflush/refreshを呼び出す必要があるということ。なぜそうなっているかと言うとタイミング的に複数ピンを同時制御できるようにするため。ピン単位の処理だと入出力に50usかかると仮定した場合、複数ピンの制御を完了させるためにピン数x50usの時間がかかってしまうことになる。これが問題となるかどうかは周辺回路の仕様しだいであるが...

ポート入力は、ある時点での入力状態を保持することで複数ポートの入力処理をタイミング的に適切に処理できるようになる。

【回路図】

【拡張IOモジュール】

【Lチカさせてみた】

【アップデート】
2019-08-05
INTピンによる入力処理の改良と、digitalWrite()の値をflush()なしでdigitalRead()できるように変更。

【サンプル・スケッチ(Lチカ)】

【ライブラリ】