G014 Control de un servo con un joystick a través de arduino

Descripción                                                                                                        ADM
Vamos a montar servo a la salida de arduino y le vamos a conectar el joystick a las entrada analógica. Al mover el joystick moveremos el servo, y además instalaremos un LED, que podremos encender al presionar el botón.


Materiales
Placa de Arduino
1 Servo Motor
1 Joystick
Protoboard, cables para las conexiones y el cable USB para conectar Arduino al PC y sirve además de alimentación

Esquema


Vamos a montar un servo que será cuyo pin de control irá conectado al pin 6 de arduino, recuerda que es uno de los que pueden modular el ancho de pulso. 


Al pin 12 de arduino vamos conectar un LED con su resistencia limitadora, es LED se encenderá cuando pulsemos el botón del joystick. El pin SW del Joystick lo vamos a conectar al pin 4 de arduino, que serán por donde entre la señal del botón del joystick a arduino.

El pin del eje X del joystick entra en la entrada analógica A1 de arduino, mientras que el pin  del eje Y entra en la entrada analógica A2 de arduino, que en el código la ignoramemos, aunque se podría utilizar para controlar un segundo servo.  Por supuesto hay que conectar los pines de alimentación a sus respectivos lugares.

Montaje



Código
Con este primer código, moveremos el eje del servo a la izquierda o a la derecha usando el joystick, y encenderemos el LED cuando pulsemos el botón. La particularidad es que cuando soltemos el joystick el eje vuelve a su posición inicial, de forma que se vuelve imposible parar el eje en un punto intermedio, este solo se desliza hasta la posición final ya sea izquierda o derecha.
#include <Servo.h>
Servo servo1;
int angulo = 0;
int Eje_X = A1;
int Eje_Y = A2;
int boton = 4;
int LED =12;

void setup() {
  servo1.attach(9);
  pinMode(boton, INPUT_PULLUP);
}

void loop() {
  angulo = map( analogRead(A0),0,1024,0,180);
  servo1.write(angulo);
  if(! digitalRead(boton)){
       digitalWrite(LED, HIGH);
  }else{
    digitalWrite(LED, LOW);
  }
  delay(250);
}
En la primera línea incluimos la librería Servo. En la siguiente línea creamos un objeto tipo Servo, llamado servo 1. Luego creamos una variable tipo entero llamada angulo, que contendrá el valor del ángulo de la posición del servo y la inicializamos en 0. Luego declaramos la variable de tipo entero llamada Eje_X  y le asignamo la entrada analógica A1, también declaramos otra variable de tipo entero Eje_Y que le asignamos la entrada analógica A2, estas dos variables contendrán los valores del los dos ejes del joystick. En la siguente línea vamos a declarar dos variable tipo entero en la misma línea una llamada boton que le asignamo el pin 4 y otra LED que le asignamo el pin 12 .

El setup solo contiene dos líneas la primera adjunta el pin 6 de arduino al objeto servo1 que controlará al servo.  La segunda linea declara el pin 4 contenido en la variable boton, como una entrada pullup, lo que nos permite ahorranos una resistencia pullup que ya trae arduino.

En el loop la primera línea asigna a la variable angulo como valor el resultado de la función map, donde lee la entrada de A1 y divide 180/1024 y lo multiplica por el valor de la entrada en ese momento, el resultado de la proporción se escribe en angulo en el objeto servo1 con la siguiente línea.

El if se utiliza para encender el led al pulsar el botón. Como la entrada del botón esta conectada a una resistencia pullup, cuando no pulsamos el botón tenemos un HIGH en la entrada, y cuando pulsamos tenemos un LOW en la entrada, por este motivo invertimos la condición de if, para que se encienda cuando pulsamos. Haz una pausa de 250 milisegundos y empezamos de nuevo.

Está claro que con el código anterior el movimiento de servo no es muy preciso, por eso no es muy buena idea enviar las lecturas del potenciómetro directamente al servo, sino que es mejor filtrarlas.  

Una técnica básica es leer la entrada del potenciómetro y decidir si subir o bajar el ángulo del eje. No es para calcular el angulo del eje.

Como el potenciómetro del joystick nos da valores entre 0 y 1000, cuando esta suelto en el centro, nos dará unos 500 poco más o menos, así que dándole un margen de tolerancia, solo aumentaremos el ángulo un valor dado, si la lectura del potenciómetro pasa de 600 subiremos y si baja de 400 bajaremos el valor del ángulo.  De esta forma las pequeñas oscilaciones se habrán filtrado.  Todo esto nos dará como resultado que el eje permanecerá en un angulo determinado y girará a la izquierda o a la derecha, un grado cada 50ml, cada vez que el potenciómetro este por debajo de 400 o por encima de 600, quedándose quieto en cualquier otra lectura. Esto al contrario de antes, cuando soltemos el joystick no volvera al ángulo del eje inicial, sino que se quedará en el último angulo registrado.
#include <Servo.h>
Servo servo1;
int angulo = 0;
int Eje_X = A1;
int Eje_Y = A2;
int boton = 4;
int LED = 12;
int salto = 3;

void setup() {
  servo1.attach(6);
  pinMode(boton, INPUT_PULLUP);
}

void loop() {
  int p = analogRead(A1);
  if(p < 400){
    angulo = angulo - salto;
  } else if(p > 600){
      angulo = angulo + salto;
  }
  servo1.write(angulo);
  if(! digitalRead(boton)){
       digitalWrite(LED, HIGH);
  }else{
    digitalWrite(LED, LOW);
  }
  delay(250);
}



Basándonos en el código anterior, hemos modificado el código de la siguiente manera. En la variable ángulo, la inicializamos en 90 grados, lo que posiciona al servo en la mitad del recorrido. Hemos creado la variable tipo entero llamada salto, que son los grado que variará cada movimiento que realice el eje, es decir, este se moverá de 3 en 3 grado, esta variable establece la precisión del giro, cuanto más pequeña más lenta, pero más precisa.

el setup se mantiene igual, sin variación alguna

El loop es lo que más ha variado, solo hemos dejado el if del botón. Hemos declarado una variable local tipo entero llamada p y le hemos asignado el valor de la entrada analógica A1. Luego hemos creado un bloque de if, en el que si la variable p es menor que 400, la variable angulo es igual a su propio valor menos el valor de salto. Si la variable p es mayor que 600 el, la variable angulo pasa a ser su propio valor mas el valor de salto. Una vez sepa cual es el valor de salto lo escribirá en el objeto servo1 y el servo se girará en el sentido correspondiente. Luego comprobará si se ha pulsado el botón y encenderá o no el LED, esperará 50 milisegundos antes de volver a empezar. con el Delay se regula la velocidad de giro, cuanto más alto sea el número de milisegundo, más lento gira, pero se vuelve más preciso.


No hay comentarios:

Publicar un comentario