mercredi 21 décembre 2011

Le servomoteur modifié


Comprendre le fonctionnement d'un servo modifié!

Pour comprendre le fonctionnement d'un servomoteur modifié (hacked) il faut d'abord comprendre le fonctionnement interne d"un servomoteur normal.
Le servomoteur normal nous donne une position selon notre commande qui varie entre 1ms et 2ms.
Donc le servo calcul l'écart entre sa position actuelle et sa position désirée tout le 20ms si l'écart est nul le servo maintient sa position sinon il tourne jusqu'à l'écart soit nul de nouveau.
La vitesse de servo entre 2 position n'est jamais constante, elle est relative à l'écart calculé à chaque fois.
Par exemple:
Pour passer de 90° à 0° le servo commence à tourner d'une grande vitesse, vue que l'écart est grand puis il diminue jusqu'à qu'il arrive à la position 0°.
Mais comment un servo peut connaître sa position?
En fait l'arbre de moteur de servo est attaché à un potentiomètre la valeur de sortie de ce potentiomètre est relative à sa position.
Supposons qu’on a enlevé se potentiomètre, le servo ne sait plus sa position réel. On peut même lui donné une fausse information de sa position en insérant à la place de potentiomètre un pont diviseur qui est en fin de compte un potentiomètre à valeur fixe.
Supposons encore que le pont diviseur est constitué de deux résistances égales. Le servo va croire qu’il est toujours au milieu.
Donc si la commande est de 1.5ms (commande pour que le servo normal tourne jusqu’à atteindre le milieu) le servo ne tourne pas puisque l’écart est nul.
Si la commande est de 2ms l’écart est donc maximal le servo commence à tourner avec sa vitesse maximal et qui reste maximal puisque l’écart est toujours fixe.
Si la commande est de 1ms l’écart est donc maximal mais négatif le servo commence à tourner avec sa vitesse maximal dans le sens contraire et qui reste maximal.

Les étapes pour modifier un servomoteur:

voilà un vidéo qui explique comment modifié un servo par roboticsed:





 
Pourquoi tous ces trucs, il est plus facile d’acheter un moteur DC et le commander en PWM!!

Oui c'est vrai, mais le servomoteur présente autre avantages plus que sa commande facile.
         Il n'est pas très cher par rapport au couple qu'il présente.
         Il est disponible par tout
         Il n'exige pas une interface de puissance
Code C:
int cnt=0;
unsigned char down=0;

void interrupt(){
if(TMR2IF_bit){ //la résolution de timer est ~= 55µs
     cnt++;
     if(cnt==down) 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){

down=27;//moteur en arret
delay_ms(1000);
down=36;//moteur en avance vitesse maximal
delay_ms(1000);
down=18;//moteur en recul vitesse maximal
delay_ms(1000);
}
}

A bientôt :)




8 commentaires:

  1. Salamo 3laikom warhmato ALLAH
    Merci beaucoup, vos projets sont trés interssants :)
    j'ai une question à propos de la fréquence de l'oscillateur.
    Quelle est la fréquence du Quartz??
    Pourriez vous me donner la relation permettant de déterminer la durée de l'impulsion en fonction de Fosc?
    merci infiniment d'avance

    RépondreSupprimer
  2. wa3alaikom selem,
    Bon pour la fréquence de l'oscillateur je pense que j'ai utilisé une Quartz de 20Mhz.
    La durée de l'impulsion est calculé àpartir d'une certaine résolution du timer.
    Par exemple si la résolution du Timer est de 55µs est la durée souhaité est de 100 ms donc on doit attendre (100ms/55µs) débordements(interruption) du timer.
    Pour plus d'information sur les registres Timers dans un PIC microcontrolleur je t'invite à consulter cet article http://cceinsat.com/index.php/tutoriallls/14-les-timers1.
    Bon courage :)

    RépondreSupprimer
    Réponses
    1. Merci de votre réponse :)
      j'ai utilisé le même code mais ça marche pas !!
      Le quartz est de 4MHz!
      Voici mon code:
      int cnt=0;
      int down=0;
      void interrupt(){
      if(TMR2IF_bit==1){
      cnt++;
      if(cnt==down) {portc=0;}
      if(cnt==200) {portc=1;cnt=0;}
      TMR2IF_bit=0;
      TMR2=0;
      }
      }
      void main()
      {
      TRISC=0x00;
      PORTC=0x00;
      CMCON = 7; // Disable comparators
      TMR2 = 0; // RAZ TIMER 2
      PR2 = 99; // Registre de période à 100
      INTCON=0xC0;
      TMR2IE_bit = 1; // Activation interruption Timer 2
      TMR2IF_bit = 0; // Mise à 0 indicateur int.
      T2CON = 0b00000100;
      while(1){
      down=15;//moteur en arret
      delay_ms(1000);
      down=20;//moteur en avance vitesse maximal
      delay_ms(1000);


      }
      }

      Pourriez vous me dire où je me suis trompé!
      merci d'avance

      Supprimer
  3. J'ai simuler ton code avec un PIC 16f877 et ça marché. J'ai seulement supprimer le ligne de configuration de comparateur.
    Quel pic tu utilises?

    RépondreSupprimer
  4. Re.
    Le PIC est de référence 16F877A. avez vous fait la simulation sur ISIS ??
    Pour moi, même sur ISIS ça marche pas!! je sais pas où se situe le problème!
    A+

    RépondreSupprimer
    Réponses
    1. Oui, ça marche sur ISIS. J'ai juste relié le pin0 du port c à un oscilloscope

      Supprimer
  5. Merci encore une fois de votre réponse:)
    je l'ai réalisé pratiquement. En effet, j'ai relié directement le fil jaune du servomoteur au pin 0 du port c ==>le servo ne tourne pas!!
    j'ai même visualiser le signal de sortie via l'oscilloscope mais aucun résultat.
    Toujours il y a 0 !!
    A+

    RépondreSupprimer
  6. J'ai visualisé la sortie dans le portc,
    la durée de l'impulsion ne doit pas dépasser 2ms ; vos durée d'impulsion sont toutes >2ms

    Essayer de faire un simple clignotement d'une led pour s'assurer de bon fonctionnement de ton circuit.

    RépondreSupprimer