dimanche 6 novembre 2011

Le servomoteur

Bonjour,
Je vais parler dans ce tutoriel, comme indique le titre, sur les servomoteurs et comment les interfacer avec des microcontrolleur pic.
Ce tutoriel est spécialement conçue pour l'équipe de projet Labyrinthe au sein de l'atelier Robotique de club Android INSAT.
D'abord, qu'est ce qu'un servomoteur??!
Un servomoteur de la marque FUTUBA




 Un servomoteur est, comme son nom l'indique, un moteur mais avec quelques spécificités en plus. Contrairement à un moteur classique qui est utilisé pour tourner avec une vitesse proportionnelle à un courant ou à une tension, un servomoteur est utilisé pour obtenir une position ou une angle (source wikipedia).
Donc contrairement aux moteurs classiques le servomoteur nous donne une position ou une angle bien défini autrement dit le servomoteur est asservi en position par défaut qui semble très utile pour la robotique.
Ok,...mais comment il fonctionne??!
Pas besoin de paniquer :)), le servomoteur possède son propre carte de puissance donc pour le commander il suffit de le relier directement avec le microcontrolleur.
Ce qui est encore plus intéressant c'est la nature du signal de commande qui est totalement numérique. Il suffit de lui envoyer une impulsion logique dont la durée varie entre 1ms et 2ms. La durée de l'impulsion définie la position du servo, c'est-à-dire que si l'impulsion dure 1ms, le servo se déplacera tout à gauche et si l'impulsion dure 2ms, il ira tout à droite. Vous aurez également compris que pour 1,5ms, le servo se positionne au milieu.

pour maintenir cette position, on doit lui envoyer cette signal avec une fréquence conventionnelle de 50HZ.




mmmm... intéressent! Comment crier ce signal alors avec un PIC16F877 par exemple??!

Rien de sorcier, pour crier ce signal on doit utiliser les registre TIMER de PIC qu'on a choisi, vous devez peut être jetez un coup d'oeil sur ce tutoriel qui parle sur les timer.

Si vous avez bien compris comment fonctionne le timer vous pouvez compris ce code ci dessus.
on utilse le timer2 8bit qui nous donne une résolution proche de 55µs.
int cnt=0;

void interrupt(){
if(TMR2IF_bit){ //la résolution de timer est ~= 55µs
     cnt++;
     if(cnt==27) portb=0;// la valeur angle varie entre 0-->180
                                        //cnt= 18 se traduit par 1ms
                                        //cnt=27 se traduit par 1.5ms d'ou 90°
     if(cnt==370) {portb=1;cnt=0;}
     TMR2IF_bit=0;//l3alam yarja3 lelsfer
     TMR2=0;
     }
}

void main() {
portb=0X00;
trisb=0X00;
T2CON=0X04;
TMR2IF_bit=0;
TMR2=0;
TMR2IE_bit=1;
INTCON=0XC0;
while(1){
}
}


à très bientôt :)