jueves, 5 de mayo de 2016

Control de un servo con arduino

En esta entrada controlaremos un servo con el arduino.
Primero hablare de los servos:
Un Servo es un dispositivo pequeño que tiene un eje de rendimiento controlado. Este puede ser llevado a posiciones angulares específicas al enviar una señal codificada. Con tal de que una señal codificada exista en la línea de entrada, el servo mantendrá la posición angular del engranaje. Cuando la señala codificada cambia, la posición angular de los piñones cambia. En la práctica, se usan servos para posicionar superficies de control como el movimiento de palancas, pequeños ascensores y timones. Ellos también se usan en radio control, títeres, y por supuesto, en robots.
El Servo que utilizare en esta entrada se posiciona utilizando un potenciómetro para marcar el angulo de giro:



Programa en Arduino



Comencemos con el código:

Lo primero sera incluir la librería Servo.h, esta librería ya esta incluida en el paquete de instalación básico con lo que no es necesaria descargarla. Para incluirla lo haremos en el inicio del programa como con las variables globales:

  #include <Servo.h>

Luego añadimos nuestro servo:

  Servo "nombre de mi servo";

Una vez los incluyamos declararemos todas las variables globales que vallamos a utilizar en nuestro programa:

  int led180 = 10;
  int led0 = 9;
  int estado;
  int poten = 0;
  int analog = 0;

Ahora dentro del void setup() le indicaremos en que pin se encuentra el servo para poder controlarlo y declarare los pines de los leds que utilizare para indicar la posición máxima del servo:

 void setup()
{

  servo.attach(2);// Aquí le indicamos que el servo se encuentra en el pin 2
  pinMode(led180,OUTPUT);
  pinMode(led0,OUTPUT);

}

Para mover el servo utilizare un potenciómetro que leeré desde una entrada analógica, el valor de la entrada lo convertiré en un valor de 0 a 180, ya que el servo que utilizo no puede rotar mas de 180º, para esto utilizare la función map(), para escribir el valor en el servo se utiliza la función "nombre del servo".write("variable o valor"), también existe otra función que nos permite leer la posición actual del servo que seria "nombre del servo".read() pero esta función ya la utilizare en otra entrada:

void loop()
{
  analog = analogRead(poten);
  estado = map(analog,0,1023,0,180);
  servo.write(estado);// Esta es la función que le escribe el valor en el servo, es recomendable hacer una pequeña pausa despues de ella para dejar posicionarse al motor del servo.
  delay(50);
  if(estado == 180)
  {
    digitalWrite(led180,HIGH);
  }
  if(estado == 0)
  {
    digitalWrite(led0,HIGH);
  }
  else
  {
    digitalWrite(led0,LOW);
    digitalWrite(led180,LOW);
  }
}

Ahora os dejo el cableado:
Es importante utilizar una fuente de alimentación externa para no quemar el pin de alimentación del arudino ya que los servos grandes consumen mas de lo que el arduino es capaz de suministrar, si se utiliza una fuente externa es necesario unir los negativos para poder trabajar sino el servo no trabajaría correctamente.


Aquí os dejo el código completo:

#include <Servo.h>
Servo servo;
int led180 = 10;
int led0 = 9;
int estado;
int poten = 0;
int analog = 0;

void setup()
{
  servo.attach(2);
  pinMode(led180,OUTPUT);
  pinMode(led0,OUTPUT);
}

void loop()
{
  analog = analogRead(poten);
  estado = map(analog,0,1023,0,180);
  servo.write(estado);
  delay(50);
  if(estado == 180)
  {
    digitalWrite(led180,HIGH);
  }
  if(estado == 0)
  {
    digitalWrite(led0,HIGH);
  }
  else
  {
    digitalWrite(led0,LOW);
    digitalWrite(led180,LOW);
  }
}