13 de mayo de 2012

Arduino: Mover un Servo con un potenciómetro

Esta es mi solución al ejercicio 4 de oomlout: http://ardx.org/CIRC04. De todas formas, lo que he hecho se parece mucho más a lo que aparece en http://ardx.org/KNOB pero sin librería servo.h (que facilita mucho el tema). Aquí una muestra del resultado:


Este es el código:

/*
 * Exercicio CIRC04: Servo
 * Explicacion en http://ardx.org/CIRC04
 *
 * Un servo estandar toma valores que permitiran que xire de 0 a 180 graos
 * A posicion ven controlada polo largo dun pulso, entre 1'25ms (0 graos) e
 * 1.75ms (180 graos) [1.5ms para 90 graos]. Se este pulso se envia o servo cada
 * 20-50ms, o servo fara o cambio suavemente.
 *
 * En Arduino existe a libreria servo.h, que permite controlar dous servos cunha soa
 * liña se os conectamos o pin 9 ou 10. Neste codigo non facemos uso desa libreria
 */

int servoPin = 9; // Pin onde conecto o cable de datos do servo (branco)
int potePin = A0; // Conectamos un potenciometro no pin analoxico 0
int poteValor; // variable onde gardarei o valor do potenciometro e que logo 
                                                                 //"escalarei"

void setup()
{
  pinMode(servoPin, OUTPUT); // inicializo o pin do servo como de saida
  pinMode(potePin, INPUT); // inicializo o pin do servo como de entrada
}

void loop()
{
  poteValor = analogRead(potePin); // recollo o valor do potenciometro
  poteValor = map(poteValor, 0, 1023, 900, 2100); // escalo a variable poteValor 
  //que ten valores entre 0 e 1023 para que señan proporcionais pero entre 900 e 
  //2100 (que son os valores para colocar o servo entre 0 e 180 graos)
  
  digitalWrite(servoPin, HIGH);
  delayMicroseconds(poteValor);
  digitalWrite(servoPin, LOW);
  delay(15); 
}

Si alguien no entiende los comentarios del código en gallego que avise... aunque está bastante claro lo que hacen.