Oplossing: looplicht op PCF8574

Dingen om mee rekening te houden:

PCF8574 pin layout

In bovenstaande afbeelding zien we dat de 8 I/O pinnen aangeduid worden met P0..P7. Verder hebben we de SDA en SCL pinnen die de I²C bus vormen, en de Vcc en GND voor de voeding. Blijven nog over de INT pin, die wijzigt zodra de toestand op P0..P7 wijzigt, en kan gebruikt worden om aan de controller aan te geven dat de nieuwe waarden voor P0..P7 moeten ingelezen worden, en A0..A2, de pinnen die deel uitmaken van het adres van de chip.

Bij I²C wordt gebruik gemaakt van een 7-bit adres om een chip op de bus te identificeren. Deze adressen liggen vast per type chip. Voor de PCF8574 ligt dat adres vast op

PCF8574 I²C adres
0 1 1 1 A2 A1 A0


In hexadecimale notatie geeft dit 0X38 wanneer A2, A1 en A0 allemaal 0 zijn. Als A2..A0 met de massa zijn verbonden zal het adres van deze PCF8574 dus 38h zijn.Stel dat we nog een tweede PCF8574 op dezelfde I²C bus willen gebruiken, dan kunnen we voor deze nieuwe chip A0 aan de Vcc hangen, terwijl A2 en A1 met de massa verbonden blijven. Deze tweede PCf8574 heeft dan als adres 39h.

Met 3 in te stellen adresbits kunnen we 8 unieke adressen maken van 38h tot 3Fh. We kunnen op één I²C bus dus maximaal 8 PCF8574 I/O expanders plaatsen, wat ons een bijkomende 64 I/O pinnen geeft. Al deze I/O wordt vanuit de Arduino gestuurd d.m.v. 2 lijnen: SDA en SCL.

Waar ook mee moet rekening gehouden worden, is het vermogen van de pinnen. In de datasheet vinden we mij de absolute maximum ratings het volgende:

Dit betekent dat een uitgang maximaal 4 mA kan sourcen (=leveren als bron), en 50mA kan sinken (=binnenhalen).

Aangezien een led minimaal een 10-tal mA nodig heeft om te branden moeten we bij leds gebruik maken van de common-anode configuratie. Een voorbeeld van de schakeling is te zien in onderstaande afbeelding:

Om een looplicht te maken op de PCF8574 moeten er 8 opeenvolgende bytes via de I²C bus gestuurd worden. Door de common anode configuratie zijn deze waarden FEh, FDh, FBh, F7h, EFh, DFh, BFh en 7Fh. We kunnen eigenlijk hetzelfde programma als van het looplicht op het schuifregister gebruiken, alleen moeten we nu sturen naar de I²C bus i.p.v. het schuifregister.

#include <Wire.h>

const byte patroon[]={0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F};

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


void loop() {
  for(int i=0;i<sizeof(patroon);i++) {
  Wire.beginTransmission(0x38);
  Wire.write(patroon[i]);
  Wire.endTransmission();
  delay(500);
  }
}