Arduino Port expanders: How to Instantly get More Pins. Are you are running out of I/O pins? You may not need to move to the next microcontroller; An easier way is to use an expansion chip!

Arduino port expander: If you run out of I/O pins you can either choose a different processor with more pins, or you can choose an I/O expander that uses a few of your pins, in exchange for a lot more!

  • Easily add more pins using an I2C or SPI chip.

  • The MCP23017 is an extremely capable I2C port expander.

  • The PCF8574 is internally simplistic yet still capable device.

  • You can use older (cheaper) chips with SPI for input or output expansion.

To minimise the number of sacrificial pins a serial interface is employed with at least a clock and data line. There are two interfaces that are typically used:

  1. I2C - Inter Integrated Circuit.
  2. SPI - Serial Peripheral Interface.

Of the two, I2C is the most sophisticated, allowing master and subordinate chips that communicate in both directions over the data bus (it requires 2 pins), whereas SPI is a more primitive interface that requires more pins (3 or 4) but is far faster.

The interesting thing is that chips that have been around for decades can make use of the SPI interface (because it defines a primitive clock and data scheme). So nearly any serial chip is usable with this interface.

I2C Arduino port expanders

I2C MCP23017 : Arduino Port Expander


The MCP23017 is the all-singing-all-dancing Arduino port expander with 16 I/O pins and it gives you virtually identical pin capability to the existing pins of a microcontroller. They can be individually set to input or output and you can enable an internal pullup (also individually).

By simply setting A0 to A2 you can have up to 8 of these devices on a single I2C bus giving you a total I/O pin count of 128 pins!

Additionally there is an interrupt capability for maximum flexibility.

Note: One potential problem is that the chip has a lot of pins meaning it is physically big and the DIP package has 28 pins. A better option may be the PCF8574 that only has 8 outputs and 16 pins.

I2C PCF8574 : Arduino Port Expander

PCF8574 pinoutThe PCF8574 has 8 I/O bits and comes in a 16 pin DIP package (as well as other packages). Again like the the MCP23017 the pins are input or output capable. However they do not have internal pullup capability.

You must add your own external pullups where necessary on input pins.

The chip also has three address inputs so 8 devices can be placed on one I2C bus giving a total of 64 I/O pins on one bus.

Additionally the PCF8574 has an interrupt capability.

Note: This is actually a far less complex device (and probably less capable but easier to use) as there are no internal registers! You simply write/read to/from output registers after writing an I2C address (with R/W bit).

The simplicity of the PCF8574 may have drawbacks compared to the MCP23017 specifically when using interrupts. Interrupts fire on any rising or falling edge of port inputs - there are no internal registers so you can't mask out an unwanted interrupt firing as you can with the MCP23017.

Note: Because there are no internal registers, and you therefore do not have a pin direction register, the I/O pin is defined as quasi-bidirectional! The datasheet claims the pin can be either an input or an output at the same time!

SPI Arduino port expanders

SPI MCP23S17: Arduino Port Expander

Interestingly you can buy a version of the MCP23017 that mcp23017specifically uses the SPI interface labelled MCP23S17, with identical pinout to the I2C version (all except the serial interface pin labels). 

The maximum speed of the MCP23017 is 1.7MHz whereas for the SPI version, it is 10MHz! You get all the complex functionality of the I2C version but faster operation. However its more difficult to add multiple devices on the same SPI bus (not impossible though).

Note: The MCP23S17 is identical to the MCP23017 except for the serial interface. They use the same datasheet so the link above leads to the MCP23017 as they operate in the same way.

SPI 74HC595 parallel output: Arduino Port Expander

Inside the 74hc595.

A popular serial to parallel chip is the 74HC595 which has 8 outputs. It requires a serial clock, serial data input, and a latch clock and possibly a chip enable i.e. an SPI interface.

This is a very cheap chip that gives digital outputs (no pullups or interrupts) but you can daisy chain lots of them together to get a lot of output pins all over a board.

SPI 74HC165 parallel input: Arduino Port Expander

An example of a parallel to serial chip is the 74HC165 this has 8 digital inputs and uses a serial interface to allow retrieval of the data bits. Again the interface is compatible with the SPI interface.

The74HC165 bloc diagram external input pins are D0~D7 while PLn loads data from those pins into the shift register.

To shift out the data CEn is held,low while CP (clock is pulsed).

You only need to worry about DS and Q7 (or Q7n) if you are daisy chaining lots of 74HC165s together; these allow the shift out bit (Q7) to become the data input to the next 74HC165 forming a serial register chain.


Have your say about what you just read! Leave me a comment in the box below.

Don’t see the comments box? Log in to your Facebook account, give Facebook consent, then return to this page and refresh it.

Privacy Policy | Contact | About Me

Site Map | Terms of Use