Control Surface
main
MIDI Control Surface library for Arduino
|
This example demonstrates the use of MCP23017 IĀ²C port expanders with rotary encoders, using hardware interrupts so you don't miss any pulses.
This only works on Teensy boards, and maybe on other ARM boards.
I've tested it using a Teensy 3.2 and a Teensy 4.0.
AVR boards (Arduino Uno, Mega, etc.) don't support IĀ²C inside of interrupt service routines, so there's no way to read the state of the MCP23017 inside of an ISR.
The same goes for ESP32 and ESP8266, although there may be ways around this by using alternative IĀ²C drivers or by using FreeRTOS features.
Connect up to 8 encoders to the MCP23017's GPIO pins: the first encoder connects to GPIO A0 and A1, the second encoder connects to GPIO A2 and A3, ..., the eighth encoder connects to GPIO B6 and B7.
Connect the "common" pins of the encoders to ground.
The built-in pull-up resistors of the MCP23017 will be enabled.
Make sure that the reset and address pins are all configured correctly (reset to Vcc; A0, A1 and A2 to ground).
If you need more than one MCP23017 with encoders, you can connect their interrupt pins together. This does result in higher latency, because on average, half of the total number of MCP23017s have to be polled, which is relatively slow, and might lead to missed pulses when using a large number of encoders.
When the position of one of the encoders changes, it is printed to the Serial monitor.
The interrupt pin of the MCP23017 triggers a hardware interrupt on the Arduino. This means that you don't have to manually poll the encoders all the time.
Written by PieterP, 2020-04-06
https://github.com/tttapa/Arduino-Helpers