[Raspberry][i2c] Sterowanie PCF8574 przez pi4j

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/