L'exercice est donc de commander 2 moteurs pas à pas en continu en fonction de l'action sur un joystick à contacts TOR.
Une limitation est faite via 4 fins de course TOR.
La première solution qui vient est de mettre, câblés en série, les FdC en NF avec les contacts joystick en NO.
Seules 4 entrées sont ainsi nécessaires sur le Picaxe avec cette simple logique câblée.
Ensuite, l'état de ces entrées viennent incrémenter ou décrémenter un compteur par 8 pour chaque moteur.
Ce compteur est donc l'index de lecture de la phase de commande du PaP , située en EEprom. (*)
La séquence pour chaque moteur est indépendante et peut être appliquée sur le port de sortie que l'on veut. (4 moteurs PaP sur un 28X2 par exemple)
Ici les deux séquences sont mises sur le même port par un décalage gauche de 4 bit d'une séquence.
Le programme de base pour cette appli peut donc se résumer à : (33 bytes vs 151 du pg initial et un gain important de vitesse de scrutation)
Rich (BB code):
#picaxe 20M2
;sequence demi pas en EEprom
eeprom 0,(%0001,%0011,%0010,%0110,%0100,%1100,%1000,%1001)
symbol Seq_MotV = b5 ; sorties B4 ... B7
symbol Seq_MotH = b6 ; sorties B0 ... B3
symbol compteurV = b7
symbol compteurH = b8
symbol Cde_Haut = pinC.0
symbol Cde_Bas = pinC.1
symbol Cde_Droite = pinC.2
symbol Cde_Gauche = pinC.3
dirsB = $FF ; port B en sortie
do
;on incremente ou decremente un compteur sur 8 selon l'entree active
compteurV = compteurV + Cde_Haut - Cde_Bas // 8
compteurH = compteurH + Cde_Droite - Cde_Gauche // 8
; lecture des sequences moteur en EEprom
read compteurV, Seq_MotV
read compteurH, Seq_MotH
;on affecte les 2x 4 bits des sorties sur le port B apres decalage:
pinsB = Seq_MotH*16 + Seq_MotV
'pause 10 ; si necessaire
loop
Si on veut pour une raison particulière, maintenir la gestion des FdC par le µC le programme peut devenir :
Rich (BB code):
do
'on neutralise par un ET logique les entrees du joystick (C.0 ? C.3)par l'etat des FdC (C.4 a C.7) si non realise par cablage direct !
b0 = not pinsC /16 and pinsC ' Si les FdC sont NO
'b0 = pinsC /16 and pinsC ' Si les FdC sont NF (ce qui est preferabe en automatisme).
;on incremente ou decremente un compteur sur 8 selon l'image b0 de l'entree active
compteurV = compteurV + bit0 - bit1 // 8
compteurH = compteurH + bit2 - bit3 // 8
; lecture des sequences moteur en EEprom
read compteurV, Seq_MotV
read compteurH, Seq_MotH
; si on veut mettre hors tension les moteurs hors commande (non conseille)
if Cde_Haut = 0 and Cde_Bas = 0 then : Seq_MotV = 0 : endif
if Cde_Droite = 0 and Cde_Gauche = 0 then : Seq_MotH = 0 : endif
;on affecte les 2x 4 bits des sorties sur le port B apres decalage:
pinsB = Seq_MotH*16 + Seq_MotV
'pause 10 ; si necessaire
En complément 2 lignes pour la mise hors tension des moteurs; cette mise hors tension des moteurs PaP est en général déconseillée si les moteurs sont soumis à un couple résistant, le maintien en position n'étant pas assuré.
De plus, l'intérêt d'une commande par 1/2 pas, peu justifiée dans le cas présent, est perdu puisque hors tension, le moteur se cale sur un pas entier.
(*) l'instruction lookdown peut être employée également mais je ne suis pas certain qu'elle soit plus rapide qu'un read en EEprom (500µs @ 4 MHz) (?)
Remarque: la gestion des FdC par programme (Et logique sur un demi octet) suppose que les entrées FdC et les entrées joystick sont dans le même ordre logique, ce qui n'est pas le cas sur le schéma du blog. (FdC UP et FdC down doivent être inversés)