Este tutorial te mostrará como utilizar el Módulo KY-023 Sensor Joystick para controlar el ángulo de movimiento de un par de servomotores SG90.
Cuando el Módulo KY-023 Sensor Joystick se mueva de arriba a bajo uno de los servomotores responderá al movimiento, mientras que el segundo servomotor realizará el de derecha a izquierda. Esta limitante se presenta porque los SG90 solo tienen un rango de movimiento de 0° a 180°, por lo que el movimiento completo de 360° se distribuye entre los dos servomotores.
¿Cómo funciona el Módulo KY-023?
El módulo KY-023 cuenta con un posicionamiento de eje dado por valores entre 0 a 1023 y conforme se mueve, varía su valor dando las coordenadas de cada eje.
Entonces los valores de las posiciones a tomar en cuenta para realizar el código de programación serán:
- Reposo (central): X = 512 , Y = 512
- Arriba: X = 1023 , Y = 512
- Abajo: X = 0 , Y = 512
- Derecha: X = 512, Y = 1023
- Izquierda: X = 512, Y = 0
Para realizar el proyecto se necesitan los siguientes materiales:
- Módulo KY-023 Sensor JoyStick (1 unidad)
- Servomotor SG90 RC 9g (2 unidades)
- Tarjeta de Desarrollo Arduino Nano 3.0 (1 unidad)
- Cables Dupont Cortos MM y MH
Diagrama de conexiones
Se realizará la conexión de los SG90 y del KY-023 en el Arduino Nano acomodando la posición inicial de los servos manualmente y teniendo en cuenta el movimiento que se requiere, es decir, la conexión del Servo 1 en el pin D6, de lo contrario realizará movimiento del Servo 2 y viceversa.
Si quieres cambiar los pines para la conexión de los servomotores, revisa que se traten de pines PWM.
Código en IDE Arduino
Para llevar acabo el siguiente código necesitaremos la librería Servo.h y tener en cuenta los valores de posicionamiento del modulo KY-023.
#include <Servo.h> //librería para control del Servo //Declaración de los Objetos servos SG90 Servo SX; //Servo para los movimientos en el EjeX (derecha-izquierda) Servo SY; //Servo para los movimientos en el Eje Y (arriba-abajo) //Declaración del Módulo KY-023 int JoyX=0; //Pin analógico del Joystick RX al pin A0 int JoyY=1; //Pin analógico del Joystick RY al pin A1 int valX; //variable para guardar los valores del Eje X int valY; //variable para guardar los valores del Eje Y //Valores constantes (máximos y mínimos)del Joystick de los ejes X y Y int Valor_Xmax = 1023; // Valor de X para llegar al lado izquierdo int Valor_Xmin = 0; // Valor de X para llegar al lado derecho int Valor_Ymax = 1023; // Valor de Y para apunta hacia arriba int Valor_Ymin = 0; // Valor de Y para apunta hacia abajo void setup() { SY.attach(6); // El Objeto del servo SG90 para el eje Y se asocia al pin PWM D6 SX.attach(5); // El Objeto del servo SG90 para el eje X se asocia al pin PWM D5 } void loop() { valX = analogRead( JoyX ); //Se lee el valor del joystick y se guardaran esos valores en valx valY = analogRead( JoyY ); //Se lee el valor del joystick y se guardaran esos valores en valy //Se realizara una serie de condiciones respecto a los movimientos posibles del módulo KY-023 if (valX > 511) { //Movimiento del eje X a lado Izquierdo partiendo del centro (valor de 511) Valor_Xmax = 1023 - valX + 511; //La constante del valor máximo para X se modificara con el nuevo valor Valor_Xmin = 0; //La constante del valor mínimo se mantendrá } else if (valX < 511) { //Movimiento del eje X a lado Derecho partiendo del centro (valor de 511) Valor_Xmax = 1023; //La constante del valor máximo se mantendrá Valor_Xmin = 511 - valX; //La constante del valor mínimo para X se modificara con el nuevo valor } if (valY > 511) { //Movimiento del eje Y hacia Arriba partiendo del centro (valor de 511) Valor_Ymax = 1023 - valY + 511; //La constante del valor máximo para Y se modificara con el nuevo valor Valor_Ymin = 0; //La constante del valor mínimo se mantendrá } else if (valY < 511) { //Movimiento del eje Y hacia Abajo partiendo del centro (valor de 511) Valor_Ymax = 1023; //La constante del valor máximo se mantendrá Valor_Ymin = 511 - valY; //La constante del valor mínimo para Y se modificara con el nuevo valor } //Posición de los servos SG90 segun los valores obtenidos de las condiciones antes declaradas valX = map (valX, Valor_Xmin, Valor_Xmax, 0, 180); //La variable valX tendrá el vector con los valores del movimiento, siendo 0° y 180° los valores de base o edo inicial SX.write (valX); // El servo 2 EjeX (derecha-izquierda) tendrá los valores para ejecutar valY = map (valY, Valor_Ymin, Valor_Ymax, 0, 180); //La variable valY tendra el vector con los valores del movimiento, siendo 0° y 180° los valores de base o edo inicial SY.write (valY); // El servo 1 EjeY (arriba-abajo) tendrá los valores para ejecutar delay (50); //Esperamos 50 ms para la siguiente lectura }
En el siguiente video puede observar la movilidad de los servos en conjunto es de 360°, siendo que el Servo 1 tiene la dirección de arriba/abajo y el Servo 2 realiza el movimiento de derecha/izquierda.
Para controlar los servos SG90 mediante Push Button consulta el siguiente tutorial:
Control de un Servomotor SG90 con el Sensor Push Button KY-004