部品屋根性(32) マイクロチップ MCP23017、IO Expander

Joseph Halfmoon

マイクロコントローラ(MCU、マイコン)を選定するときには、必要なピン数を賄える品種を選ぶのが基本だと思います。しかし、後付けでとか、オプションでとか色々な理由で端子数や駆動能力を拡張したくなることもある。そういうときに活躍するのが地味ですがお役立ちのIOエキスパンダではないかと思います。

※「部品屋根性」投稿順Indexはこちら

各社マイコンというとやたら品種が多いのが普通です。「シリーズ」物で「似たような機能」なのだけれど、ROM(FLASH)、RAMの容量、ピン数(パッケージ)などの組み合わせ多数。それもこれも、

必要にして十分な機能を最小コストで

という御要求にこたえるためです。「大きくする」、「数を増やす」とコストが確実にあがるんだ、これが。しかし人間、後から機能を追加したくなることもあるし、オプション機能は本体から外しておきたい時もある、また、小ピン主体のMCUシリーズではそもそも端子数が少なかったりする、というわけで、そういう時に足らないピン数を補ってくれるのがIOエキスパンダであります。

その昔、この老人がまだ新入社員であったころ、隣の席の年の近い先輩がなかなか優秀な人で、早くもワンチップ任されて設計していたのが、IOエキスパンダと呼ばれるチップでありました。小さいチップですが電源関係太すぎ。IOエキスパンダは論理的にはIO端子数を「増やすだけ」であるのですが、電流を引ける(流せる)というのも大事な機能であります。マイコン1個では規定を超える電流もIOエキスパンダがお手伝いすることでなんとかなる(かも)。

今回、秋月電子通商殿から調達いたしましたのは、

マイクロチップ社MCP23017

であります。I2Cバスに取り付けて汎用IO端子数を増やしてくれるチップです。その数16本。I2Cバス自体は2ピンしか使わないですし、他のI2Cデバイスとの接続にも使える「バス」なので実質ピン数を減らさず16本も端子を増やせる優れものです。その上1組のI2Cバス上に最大8個のMCP23017が共存できるので、最大限に使うと合計128本!メーカーの米マイクロチップ社は比較的小ピンのMCU主体で業界大手に「成り上がった」会社であるので、こういうデバイスを出しておられるのだと思います。なおSPI接続の品種もありますが、今回はI2C接続品です。

このチップをとりあえず動作させてみるために以下のテスト回路を作ってみることにいたしました。ホストとしては、Arduino系のMCUボードを利用し、後々Groveインタフェースの自作基板にできるようにとの目論見であります。

    • 5V電源、5V信号レベルI2CバスのArduino UNO(今回は純正品)
    • 3.3V電源、3.3V信号レベルI2CバスのWio Terminal

の二種類に接続して動作させてみる予定。なお、UnoのMCUはAVRマイコンATmega328P、WioのMCUはSAMD51P19であります。どちらもマイクロチップ社(に買収されたAtmel)製。

MCP23017_TEST_CIRCUITブレッドボード2枚で「試作」いたしました。下の写真の左側ボードが後で自作Grove基板化するつもりのMCP23017部分(上の回路図の青点線内)、下の写真の右側ボードが動作確認のためのLED群であります。下の写真ではMCP23017のポートAの8本は接続済ですが、空中に伸びるポートB用のジャンパ線8本とホストは未接続状態。なお、

3か所バグあり

です。このままでは動きませぬ。気付きました?

MCP23017_DUTonBBバグのうち2つは、左端の抵抗2本、SCLとSDA、プルアップする筈がプルダウンになっています。動く筈がない。もう一つは左基板の右下の方にあるジャンパピンが刺さっていること。何かのときにMCP23017にハードRESET掛けられるようにジャンパピンを用意しておいたのです。MCP23017自体はパワーオンリセット(POR)回路を内蔵しているので通常はRESETインアクティブのHighに吊り上げて置けばよいようです。でもジャンパがショートしているとずっとRESETアクティブ、これまた動く筈がありませぬ。

ハードの準備ができたところでテスト用のソフトの準備です。普通にI2Cをベタに使ってMCP23017を制御してもよいのですが、今回はArduino環境です。既に使えるライブラリがある筈。ArduinoIDEのライブラリマネージャから探したところMCP23017については7,8種類ものライブラリが存在しました。そこで「魔が差した」のは、先頭にリストされている Adafruit社製のライブラリでなく、別なシンプルな名前のライブラリを選択してしまったこと。一応、Exampleやソースを参考に書いてみたのですが、何が悪い(私の書き方が悪いノダきっと)のかI2Cバスを監視してもサッパリです。駄目だこりゃ、とあきらめ、結局Adafruit社のライブラリをインストールいたしました。

Adafruit MCP23017 Arduino Library

Adafruit社は「Arduino業界」では有名なボードメーカーだと思います。自社製ボードに使える多くのソフトウエア・ライブラリをBSDライセンスのもと使えるようにしてくれています。ただ、ソースから1行引用させていただくと

Adafruit invests time and resources providing this open source code, please support Adafruit and open-source hardware by purchasing products from Adafruit!

だそうです。気になってその辺を探したら、手元にも一応Adafruit製品がありました。お世話になっているのだから、もっと買わないといけないかね。。。

さて、Adafruit製ドライバを使って作成したテストプログラムはこちら。

#include <Wire.h>
#include "Adafruit_MCP23017.h"

Adafruit_MCP23017 mcp;

uint8_t testPin;

void setup() {  
  mcp.begin();
  for (uint8_t pn=0; pn<16; pn++) {
    mcp.pinMode(pn, OUTPUT);
    mcp.digitalWrite(pn, HIGH);
  }
  testPin = 0;
}

void loop() {
  mcp.digitalWrite(testPin, LOW);
  delay(1000);
  mcp.digitalWrite(testPin, HIGH);
  testPin = (testPin < 15) ? (testPin+1) : 0;
}

ライブラリにより、MCP23017のピンがまるで本体のピンのように扱えるようになりました。

Arduino Uno(純正品)に接続して試験

さっそく、Unoに書きこんで動作させてみたところがこちら。約1秒毎にLEDが一個づつ点灯していきます。全点灯、動作OK。
MCP23017_ArduinoUno

Wio TerminalのI2C Groveポート(電源、信号とも3.3V)に接続して試験

5Vの純正Unoから、今度は、3.3V電源、3.3V信号のWio Terminalに付け替えます。MCP23017自体は、5Vでも3.3Vでも動作可能なので、上の方の回路図のとおり、接続を変えればそのまま動く筈。動きました。なお、使用したテスト用のソフトウエアはUnoの時とまったく同じです。ターゲットボードのみ、UnoからWioへ変更して再ビルド、書き込み。

MCP23017_WioTerminalまあ、これにてGroveポート変じて16本のGPIO(早くは操作できないけれども)を確保。何に使うのか?

部品屋根性(31) HC-SR04 超音波センサ、3.3V信号接続 へ戻る

部品屋根性(33) 傾斜スイッチ、Uno/Wio/M5StickCで割り込み受け