Difference between revisions of "I/O Expander Shield with MCP23017"
(3 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
+ | ==Description== | ||
+ | |||
+ | I/O Expander shield is a shield used to expand the number of I/Os of an Arduino Uno. It is based on the chipset MCP23017. The chipset MCP23017 communicates with Arduino Uno through I2C interface. It adds GPIOA and GPIOB, a total of 16 I/Os. There are two LEDs and two buttons on the shield. User can decide if they want to use the built-in LED/buttons or not by using the 4-bit DIP switch. | ||
[[File:IOExpand shield 1.jpg|400px]] | [[File:IOExpand shield 1.jpg|400px]] | ||
Line 5: | Line 8: | ||
==Schematics== | ==Schematics== | ||
*[http://cnlearn.linksprite.com/wp-content/uploads/2014/04/io-expander-shield-SCH.pdf Schematic] | *[http://cnlearn.linksprite.com/wp-content/uploads/2014/04/io-expander-shield-SCH.pdf Schematic] | ||
+ | |||
+ | ==Code== | ||
+ | <syntaxhighlight lang="c"> | ||
+ | #include <Wire.h> | ||
+ | |||
+ | const byte mcp_address=0x20; // I2C Address of MCP23017 Chip | ||
+ | const byte GPIOA=0x12; // Register Address of Port A | ||
+ | const byte GPIOB=0x13; // Register Address of Port B | ||
+ | const byte IODIRA=0x00; // IODIRA register | ||
+ | const byte IODIRB=0x01; // IODIRB register | ||
+ | |||
+ | void setup() | ||
+ | { | ||
+ | //Send settings to MCP device | ||
+ | Wire.begin(); // join i2c bus (address optional for master) | ||
+ | Wire.beginTransmission(mcp_address); | ||
+ | Wire.write((byte)IODIRA); // IODIRA register | ||
+ | Wire.write((byte)0x03); // set GPIOA-0/GPIOA-1 to inputs | ||
+ | Wire.endTransmission(); | ||
+ | } | ||
+ | |||
+ | void loop() | ||
+ | { | ||
+ | Wire.beginTransmission(mcp_address); | ||
+ | Wire.write((byte)GPIOA); // set MCP23017 memory pointer to GPIOB address | ||
+ | Wire.endTransmission(); | ||
+ | Wire.requestFrom(0x20, 1); // request one byte of data from MCP20317 | ||
+ | int inputs=Wire.read(); // store the incoming byte into "inputs" | ||
+ | |||
+ | if((inputs&0x01)==0) | ||
+ | { | ||
+ | Wire.beginTransmission(mcp_address); | ||
+ | Wire.write(GPIOA); // address bank A | ||
+ | Wire.write((byte)0x04); // value to send GPIOA-2 HIGH | ||
+ | Wire.endTransmission(); | ||
+ | } | ||
+ | if((inputs&0x02)==0) | ||
+ | { | ||
+ | Wire.beginTransmission(mcp_address); | ||
+ | Wire.write(GPIOA); // address bank A | ||
+ | Wire.write((byte)0x08); // value to send GPIOA-3 HIGH | ||
+ | Wire.endTransmission(); | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | Wire.beginTransmission(mcp_address); | ||
+ | Wire.write(GPIOA); // address bank A | ||
+ | Wire.write((byte)0x00); // value to send GPIOA LOW | ||
+ | Wire.endTransmission(); | ||
+ | } | ||
+ | } | ||
+ | [/syntaxhighlight] | ||
+ | |||
+ | ==Resources== | ||
+ | *[http://ww1.microchip.com/downloads/en/DeviceDoc/21952b.pdf Datasheet] |
Latest revision as of 10:01, 10 April 2014
Contents
Description
I/O Expander shield is a shield used to expand the number of I/Os of an Arduino Uno. It is based on the chipset MCP23017. The chipset MCP23017 communicates with Arduino Uno through I2C interface. It adds GPIOA and GPIOB, a total of 16 I/Os. There are two LEDs and two buttons on the shield. User can decide if they want to use the built-in LED/buttons or not by using the 4-bit DIP switch.
Schematics
Code
<syntaxhighlight lang="c">
- include <Wire.h>
const byte mcp_address=0x20; // I2C Address of MCP23017 Chip const byte GPIOA=0x12; // Register Address of Port A const byte GPIOB=0x13; // Register Address of Port B const byte IODIRA=0x00; // IODIRA register const byte IODIRB=0x01; // IODIRB register
void setup() {
//Send settings to MCP device Wire.begin(); // join i2c bus (address optional for master) Wire.beginTransmission(mcp_address); Wire.write((byte)IODIRA); // IODIRA register Wire.write((byte)0x03); // set GPIOA-0/GPIOA-1 to inputs Wire.endTransmission();
}
void loop() {
Wire.beginTransmission(mcp_address); Wire.write((byte)GPIOA); // set MCP23017 memory pointer to GPIOB address Wire.endTransmission(); Wire.requestFrom(0x20, 1); // request one byte of data from MCP20317 int inputs=Wire.read(); // store the incoming byte into "inputs" if((inputs&0x01)==0) { Wire.beginTransmission(mcp_address); Wire.write(GPIOA); // address bank A Wire.write((byte)0x04); // value to send GPIOA-2 HIGH Wire.endTransmission(); } if((inputs&0x02)==0) { Wire.beginTransmission(mcp_address); Wire.write(GPIOA); // address bank A Wire.write((byte)0x08); // value to send GPIOA-3 HIGH Wire.endTransmission(); } else { Wire.beginTransmission(mcp_address); Wire.write(GPIOA); // address bank A Wire.write((byte)0x00); // value to send GPIOA LOW Wire.endTransmission(); }
} [/syntaxhighlight]