UniPi and pi4j

George Proost
Posts: 5
Joined: Thu Jan 22, 2015 11:44 am
Location: Turnhout, Belgium

UniPi and pi4j

Postby George Proost » Sat Oct 10, 2015 2:44 pm

Hi all,

I would like to build an extension to the pi4j library, and am doing some tests:

UniPi + Rasp 2 + raspbian

I cannot seem to get relay 1, GP07 to work. There is somethig I missing here, but whar is it?


I have confirmed that I have address 20 for the MCP23008:

Code: Select all

pi@raspberrypi ~ $ i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- 18 -- -- -- -- -- -- --
20: 20 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: 50 51 52 53 54 55 56 57 -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- 6f
70: -- -- -- -- -- -- -- -- 


I can use:

Code: Select all

i2cset -y 1  0x20 0x09 0x80

to control, with no issues.

.. I get the following error when executing the program:

Code: Select all

Number of relays to test: 8
Milliseconds to wait: 50
A serious error has occurred:
java.lang.ArrayIndexOutOfBoundsException: 128
   at com.pi4j.io.gpio.GpioProviderBase.getPinCache(GpioProviderBase.java:69)
   at com.pi4j.io.gpio.GpioProviderBase.export(GpioProviderBase.java:98)
   at com.pi4j.gpio.extension.mcp.MCP23008GpioProvider.export(MCP23008GpioProvider.java:127)
   at com.pi4j.io.gpio.GpioProviderBase.export(GpioProviderBase.java:79)
   at com.pi4j.io.gpio.impl.GpioPinImpl.export(GpioPinImpl.java:158)
   at com.pi4j.io.gpio.impl.GpioControllerImpl.provisionPin(GpioControllerImpl.java:517)
   at com.pi4j.io.gpio.impl.GpioControllerImpl.provisionDigitalOutputPin(GpioControllerImpl.java:669)
   at sfcountertester.SFCounterTester.<init>(SFCounterTester.java:93)
   at sftestsuite.SFTester.main(SFTester.java:71)
Expect: 17 counts for relay: Relay2
Expect: 16 counts for relay: Relay3
Expect: 15 counts for relay: Relay4
Expect: 14 counts for relay: Relay5
Expect: 13 counts for relay: Relay6
Expect: 12 counts for relay: Relay7
Expect: 11 counts for relay: Relay8
Exception in thread "Thread-1"
java.lang.RuntimeException: java.io.IOException: Error writing to /dev/i2c-1 at address 0x20 to address 0x9. Got -10001.
   at com.pi4j.gpio.extension.mcp.MCP23008GpioProvider.setState(MCP23008GpioProvider.java:203)
   at com.pi4j.io.gpio.impl.GpioPinImpl.setState(GpioPinImpl.java:325)
   at com.pi4j.io.gpio.impl.GpioControllerImpl.shutdown(GpioControllerImpl.java:939)
   at com.pi4j.io.gpio.impl.GpioControllerImpl$ShutdownHook.run(GpioControllerImpl.java:888)
Caused by: java.io.IOException: Error writing to /dev/i2c-1 at address 0x20 to address 0x9. Got -10001.
   at com.pi4j.io.i2c.impl.I2CDeviceImpl.write(I2CDeviceImpl.java:124)
   at com.pi4j.gpio.extension.mcp.MCP23008GpioProvider.setState(MCP23008GpioProvider.java:201)
   ... 3 more
run-remote:
BUILD SUCCESSFUL (total time: 29 seconds)


in addition I attach code:

Code: Select all

package sfcountertester;

import com.pi4j.gpio.extension.mcp.MCP23008GpioProvider;
import com.pi4j.gpio.extension.mcp.MCP23008Pin;
import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.gpio.GpioFactory;
import com.pi4j.io.gpio.GpioPinDigitalOutput;
import com.pi4j.io.gpio.PinState;
import com.pi4j.io.i2c.I2CBus;
import java.io.IOException;

/**
 *
 * @author gproost
 */
public class SFCounterTester implements Runnable {

    private int numRelays;
    private int minimumClicks = 10;
    private int delay = 100;

    // create gpio controller
    final GpioController gpio = GpioFactory.getInstance();

    // create custom MCP23008 GPIO provider
    final MCP23008GpioProvider gpioProvider;

    // relays
    static GpioPinDigitalOutput relay1;
    static GpioPinDigitalOutput relay2;
    static GpioPinDigitalOutput relay3;
    static GpioPinDigitalOutput relay4;
    static GpioPinDigitalOutput relay5;
    static GpioPinDigitalOutput relay6;
    static GpioPinDigitalOutput relay7;
    static GpioPinDigitalOutput relay8;

    /**
     * * *
     *
     * @param numRelays
     * @param delay
     * @throws InterruptedException
     * @throws java.io.IOException
     */
    public SFCounterTester(int numRelays, int delay) throws InterruptedException, IOException {

        gpioProvider = new MCP23008GpioProvider(I2CBus.BUS_1, 0x20);

        try {

            this.numRelays = numRelays;
            this.delay = delay;

            if (numRelays >= 1) {
                relay1 = gpio.provisionDigitalOutputPin(gpioProvider, MCP23008Pin.GPIO_00, "Relay8", PinState.LOW);
                relay1.setShutdownOptions(true, PinState.LOW);
            }

            if (numRelays >= 2) {
                relay2 = gpio.provisionDigitalOutputPin(gpioProvider, MCP23008Pin.GPIO_01, "Relay7", PinState.LOW);
                relay2.setShutdownOptions(true, PinState.LOW);
            }

            if (numRelays >= 3) {
                relay3 = gpio.provisionDigitalOutputPin(gpioProvider, MCP23008Pin.GPIO_02, "Relay6", PinState.LOW);
                relay3.setShutdownOptions(true, PinState.LOW);

            }

            if (numRelays >= 4) {
                relay4 = gpio.provisionDigitalOutputPin(gpioProvider, MCP23008Pin.GPIO_03, "Relay5", PinState.LOW);
                relay4.setShutdownOptions(true, PinState.LOW);
            }

            if (numRelays >= 5) {
                relay5 = gpio.provisionDigitalOutputPin(gpioProvider, MCP23008Pin.GPIO_04, "Relay4", PinState.LOW);
                relay5.setShutdownOptions(true, PinState.LOW);

            }

            if (numRelays >= 6) {
                relay6 = gpio.provisionDigitalOutputPin(gpioProvider, MCP23008Pin.GPIO_05, "Relay3", PinState.LOW);
                relay6.setShutdownOptions(true, PinState.LOW);
            }

            if (numRelays >= 7) {
                relay7 = gpio.provisionDigitalOutputPin(gpioProvider, MCP23008Pin.GPIO_06, "Relay2", PinState.LOW);
                relay7.setShutdownOptions(true, PinState.LOW);
            }

            if (numRelays == 8) {
                relay8 = gpio.provisionDigitalOutputPin(gpioProvider, MCP23008Pin.GPIO_07, "Relay1", PinState.LOW);
                relay8.setShutdownOptions(true, PinState.LOW);
            }

        } catch (Exception ex) {
            System.out.println("A serious error has occured:");
            ex.printStackTrace();
        }
    }

    @Override
    public void run() {

        switch (numRelays) {

            case 8:
                runTest(relay8, minimumClicks + 8, this.delay);

            case 7:
                runTest(relay7, minimumClicks + 7, this.delay);

            case 6:
                runTest(relay6, minimumClicks + 6, this.delay);

            case 5:
                runTest(relay5, minimumClicks + 5, this.delay);

            case 4:
                runTest(relay4, minimumClicks + 4, this.delay);

            case 3:
                runTest(relay3, minimumClicks + 3, this.delay);

            case 2:
                runTest(relay2, minimumClicks + 2, this.delay);

            case 1:
                runTest(relay1, minimumClicks + 1, this.delay);

        }

        // get out gracefully
        gpioProvider.shutdown();
        //       gpio.shutdown();

    }

    /**
     *
     * @param pin
     * @param number
     * @throws InterruptedException
     */
    private void runTest(GpioPinDigitalOutput pin, int number, int delay) {

        try {

            System.out.println("Expect: " + number + " counts for relay: " + pin.getName());

            for (int i = 0; i <= number - 1; i++) {

                gpio.setState(PinState.HIGH, pin);
                Thread.sleep(delay);

                gpio.setState(PinState.LOW, pin);
                Thread.sleep(delay);
            }

        } catch (Exception e) {

        }
    }
}



If anyone can help, I would appreciate it immensely.


Regards,


George.
John
Posts: 4
Joined: Wed Sep 30, 2015 2:43 am
Location: Amsterdam
Contact:

Re: UniPi and pi4j

Postby John » Sat Oct 10, 2015 3:38 pm

This looks like maybe a bug in the Pi4J Java code and not in the application.

As far as i known the Pi4J library caches the pinmodes at the moment they are being initialized just in case you re-initialize a pin it throws an exception.

The error is an error showing that a certain entry in an Java Array does not exist at position 128, and hence throws an index out of bounds exception. I would discuss this one with the Pi4J developer as it is the Pi4J lib throwing the exception.
George Proost
Posts: 5
Joined: Thu Jan 22, 2015 11:44 am
Location: Turnhout, Belgium

Re: UniPi and pi4j

Postby George Proost » Sun Oct 11, 2015 12:06 pm

Hi John,

Yes issue is pi4j .. pin caching..

Currently under snapshot-1.0.1 fails ... under version 1.0 works.
I need snapshot however due to improved serial behaviour.

I have contacted the developers.

Regards

George
John
Posts: 4
Joined: Wed Sep 30, 2015 2:43 am
Location: Amsterdam
Contact:

Re: UniPi and pi4j

Postby John » Sun Oct 11, 2015 6:43 pm

Hi George,

Have you tried jssc for serial connections? It controls both serial pins (using /dev/) and serial over usb. You would be able to use the 1.0 then.

Cheers,
John
George Proost
Posts: 5
Joined: Thu Jan 22, 2015 11:44 am
Location: Turnhout, Belgium

Re: UniPi and pi4j

Postby George Proost » Tue Oct 13, 2015 10:12 am

Thanks John,

I'll look into that.


George.

Return to “General discussion”

Who is online

Users browsing this forum: No registered users and 1 guest