Descripición ADM
Temenos que ver que hacer para que el valor del potenciómetro represente la posición del servo de manera que el servo se mueva siguiendo al potenciómetro. Para ello hay que entender que el valor que leamos en la puerta A0 está comprendido entre 0 y 1024, y que estos valores tienen que distribuirse entre 0 y 180º. Así que para calcular el Angulo correspondiente basta con hacer:
Temenos que ver que hacer para que el valor del potenciómetro represente la posición del servo de manera que el servo se mueva siguiendo al potenciómetro. Para ello hay que entender que el valor que leamos en la puerta A0 está comprendido entre 0 y 1024, y que estos valores tienen que distribuirse entre 0 y 180º. Así que para calcular el Angulo correspondiente basta con hacer:
ángulo = (180º / 1024) * lectura A0
esto lo vamos a utilizar en la función map(), que hace lo mismo que la formula anterior, pero de un modo cómodo y nos libra del uso de los dato float.
angulo = map ( analogRead (A0),0,1024,0,180) ;
Esto se traduce como haz la proporción de los valores que leas en A0 entre 0 y 1024 en un valor entre 0 y 180 y asigna el resultado a la variable angulo.
Material
Placa de Arduino
1 Servo Motor
1 Potenciómetro de 100k
Protoboard, cables para las conexiones y el cable USB para conectar Arduino al PC y sirve además de alimentación
Esquema
Conectamos un potenciometro, de 100K a arduino, de hecho los extremos están conectado a 5V y a GND y el pin central del mismo a la entrada analógica A0. Cuando movamos el eje del potenciómetro, variará la tensión en la entrada analógica A0, y en función a dicha variación, variará el ancho de pulso en la salida 9, permitiendo de este modo gobernar al servo con el potenciómetro, por supuesto todo esto con ayuda del código adecuado.
Código
Este primer código que vamos a ver puede servir entre otras cosas para comprobar el funcionamiento del servo.
#include <Servo.h>
Servo servo1;
int angulo = 0;
void setup() {
servo1.attach(9);
}
void loop() {
for(angulo = 0; angulo <= 180; angulo += 1){
servo1.write(angulo);
delay(25);
}
for(angulo = 0; angulo >= 0; angulo -= 1){
servo1.write(angulo);
delay(25);
}
}
Inicialmente vamos a conectar un servo a arduino, y con la modulación del ancho de pulso arduino va a controlar el giro del servo, recoriendo todos los grados de giro. Luego vamos a conectar un potenciómetro a arduino y a través del potenciómetro seremos nosotros los que modulemos el ancho de pulso y con ello vamos a controlar el giro del servo.
Hemos conectado un servo que se gobernará a través de arduino, para ello el positivo está conectado al positivo de la fuente, el negativo a GND y el pin de control, lo hemos conectado a pin 9 de arduino, este pin es uno de los que pueden proporcionar ancho de pulso PWM, ya que los servos posicionan sus ejes en función a la modulación del ancho de pulso.
En el bloque inicial, antes del setup, en la primera línea hemos incluido la librería servo para poder utilizar sus instrucciones. En la segunda línea hemos creado un Objeto tipo Servo, al que hemos llamado servo1. En la tercera línea hemos declarado una variable de tipo entero llamada angulo y la hemos inicializado con un valor 0, esta variable será la encargada de guarda el valor del ángulo donde se encuentre el eje del servo.
En el Setup, la única línea conecta al objeto servo1, al pin 9 de arduino. Notese que no usamos pinMode, sino que usamos una función de la librería Servo, que su sintaxis es el nombre de objeto punto y la instrucción attach, que significa adjuntar y entre paréntesis el número del pin.
Ya en el loop, tenemos dos bucles for, el primero, mueve el eje del servo desde el ángulo 0 al ángulo 180. Utiliza la variable global angulo que la comienza a 0, le va sumando uno en cada repetición, y va repitiendo mientras angulo sea menor o igual a 180, para ello lo que hace en cada repetición es escribir el valor de la variable angulo, en el objeto servo1, que esta adjunto al pin 9. Notese que no se utiliza analogWrite, sino otra función de la librería Servo. La función .write nos permite escribir el ángulo en el que deseamos que se posicione el eje del servo, en este caso será el valor que tenga la variable angulo. Hace una pausa de 25ms en cada repetición. Cuando ya no se cumple la condición del primer bucle, pasa al ejecutar el segundo bucle for, que es igual que el anterior, pero la variable se inicializa con un valor de 180, y se va restando un grado en cada repetición y se repite mientras que angulo sea mayor o igual que 0, esto lo que hace es que el eje del servo gire poco a poco 180 grados en sentido contrario al que lo venía haciendo. y luego vuelta a empezar. Resumiendo con este código el eje gira del 0 a 180 grados poco a poco, y luego de 180 a 0 creando un movimiento continuo de izquierda a derecha y de derecha a izquierda.
Este segundo código, es el que realmente nos va a permitir elegir la posición del eje del servo, variando la posición del eje del potenciómetro.
#include <Servo.h>
Servo servo1;
int angulo = 0;
void setup() {
servo1.attach(9);
}
void loop() {
angulo = map( analogRead(A0),0,1024,0,180);
servo1.write(angulo);
delay(250);
}
Partiendo del código anterior, la única diferencia está en el contenido de la función loop. Lo primero que ocurren en loop es que se la asigna a la variable angulo el resultado de la función map, que divide 180 grado entre 1024 lecturas posible en la entrada analógica A0 y el resultado lo multiplicas por el valor presente en ese momento en la entrada analógica A0. Una vez que la variable angulo sepa el resultado, escribe dicho resultado en el objeto servo1 mendiante la instrucción servo1.write y haz una pausa de 250ms, esta pausa dará estabilidad al movimiento del servo. Y comenzamos de nuevo.