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

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

Plus en détail