Skip to Content

Using GPIO Expander MCP23017 With Arduino (Get up to 128 GPIOs)

Using GPIO Expander MCP23017 With Arduino (Get up to 128 GPIOs)

In this guide, I will teach you about the I2C IO expander – MCP23017, which enables you to control up to 128 GPIO pins using only two lines on an Arduino. 

If you sometimes feel the number of GPIOs on the Arduino is too limited then this is the tutorial for you. For example, if you want to control 20 LEDs or a 4×7 segment display, you can use the IO expander ICs to increase the number of inputs, outputs, or both. 

In this tutorial, I will take you through the basic working principle of the IO expander. I will provide a step-by-step guide to connect an MCP23017 module to an Arduino UNO. I will also show you a complete working Arduino code example. 

Al final del tutorial, encontrará las aplicaciones y respuestas a las preguntas más frecuentes sobre el expansor IO. 

Comencemos.

Componentes necesarios para construir el proyecto Arduino MCP23017

Componentes de hardware

Software

Makerguides.com participa en el Programa de Asociados de Amazon Services LLC, un programa de publicidad de afiliados diseñado para proporcionar un medio para que los sitios ganen honorarios de publicidad mediante la publicidad y los enlaces a productos en Amazon.com.

Fundamentos del MCP23017 IO Expander IC

In this section, we will understand more about the MCP23017 IC. I will cover details about the electrical parameters, pin functions, and more. By the end of this section, you will know how to add MCP23017 IO expanders to your applications to increase the number of GPIOs.

El MCP23017 IO Expander IC

Características básicas del módulo MCP23017

Below you can see the block diagram of the MCP23017 I/O Expander IC.  It consists of an I2C interface for communication with Arduino, and also an address line selection for the IC, SERDES (serialise and de-serialise), GPIO ports, and interrupt pins.

Características básicas del módulo MCP23017

El IC MCP23017 es un expansor de E/S basado en I2C. Tiene las siguientes características.

  1. Proporciona 16 GPIOs: Los 16 pueden actuar independientemente como pines de entrada o salida.
  2. Soporta la interfaz I2C con todos los modos ( 100 kHz, 400 kHz, así, y 1 MHz)
  3. Puedes configurar la dirección I2C. Tienes tres pines que puedes conectar en alto o en bajo. En total, puedes tener ocho direcciones. 
  4. With 8 I2C addresses and 16 GPIO pins per expander module you could control up to 8 * 16 = 128! GPIO pins.
  5. Soporta funciones de interrupción - Puede generar una interrupción cuando un pin cambia.
  6. Amplio rango de tensión de funcionamiento - 1,8 V a 5,5 V
  7. Baja corriente de espera: por lo tanto, es una buena opción para los dispositivos alimentados por batería.

Distribución de pines del expansor IO MCP23017

Here is the pin-out diagram of the MCP23017. The IC has 28 pins. The function of the individual pins is explained in the table below.

Distribución de pines del expansor IO MCP23017
Etiqueta de la clavijaDescripción de la clavija
GPB0-GPB7Pin de entrada y salida bidireccional. Puede habilitarse para interrupción por cambio y/o resistencia interna de pull-up débil
GPA0-GPA7Pin de entrada y salida bidireccional. Puede habilitarse para interrupción por cambio y/o resistencia interna de pull-up débil
VDDPotencia
VSSTierra
NCSin conexión. Dejar el pin sin conectar
SCLLínea de reloj serie (I2C)
SDALínea de datos en serie (I2C)
A0Clavija de dirección de hardware A0 - Debe estar polarizada externamente
A1Clavija de dirección de hardware A1 - Debe estar polarizada externamente
A2Clavija de dirección de hardware A2 - Debe estar polarizada externamente
RESET#Pin de reinicio activo bajo
INTBSalida de interrupción para el puerto B. Puede configurarse como activa-alta, activa-baja o de drenaje abierto
INTASalida de interrupción para el puerto A. Puede configurarse como activa-alta, activa-baja o de drenaje abierto

The IC has three address configuration pins. You can connect up to 8 IO modules onto the I2C line of the Arduino UNO. Just make sure each module has its unique address configured.

La siguiente tabla contiene la información sobre las 8 direcciones I2C que se pueden crear utilizando 3 líneas de dirección.

Configuración de bits de direcciónDirección I2C
0000100000
0010100001
0100100010
0110100011
1000100100
1010100101
1100100110
1110100111

Especificaciones eléctricas de MCP23017

The MCP23017 IC can be powered from 5 V or 3.3 V. Let us see a few critical electrical parameters of the IC, which are essential to ensure you can build the project.

CaracterísticaGamaObservaciones
Tensión de alimentación1,8 V a 5,5 VConecta 3,3 V para dispositivos Arduino alimentados por 3,3 V. Conecta este pin a 5 V si necesitas conectar Arduino UNO. 
Corriente de alimentación1 mA1 mA es la corriente de reposo (cuando no hay GPIOs conectados) 
Corriente de espera1 uABuena opción para los dispositivos con batería
Tensión lógica (baja)0,2 x VDDSi la alimentación es de 5 V, el nivel de tensión baja lógica será de 1 V. Todo lo que sea inferior a 1 V se detectará siempre como un 0 lógico.
Tensión lógica (alta)0,8 x VDDSi la alimentación es de 5 V, el nivel de tensión baja lógica será de 1 V. Todo lo que sea inferior a 1 V se detectará siempre como un 0 lógico.
Salida Baja tensión0.8 V Máximo
Salida de alta tensiónVDD - 0,7 VMínimo

Aplicaciones del IO Extender IC - MCP23017

En la imagen siguiente puede encontrar la aplicación de un expansor IO.

aplicación de un expansor IO

La interfaz I2C permite controlar el expansor IO. El expansor IO es una opción popular para sistemas informáticos, de electrónica de consumo, de comunicación, industriales y de automatización. 

He aquí algunos ejemplos de situaciones en las que puede utilizar este módulo:

  1. LED Matrix application – LED matrices typically need 8 to 12 IO lines. Connecting the LED matrix module directly to the MCU will use up a lot of MCU pins. An IO Expanders, in this case, is the best solution. For more details read our guide on Interfacing an LED Dot Matrix display with Arduino
  1. Keypads – You can save many MCU pins when working with matric switches or keypads. IO expanders are fast in responding. You can easily use IO expanders to interface alphanumeric keypads to an MCU using only two I2C lines.  Have a look at our tutorial on How to use a Keypad with Arduino, if you want to do this.
  1. Collective interrupts from multiple subsystems  – You can use MCP23017 to interrupt the main MCU. Here, the MCP23017 will collect all the interrupts from the other subsystems and interrupt the MCU. MCU can collectively read the interrupts and take action later.
  2. Interfacing to relay boards – You can use IO expanders to connect relay boards to the Arduino. Relay boards usually contain 4 to 16 relays on board. Each relay needs a dedicated GPIO pin to control them. IO expanders come in handy in these situations too. For more information, see our post Using a Relay With Arduino.

Instrucciones paso a paso para conectar el MCP23017 IO Expander con Arduino UNO

En esta sección, vamos a construir un proyecto utilizando Arduino UNO y el IO Expander MCP23017.

Primero cubriré las conexiones de hardware, y luego compartiré un código de ejemplo para un par de proyectos simples.

¿Cómo conectar el MCP23017 IO Expander al Arduino UNO?

A continuación se muestra la guía de conexión paso a paso para completar el Arduino y el módulo expansor IO MCP23017. 

Paso 1: Empezar con las conexiones GND

Comienza con las conexiones GND

Puedes elegir cualquier pin GND en el Arduino para completar las conexiones GND. Es una buena práctica conectar primero los pines GND.

Conecta el pin GND de la placa MCP23017 al pin GND del Arduino UNO. 

Paso 2: Conectar el pin SDA

Conectar el pin SDA

Conecte el pin de datos I2C (SDA) del módulo MCP23017 al pin A4 del Arduino UNO. La línea de datos I2C es el Pin A4 del Arduino UNO.

Paso 3: Conectar el pin SCL

Conecte el pin SCL

Conecte el pin de reloj I2C (SCL) del módulo MCP23017 al pin A5 del Arduino UNO. La línea de reloj I2C es el Pin A5 del Arduino UNO.

Paso 4: Completar la conexión eléctrica

Completar la conexión eléctrica

Conecta los 5 V del Arduino UNO al pin VCC del módulo MCP23017. 

Paso 5: Completar el diagrama de conexión

Esquema de conexión completo

Enhorabuena, con estas conexiones, puedes comunicarte con el expansor IO y probar las conexiones. 

You can use the below sketch to control the IO expander using Arduino.  In this example, you will turn on and turn off an LED connected to the IO expander using a switch also connected to the Arduino board.  You can find the connection diagram below:

Conexiones LED

  • Conecta una resistencia de 470 ohmios al pin del ánodo del LED.
  • Conecta el pin del cátodo del LED al pin GND del UNO. 
  • Conecte el otro extremo de la resistencia de 470 ohmios al pin A0 del expansor IO. 

Conexiones de botones

  • Conecte la pata del botón al pin A1 del expansor IO
  • Conecta la pata del botón opuesto al pin GND de la placa

Código Arduino 

Código para controlar un LED con un interruptor

Instala la biblioteca MCP23017 de Adafruit.

Instalar la biblioteca MCP23017 de Adafruit

Vaya a Herramientas y seleccione gestionar bibliotecas. 

  1. Busque MCP23017 en la barra de búsqueda. 
  2. Haga clic en Instalar
instalar todas las bibliotecas dependientes

Cuando se le pregunte, seleccione instalar todas las bibliotecas dependientes

instalar todas las bibliotecas dependientes

El Código completo

// Controls an LED via an attached button.
 
// ok to include only the one needed
// both included here to make things simple for example
#include <"Adafruit_MCP23X08.h"
#include "Adafruit_MCP23X17.h"
 
#define LED_PIN 0     // MCP23XXX pin LED is attached to
#define BUTTON_PIN 1  // MCP23XXX pin button is attached to
 
// only used for SPI
#define CS_PIN 6
 
// uncomment appropriate line
Adafruit_MCP23X08 mcp;
//Adafruit_MCP23X17 mcp;
 
void setup() {
  Serial.begin(9600);
  //while (!Serial);
  Serial.println("MCP23xxx Combo Test!");
 
  // uncomment appropriate mcp.begin
  if (!mcp.begin_I2C()) {
  //if (!mcp.begin_SPI(CS_PIN)) {
    Serial.println("Error.");
    while (1);
  }
 
  // configure LED pin for output
  mcp.pinMode(LED_PIN, OUTPUT);
 
  // configure button pin for input with pull up
  mcp.pinMode(BUTTON_PIN, INPUT_PULLUP);
 
  Serial.println("Looping...");
}
 
void loop() {
  mcp.digitalWrite(LED_PIN, !mcp.digitalRead(BUTTON_PIN));
}

Código para hacer parpadear un LED conectado al Pin A0 del Expansor IO

// Blinks an LED attached to a MCP23XXX pin.
 
// ok to include only the one needed
// both included here to make things simple for example
#include "Adafruit_MCP23X08.h"
#include "Adafruit_MCP23X17.h"
 
#define LED_PIN 0     // MCP23XXX pin LED is attached to
 
// only used for SPI
#define CS_PIN 6
 
// uncomment appropriate line
Adafruit_MCP23X08 mcp;
//Adafruit_MCP23X17 mcp;
 
void setup() {
  Serial.begin(9600);
  //while (!Serial);
  Serial.println("MCP23xxx Blink Test!");
 
  // uncomment appropriate mcp.begin
  if (!mcp.begin_I2C()) {
  //if (!mcp.begin_SPI(CS_PIN)) {
    Serial.println("Error.");
    while (1);
  }
 
  // configure pin for output
  mcp.pinMode(LED_PIN, OUTPUT);

  Serial.println("Looping...");
}
 
void loop() {
  mcp.digitalWrite(LED_PIN, HIGH);
  delay(500);
  mcp.digitalWrite(LED_PIN, LOW);
  delay(500);
}

Preguntas frecuentes sobre el expansor IO MCP23017 y los proyectos Arduino

He incluido una lista de las preguntas más frecuentes sobre los proyectos construidos con Arduino y el IO expander IC MCP23017. 

How do I connect my Arduino to the MCP23017?

You can connect the MCP23017 to the Arduino using I2C lines. You can use the SDA and SCL lines of the Arduino UNO. The SDA pin is on the A5 pin of the Arduino. The SCL pin is on the A4 pin of the Arduino. 

How do I address the MCP23017?

El MCP23017 soporta la comunicación I2C. La dirección I2C del MCP23017 IC depende de la terminación de los tres pines, A0, A1 y A2.

La ventaja de tener líneas de dirección configurables es que se pueden direccionar hasta ocho MCP23017 IO Expander.

¿Cómo puedo dirigirme a MCP23017

What is the MCP23017?

El MCP23017 es un expansor de E/S. Soporta una interfaz I2C. MCP23017 tiene 16 GPIOs. Puede configurar cada GPIO como una entrada o una salida.

Puedes utilizar el expansor IO MCP23017 para conectar teclados, placas LED y otras interfaces que demanden más pines fácilmente al Arduino. 

How much current can the MCP23017 supply?

El MCP23017 puede soportar hasta 8 mA para conducir la carga. Aquí hay una captura de pantalla de la hoja de datos.

¿Cuánta corriente puede suministrar el MCP23017?

El MCP23017 puede absorber hasta 8 mA a 5 V. La capacidad de suministro de corriente es de 3 mA a 5 V.

Esto es suficiente para accionar LEDs individuales para la mayoría de los tipos de pantallas. 

Conclusión

El MCP23017 es un circuito versátil para ampliar el número de GPIOs. En este artículo, cubrimos los fundamentos del CI y repasamos los detalles de los pines.

También construimos un proyecto sencillo para probar las conexiones e incluimos un código de ejemplo que puedes utilizar.

Si tienes alguna pregunta sobre el proyecto IO expander, responderé a tus dudas en la sección de comentarios.

Mat Smith

Tuesday 31st of October 2023

Great article, however the title says you can use the chip to connect up to 144 inputs to an Arduino. With 3-bit addressing giving 8 possible addresses, and 16 IOs per chip, that would be 8x16 = 128, not 144?

Stefan Maetschke

Wednesday 1st of November 2023

Good catch! Thanks for pointing it out. Yes, it is 128 and not 144. I corrected the wrong number.