デジタルピンを増設する「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・ラズパイ等)でユーザー同士で情報を共有して下さい。
関連記事
プチモンテ ※この記事を書いた人
![]() | |
![]() | 💻 ITスキル・経験 サーバー構築からWebアプリケーション開発。IoTをはじめとする電子工作、ロボット、人工知能やスマホ/OSアプリまで分野問わず経験。 画像処理/音声処理/アニメーション、3Dゲーム、会計ソフト、PDF作成/編集、逆アセンブラ、EXE/DLLファイルの書き換えなどのアプリを公開。詳しくは自己紹介へ |
| 🎵 音楽制作 BGMは楽器(音源)さえあれば、何でも制作可能。歌モノは主にロック、バラード、ポップスを制作。歌詞は抒情詩、抒情的な楽曲が多い。楽曲制作は🔰2023年12月中旬 ~ | |









