Mostrando las entradas con la etiqueta servomotor. Mostrar todas las entradas
Mostrando las entradas con la etiqueta servomotor. Mostrar todas las entradas

jueves, 13 de agosto de 2015

Servos

Hola, hoy quería mostrarles lo sencillo que resulta manejar un servo con arduino.

Antes de comenzar, voy a hacer una breve explicación de qué es un servo o servomotor de modelismo. Un servo es un dispositivo electromecánico que tiene la capacidad de ir y mantenerse en la posición que se le diga, recibe pulso periódico pwm, que varía de 1mS a 2mS, como muestra la imágen.


Bueno, ahora que saben más o menos qué es y como funciona, vamos al programa.

En la parte de ejemplos, en el ide de arduino, hay una opción que dice "servo", ahí se van a encontrar con 2 ejemplos "knob" y "sweep", si bien estos ejemplos sirven, creo que solo tienen una cantidad de pines limitados (9 y 10), por lo que no se pueden poner más que 2 servos (o al menos eso entendí). Por eso, buscando un poquito me topé con esta otra librería que parece que podría aceptar como salida cualquier pin, soporte o no salidas pwm.

El siguiente códgo lo saqué de este sitio y lo único que hice fue traducir los comentarios.

#include <SoftwareServo.h> 

SoftwareServo myservo;  // crea el objeto servo, para controlar el servo

int potpin = 0;  // pin analógico para conectar el potenciómetro
int val;    // variable que lee el valor analógico

void setup() 
{ 
  myservo.attach(2);  // vincual el servo al pin 2 void loop() 
{ 
  val = analogRead(potpin);            // lee el valor del pote
  val = map(val, 0, 1023, 0, 179);     // re-escala el valor del pote a 0 - 180
  myservo.write(val);                  // pone el servo en el ángulo escalado del pote
  delay(15);                           // le da tiempo al servo para llegar

  SoftwareServo::refresh();
} 



Bueno, el código parece ser simple, por lo que pude leer, la línea "SoftwareServo::refresh();" tiene que estar cada 50mS o menos, para que el servo funcione correctamente, por lo que eso podría llegar a ser un problema para programas largos, por lo que recomiendo (dependiendo del programa) agregar el siguiente código:


tiempo = micros();
colocar el código acá
Serial.print((micros() - tiempo));


Eso lo que va a hacer es calcular de forma casi precisa cuantos micro segundos pasaron mientras el código se estaba ejecutando, probablemente tenga un error, pero no creo que llegue al mS. En caso de que se superen los 50mS con el código, lo único que hay que hacer es colocar periódicamente "SoftwareServo::refresh();" y ya se soluciona (obviamente siempre teniendo en cuenta que el tiempo sin poner ese fragmento de código no supere los 50mS).

Descargas:

Librería del servo:

https://mega.co.nz/#!blhhhCpS!MpJYJ44tsdfn8ZwFCpdu7anjrVUms-0BXTSjYwX5rhY