2023
|
|
2x8 Ein- und Ausgänge
PCF8575-Board als externe I/O-Erweiterung: Steuerung mit Compact Red Needle
|
Wer die digitalen Aus- und Eingänge des Arduino nicht, oder für andere Dinge verwenden möchte, der kann über I2C und den zwei Anschlüssen SCL und SDA ein Board mit dem PCF8575 16 Bit IO Expander verwenden.
Der Vorteil ist auch die übersichtliche Anordnung der acht Ein- und Ausgänge, wie sie an einem von Compact Red Needle unterstützen Interface zu erwarten sind. Am Ende dieser Ausführungen befindet sich der fertige Sketch für einen Arduino, um dieses Board mit dieser kostenlosen und plattformübergreifenden Software zu benutzen. Ein einmaliges Hochladen der Zeilen reicht, um vom PC aus Dinge zu steuern.
|
Auspacken Spannungen und Adressen
|
Das Board ist auch 2023 recht preiswert und kommt mit mehr Bauteilen als erwartet aus der Tüte. Ein 3,3 V-Spannungsregler und weitere Bauteile werden im Netz nicht oder nur vernebelt beschrieben. Zunächst verwirren zwei unterschiedliche Spannungsanschlüsse, einmal VCC in der Nähe der I2C-Anschlüsse und zweimal VDD an den beiden Seiten der jeweils acht I/O-Anschlüsse. Zusätzlich befindet sich auf der Rückseite noch eine unverbundene Lötbrücke zwischen diesen beiden Spannungen.
Als Adresse findet man im Netz eine 0x20, wenn die drei Adressleitungen A0-A2 an GND angeschlossen sind. Die Rückseite des Boards zeigt Lötbrücken ohne Verbindungen, so dass möglicherweise der Anwender diese Adresse noch festlegen soll. Möglich wäre auch, dass offene Adressleitungen definierte Zustände annehmen.
Zur Beseitigung der Unsicherheiten wird der Sketch der Arduino-IDE unter Datei/Beispiele/Wire/i2c_scanner aufgerufen und ausgeführt. Als Versorgungsspannung Vcc wird 5 V des Arduino verwendet.
Das Ergebnis ist eine 0x21 oder 0x25 als Adresse. Sie pendelt sich bei 0x25 ein. Messungen an Vdd zeigen 3,3 Volt, so dass auch diese Logik bedient werden kann. Nach ersten Ansprechversuchen änderte sich die Adresse je nach Berührung mit der Hand. Demnach sind offene Adressleitungen nicht definiert. Liegen alle drei Leitungen nach Behandlung der offenen Brücken mit heißem Lot auf GND, so meldet der Scanner konstante 0x20.
|
Testprogramm I2C = Wire
|
Die I2C-Aufrufe unter Arduino sind einfach zu handhaben. Bei bekannter Adresse sendet der kleine Test zwei Bytes zum Expander, die den beiden parallelen Ports entsprechen. Die 8 schaltet Bit 3 des Anschlusses P03 an. Das zweite Byte mit dem Wert 0 setzt die Anschlüsse P10-P17 als Eingänge.
#include <Wire.h>
void setup()
{Wire.begin();
Wire.beginTransmission(0x20);
Wire.write(8);
Wire.write(0);
Wire.endTransmission();
}
void loop()
{}
Füllt man die loop() noch etwas auf, so kann ein einfaches Blinken und die Abfrage der Eingänge überprüft werden. Die Zustände der beiden Ports erscheinen im seriellen Monitor.
void loop()
{static bool on = true;
Wire.beginTransmission(0x20);
Wire.write(on?0x8:0x00);
Wire.write(0);
Wire.endTransmission();
Wire.requestFrom(0x20,2);
Serial.println(Wire.read());
Serial.println(Wire.read());
Wire.endTransmission();
on =! on;
delay(500);
}
Damit funktioniert alles wie erwartet und gewünscht. Im letzten Schritt soll nun der CLAB-Sketch für den Arduino so geändert werden, dass Compact Red Needle auch mit diesen 16 Anschlüssen betrieben werden kann.
|
Programm Compact Red Needle meets PCF8575
|
Die Verwendung von I2C-Teinehmern erfordert die Einbindung der Bibliothek Wire.h. Durch den Wegfall der Arduino-Pins gestaltet sich der Sketch und möglicherweise auch der Umgang mit dem Programm viel übersichtlicher. Die eigentlichen Änderungen sind also das Streichen von Pin-Definitionen und die Behandlung der Byte-Kommandos DIN und DOUT mit entsprechenden Wire-Aufrufen.
#include <Wire.h>
#define ADDR 0x20 //PCF8775 A0-A2=GND
#define AIN1 60
#define AIN2 58
#define DIN 211
#define DOUT 81
#define PWM 64
#define PWMPIN 10
//DIGITAL OUT PINS PCF8575 P00-P07
//DIGITAL IN PINS PCF8575 P10-P17
//ANALOG IN PINS A - B CLAB
byte Ains[] = {0,1};
//BitValues
byte Bits[] = {1,2,4,8,16,32,64,128};
void setup()
{Serial.begin(9600); //Special CLAB
Wire.begin();
Wire.beginTransmission(ADDR);
Wire.write(0);
Wire.write(0);
Wire.endTransmission();
}
void loop()
{ int i, val, inbyte; byte b;
val = Serial.available(); //Was da?
if (val>0)
{inbyte=Serial.read(); //abholen
delay(5);
switch(inbyte)
{ case 13 : //CLAB ID nur ab Compact 1.75!
Serial.write(3);delay(2);break; //ID
case PWM: b=Serial.read(); //Ausgabebyte holen
analogWrite(PWMPIN,b);
break;
case DIN : Wire.requestFrom(ADDR,2);
Wire.read(); //P0
Serial.write(Wire.read());
Wire.endTransmission();
break;
case AIN1:
case 48: Serial.write(analogRead(Ains[0])>>2);break;
case AIN2:
case 49: Serial.write(analogRead(Ains[1])>>2);break;
case DOUT: b=Serial.read(); //Ausgabebyte holen
Wire.beginTransmission(ADDR);
Wire.write(b);
Wire.write(0);
Wire.endTransmission();
break;
default: break;
}
}
delay(5);
}
Der Sketch und die HEX-Datei zum Hochladen zum UNO R3 ohne Arduino-IDE befinden sich in einer Zip-Datei mit dem Namen CLAB_8575.zip. |
Compact Red Needle
MSR mit Arduino & Compact
Mehr Software
|