もよいめも

不定期更新ものづくりブログ

【Arduino】MCP23017を複数使って、デジタルピンを最大128増やす

現在、ライブラリが更新され、従来のプログラムがそのまま使用できなくなっています。新バージョンは以下にまとめてあります

moyoi-memo.hatenablog.com


皆さん、Arduinoのピンの数たりてますか?
普段は十分足りてますが、本格的なものを作ろうとするとどうしても足りなくなってしまいます。

そこでこの「MCP23017」というICです。
akizukidenshi.com
このICはI2c通信で、プログラム上もかなり簡単にピンを増やすことのできるICです。今回はこのICについて詳しく書いていこうと思います。

ちなみにSPIで通信する「MCP23S17」もありますが、今回は割愛します。

配線の仕方

まずは配線。
以下の画像の通りに配線してください。(この場合アドレスは0x00)
Arduino nanoを使用する場合はA4がSDA、A5がSCLです。

f:id:moyoi:20200313101650p:plain
配線の仕方(画像はデータシートより)

f:id:moyoi:20200314112049p:plain
配線の仕方
なんとも適当な配線ですがつまりはMCP23017のGPB0をタクトスイッチに、GPA7のLEDにつないでるだけです。

ちなみにプログラム上のピンの番号はこちら

GPB0 8 GPA7 7
GPB1 9 GPA6 6
GPB2 10 GPA5 5
GPB3 11 GPA4 4
GPB4 12 GPA3 3
GPB5 13 GPA2 2
GPB6 14 GPA1 1
GPB7 15 GPA0 0
f:id:moyoi:20200313101650p:plain
見やすいようにもう一枚

プログラム

ライブラリー

こちらからライブラリーをZIP形式でダウンロードします。
(バージョンが1.3.0以下のものをダウンロードしてください)
github.com
そして、Arduino ideのメニューのスケッチ→ライブラリーをインクルード→zip形式のファイルをインストールからダウンロードしたファイルを選択します。ソフトを再起動させれば導入は完了です。

プログラム

今回はタクトスイッチを押したときにLEDが点くプログラムにします。
もちろんこのICはデジタルピンを増やせる奴なので、アウトプットもインプット、さらにプルアップもできます。

ちなみに、ライブラリをインクルードする文でエラーを吐くこともあるそうなので、そういう場合は以下の文に置き換えてみてください。
これ↓

#include <Adafruit_MCP23017.h>

プログラムはこれ↓

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

Adafruit_MCP23017 mcp;

void setup() {
  mcp.begin(0x00);

  mcp.pinMode(7, OUTPUT);
  mcp.pinMode(8, INPUT);
  mcp.pullUp(8, HIGH);//これでプルアップ
}


void loop() {
  if (mcp.digitalRead(8) == LOW) {
    mcp.digitalWrite(7, HIGH);
  } else {
    mcp.digitalWrite(7, LOW);
  }
}

複数のMCP23S17を使う場合

右下の3つの端子(A0~A2)はアドレスを指定するためのピンなので
複数のMCP23017を使用する場合はそれぞれ別の場所につなぐようにしてください。
また、ピンとアドレスの関係は以下の図にまとめてありますので参考にしてください。
最大8つのMCPを接続できることになるのでフルに使ったら128ものデジタルピンを増やせることになります。(やったことがないので通信速度とかに問題が出るかもしれませんが)
ちなみに0がGND、1が5Vです。

A0 A1 A2 アドレス
0 0 0 0x00
1 0 0 0x01
0 1 0 0x02
1 1 0 0x03
0 0 1 0x04
1 0 1 0x05
0 1 1 0x06
1 1 1 0x07

2つのMCP23017を使う場合はこんな感じです。
ちなみに大量にLチカするプログラムです。

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

Adafruit_MCP23017 mcp1;
Adafruit_MCP23017 mcp2;

void setup() {
  mcp1.begin(0x00);
  mcp2.begin(0x01);
  for (int i = 0; i <= 15; i++) {
    mcp1.pinMode(i, OUTPUT);
    mcp2.pinMode(i, OUTPUT);
  }
}

void loop() {
  for (int i = 8; i <= 15; i++) {
    mcp1.digitalWrite(i, HIGH);
    delay(20);
    mcp1.digitalWrite(i, LOW);
  }
  for (int i = 8; i <= 15; i++) {
    mcp2.digitalWrite(i, HIGH);
    delay(20);
    mcp2.digitalWrite(i, LOW);
  }
  for (int i = 0; i <= 7; i++) {
    mcp2.digitalWrite(i, HIGH);
    delay(20);
    mcp2.digitalWrite(i, LOW);
  }
  for (int i = 0; i <= 7; i++) {
    mcp1.digitalWrite(i, HIGH);
    delay(20);
    mcp1.digitalWrite(i, LOW);
  }
}


ブログ用、MCP23017とArduinoで大量Lチカ

余談

Mcpの記事って結構書いている人いるんですよね、
そのせいかわかりませんがGoogleで検索しても全然この記事が出てこないんですよ。
もはや弾かれてるんじゃないかってレベルです。
まあ心あたりはありまして、文字数が少ないのが原因なんじゃないのかにらんでいます。
ということでこの余談を付け足してるんですよね。
自分で頑張って書いた記事が見てもらえないことは悲しい事です、これで見られるようになったらいいんですが...

なんか最近は結構上位に出るようで嬉しい限りです!

と言うことで皆さん、良きArduinoライフを!