PCF8574 I/O extender deel 1: meer outputs

Deze keer gaan we kijken hoe we 8 leds individueel kunnen aansturen zonder dat we meteen 8 poorten op de Arduino nodig hebben. Dit gaan we doen door een zgn. I/O port extender te gebruiken. Dit betekent in praktijk dat we met 2 poortjes op de Arduino, 8 (of meer) uitgangen kunnen aansturen. Zoals je zult zien is dit een heel eenvoudige schakeling. Er zijn hier meerdere mogelijkheden voor. In dit geval kiezen we voor een goedkoop ic van Philips: de PCF8574.

De PCF8574

De PCF8574 is een 8-bits I/O port extender met een i2c interface. De chip heeft 8 poorten die als input of output kunnen worden gebruikt en voor de i2c-communicatie een SDA en SCL poort. Verder kun je het ic2-adres instellen en heeft het natuurlijk wat spanning nodig.

De chip is in meerdere behuizingen te krijgen. Wij kiezen hier voor een DIP 16 omdat we het anders niet op een breadboard kunnen maken. DIP-16 zie je hiernaast: een ic met 2 x 8 = 16 lange pootjes.

Pin-out

Hiernaast zie je de aansluitingen op de chip. Begin altijd bij markering in de hoek te tellen en tel vervolgens tegen de klok in verder voor 2, 3… Bij deze chip ligt pin 9 dus tegenover pin 8 en pin 16 tegenover pin 1. Een andere manier om  pin 1 makkelijk te vinden is om te kijken naar de uitsparing (halve maantje/cirkel): pin 1 zit vrijwel altijd links naast deze inkeping.

De PCF8574 kan 2,5 tot 6 Volt aan. Dat maakt hem dus zeer geschikt voor gebruik met de 5V of 3,3 volt Arduino’s. Wat ook belangrijk is om te weten: de I/O poorten sturen maximaal 25 mA uit waardoor je met 5 Volt op VCC / VDD direct ledjes op de poorten aan kan sluiten. (Een led gebruikt meestal zo’n 20 mA)

De schakeling

Je hebt nodig voor deze schakeling:

  • een Arduino
  • een bread board met wat jumper cables
  • een PCF8574 DIP-16 ic
  • 8 ledjes

Plaats de PCF8574 chip op het bread board zó dat er een onderbreking tussen tegenoverliggende rij  is:

  • Verbindt pin 1 en 2 door én pin 2 en 3.
  • Verbindt pin 1 en 8 met GND
  • Verbindt pin 16 met je Arduino 5V of 3,3V
  • Verbindt pin 15 met SDA of A4 op de Arduino
  •  Verbindt pin 14 met SCL of A5 op de Arduino
  • Sluit nu leds aan op pin 4 t/m 7 en pin 9 t/m 12. De Anode (+) aan de chip en Kathode (-) allemaal naar GND. Er hoeft geen voltage-divider weerstand tussen!

Als je klaar bent ziet het ongeveer zo uit:

Software

Nu zijn we klaar om de software te uploaden om te kijken of en hoe het werkt.
Hieronder vind je een voorbeeldprogramma waarmee je kan beginnen om te spelen met deze schakeling. Op de seriële poort monitor kun je ook zien welke waardes worden verzonden en welke dan weer uitgelezen worden.

/*
Testprogramma voor PCF8574 I2C 8-bit I/O expander als Output expander

Deze sketch doet een bit rotatie en laat vervolgens een bit-counter oplopen.
Geschreven door R.P.S. Louwman
Vrij te gebruiken en aan te passen door iedereen.

Aansluitingen:
PCF8574 Pin 1 naar GND (ook Arduino op GND zetten)
PCF8574 Pin 2 naar GND
PCF8574 Pin 3 naar GND
PCF8574 Pin 4,5,6,7 naar LED1 tm LED4  (andere kant naar GND)
PCF8574 Pin 8 naar GND (ook Arduino op deze GND zetten)
PCF8574 Pin 9,10,11,12 naar LED5 tm LED8 (andere kant naar GND)
PCF8574 Pin 14 naar Arduino SCL / A5
PCF8574 Pin 15 naar Arduino SDA / A4
PCF8574 Pin 16 naar VCC (+3.3 of 5V Arduino)
*/
#include <Wire.h>

#define PCF8574_i2cAdr B0100000 // Adres als PCF8574_pin1,2,3 met GND verbonden zijn

void setup() {
Wire.begin();
Serial.begin(9600);
}

void loop() {
// This will do a bit-rotation (00000001,00000010,00000100,00001000…)
for(uint8_t i=0; i<8; i+=1) {
PCF8574_write(1<<i);
delay(500);
}
delay(2000);
// This will do a bit-count from 0 to 255 (00000000…11111111)
for(uint16_t i=0; i <=255; i+=1) {
Serial.print(“Writing “);
Serial.println(i, BIN);
PCF8574_write(i);
Serial.print(“Reading: “);
Serial.println(PCF8574_read(), BIN);
delay(150);
}
delay(2000); // i=255: keep every bit on for 2 secs
PCF8574_write(B00000000); // do 2 seconds down-time
delay(2000);
}

void PCF8574_write(byte bytebuffer) {
Wire.beginTransmission(PCF8574_i2cAdr);
Wire.write(bytebuffer);
Wire.endTransmission();
}

byte PCF8574_read() {
byte bytebuffer;
Wire.requestFrom(PCF8574_i2cAdr, 1);
if(Wire.available()) { bytebuffer = Wire.read(); }
return bytebuffer;
}

Hier een korte demo van het resultaat: YouTube demo

Toepassing

Je kan deze chip en deze constructie ook heel goed gebruiken om een 7-segment LED display aan te sturen en cijfers weer te geven. Gebruik je 3 van deze chips in serie dan kun je er ook RGB leds mee aansturen. Je kan vast zelf ook nog wel enkele toepassingen verzinnen. De kans is groot dat deze chip al in diverse apparaten bij je thuis zit.

Dit is veruit de meest makkelijke chip om te gebruiken en zeer goedkoop; je bespaart zelfs weerstanden voor je leds.. De beperking is misschien de 8-poortjes, maar dat is te omzeilen door meerdere van deze ic’s op andere adressen te gebruiken. i2c kan 8 verschillende adressen tegelijk aan.

Adres instellen

Hier zie je hoe je andere adressen in kan stellen met pin 1 t/m 3:

Vss=GND, VDD=VCC/3.3V/5V
Meer uitleg over i2c en adressering volgt in een ander stuk.

Probeer het zelf! Experimenteer, Enjoy.

Leave a Reply

Het e-mailadres wordt niet gepubliceerd.