InicioTarjetas de DesarrolloArduinoControl de Servomotores SG90 con Módulo KY-023 Sensor Joystick

Control de Servomotores SG90 con Módulo KY-023 Sensor Joystick

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:

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

TUTORIALES RELACIONADOS