W tym poście przedstawię sposób kontrolowania naszego ekspandera PCF8574 przez raspberry.
Sam wpis spowodowany jest tym że wbudowana w bibliotekę pi4j klasa do obsługi powyższego ekspandera uniemożliwiała mi ustawienie pinu 07 jako wyjścia.
1. Aby uzyskać manualną kontrolę nad urządzeniem i2c podłączonym do magistrali naszej raspberry musimy w pierwszej kolejności utworzyć instancję portów gpio:
// create gpio controller
final GpioController gpio = GpioFactory.getInstance();
2. Utworzenie instancji magistrali i2c:
bus = I2CFactory.getInstance(I2CBus.BUS_1);
System.out.println("Connected to bus OK!");
UWAGA: dla raspberry w rewizji 1 używamy I2CBus.BUS_0, natomiast dla rewizji 2 I2CBus.BUS_1
3. Utworzenie instancji naszego ekspandera PCF8574
//get device itself
device = bus.getDevice(0x20);
System.out.println("Connected to device OK!");
Po wykonaniu tych trzech kroków, możemy komunikować się z naszym ekspanderem.
Jeśli chcemy ustawić wszystkie piny jako wyjścia w stanie wysokim to wykonujemy instrukcję:
device.write((byte) 0b11111111);
jeśli chcemy ustawić wszystkie wyjścia w stanie niskim to wysyłamy:
device.write((byte) 0b00000000);
//Miganie diodami
for(int x = 0; x < 12; x++){
device.write((byte) 0b00000000);
Thread.sleep(100);
device.write((byte) 0b11111111);
Thread.sleep(100);
System.out.println("Wykonano obieg!");
}
Uwaga: jeśli chcemy korzystać z wejść w naszym pcf, to najpierw musimy ustawić je jako wyjścia w stanie HIGHT(Wysokim), a dopiero potem możemy czytać ich stan za pomocą instrukcji:
int odpowiedz = device.read();
System.out.println("odpowiedz = " + odpowiedz);
Którą należy przetworzyć na 8 bitowy ciąg binarny np tak:
int odpowiedz = device.read();
System.out.println("odpowiedz = " + odpowiedz);
boolean[] bit = new boolean[8];
for(int x = 7; x >= 0; x--){
if(odpowiedz % 2 == 1) bit[x] = true;
odpowiedz /= 2;
}
for(int x = 0; x < 8; x++){
if(bit[x]) System.out.println("LED 0"+ x + " = 1");
else System.out.println("LED 0"+ x + " = 0");
}
Bibliografia:
https://blogs.oracle.com/acaicedo/resource/Parallax-I2C/Sensors.java
http://hackaday.com/2008/12/27/parts-8bit-io-expander-pcf8574/