Hvis du har for få inn-/ utganger kan du bruke en port expander. MCP23008 er en integrert krets som gir deg 8 ekstra inn-/ utganger ved å bruke bare to pinner på Arduino. Den kommuniserer via I²C. Denne kretsen har 3 adressepinner som må kobles enten høy (5V) eller lav (jord) for å bestemme adressen på kretsen. Det vil si at du kan koble opp 8 kretser på den samme bussen, og det vil gi 64 ekstra inn-/ utganger. Det finnes også en 16-ports versjon , MCP23017, som gjør at du maksimalt kan få 128 inn-/ utganger på I²C-bussen på en Arduino Uno.
Datablad MCP23008
Datablad MCP23017
Bibliotek MCP23008
Bibliotek MCP23017
Forklaring på pinnene
SCL: Klokkelinje I²C, kobles til A5 på Arduino Uno.
SDA: Datalinje I²C, kobles til A4 på Arduino Uno.
RESET: Denne kobles til +5V gjennom en 10kΩ motstand.
VDD: +5V.
VSS: Jord.
GP0..GP7: General purpose IO. Disse kan konfigureres som inn- eller utganger. De har også intern pullup som Arduino.
A0..A2: Adressepinner (se tabell under).
INT: Interrupt. Denne kan kobles til en interruptlinje på Arduino (D2 eller D3 på Uno). Den gir et signal når det er endring på en inngang.
NC: No connection.
Adressering:
For å kommunisere via I²C må Arduino vite adressen til kretsen den skal kommunisere med. På disse kretsene er det 3 adressepinner, A0, A1 og A2 som kobles enten høy eller lav etter følgende tabell:
A2 | A1 | A0 | Adresse |
---|
0 | 0 | 0 | 0 |
0 | 0 | 1 | 1 |
0 | 1 | 0 | 2 |
0 | 1 | 1 | 3 |
1 | 0 | 0 | 4 |
1 | 0 | 1 | 5 |
1 | 1 | 0 | 6 |
1 | 1 | 1 | 7 |
Eksempel med en inngang og en utgang
Her er det koblet inn en trykkbryter på GP0, og en LED på GP3. Alle adressepinnene er koblet til jord, altså I²C-adressen er 0.
#include <Wire.h>
#include <Adafruit_MCP23008.h>
const int addr = 0;
Adafruit_MCP23008 mcp;
void setup(){
mcp.begin(addr);
mcp.pinMode(0, INPUT);
mcp.pinMode(3, OUTPUT);
}
void loop(){
if(mcp.digitalRead(0))
mcp.digitalWrite(3, HIGH);
else
mcp.digitalWrite(3, LOW);
}
GitHub: Examples/PortExpander/PortExpander.ino
Port expander og Zumo
Denne port expanderen bruker i2c for kommunikasjon, og kan derfor kobles sammen med Zumo roboten. Vi har lagd et eksempel i to varianter som gjør akkurat dette.
PLabExamples/examples/14.Zumo/SensorToPortExpanderLEDs.
PLabExamples/examples/14.Zumo/SensorToPortExpanderLEDsAdvanced.
Her bruker vi kun sensorene fra Zumoen. Vi leser verdiene, og får en LED per sensor til å lyse med intensistet basert på hva den tilsvarende sensoren leser. For å øke hastigheten på i2c kommunikasjonen, skriver vi til alle portene på port expanderen samtidig.
I den første varianten av eksempelet tvinger vi alle 8 portene til å være utganger, mens i den andre varianten kan du selv bestemme antallet utganger, hvilke som skal brukes og i hvilken rekkefølge utgangene skal være definert.
Begge eksemplene har lagt skrivingen i funksjoner som kan klippes ut og limes inn i andre prosjekter.
Oppkobling: