ホーム > カテゴリ > ロボット・電子工作・マイコン >

デジタルピンを増設する「IOエキスパンダー」の使い方 [Arduino]

Arduino UNOのデジタルピンは0から13ピンで合計14ピンあります。

今回の「MCP23017」を使用すると14ピンが増設されて合計28ピンを使用する事が可能です。また、増設されたピンはI2C接続でレジスタを設定する事により、HIGHとLOW(GND)のデジタル入出力を行う事が出来ます。

使用部品・材料

総額で約650円です。(Arduino本体の値段を除く)

部品/材料値段備考
サンハヤト SAD-101 ニューブレッドボード¥500Amazon.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・ラズパイ等)でユーザー同士で情報を共有して下さい。

関連記事



公開日:2017年08月22日 最終更新日:2017年08月23日
記事NO:02536