SERVOMOTOR EN ATTINY85

Siguiendo con las necesidades que plantea el proyecto Pulsar Mini, tuvimos que encontrar la manera de utilizar un micro-servo con con un Attiny85 programado como Arduino. En este camino, el primer problema que surge es que la librería Servo de Arduino no funciona con Attiny85, esta requiere un timer de 16bits mientras que el Attiny85 tiene uno de 8bits.

Luego de buscar y probar algunas librerías alternativas que no funcionaban correctamente encontramos la solución en un post del blog Project for Tech (PfT). Como en otros temas relacionados al Attiny85+Arduino, no abunda información relevante, por eso decidimos documentarlo en este blog en castellano.

Lo que el autor de PfT hizo es volver a la librería SoftwareServo (original para Arduino) de los tiempos en que las versiones del IDE eran 20xx y hacerla funcionar para cualquier IDE 1.0+. Para más detalles de cómo lo hizo se puede revisar su post. Además agregó más ejemplos a la librería original ya que sólo incluía uno: SerialServo, y el problema con este es que la librería serial no corre en el Attiny85 en su forma normal.

La librería modificada y los ejemplos se pueden descargar desde aquí: SoftwareServo. Es muy simple de utilizar, se instala como cualquier librería de Arduino y se carga alguno de los ejemplos en Attiny85.

Se puede probar con el ejemplo Sweep, que tiene el siguiente código:

 

#include <SoftwareServo.h> 
 
SoftwareServo myservo;                 // crea el objeto servo
                                       // pueden ser creados un maximo de 8
 
int pos = 0;                           // variable que guarda la posicion del servo 
 
void setup()
{
  myservo.attach(1);                  // destina el Pin 1 al servo
} 
 
void loop()
{
  for(pos = 0; pos < 180; pos += 1)  // va de 0 a 180 grados grados
  {                                  // en un paso para un grado
    myservo.write(pos);              // manda al servo a la posición almacenada en 'pos'
    SoftwareServo::refresh();        // debe ser llamada al menos cada 50ms para mantener los servos actualizados
    delay(15);                       // espera 15ms para que el servo llegue a la posicion
  }
  for(pos = 180; pos>=1; pos-=1)     // va de 180 a 0 grados
  {
    myservo.write(pos);              // manda al servo a la posición almacenada en 'pos'
    SoftwareServo::refresh();
    delay(15);                       // espera 15ms para que el servo llegue a la posicion
  }
}
 

El diagrama de conexión es muy simple (realizado en Fritzing):

conexion-servo-attiny85_esquema

Finalmente, se puede notar que el servo no se se mueve con la misma “suavidad” que al utilizar una placa Arduino, sino que realiza pequeños saltos de un paso a otro. Esto sucede porque el ATtiny85 al correr con un timer de 8bits en vez de uno de 16bits, tiene menor resolución que la placa Arduino.

admin

Leave a reply