Servo controlado con Joystick en Arduino

INTRODUCCIÓN
Esta vez veremos como elaborar un sencillo ejemplo para poder controlar un servomotor con un joystick como el de los mandos de las videoconsolas.
MATERIALES
Para llevar a cabo el proyecto necesitaremos los siguientes materiales:
- x1 Arduino UNO (o compatibles)
- x1 Servomotor (SG90)
- x1 Joystick module
ESQUEMA
Como alimentación del Arduino voy a usar el cable USB conectado a mi PC.
A TENER EN CUENTA: Los pines de ejeX y ejeY del joystick son analógicos, y el de switch es digital. El pin para mover el servo es controlado mediante PWM (el simbolito ~ que figura al lado del numero del pin de la placa).
Arduino
Vamos a necesitar un par de librerías para este proyecto, concretamente Servo para el control del servomotor. Lo primero que necesitamos es importar la librería dentro de nuestro sketch Arduino.
#include <Servo.h>;
Servo servo; // Crear un objeto tipo Servo llamado servo
int angulo = 90; // Empezamos en el centro
int salto = 1; // Controla el salto por movimiento
void setup() {
servo.attach(6); // Conectar servo al pin 6
servo.write(angulo);
Serial.begin(9600);
}
void loop() {
int ejeX = analogRead(A1); // Leemos la entrada del joystick
ejeX = constrain(ejeX, 0, 1024); // Evitamos que el valor del ejeX se salga de estos parámetros
angulo = constrain(angulo, 0, 180); // Evitamos que el ángulo se salga de estos parámetros
//Serial.println(ejeX);
// Si no se mueve el joystick dejamos el servo como esta
if (ejeX > 505 && ejeX < 520) {
servo.write(angulo); // Le indicamos a cuantos grados se tiene que poner el servo
}
// Controla la disminución del ángulo dependiendo de cuánto accionemos el joystick
else if (ejeX < 505) {
if (ejeX > 435) {salto = 1;}
else if (ejeX > 335) {salto = 3;}
else if (ejeX > 235) {salto = 7;}
else if (ejeX > 135) {salto = 9;}
else {salto = 15;}
angulo -= salto; // Disminuimos el ángulo
servo.write(angulo); // Le indicamos a cuantos grados se tiene que poner el servo
//Serial.println("Menos ángulo");
}
// Controla el aumento del ángulo dependiendo de cuanto accionemos el joystick
else if (ejeX > 520) {
if (ejeX < 650) {salto = 1;}
else if (ejeX < 750) {salto = 3;}
else if (ejeX < 850) {salto = 7;}
else if (ejeX < 950) {salto = 9;}
else {salto = 15;}
angulo += salto ; // Aumentamos el ángulo
servo.write(angulo); // Le indicamos a cuantos grados se tiene que poner el servo
//Serial.println("Más ángulo");
}
delay(75); // Este delay regula la velocidad de lectura del joystick
}
El código completo nos quedaría así:
servo_and_joystick.ino
#include <Servo.h>;
Servo servo; // Crear un objeto tipo Servo llamado servo
int angulo = 90; // Empezamos en el centro
int salto = 1; // Controla el salto por movimiento
void setup() {
servo.attach(6); // Conectar servo al pin 6
servo.write(angulo);
Serial.begin(9600);
}
void loop() {
int ejeX = analogRead(A1); // Leemos la entrada del joystick
ejeX = constrain(ejeX, 0, 1024); // Evitamos que el valor del ejeX se salga de estos parámetros
angulo = constrain(angulo, 0, 180); // Evitamos que el ángulo se salga de estos parámetros
//Serial.println(ejeX);
// Si no se mueve el joystick dejamos el servo como esta
if (ejeX > 505 && ejeX < 520) {
servo.write(angulo); // Le indicamos a cuántos grados se tiene que poner el servo
}
// Controla la disminución del ángulo dependiendo de cuánto accionemos el joystick
else if (ejeX < 505) {
if (ejeX > 435) {salto = 1;}
else if (ejeX > 335) {salto = 3;}
else if (ejeX > 235) {salto = 7;}
else if (ejeX > 135) {salto = 9;}
else {salto = 15;}
angulo -= salto; // Disminuimos el ángulo
servo.write(angulo); // Le indicamos a cuántos grados se tiene que poner el servo
//Serial.println("Menos ángulo");
}
// Controla el aumento del ángulo dependiendo de cuánto accionemos el joystick
else if (ejeX > 520) {
if (ejeX < 650) {salto = 1;}
else if (ejeX < 750) {salto = 3;}
else if (ejeX < 850) {salto = 7;}
else if (ejeX < 950) {salto = 9;}
else {salto = 15;}
angulo += salto ; // Aumentamos el ángulo
servo.write(angulo); // Le indicamos a cuántos grados se tiene que poner el servo
//Serial.println("Más ángulo");
}
delay(75); // Este delay regula la velocidad de lectura del joystick
}
Descarga
Analyst Frontend Developer en Comunytek (BBVA CIB – NOVA).
Autodidacta, apasionado de las nuevas tecnologías y de los proyectos DIY.
hola a mi no me sirvio el codigo no jira el servo
Hola,
una pregunta tengo 4 servomotores sg 90 como puedo programarlos con 2 joysticks?
Gracias crack.
Disculpa colega, la parte del 15 que usas, esa parte que es la tarea que desempeña?
me funciono muy bien, muchas gracias por la aportación. me preguntaba que cambios le puedo hacer para mover motores de c/c muchas gracias
Hola, sigo tal cual las especificaciones pero el servomotor se mueve por si solo y no para de moverse
Hola Eduardo, ¿has probado a descargar el proyecto en la sección de descarga y ejecutarlo tal cual? También puede ser que tengas la conexión del joystick o del servo un poco diferente al esquema.
Un saludo!
disculpa en este programa puedo utilizar un servo de 15kg en lugar del servo que utilisaste
Hola Marco,
No deberías tener ningún problema en conectar un servo de 15kg.
Un saludo!