Ejemplo sensor de golpes y detector de movimiento en la Raspberry Pi con Java

Escrito por el .
gnu-linux java planeta-codigo programacion
Enlace permanente Comentarios

Raspberry Pi

Java

Otro par de sensores que incluye el kit de introducción a la electrónica para la Raspberry Pi son un sensor de golpes o tilt y un detector de movimiento. El funcionamiento de ambos es muy similar, utilizando un pin GPIO como entrada se recibe si el sensor de golpes está activo o si el detector de movimiento ha detectado movimiento. El sensor de golpes es una bolita de mercurio encerrada en una ampolla de cristal. Como el mercurio a temperatura ambiente su estado es líquido puede moverse y como es un metal puede conducir la electricidad cuando está en una determinada posición entre dos filamentos.

El sensor de golpes necesita de tres cables uno para la corriente de 3.3V, otro para tierra y finalmente otro que se conecta como entrada a un pin GPIO. Usando varios cables hembra-hembra y macho-macho hacemos las conexiones entre el sensor y la placa de pruebas sin soldadura o breadboard.

Sensor de golpes y detector de movimiento Sensor de golpes y detector de movimiento

Sensor de golpes y detector de movimiento

Usando la librería diozero para controlar los pines GPIO desde un programa implementado con Java detectamos si el sensor está activo o no según la posición de la bolita de mercurio. El ejemplo consiste en encender un diodo LED que ya mostré en un artículo anterior de esta serie sobre electrónica cuando el sensor tilt esté activo. Usaré el pin 18 para el diodo LED y el pin 21 para el sensor según la nomenclatura de Broadcom. Los pines serían el 12 según la nomenclatura del header y 1 según la nomenclatura de wiringPi para el diodo LED y 13 y 2 para el sensor tilt.

Cableado sensor de golpes

Cableado sensor de golpes
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package io.github.picodotdev.blogbitix.javaraspberrypi;

import com.diozero.LED;
import com.diozero.api.*;

public class Tilt {

    public static void main(String[] args) throws InterruptedException {
        try (LED led = new LED(18); DigitalInputDevice tilt = new DigitalInputDevice(21)) {
            led.on();
            Thread.sleep(2000);
            led.off();

            tilt.whenActivated(() -> {
                led.on();
            });
            tilt.whenDeactivated(() ->  {
                led.off();
            });

            Thread.sleep(30000);
        }
    }
}
Tilt.java

En el siguiente vídeo se aprecia como cuando al cambiar de posición del sensor de movimiento se mueve la bolita de mercurio y el diodo LED de ejemplo se enciende y apaga.

El detector de movimiento en teoría es similar en funcionamiento al tilt y la librería diozero proporciona la clase MotionSensor para hacer más sencillo su uso. Digo en teoría porque no he conseguido hacerlo funcionar y he revisado varias veces las conexiones mostradas en otros ejemplos incluido el ejemplo de osoyoo, no se si es porque me falta algo más que debo tener en cuenta y que no conozco o el sensor no funciona viniéndome estropeado. Cuando el sensor detecta movimiento cambia el voltaje de su pin GPIO de datos. Los otros dos pines que utiliza son uno para el voltaje de 5V y el de tierra.

El programa Java para el sensor de movimiento es similar al sensor tilt e igualmente encendería o apagaría un diodo LED cuando detecta movimiento.

Cableado sensor de movimiento

Cableado sensor de movimiento
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package io.github.picodotdev.blogbitix.javaraspberrypi;

import com.diozero.LED;
import com.diozero.sandpit.MotionSensor;

public class Motion {

    public static void main(String[] args) throws InterruptedException {
        try (LED led = new LED(18); MotionSensor motion = new MotionSensor(21)) {
            led.on();
            Thread.sleep(2000);
            led.off();

            motion.whenActivated(() -> {
                led.on();
            });
            motion.whenDeactivated(() ->  {
                led.off();
            });

            Thread.sleep(30000);
        }
    }
}
Motion.java

Ambos ejemplos pueden usarse con los siguientes comandos cambiando la dirección IP de la Raspberry Pi y el directorio de la misma a donde se suben los ejemplos.

1
2
3
$ ./gradlew upload
$ ssh -t 192.168.1.101 'cd /home/raspberrypi/scripts/javaraspberrypi && sudo java -classpath "*" io.github.picodotdev.blogbitix.javaraspberrypi.Tilt'
$ ssh -t 192.168.1.101 'cd /home/raspberrypi/scripts/javaraspberrypi && sudo java -classpath "*" io.github.picodotdev.blogbitix.javaraspberrypi.Motion'
execute.sh

El siguiente artículo de la sería será sobre cómo usar un servo motor que es diferente de un motor que gira constantemente.

Terminal

El código fuente completo del ejemplo puedes descargarlo del repositorio de ejemplos de Blog Bitix alojado en GitHub.


Comparte el artículo: