Cómo: controlar servomotores con un joystick Arduino

Hoy, les mostraré cómo usar un módulo Arduino Joystick para controlar un par de servos. La idea detrás del proyecto es tener un soporte donde puedas colocar una cámara u otra cosa y tener control total usando el joystick.

Solo necesita unos minutos y componentes muy simples para terminar el proyecto. Aquí tenéis un vídeo por si queréis echar un vistazo al resultado final.

¿Qué es un joystick?

Comencemos con lo básico… ¿Qué es un Joystick?

Para este proyecto, vamos a utilizar un módulo Arduino Joystick. Es un uso básico del módulo solo con fines de aprendizaje, pero existen infinitas aplicaciones, especialmente en el espacio de la robótica.

Este módulo de joystick Arduino es muy similar a lo que encontrarías en muchos controladores de juegos, pero si miramos debajo del capó, toda la magia sucede gracias a 2 potenciómetros, uno para el eje X y otro para el eje Y.

Los potenciómetros se utilizan realmente para controlar el movimiento 2D generando señales analógicas. Algunos módulos también tienen un botón pulsador que se puede usar para eventos especiales.

El módulo Joystick es un gadget que traduce el movimiento de tu mano en señales eléctricas, en otras palabras, el joystick traduce los movimientos completamente físicos en una forma digital que puede ser interpretada por nuestro controlador, el Arduino en este caso.

El joystick antiguo de arriba no es más que dos potenciómetros que nos permiten medir el movimiento de la palanca roja en una doble dimensión.

Los potenciómetros son básicamente resistencias variables que se utilizan en el módulo del joystick y actúan como sensores que proporcionan un voltaje variable según el movimiento del joystick alrededor de sus ejes.

Módulo de joystick Arduino

El módulo Arduino Joystick es como cualquier joystick con la ventaja de que tiene pines disponibles para pasar fácilmente las señales al microcontrolador, Arduino en este caso. Podemos controlar el eje X, el eje Y y las dimensiones Z (el botón para eventos especiales) usando este módulo de joystick.

Como se explicó anteriormente, los potenciómetros se usan para manejar los ejes X e Y, mientras que el botón es solo un interruptor. Los pines de datos para las dimensiones del eje X y el eje Y son señales de entrada analógicas, mientras que el pin de dimensión Z utiliza un botón de entrada digital. Por eso, los puertos X e Y se conectan a los pines analógicos de Arduino, mientras que el puerto Z se conecta al pin digital del microcontrolador.

Cuando gira el brazo del joystick, está cambiando la resistencia en el potenciómetro. Si la palanca de mando está en la dirección opuesta a la ruta desde el terminal de conexión de entrada, la señal experimentará la máxima resistencia.

Cambiar la resistencia del potenciómetro cambia la corriente en el circuito conectado. De esta forma, el potenciómetro convierte la posición física de la varilla en una señal eléctrica y la pasa al puerto del joystick en el controlador.

¿Qué es un servomotor?

El otro componente que usaremos hoy es un servomotor.

Los servos son motores pequeños y eficientes que se pueden posicionar con mucha precisión con el uso de un microcontrolador. Estas características los hacen muy útiles para aplicaciones como autos de juguete, robots y aviones. También se pueden usar en aplicaciones industriales, robótica, fabricación en línea, farmacia y prácticamente cualquier cosa que pueda imaginar.

El circuito del servo está integrado en la unidad del motor y tiene un eje posicional, generalmente equipado con engranajes. El motor está controlado por una señal eléctrica que determina la cantidad de movimiento del eje.

¿Cómo funciona el servomotor?

Los servomotores se controlan básicamente mediante el envío de un pulso eléctrico de ancho variable. Hay pulsos mínimos, pulsos máximos y tasas de repetición. Los servomotores generalmente solo se pueden girar 90 ° en cualquier dirección para un total de 180 °, aunque puede encontrar algunos que pueden girar 360 grados.

La posición neutral del motor se define como la posición en la que el servo tiene la misma cantidad de rotación potencial en el sentido de las agujas del reloj o en el sentido contrario a las agujas del reloj. La señal PWM enviada al motor determina la posición del eje y se basa en la duración del pulso enviado a través del pin de control.

El servo espera ver un pulso cada 20 milisegundos (ms), y la longitud del pulso determinará la distancia que gira el eje. Por ejemplo, un pulso de 1,5 ms hará que el motor vaya a la posición de 90°. Muévalo en sentido contrario a las agujas del reloj hasta la posición 0° durante menos de 1,5 ms. Cualquier posición de más de 1,5 ms hará que el servo gire en el sentido de las agujas del reloj hacia la posición de 180°.

Por supuesto, no necesita saber todas estas cosas porque usaremos una biblioteca para controlar el servo.

Proyecto de joystick Arduino

El módulo de joystick arduino proporciona un valor de 0 a 1023, ese valor se puede escalar y convertir en un número de grados de 0 a 180. El eje X del joystick controlará uno de los servos mientras que el eje Y controlará el otro.

El resultado final será un stand con 2 servos montados, uno de ellos controlará los movimientos izquierda/derecha y el otro arriba/abajo. Para el proyecto, estoy usando un soporte de cámara para facilitar el montaje de los servos, pero es totalmente opcional.

Lista de la compra

Aquí está la lista de componentes que necesita para construir el proyecto. El soporte de la cámara es totalmente opcional, pero te hará la vida más fácil.

Comencemos a Construir…

Conexiones del servomotor Arduino

La primera parte es conectar ambos Servos al Arduino. Las conexiones son muy sencillas, solo necesitas conectar alimentación y tierra y el cable que acciona el servo.

Servo arriba/abajo arduino Servo Derecha/Izquierda arduino
Cable rojo 5 voltios Cable rojo 5 voltios
cable negro TIERRA cable negro TIERRA
Cable Amarillo o Blanco PWM (4) Cable Amarillo o Blanco PWM (10)

Consulte el siguiente diagrama para obtener más detalles.

Conexión de joystick Arduino

El siguiente diagrama puede ser un poco confuso si obtuvo el módulo del enlace que le di. Su joystick Arduino probablemente tenga 5 pines expuestos para simplificar las cosas. Si te confundes, ve directamente a la mesa después de la imagen.

Palanca de mando arduino
5V 5V
TIERRA TIERRA
U/DU/D (eje Y) A4
L/RL/R (eje X) A3

Hay un pin adicional generalmente llamado SW que envía una señal digital cuando se presiona el joystick, pero no lo estamos usando para el proyecto.

Una vez que todo esté conectado, se verá más o menos como la imagen de abajo. He agregado un sensor ultrasónico para darle una idea de las cosas que puede montar en el soporte, pero no tiene ningún propósito.

Código fuente del servocontrolador de joystick Arduino

El código fuente es extremadamente simple, pero he agregado comentarios en cada línea para que no te pierdas nada. Tenga en cuenta que necesita agregar la biblioteca de servos para poder compilar el código.

#include const int servo1 = 3; // Pin para el primer servo const int servo2 = 10; // Pin para el segundo servo const int joyH = 3; // L/R Parallax Thumbstick const int joyV = 4; // U/D Parallax Thumbstick int servoVal; // variable para leer el valor del pin analógico Servo myservo1; // crea un objeto servo para controlar un servo Servo myservo2; // crea un objeto servo para controlar un servo void setup() { // Servo myservo1.attach(servo1); // adjunta el servo myservo2.attach(servo2); // conecta el servo // Inicializar Serial Serial.begin(9600); } bucle vacío () { salida Joystick (); // Muestra los valores del Joystick usando el monitor serial // Lee el valor del joystick horizontal (valor entre 0 y 1023) servoVal = analogRead(joyH); servoVal = map(servoVal, 0, 1023, 0, 180); // escalarlo para usarlo con el servo (resultado entre 0 y 180) myservo2.write(servoVal); // establece la posición del servo según el valor escalado // Lee el valor del joystick horizontal (valor entre 0 y 1023) servoVal = analogRead(joyV); servoVal = map(servoVal, 0, 1023, 70, 180); // escalarlo para usarlo con el servo (resultado entre 70 y 180) myservo1.write(servoVal); // establece la posición del servo según el valor escalado delay(15); // espera a que el servo llegue allí } /** * Muestra los valores del joystick */ void outputJoystick(){ Serial.print(analogRead(joyH)); Serial.print («—«); Serial.print(analogRead(joyV)); Serial.println («—————-«); }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

dieciséis

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

#include

constante int servo1 = 3; // Pin para el primer servo

const int servo2 = 10; // Pin para el segundo servo

const int joyH = 3; // Palanca de control de paralaje L/R

const int joyV = 4; // Joystick de paralaje U/D

valor servo int; // variable para leer el valor del pin analógico

Servo myservo1; // crea un objeto servo para controlar un servo

Servo myservo2; // crea un objeto servo para controlar un servo

configuración vacía () {

// servos

myservo1.adjuntar(servo1); // conecta el servo

myservo2.adjuntar(servo2); // conecta el servo

// Inicializar serie

Serial.begin(9600);

}

bucle vacío(){

salidaJoystick(); // Muestra los valores del Joystick usando el monitor serial

// Lee el valor del joystick horizontal (valor entre 0 y 1023)

servoVal = analogRead(joyH);

servoVal = map(servoVal, 0, 1023, 0, 180); // escalarlo para usarlo con el servo (resultado entre 0 y 180)

myservo2.write(servoVal); // establece la posición del servo según el valor escalado

// Lee el valor del joystick horizontal (valor entre 0 y 1023)

servoVal = analogRead(joyV);

servoVal = map(servoVal, 0, 1023, 70, 180); // escalarlo para usarlo con el servo (resultado entre 70 y 180)

myservo1.write(servoVal); // establece la posición del servo según el valor escalado

retraso (15); // espera a que llegue el servo

}

/**

* Mostrar valores de joystick

*/

salida vacíaJoystick(){

Serial.print(analogRead(joyH));

Serial.print («—«);

Serial.print(analogRead(joyV));

Serial.println («—————-«);

}

Después de cargar el código en tu Arduino UNO, deberías poder tener control total sobre tus servos. ¡Espero que hayas disfrutado el proyecto!