5 de maig 2015

Servomotors estàndar

Els servomotors són motors elèctrics que poden ser controlats tant en velocitat com en posició.

Hi ha dos tipus de servos: de rotació estàndar i de rotació contínua >>:
L'estàndar pot girar 180 graus i la seva posició es pot controlar com un motor pas a pas d'una manera molt precisa.
El de rotació contínua pot girar en ambdues direccions indefinidament.

Connexió a Arduino i alimentació dels servos

Tot i que en teoria els servos es poden connectar a qualsevol pin digital, donat que els senyals servo són trens de polsos, prefereixo connectarlos a pins PWM si és possible.
A més, com que la llibreria Servo que cal utilitzar inhabilita l'ús dels pins 9 i 10 com sortides analògiques, proposo connectar els servos a aquests pins (9, 10).

Els servos s'han de connectar a una font d'alimentació externa degut al seu elevat consum (el pins de sortida d'Arduino només poden entregar 40 mA, i els servos poden tenir pics de fins a 700 mA).
S'aconsella utilitzar una bateria de 4 piles AA, connectant el negatiu de la bateria al pin GND d'Arduino, i el cable vermell del servo al positiu de la bateria:
Pautes de programació

Per treballar amb servos cal incloure al programa la llibreria Servo.
La posició del servo es defineix amb la instrucció write()
Les instruccions attach() i detach() permeten associar i deixar d'associar senyals servo als pins especificats.

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

// crea un objecte servo que anomenem com volem
Servo myservo;  
 
void setup() 
{
  // indiquem a quin pin connectem el servo
  myservo.attach(10);  
}
 
void loop() 
{
  myservo.write(0);  // definició de la posició del servo: 0º
  delay(1000);  // el mantenim en aquesta posició durant 1 s  
  myservo.write(180);  // definició de la posició del servo: 180º
  delay(1000); // el mantenim en aquesta posició durant 1 s   
}
Aturada dels senyals servo per no gastar piles quan no cal, amb la funció detach();

Els moviments dels servos són molt sobtats, el canvi de posició es fa de manera pràcticament instantània. 
Si ens interessa un moviment més suau podem definir el canvi de posició "pas a pas":
#include <Servo.h> 
 
Servo myservo;  // create servo object to control a servo  
int pos = 0;    // variable to store the servo position 
 
void setup() 
{ 
  myservo.attach(10);  // attaches the servo on pin 10 to the servo object 
} 
 
void loop() 
{ 
  for(pos = 0; pos < 180; pos += 1)  // goes from 0 degrees to 180 degrees 
  {                                  // in steps of 1 degree 
    myservo.write(pos);         // tell servo to go to position in variable 'pos' 
    delay(15);                  // waits 15ms for the servo to reach the position 
  } 
  for(pos = 180; pos>=1; pos-=1)     // goes from 180 degrees to 0 degrees 
  {                                
    myservo.write(pos);         // tell servo to go to position in variable 'pos' 
    delay(15);                  // waits 15ms for the servo to reach the position 
  } 
} 

Cap comentari:

Publica un comentari a l'entrada