zondag 17 maart 2013

Arduino - Experiment 7a - GPIO port expander

In dit experiment heb ik een MCP23017 16 bit port expander op de Arduino aangesloten. De MCP23017 wordt aangestuurd via I2C.

De chip ziet er als volgt uit:
De Chip heeft GPA0-7 en GPB0-7 poorten en A0-2 voor het I2C adres in te stellen. De chip werkt met een basis adres van 0x20 en kan met deze drie pinnen ingesteld worden op een adres tussen 0x20 en 0x27.

Om de poorten aan te sturen gebruiken we ook een adres. Om de A-reeks aan te sturen gebruiken we adres: 0x12, en de eerste poort: 0x1.

Arduino Sketch:

#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

void setup()
{
  //Send settings to MCP device
  Wire.begin();              // join i2c bus (address optional for master)

  // IOCON.BANK defaults to 0 which is what we want.
  // So we are using Table 1-4 on page 9 of datasheet
  
  Wire.beginTransmission(mcp_address);
  Wire.write((byte)0x00); // IODIRA register
  Wire.write((byte)0x00); // set all of bank A to outputs
  Wire.write((byte)0x00); // set all of bank B to outputs 
  Wire.endTransmission();
  
}

void loop()
{
  Wire.beginTransmission(mcp_address);
  Wire.write(GPIOA);      // address bank A
  Wire.write((byte)0x1);  // value to send - pin A1 HIGH
  Wire.endTransmission();
  
  delay(500);

  Wire.beginTransmission(mcp_address);
  Wire.write(GPIOA);    // address bank A
  Wire.write((byte)0x2);  // value to send - pin A2 HIGH
  Wire.endTransmission();
  
  delay(500);
}

Bovengenoemde code laat de leds op pin GPA0 en GPA1 om en om branden: