デジタルピンを増設する「IOエキスパンダー」の使い方 [Arduino]
Arduino UNOのデジタルピンは0から13ピンで合計14ピンあります。
今回の「MCP23017」を使用すると14ピンが増設されて合計28ピンを使用する事が可能です。また、増設されたピンはI2C接続でレジスタを設定する事により、HIGHとLOW(GND)のデジタル入出力を行う事が出来ます。
使用部品・材料
総額で約650円です。(Arduino本体の値段を除く)
部品/材料 | 値段 | 備考 |
---|---|---|
サンハヤト SAD-101 ニューブレッドボード | ¥500 | Amazon.com |
16bit I2C I/Oエキスパンダー MCP23017 | ¥100 | 秋月電子の通販コード(I-09486) |
タクトスイッチ | ¥10 | 秋月電子の通販コード(P-03647) |
5mm赤色LED OSDR5113A (2個) | ¥40 | 秋月電子の通販コード(I-11655) |
カーボン抵抗器 | 数円 | 10kΩ(1個)、1kΩ(2個)、220Ω(2個)を使用。 |
配線図
I2C接続用のプルアップには1kΩを使用しています。
次は公式データシートより(mcp23017_mcp23s17.pdf)
[ピン配置]
[デバイスアドレス]
[レジスタアドレス]
[レジスタ概要]
デバイスアドレスはA0,A1,A2ピンを使用しています。この3つはHIGH(Arduinoでは5V)、LOW(GND)のどちらかに接続します。3bit(8種類)ですので値を変更する事により最大8台までの「MCP23017」を接続する事が可能です。
ArduinoのI2C接続では上位7bitを使用しますので、R/Wは使用しません。
...
今回、使用するレジスタアドレスは「IOCON.BANK = 0」(標準)の方です。
その中で初期設定用の「IODIRA」「IODIRB」と、GPAとGPBピンのHIGH/LOWを設定する「GPIOA」「GPIOB」を使用しています。
スケッチ(プログラム)
電源を投入すると「GPA0~GPA7」と「GPB1~GPB7」のピンがHIGHになります。「GPB0」はLOWです。これにより、右側のLEDは点灯しますが、左側は消灯したままとなります。
左側のLEDはタクトスイッチを押すと点灯するようにしています。
#include <Wire.h> // デバイスアドレス(スレーブ) uint8_t DEVICE_ADDRESS = 0x20; // 2進 100000 // 前回のボタンの状態 // ※レジスタへの書き込み回数を減らす為です。 int pre_button = LOW; void setup() { pinMode(8,INPUT); // マスタとしてI2Cバスに接続する Wire.begin(); // 初期設定(IODIRA/IODIRB) Wire.beginTransmission(DEVICE_ADDRESS); // 先頭アドレスへ Wire.write(0x00); // I/O設定Aの全てを出力設定にする Wire.write(0x00); // I/O設定Bの全てを出力設定にする Wire.write(0x00); Wire.endTransmission(); // GPIOA(GPA0~GPA7) Wire.beginTransmission(DEVICE_ADDRESS); Wire.write(0x12); // 全てのGPAピンをHIGH(出力)にする Wire.write(0xff); Wire.endTransmission(); // GPIOB(GPB0~GPB7) Wire.beginTransmission(DEVICE_ADDRESS); Wire.write(0x13); // GPB0をLOW(入力)でそれ以外のGPBピンはHIGH(出力)にする Wire.write(0xfe); // 2進 11111110 Wire.endTransmission(); } void loop() { if (digitalRead(8) == HIGH){ if(pre_button != HIGH){ // 全てのGPBピンをHIGH(出力)にする Wire.beginTransmission(DEVICE_ADDRESS); Wire.write(0x13); Wire.write(0xff); // 2進 11111111 Wire.endTransmission(); pre_button = HIGH; } }else{ if(pre_button != LOW){ // GPB0をLOW(入力)でそれ以外のGPBピンはHIGH(出力)にする Wire.beginTransmission(DEVICE_ADDRESS); Wire.write(0x13); Wire.write(0xfe); // 2進 11111110 Wire.endTransmission(); pre_button = LOW; } } }
最後に
今回のようにデジタルピンが不足している時に、100円のMCP23017でピンを増設する方法がありますが、250円でArduinoを作る方法もあります。
掲示板
ArduinoやRaspberry Piなどの電子工作の掲示板を作成しました。質問やわからない事は電子工作 (Arduino・ラズパイ等)でユーザー同士で情報を共有して下さい。