Java 7 y Raspberry PI (GPIO with PI4J)


Un post luego de montón de años.

Estuve jugando con un RasbperryPI modelo B, pensando en el internet de las cosas (Internet of Things – #IoT es el hashtag de Twitter). No voy a entrar en detalles del #IoT, sino que les comentaré sobre Java y Rasbperry PI.

El Raspberry PI modelo B lo adquirí aquí (omito nombres) y lo hice traer con el mail-box de correos del Ecuador. En ese mismo sitio compré: la memoria SD con raspbian (SO para Raspberry), un case y un adaptador de corriente que según pensé era lo que necesitaría, pero ahora con experiencia les digo que sería mejor comprar un starter kit como pueden ver aquí, lo digo porque he buscado en mi ciudad (Loja) algunos elementos y no he podido encontrar todos, ni tampoco las partes para armarlos. Lamentablemente esta empresa que tiene muchos accesorios para el Raspberry y también para Arduino, no hace entregas a estos buzones en Miami, es por eso que me ha tocado buscar otras alternativas. En fin, y volviendo al tema no esta por demás mencionarles que necesitamos un mouse y teclado USB, así como también un cable HDMI o cables de audio y vídeo para conectar el Raspberry al tele o pueden ver también adaptadores de HDMI a VGA y usan el monitor de su computador.

Los primeros pasos los pueden encontrar aquí Tutorial 3 – Instalación y configuración de inicial del Raspberry Pi (raspi-config), resulta interesante ver como aquí ya se habla de Rastrack que es un sitio que lleva un registro de quienes tienen un Raspberry y que voluntariamente publicaron sus datos, para Ecuador se ve 31 dispositivos, pero de seguro este número no es real y existen más equipos, pero no registrados.

Una vez configurado les recomiendo usar la siguientes herramientas:

  • Para poder realizar conexión remota usen CoRD, antes deben instalar xrdp, aquí les dejo el link que los ayudará Remote Desktop With Raspberry Pi. Aquí comentarles que tengo problemas con el teclado, el Raspberry está configurado algún teclado en un idioma diferente al teclado en español que tengo y siempre tengo que buscar los caracteres o copiarlo de algún texto en internet.
  • Ahora me pongo la camiseta de «macquero», para transferir archivos usaremos la herramienta Netatalk que permitirá trabajar al Raspberry con el Apple Filing Protocol, y para ello ejecutamos el comando:
sudo apt-get install netatalk

Empezamos a mezclarlo con Java….

Java desde su nacimiento fue pensado para ser multidispositivo, por allá en 1995 se hablaba de refrigeradoras, hornos, cocinas, etc. Hoy por hoy Java está en muchos de nuestros dispositivos, desde nuestro computador, pasando por reproductores blue-ray, menus de TV digital, hasta llegar a los chip de celulares, si señores Java está en los chip de nuestros celulares. Lo anterior me hizo recordar este vídeo (JavaZone 2013: Javapocalypse).

Desde el año pasado (Septiembre de 2013) Raspbian incluye el Java Development Kit (JDK) para la versión SE, es decir la versión estándar, es decir la versión que usamos en cualquiera de nuestro computadores. Aquí un punto a considerar, también existe la versión Java ME que es la microedition que también se puede usar en un Raspberry, pero hoy usaremos de la versión SE 1.7. Y como ya viene instalada vamos a nuestro Raspberry vía escritorio remoto, abrimos y ventana del LxTerminal y ejecutamos el comando:

 java -version 

En mi caso tengo la versión 1.7 update 40.

Podemos hacer el tipico programa Hola mundo!, sí yo sí lo hice pero no les voy a hablar de ello sino les comentaré de cómo realizar algo diferente encender/apagar un LED desde un programa Java que se ejecuta en el Raspberry PI, nuevamente aclaro que aquí se usa la versión 1.7 estándar de Java no la ME. La primera aproximación fue buscar como manipular GPIO utilizando Java, por que GPIO es el mecanismo que tiene un Raspberry para interactuar con otros dispositivos o en este caso con un circuito eléctrico. Si quieren información sobre el GPIO pueden encontrarla en Simple Guide to the RPi GPIO Header and Pins.

Empecé la búsqueda y encontré la siguiente página Control a LED with your Raspberry Pi by using Java SE Embedded. De esta página comentarles que obtuve el diseño del circuito eléctrico que usé, OJO diseñé el circuito según las fotos, pero NO con el diagrama que se muestra aquí, por que es diferente al de las fotos. Resumo la conexión: pin 18 del GPIO a la resistencia de 560 ohm de la resistencia al ánodo del LED y el cátodo del LED al pin 6 del GPIO que es tierra. Luego de revisar el código que se muestra puedo decir que básicamente cada PIN o GPIO Pin se maneja a través de la escritura de datos en unos directorios que se ubican en /sys/class/gpio/ aquí dentro se encuentran otros directorios con el prefijo gpio seguido de un número (que representa al PIN con el que se trabaja), dentro de esos directorios se escriben algunos archivos que ayudan a que el LED se encienda o se apague.

Debo ser honesto no implemente el código que ese post mostraba, sino que usé como base el que se muestra en Pi4J – The only library you need for your Raspberry Pi and Java SE Embedded, que es del mismo autor, pero que en este caso usa una librería denominada Pi4J que trata de ser un puente entre Java y las librerías nativas del Raspberry (del Raspbian para hablar con propiedad) si alguien sabe algo de Java Native Interface o JNI, lo anterior le sonará similar.

En el sitio web de Pi4J encontré varios ejemplos, concretamente Control GPIO que me mostró otras formas de trabajo y sobre todas las cosas me confirmó el diagrama del circuito, por que sí, sí temía dañar el raspberry en mi primer intento. Para poder usar Pi4J, que sin lugar a dudas nos hace más sencillas las tareas, hay que:

  1. descargar un zip desde aquí y agregar los jar: pi4j-core, pi4j-device, pi4j-gpio-extension y pi4j-service. Creo que únicamente se usa pi4j-core.jar, pero no estoy seguro y no lo he probado, y por ello trabajé con las 4. Utilicé como IDE a NetBeans 7.4, así que el proceso de agregar los jar al proyecto es sencillo.
  2. conocer el número con el que Pi4J identifica a los pines del GPIO (que es diferente a los números que maneja Rapberry), es decir debemos hacer un mapeo que los encuentran aquí, recuerden usar los números grandes que se encuentran en negrita. En mi caso usé el pin 18 (GPIO5) es por eso que el código verán algo uso RaspiPin.GPIO_05.

El siguiente código que escribí permite que el usuario ingrese cuántas veces se enciende/apaga el LED:

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.gpio.RaspiPin;
import java.util.Scanner;

/**
 *
 * @author jorgaf
 */
public class DemoLED {
    public static void main(String[] args) {
        int limit = 1;
        Scanner lec = new Scanner(System.in);

        GpioController gpio = GpioFactory.getInstance();
        GpioPinDigitalOutput ledPin = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_05, "LED", PinState.HIGH);

        do{
            System.out.print("Ingrese un valor: ");
            limit = lec.nextInt();
        }while(limit <= 0);

        try{
            for(int i = 0; i < limit; i ++){
                ledPin.low();
                Thread.sleep(2*1000);
                ledPin.high();
                Thread.sleep(2*1000);
            }
            ledPin.toggle();
        } catch(InterruptedException ie){

        } finally{
            gpio.shutdown();
        }
    }
}

Un par de imágenes que muestran lo que se hizo:

El programa ejecutado desde del Raspberry

IMG_0211

El montaje con el LED apagadoIMG_0212

Ahora con el LED encendidoIMG_0213

Eso es todo lo que se hizo, no es una tarea compleja, pero les puedo ayudar a quienes como yo estamos iniciando en el tema. Antes de terminar la entrada les quiero comentar que para el 31 de Marzo de 2014 la gente de Oracle está preparando un MOOC que tiene por título: Develop Java Embedded Applications Using a Raspberry Pi que durará 5 semanas. Según he revisado los contenidos gran parte del curso la dedicaremos  a construir programas que trabajen con un par de sensores (Adafruit Ultimate GPS Breakout – 66 channel w/10 Hz updates y BMP180 Barometric Pressure/Temperature/Altitude Sensor- 5V ready). Existe un kit de accesorios con todo lo que se necesitará en el curso, pero como les comenté es una pena pero no podemos comprar los accesorios del curso porque los vende Adafruit y no hace envíos a buzones en Miami (a pesar de que escribí un correo a Adafruit explicando el por que uso un buzón en Miami, la respuesta fue no).

Pero no todo está perdido si quieren adquirir el kit les comento que cables, LEDs, resistencias, condensadores, protoboard, capacitores se pueden encontrar fácilmente, mientras que el USB TTL console cable y el Adafruit Pi Cobbler kit with GPIO cable se puede pedir a alguien de electrónica que los elabore ya que no son complejos. Y para los sensores si debemos comprarlos en internet, yo los compré aquí.

Espero que estas líneas sean útiles para ustedes.

Hey también nos modernizamos y ahora usamos GIT para mostrar el código, así que aquí  el código para que lo clonen

3 comentarios en “Java 7 y Raspberry PI (GPIO with PI4J)

  1. Una vez he escrito el código de mi programa en un PC (X comodidad) como genero lo que viene siendo el programa para pasarlo a la Raspberry? Y como lo ejecuto en ella?

    Buen tuto, muchas gracias!

Deja un comentario