Pages: [1]   Go Down
Author Topic: controle servo en largeur d'impulsion  (Read 1919 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 41
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Salut tout le monde,

J'ai recu aujourd'hui 2 servos que j'avais commandé, et j'ai commencé à jouer avec.
D'abord, avec la librairie servo qu'on trouve sur le site, pour verifier que ca marche (OK), et ensuite
directment depuis mon programme (J'aimerais me passer de la lib).
Dans mon code, j'ai essayé quelquechose du genre ;

digitalwrite(servoPin, HIGH);
delayMicroseconds(500);
digitalWrite(servoPin,LOW);

et ben ca marche pas : le servo bouge, mais son mouvement ne correspond pas à la consigne (la valeur du delayMicroseconds). Par contre, si je repete cette sequence, au bout d'un moment, le servo arrive jusqu'a la position souhaitée...
Je pige pas...
J'ai regardé le code de la lib, il fait appel a une variable TCNT0 dont je n'ai pas su trouver reference, mais apparement, il s'agirait d'un genre d'heure courante (un peu l'equivalent de la fonctions millis, mais en plus précis je pense).

Un peu d'aide et d'explications seraient bienvenus...
merci d'avance
Pascal.
« Last Edit: January 26, 2008, 05:28:44 pm by Skall » Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 198
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Salut
Faut aussi mettre un delay après le passage à l'état bas, car là comme c'est en boucle, tu met à l'état bas puis toute suite après à l'état haut. La période doit être de 20ms.
Pour TCNT0 c'est la valeur du Timer0.. mais c'est plus pour programmer en C ou en assembleur.
a+
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 41
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

OK, en fait, je pense avoir compris mon probleme : il ne suffit pas d'envoyer un fois la consigne, il faut l'envoyer plus fois, c'est pour cela que les programme qui utilisent la lib servo doivent appeler la function "refresh" suffisament souvent, et a un moment, le servo arrivera à la valeur de consigne...(on ne sais pas quand).
D'ailleurs, cette function refresh verifie si le dernier appel date de plus de 20ms, si ca n'est pas le cas (refresh trop tot), alors la fonction ne fait rien...

Je vais essayer d'implementer ca.
Par contre, il faut que je trouve la regle qui me permette de calculer la largeur d'implusion en fonction de l'angle souhaité pour le servo.
J'ai trouvé ca :
http://aeropic.free.fr/pages/modelisme/inverseur/inverseur.htm
et ca :
http://fribotte.free.fr/bdtech/pic/pic_et_servo.html

je cite :
Quote
Voici les valeurs réellements trouvées pour le servo-moteur testé.
Le signal était généré à l'aide d'un PIC (voir ci-dessous la partie programmation).
La précisions n'était peut-être pas au rendez-vous ! mais ça donne une idée...

    * Milieu vers 1.44 ms
    * -70 deg vers 0.8 ms
    * -102 deg (butée) vers 0.51 ms
    * +55 deg vers 1.92 ms
    * +98.8 deg (butée) vers 2.31 ms

Soit un "pas" de 8µs correspond à 0.89 deg.
Ou dans l'autre sens, un deg correspond à 9µs approximativement.

Je vais faire des essais avec des valeurs de cet ordre...
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 41
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ca marche !!!!

coté PC, je calcule une valeur de consigne corespondant à un angle :
Quote
      void setAngle(short consigne)
        {
            int angle = (int)consigne;
           /* j'ai trouvé les valeur min et max en tatonnant */
            int min = 500;
            int max = 2500;
            short pulse0 =(short)( min + (max - min) * angle / 180);
           /*t_angle contient la largeur de l'impulsion correspondant à l'angle passé en parametre.*/
            t_angle = pulse0;
        }

et sur la carte arduino, le bout de code correspondant qui envoie l'implusion est simplement :
Quote
           digitalWrite(pinNumber,HIGH);
            delayMicroseconds(value);
            digitalWrite(pinNumber,LOW);            

En fait, je developpe un systeme me permettant de piloter la carte depuis un pc, en echangeant des message via le cable usb.
Par exemple, pour dire à la carte d'emettre un pulse de largeur 1250 sur la pin 12, je lui envoie le message :
P/12/1250. Sur la carte, j'inteprete le message recu, et j'execute l'action correspondante.

Sur le PC, je developpe un controle .net en C# qui permet de controler la carte, avec plein de "widgets" permettant de controler les pins de la carte...
Je ferai un article quand tout ceci sera pret... en fournissant les sources, evidemment...
« Last Edit: January 29, 2008, 02:59:13 am by Skall » Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 198
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ca m'a tout l'air intéressant  smiley
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 41
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

J'ai fait une petite video avec ma webcam pour montrer ou j'en suis :
http:// http://video.google.com/videoplay?docid=4663688411083622992

Un petit bras robot fait en lego, et motorisé par 2 servos controlés depuis le PC via l'arduino.
Dans mon soft sur PC, j'ai deux trackbars qui indiquent les consignes d'angles à envoyer aux servos. Le soft PC convertit ca en consignes de pulse que la carte doit envoyer sur ses sorties digitales.

Je concurrence les legos mindstorm pour un prix defiant toute concurrence !!!

Logged

FR
Offline Offline
Full Member
***
Karma: 0
Posts: 105
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Super sympa, bonne suite.

Nicolas
Logged

Geneva
Offline Offline
Faraday Member
**
Karma: 30
Posts: 3231
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Chouette démo, c'est encourageant en tous cas.
Logged

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

0
Offline Offline
Full Member
***
Karma: 0
Posts: 198
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

En effet c'est pas mal du tout smiley
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 41
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

à suivre

ici : http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1203325056/0#0
et ici : http://www.arduino.cc/playground/Fr-projets/Fr-UsbControle
Logged

Pages: [1]   Go Up
Jump to: