Portexpander PCA9555 am Arduino
Nahezu jeder Bastler kennt das Problem:

Man hat eine Schaltung fertiggestellt und stellt dann fest, dass man doch noch die eine oder andere Funktion hinzubauen möchte. Nur leider sind alle Pins des Mikrocontrollers schon belegt, so dass man praktisch keine Möglichkeit mehr hat, weitere Dinge daran anzuschliessen.

Nich nur in diesem Fall kann ein sogenannter Portexpander für Abhilfe sorgen. Über ein einfaches I2C interface, welches nur 2 I/O Leitungen benötigt, lassen sich nämlich nahezu beliebig viele zusätzliche IO-Leitungen an ein vorhandenes System anbauen.

Diese Portexpander gibt es in den verschiedensten Ausführungen, die sich sowohl in Pin-Anzahl als auch den elektischen Eigenschaften der IO-Ports unterscheiden. So gibt es zum Beispiel welche mit PUSH-PULL Ausgängen, andere wiederum stellen Open Collector Ausgänge zur Verfügung.

Der hier verwendete Baustein PCA9555 (Analog zum TCA9555) stellt 16 zusätzliche Ein-Ausgabeleitungen zur Verfügung, die entweder als Eingang oder als Ausgang mit Push-Pull-Treiberstufe programmiert werden können.

Er eignet sich dadurch sehr gut, um einem kleinen Arduino zu mehr Kontaktmöglichkeiten zu verhelfen.

Die Belastbarkeit der Ausgänge liegt dabei in etwa auf demselben Niveau wie bei einem Mikrocontroller auch, grosse Lasten sollte man damit also nicht treiben.

Mit der Arduino-Bibliothek Wire.h ist auch die Ansteuerung fast so einfach wie bei einem normalen Prozessor-Pin.

Um den PCA9555 zu konfigurieren, gibt es insgesamt 8 Register, welche die Adressen 0-7 belegen.

Konfiguriert werden die Pins durch Setzen von Bits in den beiden Config-Registern mit der Adresse 6 und 7. Ist hier ein Bit auf 0 gesetztm ist der zugehörige Pin ein Ausgang, bei einem logischen 1 wird er zum Eingang.

In dem hier gezeigen Sketch wird ein einfaches Blinklicht realisiert, welches alls Ausgänge des Portexpanders im 1-Sekunden Takt blinken lässt.

#include "Wire.h"
#define PCA9555 0b01000000/2

#define PCA9555_INPUT_0 0
#define PCA9555_INPUT_1 1
#define PCA9555_OUTPUT_0 2
#define PCA9555_OUTPUT_1 3
#define PCA9555_PI_0 4
#define PCA9555_PI_1 5
#define PCA9555_CFG_0 6
#define PCA9555_CFG_1 7


void setup () {

Wire.begin();

Serial.begin(9600);
Serial.println("System started.");

//Both Ports as Output
Wire.beginTransmission(PCA9555);
Wire.write(PCA9555_CFG_0);
Wire.write(0x00);
Wire.write(0x00);
Wire.endTransmission();


}

void loop () {

byte data;
Wire.beginTransmission(PCA9555);
Wire.write(PCA9555_OUTPUT_0);
Wire.write(0xff);
Wire.write(0xff);
Wire.endTransmission();
delay(1000);

Wire.beginTransmission(PCA9555);
Wire.write(PCA9555_OUTPUT_0);
Wire.write(0x00);
Wire.write(0x00);
Wire.endTransmission();
delay(1000);



}


Zusätzlich bietet der Baustein noch einen Interrupt Ausgang, welcher auf LOW geht, wenn sich der Pegel an einem EIngangs-Pin ändert. Damit kann dem abfragenden Mikrocontroller zum Beispiel mitgeteilt werden, dass eine Taste gedrückt wurde oder irgendein anderes Ereignis eingetreten ist.

Solche I2C Portexpander kann man überall dort vorteilhaft einsetzen, wo es bei der Abfrage bzw. dem Schreiben der IO-Werte nicht auf besonders hohe Geschwindigkeit ankommt. Dieser Nachteil wird natürlich durch die potentiell sehr hohe Anzahl von möglichen Ein-Ausgabeleitungen ausgeglichen.

Bauteile für dieses Projekt - Anzeigen:
Aktive Bauelemente

Passive Bauelemente


Weitere Informationen,Grundlagen,Bauanleitung,Schaltplan, Links zum Thema
Anzeigen:

Neueste Artikel
Anzeigen:
Aktuelle Newsbeiträge
Sie sind Besucher Nr. 1213516