現在、ライブラリが更新され、従来のプログラムがそのまま使用できなくなっています。新バージョンは以下にまとめてあります
皆さん、Arduinoのピンの数たりてますか?
普段は十分足りてますが、本格的なものを作ろうとするとどうしても足りなくなってしまいます。
そこでこの「MCP23017」というICです。
akizukidenshi.com
このICはI2c通信で、プログラム上もかなり簡単にピンを増やすことのできるICです。今回はこのICについて詳しく書いていこうと思います。
ちなみにSPIで通信する「MCP23S17」もありますが、今回は割愛します。
配線の仕方
まずは配線。
以下の画像の通りに配線してください。(この場合アドレスは0x00)
Arduino nanoを使用する場合はA4がSDA、A5がSCLです。
なんとも適当な配線ですがつまりは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 |
プログラム
ライブラリー
こちらからライブラリーを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); } }