I have the Arduino Uno and I'm working on a project to build a controller with different inputs and some outputs for readouts. In classic style, I got the Arduino Uno before realising that I might not have enough I/O points to connect everything I want.

I believe there is a way to expand my Uno by using an I/O Expander? Has anyone done something similar? The controller will be for a specific game called Kerbal Space Station. There are quite a few articles helping with the build but not specific to what I am looking at.

Components I'll be using:


  • 2x 3 Axis Joysticks
  • 11x Microswitches
  • 6x Toggle switches
  • 1x Analogue slider
  • 1x 10 point rotary switch


  • 4x 12 pin LED Bargraphs
  • 1x Serial LCD module display
  • 1
    yes, that sort of a thing has been addressed before ..... what type of joysticks will you be using?
    – jsotola
    Oct 30, 2018 at 20:29

2 Answers 2


Yes, all those things have been done before. Here's some suggestions for components:

  • MCP23S17 / MCP23017 - SPI / I2C IO expander (16 IO pins, many can be connected together) (MCP23S17 library)
  • MCP3208 - 8 channel 12-bit SPI ADC (MCP3208 library)
  • TLC59116 - I2C Constant Current LED PWM driver (16 channel) (TLC59116 library)

Some other useful tutorials that may help:

  • Keypad - read lots of buttons / switches with not many pins
  • Multiplex - Control many LEDs with not many IO pins

Sparkfun also sells a SX1509 module for a very good price. It can do a matrix keyboard all on its own (hardware support) with similar (independent hardware-driven) LED heartbeat control. Aside from that, you can use any remaining pins as normal I/O (read/write/pwm). There are 16 pins total, and it's controlled over I2C.

Adafruit also has a board called the Seesaw, which is a small Atmel SAMD09 with I2C slave firmware. It works similarly, but the pins are much more limited.

Either way, you simply include a library to your code, and use the object to interface with the pins rather than the usual functions on your Arduino. Most seem to use identical syntax (someclass.digitalWrite()...) to the normal Arduin functions.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.