martes, 3 de marzo de 2015

Trabajando con servos (I)

Trabajando con servos (I)


Hola a todos. Vamos a introducir un nuevo elemento en nuestro repertorio. Un servomotor, o más comúnmente conocido como servo.

Un servo es un dispositivo electrónico actuador que tiene un eje de rendimiento controlado, el cual podemos ubicar en cualquier posición dentro de su rango de actuación y mantenerlo estable en esa posición. Habitualmente su rango está comprendido entre los 0 y 180 grados.



Como podemos observar, consta de 3 entradas, 5V, GND y señal de control. Dentro de este elemento podemos encontrar un motor de corriente contínua, una caja reductora y una tarjeta de control.

La tarjeta de control será la encargada de realizar el control de la posición del servo, mediante el uso de un controlador proporcional. No vamos a entrar en detalle de que como realiza esa acción, pero podéis encontrar una explicación bastante completa aquí.

Lo que si que nos interesa saber, es que la posición se controla por una señal de onda cuadrada, siendo la duración del nivel alto de la señal el que determina la posición.

Típicamente, aunque depende del fabricante, los valores son de 1ms para el 0º, 1,5ms para el valor central o 90º, y 2ms para los 180º. El tren de pulsos debe permanecer constante para mantener la posición del servo. El tiempo que debe permanecer la señal a 0V no es crítico, aunque no debe superar un valor (nuevamente determinado por el fabricante) para que el siervo no entre en modo de latencia y pierda la posición.

La ondas que debemos generar son del estilo PWM, y deben ser algo cómo esto:




Para realizar nuestro ejemplo montaremos el siguiente esquema:



Que llevaremos a la placa, por ejemplo así:



Y el sketch, pues la propuestas a continuación. La podes descargar desde aquí:


//Ejercicio para pilotar un servo con tren de pulsos
//generados con PWM, desde cualquier pin del Arduino

int pinpot; // pin conectado al potenciometro
int valorpot; // valor leido en el potenciometro
int servo = 9; // pin conectado al servo
int pulso; // Variable usada para generar el pulso de control

void setup()
{
  pinMode (pinpot,INPUT);
  pinMode (servo,OUTPUT);
}

void loop()
{
valorpot = analogRead (pinpot); // lectura del potenciometro
pulso = map(valorpot, 0, 1023, 1000, 2000); //calculamos el valor del ancho
//del pulso en microsegundos, de forma propocional entre los dos valores
//correspondientes a 0 y 180 grados
digitalWrite(servo, HIGH); // activamos el servo
delayMicroseconds(pulso); // durante el tiempo necesario para llevarlo a la posicion
digitalWrite(salida, LOW); // desactivamos el flanco positivo
delayMicroseconds(20000); // tiempo a 0 para generar la seal cuadrada
}


Para el servo que yo utilizo, con valores 1ms y 2ms, no consigo alcanzar los extremos, (0º y 180º) por lo que en mi caso uso 0,550ms y 2,1ms.


Bueno, después de esta pequeña introducción teórica, ¿como generamos ese tren de pulsos de otra forma más sencilla? Pues gracias a una librería creada para el IDE de Arduino, la librería servo.h, el tema es muy sencillo.

Antes de nada, y como es la primera vez que usaremos  librería externas, especificar que se llaman en la primera parte de nuestro programa con una instrucción de este tipo:

#include <Servo.h>

Las instrucciones necesarias para trabajar con servos son:

attach ()


En esta instrucción especificamos el pin donde conectaremos nuestro servo. La sintaxis es la siguiente:

servo.attach(pin, min, max)

Donde :

servo:  indica que se trata de una variable del tipo servo,

pin:      pues eso, el pin donde hemos conectado la señal de control del servo,

min:     es opcional, e indica el ancho del pulso positivo, en microsegundos para la posición de 0                     grados. Si no se indica, usará por defecto 544 microsegundos,

max:   también opcional, indicaría el ancho del pulso positivo para la posición de 180º. Si no se indica, por defecto el valor es de 2400.


Ejemplo 2


Como previo a nuestro proyecto con el termómetro, vamos a adaptar nuestro programa para usarlo con la librería servo.h . Este ejemplo es una adaptación del que podéis encontrar en la web oficial de Arduino, aquí.

El montaje es el mismo que en el ejemplo anterior, y el sketch lo podéis descargar desde aquí.


// Control de un servo a traves de la libreria servo.h

#include <Servo.h> // instruccion para incluir la libreria en el sketch
 
Servo miservo;  // creamos el objeto servo, para luego controlarlo
 
int pinpot = 0;  // pin conectado al potenciometro
int valorpot;    // variable para almacenar la lectura del potenciometro 
int grados; // variable para almacenar la posicion del servo 
void setup() 
{ 
  myservo.attach(9);  // Pin conectado al servo 
} 
 
void loop() 
{ 
  valorpot = analogRead(potpin);        // Leemos el valor del potenciometro entre 0 y 1023
  grados = map(valorpot, 0, 1023, 0, 179); // Lo reescalamos para un valor proporcional de entre 0 y 180grados
  myservo.write(grados);       // esta instrucción envía al servo a la 
                               //posición indicada en grados. 
  delay(15)           // Esperamos que alcance la posición 
}

En este caso , a mi en el valor máximo mi servo "ratea", porque los 2400 son superiores a los aproximadamente 2100, que he comprobado. Por tanto para mi caso, debería sustituir la instrucción attach, por esta:

   myservo.attach(9,540,2100);

Nos vemos en la siguiente entrada para realizar un el termómetro analógico...


No hay comentarios:

Publicar un comentario