Servos de télécommande
Transcription
Servos de télécommande
CH-1092 Belmont, Switzerland Tel +41 21 728-6156, Fax 728-6157 Email [email protected], www.didel.com www.didel.com/pic/Servos.pdf Servos de télécommande Le servos de télécommande sont bien connus http://www.digitalspirit.org/wiki/docs/servo-moteurs Leur position dépend d’une impulsion positive de 1 à 2ms, répétée toutes les 20ms. La tension d’alimentation est en général de 4 à 6V. Attention au brochage ! La routine pour commander un servo peut se faire de différentes façons : - par boucle d’attente si on est monotâche - avec un timer - avec un timer par interruption - avec deux timers par interruption Boucle d’attente La solution boucle d’attente est triviale. Si la variable d’entrée est 8 bits (1 à 255 pour 1 à 2ms), on crée une boucle d’attente de 4ms. Attention, il faut trier la valeur 0, identique à 256 dans les boucles d’attente simples. La boucle génère donc un délai de 0 à 1020ms. On va utiliser ce débordement pour garantir les extrémités avec des impulsions de 990 à 1010ms. La routine délai est appelée une première fois avec 990/4 puis avec le paramètre de position, valeur zéro corrigée. \rout:PulseServo|Impulsion 1-2ms sur PortServo :#bServo \in:PosServo \mod :Temp Cx1 Cx2 PulseServo : ServoOn ; macro Move #990/4,W Call DelWx4us Move PosServo,W Call DelWx4us ServoOff Ret ; Dans le programme principal, Move PosServo,W Call PulseServo ; éventuellement commander d’autres servos Move #20,W Call DelWx1ms … Testeur microdules Le microdule PoToD8 uncorpore un connecteur pour servo. Il suffit de tourner le pot pour voir le servo bouger. \rout:DelWx4us|Attente de W fois 4us ; précisément 0 4us, 1 9 us, 255 1025 us DelWx4us : Or #0,W Skip,NE Ret Move W,Cx1 A$ : Nop DecSkip,EQ Cx1 Jump A$ Ret \rout:DelWx1ms|Delai multiple de 1ms \in;W 1-256 ms \mod;Cx1 Cx2 W DelWx1ms: Move W,Cx2 L$: Move #250,W Move W,Cx1 A$: Nop DecSkip,EQ Cx1 Jump A$ DecSkip,Eq Cx2 Jump L$ Ret Exemple d’application Graupner propose le système Nautic pour démultiplexer un Loop: Move #P1500,W TestSkip,BC PortA:#bIn1 canal de servo en 8 paires de sorties qui commandent des Move #P1000,W lampes ou des relais. Le problème est de commander un TestSkip,BC PortA:#bIn2 servo avec une paire de sorties. Il pourra donc prendre trois Move #P2000,W Move W,Servo positions seulement. Call Pulse Un PIC à 6 pattes suffit, mais prenons un 16F629 et pour Move #20,W rendre service à un ami, câblons un petit circuit. Le Call DelWx1ms programme teste les deux entrées et décide de la valeur Jump Loop pour le servo dans la boucle ci-contre, qui suit l’initialisation. Le câblage sur une carte à trous est facile, puisqu’il n’y a pas de composants discrets Gnd pin 8 Vcc pin 1 In1 pin2 In2 pin3 Outservo pin7 La mise au point et la programmation du 16F629 s’est faite avec un microdule M20. Timer simple Un timer peut remplacer la boucle d’attente. La durée n’est toutefois pas plus précise avec un timer 8 bits (et cela ne sert à rien d’être plus précis) et il faut surveiller dans une boucle la fin du timer. Pendant 1ms, au début de l’impulsion, une autre tâche peut être effectuée, c’est le seul avantage. Timer par interruption Le Timer0 déclenche une interruption toutes les 20ms. Cette interruption active la sortie servo et initialise le timer à la durée voulue. A l’interruption suivante, on coupe le servo, on s’occupe éventuellement d’un 2e servo, et on réinitialise le timer pour une interruption à 18 ou 19 ms. Pour la durée de 1 à 2ms, le timer est initialisé de 128 à 255 avec un prédiviseur par 8 à 4MHz. La valeur Servo de 0 à 255 est divisée par 2 (0 – 126) et on ajoute 124 pour couvrir de 124 à 124+126 = 250, 0.99ms. Ceci évite le problème du zéro. Pour les 20ms, on pourrait réinitiliser le timer, mais il faut bien suivre la procédure documentée. C’est plus simple d’initialiser des interruptions à 2ms et d’en compter 9 avant de recommencer. Deux timers par interruption C’est la solution recommandée dans un système complexe avec un timer qui gère les moteurs (www.didel.com/pic/Pfm.pdf, www.didel.com/pic/Enco.pdf , un capteur de distance www.didel.com/pic/Dist.pdf , des timers www.didel.com/pic/Timers.pdf pour les clignotements et timout et d’autres interfaces série http://www.didel.com/pic/Serie.pdf , I2C http://www.didel.com/pic/I2C . Toutes les 20ms un 2e timer est mis en route pour activer, puis désactiver le ou les servos. C’est ce qui a été programmé dans le Starlet, voir le programme BsTestInterServo.asm et le ficher BsInter.asi dans www.didel.com/starlet/StarletSoft.zip, comme référencés en page 8 de www.didel.com/starlet/StarletSoft.pdf. jdn 100620
Documents pareils
Servos de télécommande -- provisoire 140616
CH-1092 Belmont, Switzerland
Tel +41 21 728-6156, Fax 728-6157
Email [email protected], www.didel.com
www.didel.com/xbot/Servos.pdf