Servo controlado con Joystick en Arduino

por | Oct 25, 2017 | Arduino | 8 Comentarios

Joystick Material Design

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>;
A continuación deberemos definir las variables que usaremos en nuestro programa.
Servo servo;  // Crear un objeto tipo Servo llamado servo
int angulo = 90;  // Empezamos en el centro
int salto = 1;  // Controla el salto por movimiento
Una vez hecho esto declararemos la función setup().
void setup() {
  servo.attach(6);  // Conectar servo al pin 6
  servo.write(angulo);
  Serial.begin(9600);
}
Ahora vamos a declarar la función loop(), que será la que se encargará de mover nuestro servo cuando movamos el joystick. Dentro de esta función tenemos una serie de ifs que se comprueban cuánto estas accionando el joystick, para así variar la velocidad de movimiento del mismo.
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
}
Aquí os dejo un pequeño vídeo de como funciona el servo con el joystick.