21 de gen. 2016

Servos de rotació contínua

Els servos de rotació contínua giren mentre rebin polsos PWM.

Com que la llibreria Servo que cal utilitzar inhabilita l'ús dels pins 9 i 10 com a sortides analògiques, proposo connectar els servos a aquests pins (9, 10).

Els senyals Servo són trens de polsos PWM (senyals 0-1 de període 20 ms). L'amplada del pols (temps durant el qual està actiu, a 5V) determina el sentit de gir i la velocitat del servo.



Referències del llenguatge:
Per tal de treballar amb servos cal incloure al programa la llibreria Servo.
L'ample dels polsos es defineix amb la instrucció write() o writeMicroseconds()
Les instruccions attach() i detach() permeten associar i deixar d'associar els senyals Servo als pins especificats.

Si utilitzem la instrucció write:
180: sentit horari (?), velocitat màxima
190: aturat
180: sentit antihorari (?), velocitat màxima

Si utilitzem la instrucció writeMicroseconds():
1300: sentit horari, velocitat màxima
1500: aturat
1700: sentit antihorari, velocitat màxima
* les dades corresponen als servos Parallax. Per a altres, cal consultar el datasheet.

Control de la velocitat:
Velocitats intermitges es poden aconseguir aplicant polsos d'amplades intermitges: entre 0 i 90 en un sentit de gir, i entre 90 i 180 en l'altre.
Cal tenir en compte però que la relació velocitat/amplada del pols no és lineal.

Exemple:
Gir d'un servo durant un temps en un sentit a velocitat intermitja, aturada durant un temps, gir en l'altre sentit durant el mateix temps amb la mateixa velocitat:

#include <Servo.h>  // llibreria que cal incloure per treballar amb servos

Servo Servo1;  // creació de l'objecte Servo amb el nom que vulgui
int temps = 100;  // temps durant el qual ha de girar el servo

void setup() 
{ 
  Servo1.attach(9);  // servo connectat al pin 9void loop() 
{
  // gir a velocitat mitja (90+30) en un sentit durant un temps determinat:
  Servo1.write(120);  
  delay(temps);
  // servo aturat durant un temps:
  Servo1.write(90);  
  delay(temps);
  // gir a velocitat mitja (90-30) en l'altre sentit durant el mateix temps:
  Servo1.write(60);  
  delay(temps);
}

Calibració:
Si en posició d'aturada el servo no s'atura del tot cal calibrar-lo ajustant el seu potenciòmetre.

Ajust de velocitat (sincronitzar dos servos)
Si un robot no va recte es que els servos no giren a la mateixa velocitat. Si no podem calibrar els dos posant el potenciòmetre intern en la mateixa posició, podem reduir la velocitat del servo que gira més ràpid.
Podem crear un valor d'ajust que se sumi a la velocitat del servo més ràpid per igualar-lo a l'altre:

int ajuste = 5; // valor a modificar
servo1.write(0+Ajuste);  //Si el servo1 es el mas rapido  
servo2.write(180);       // Si fuera el servo2 deberas utilizar  ser2.write(180-Ajuste);

Cap comentari:

Publica un comentari a l'entrada