Controlar un servomotor con la Raspberry Pi y Java

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

Raspberry Pi

Java

Otro de los elementos que incluye el kit de iniciación a la Raspberry Pi es un servomotor, en concreto uno del modelo SG90. En la especificación del servomotor SG90 está detallado cual es el código de colores de los cables. Rojo para la corriente de 5V, marrón para tierra y naranja para el pin PWM con el que se controlará el servo motor, el diodo led es simplemente para saber que cuando se enciende el programa Java se ha iniciado. La Raspberry Pi tiene algunos pines con soporte hardware para realizar PWM.

Un servomotor es un elemento distinto de un motor, un motor usa dos cables uno para mover el motor hacia adelante y otro cable para mover el motor hacia atrás. Los servomotores además de utilizar un único cable para controlarlo su funcionalidad es distinta usándose para posicionar el motor en un determinado ángulo que en el caso del SG90 tiene un ángulo de funcionamiento de 180º. Además el servomotor es más complejo, como se explica en el siguiente artículo de título ¿Cual es la diferencia entre un motor DC y servo motor? el servomotor se compone de varios elementos empaquetados como una pieza. Se compone de un motor DC normal, una unidad de reducción, un sensor de posicionamiento y un circuito de control.

Servomotor Cableado en la breadboard

Servomotor y cableado

La función del servomotor es recibir la señal de control y aplicar corriente al motor hasta que que esté en la posición indicada por la señal. Un servomotor no rota libremente sino que como he comentado en el caso del SG90 tiene un ángulo de funcionamiento de entre 0º y 180º. La señal de control es un pulso de anchura modulada o PWM.

Usando la librería Diozero es sencillo controlar un servomotor a través de la clase Servo. El constructor recibe tres datos el pin de la Raspberry Pi que controlará el servomotor, según la nomenclatura Broadcom que usa la librería Diozero, la frecuencia del pulso PWD que sirve para controlar la velocidad de rotación y finalmente la posición inicial a establecer. Con el método pulseWidthMs y un rango de un valor float entre 0.6 y 2.4 controlaremos la posición o ángulo del servomotor.

El siguiente programa Java cambia en un bucle la posición del servo desde la posición mínima a la máxima. En él he utilizado el pin 18 que en la Raspberry Pi 1 soporta PWD, en las versiones 2 y 3 podríamos haber usado los pines 18 o 19.

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

import com.diozero.LED;
import com.diozero.sandpit.Servo;

public class Servomotor {

    public static void main(String[] args) throws InterruptedException {
        try (LED led = new LED(21); Servo servo = new Servo(18, 50, 1.45F)) {
            led.on();

            for (int i = 0; i < 5; ++i) {
                Thread.sleep(3000);
                servo.setPulseWidthMs(0.6F);
                Thread.sleep(3000);
                servo.setPulseWidthMs(2.3F);
            }

            servo.setPulseWidthMs(1.45F);
            Thread.sleep(2000);
        }
    }
}
Servomotor.java

Aunque he conseguido hacer funcionar el servomotor con este programa no ha sido exento de problemas. Y es que cuando el programa finaliza la Raspberry Pi se me bloquea o se pierde la conectividad de red. No se si por algún bug en la librería Diozero o alguna incompatibilidad con la Raspberry Pi 1 B, quizá en otro modelo de la Raspberry Pi no dé los problemas que a mi me da.

En otros artículos de la serie puedes consultar cómo usar otros elementos de kit con Java y la Raspberry Pi.

Terminal

El código fuente completo del ejemplo puedes descargarlo del repositorio de ejemplos de Blog Bitix alojado en GitHub y probarlo en tu equipo ejecutando siguiente comando:
./gradlew executeServomotor


Comparte el artículo: