Contrôle simultané de 2 moteurs pas-à-pas avec un PICAXE

Introduction
Contrôler un moteur ''Pas-à-Pas'', qu'il soit unipolaire ou bipolaire, avec un PICAXE ne pose généralement pas de problème majeur.

Que l'on utilise des boutons-poussoirs ou un joystick, contrôler deux moteurs ''Pas-à-Pas'' à tour de rôle avec un seul PICAXE reste également assez aisé.
Mais en contrôler deux simultanément avec un seul PICAXE, un joystick et des détecteurs de fin-de-course devient plus compliqué.


En automation, la logique combinatoire cablée a toujours été la plus rapide, mais elle nécessite souvent plusieurs circuits intégrés, des portes logiques par exemple, au lieu d'un simple microcontrôleur.

La logique séquentielle, programmable telle qu'on la connait aujourd'hui, nous fait parfois oublier des méthodes utilisées dans les années 70 et 80, comme les ROM fusibles et les PLA.
L'utilisation de mémoires PROM, EPROM ou EEPROM permet de réaliser des fonctions complexes de logique combinatoire, avec un temps de reaction inférieur à 50 nS pour une PROM TTL bipolaire, ce qui constitue une excellente solution pour le contrôle simultané de 2 moteurs Pas-à-Pas.

Heureusement, PICAXE permet un compromis, certes plus lent qu'en logique cablée mais plus facile à mettre en oeuvre et à corriger en cas d'erreur.
En terme de compromis, il s'agit d'utiliser les instructions ''Table'' et ''Readtable'' en lieu et place d'une mémoire PROM externe.


Réalisation
A simple titre de documentation,  le premier schéma présente une version qui utiliserait un PICAXE et une PROM fusible dont les datas seraient tirées de la table 0 à 255 du PICAXE et adaptées au cablage des commandes et fins-de-course.
Cette table peut être simplifiée si on exclut les conditions peu probables, telles que la présence simultanée de commandes et de fins-de-courses opposés.
La programmation d'une PROM fusible nécessite un programmateur spécifique qui ne sera pas abordé dans cet article.

J'ai personnellement utilisé le second schéma pour la commande d'une caméra simultanément dans 2 axes, en rotation et en élévation.

En photo/vidéo animalière, les mouvements d'orientation du caméscope, par leurs niveaux sonores, ne doivent pas effrayer les animaux que l'on désire filmer.
La rotation silencieuse et régulière des moteurs pas-à-pas est obtenue grâce à un pilotage par demi-pas.
Cela implique l'utilisation de moteurs unipolaires au lieu de moteurs bipolaires, même s'il faut déplorer une légère perte de couple par rapport à ces derniers.
Les transmissions par poulies et la programmation permettent d'ajuster les vitesses de moteurs.
L'autonomie des batteries est primordiale car tout mAH non consommé peut conduire aux images tant attendues.
Quelques points particuliers permettent d'économiser l'énergie des batteries :
- caméscope hors tension pendant l'attente d'un animal
- pas de led-témoin en service inutilement
- si possible, pas de surfréquences d'horloge des microcontrôleurs et recours à des fonctions telles que ''disablebod'' ou sleep (non utilisées dans cet exemple)
- moteurs hors tension une fois en position
  (mis à part le vent, il n'y a pas de force entraînante en rotation, mais ce n'est réalisable en élévation que si le berceau du caméscope est équilibré)

Le programme du PICAXE 20M2 repris ci-après est rigoureusement adapté au schéma proposé.
Il est bien sûr toujours possible d'utiliser des fins-de-courses à ampoule Reed (ILS) au lieu de microswitches.
Avec certains moteurs, si on impose une fréquence d'horloge élevée au PICAXE, il peut s'avérer nécessaire de marquer une pause entre chaque ''PAS'' moteur.

Programmation du PICAXE 20M2
; Les vitesses des moteurs seront identiques

; LSB Port B pour Rotation
; MSB Port B pour Elévation

; C.0 = input Cmd DW
; C.1 = input Cmd UP
; C.2 = input Cmd CCW
; C.3 = input Cmd CW
; C.4 = input Fdc UP
; C.5 = input Fdc DW
; C.6 = input Fdc CCW
; C.7 = input Fdc CW

; readtable = 0 pour Power-off
; readtable = 1 pour DW
; readtable = 2 pour UP
; readtable = 4 pour CCW
; readtable = 8 pour CW
; readtable = 5 pour DW+CCW
; readtable = 6 pour UP+CCW
; readtable = 9 pour DW+CW
; readtable =10 pour UP+CW


setfreq m32                ; fréquence d'horloge du microcontrôleur

dirsC=0 : dirsB=255

symbol interval=0        ; pause entre les pas (vitesse)
symbol action=b1
symbol index=w13
symbol offset=w12

; table 0 à 255 pour l'interprétation des inputs (commandes + Fins-de-courses)
table 0,(0,1,2,0,4,5,6,0,8,9,10,8,0,1,2,0)
table 16,(0,1,0,0,4,5,4,4,8,9,8,8,0,1,0,0)
table 32,(0,0,2,0,4,4,6,4,8,8,10,8,0,0,2,0)
table 48,(0,0,0,0,4,4,4,4,8,8,8,8,0,0,0,0)
table 64,(0,1,2,0,0,1,2,0,8,9,10,8,0,1,2,0)
table 80,(0,1,0,0,0,1,0,0,8,9,8,8,0,1,0,0)
table 96,(0,0,2,0,0,0,2,0,8,8,10,8,0,0,2,0)
table 112,(0,0,0,0,0,0,0,0,8,8,8,8,0,0,0,0)
table 128,(0,1,2,0,4,5,6,4,0,1,2,0,0,1,2,0)
table 144,(0,1,0,0,4,5,6,4,0,1,0,0,0,1,0,0)
table 160,(0,0,2,0,4,4,6,4,0,0,2,0,0,0,2,0)
table 176,(0,0,0,0,4,4,4,4,0,0,0,0,0,0,0,0)
table 192,(0,1,0,0,0,1,2,0,0,1,0,0,0,1,2,0)
table 208,(0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0)
table 224,(0,0,2,0,0,0,2,0,0,0,2,0,0,0,2,0)
table 240,(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)

; table 256 à 319 pour les sorties vers les enroulements des moteurs
table 256,(144,16,48,32,96,64,192,128)    ; 8 demi-pas en DW
table 264,(128,192,64,96,32,48,16,144)    ; 8 demi-pas en UP
table 272,(8,12,4,6,2,3,1,9)            ; 8 demi-pas en CCW
table 280,(9,1,3,2,6,4,12,8)            ; 8 demi-pas en CW
table 288,(152,28,52,38,98,67,193,137)    ; 8 demi-pas en DW+CCW
table 296,(136,204,68,102,34,51,17,153)    ; 8 demi-pas en UP+CCW
table 304,(153,17,51,34,102,68,204,136)    ; 8 demi-pas en DW+CW
table 312,(137,193,67,98,38,52,28,152)    ; 8 demi-pas en UP+CW

main:
readtable pinsC,action            ; lecture des Commandes et Fins-de-courses

select action
case 0            ; Power-off
    pinsB=0
    goto main
case 1
    offset=256    ; DW    ;
case 2
    offset=264    ; UP
case 4
    offset=272    ; CCW
case 8
    offset=280    ; CW
case 5
    offset=288    ; DW+CCW
case 6
    offset=296    ; UP+CCW
case 9
    offset=304    ; DW+CW
case 10
    offset=312    ; UP+CW
endselect


    index=offset+bptr
    bptr=bptr+1
    if bptr=8 then
        bptr=0
    endif
    readtable index,pinsB
    ; pause interval

  
goto main





Lien vers les fichiers explicatifs des valeurs contenues dans les tables 0 à 255 et 256 à 319







Aucun commentaire:

Enregistrer un commentaire

Les commentaires constructifs sont les bienvenus.
Contact par mail via mon profil dans la colonne de droite.