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:

A2A1A0Adresse
0000
0011
0102
0113
1004
1015
1106
1117

 

Eksempler fra biblioteket

Fra Adafruit biblioteket (som er inkludert i bibliotekene vi har lagt ut) er det to eksempler på bruk.

PLabExamples/examples/16.PortExpanderMCP23008/button - Et enkelt eksempel som leser en knapp og lyser en LED basert på hva den leser.

PLabExamples/examples/16.PortExpanderMCP23008/toggle - Et enkelt eksempel som blinker en utgang på port expanderen.

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.

mcp23008_test
#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; analogWrite() simulering

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.

Under "Noen enkle eksempler for Arduino" viser vi hvordan vi kan bruke analogWrite() for å bestemme lysintensiteten til LED. Da biblioteket for port expanderen ikke har en slik funksjon har vi her lagd funksjoner som fungerer på veldig lik måte, om dog med lavere frekvens. Disse, eller variasjoner av disse kan brukes hvis du trenger analogWrite() via port expander. Begge variasjonene av eksemplet har slike funksjoner som kan klippes ut og limes inn i andre prosjekter etter behov.

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.

Oppkobling:

 

  • No labels