Robotique : Commande d'un moteur pas à pas avec un Oric Atmos

boule_bl.gifL'idée

Il y a quelque temps j'ai ressorti mon vieux Oric Atmos, mon premier ordinateur des années 1984, avec l'idée d'en faire quelque chose. Après une recherche sur internet, j'ai trouvé des pages le Club Europe Oric avec des adeptes, de la documentation, des jeux et des programmes à charger.

Comme l'Oric possède un connecteur 2 x 17 br qui permet un accès direct au Bus du processeur 6502, cadencé à 1 MHz
, pourquoi ne pas essayer une application de robotique ? Comme la commande d'un moteur pas à pas (récupéré sur une vielle imprimante).

boule_bl.gifLe principe

boule_rg.gif

Il n'est pas nécessaire de démonter l'Oric ! il faut relier un connecteur 2 x17 contacts HE 10 femelle au connecteur du bus d'extension de l'oric.

boule rg.gifJ'ai placé un interrupteur fin de course sur le moteur pas à pas pour permettre de retrouver la position de départ.

boule rg.gifLe programme informatique demande l'angle de rotation, affiche à l'écran la position et fait tourner le moteur.

boule_bl.gifRéalisation de la carte P.I.A.

boule_bl.gifLe 6502 contenu dans l'Oric ne peut pas commander directement une entrée ou une sortie. Il faut une carte PIA ( Périphérique Interface Adaptateur ) :

boule_rg.gifUn circuit spécialisé 65A21 permet d'adresser 2 ports de 8 bits qui peuvent fonctionner en entrée ou sortie.

boule rg.gifChacune des sorties peut drainer un courant de 10 mA, avec une résistance de rappel au + 5V. On peut y connecter des Del avec en série une résistance de 470 ohms.

boule rg.gifL'adressage du 65A21 se fait par l'intermédiaire de 2 circuits TTL. Le groupe d'adresse A7A6A5A4 est décodé par une porte Nand à 4 entrées. 4 circuits 65A21 peuvent être sélectionnés avec cette carte, un seul est monté. Le 74LS155 permet la sélection par l'intermédiaire de la broche CS2.

boule rg.gif La carte devra être reliée à une alimentation stabilisée de 5V, car celle de l'oric n'est pas suffisante et risquerait de partir en fumée.

boule rg.gifLes numéros des connexions sur le schéma structurel et sur le dessin de câblage des composants indiquent les broches du connecteur 2 X 17 contacts. Un câble plat à 34 conducteurs sera utilisé mais seul 22 liaisons seront réalisées sur la carte P.I.A. Il faudra ne pas oublier de brancher la masse ( connexion 34), mais ne pas relier le + 5V de l'Oric.


boule_bl.gifLe connecteur sera branché à l'arrière de l'Oric sur le bus d'extension, en respectant le sens

boule_bl.gifCommande d'un interrupteur et d'une LED

Pour tester le fonctionnement de cette carte on pourra connecter un interrupteur et une LED avant d'y relier une carte de commande pour moteur pas à pas.

boule_bl.gifOn réalise le branchement ci-contre. La DEL peut être branchée sur n'importe laquelle des sorties PA0 à PA7 car c'est l'ensemble du Port A qui sera commuté. Il en va de même pour l'interrupteur sur le Port B.

 

 

boule_bl.gifLe programme ci-contre se contente de faire clignoter la led lorsque l'on ferme l'interrupteur.

boule rg.gifLes registres du P.I.A.

L'instruction POKE permet de placer à ces adresses un nombre à 8 bits compris entre 0 et 255

Port A
#3F0
Données
#3F1
Contrôle
Port B
#3F2
Données
#3F3
Contrôle

boule rg.gifLe registre sens de transfert

IL nécessite 2 instructions POKE. Pour accéder à ce registre, il faut mettre le bit CR2 du registre de contrôle à 0. Si les autres bits ne sont pas utilisés on les met aussi à 0. Pour indiquer le sens de transfert on place ensuite un 0 ou un 1 dans le registre de données.

Entrée
0
Sortie
1

boule rg.gifPour mettre un port à 1, on écrit à son adresse la valeur décimale 255 soit 11111111 en binaire (les 8 bits sont à 1)

1 REM " Test P.I.A."

 
10 POKE#3F1,0 Mise à 0 du registre de contrôle pour l'accés au registre de transfert du port A
20 POKE#3F0,255 Bits du port A en sorties
30 POKE#3F1,255 Mise à 1 du registre de contrôle pour l'accés au registre de données du port A
40 POKE#3F3,0 Mise à 0 du registre de contrôle pour l'accés au registre de transfert du port B
50 POKE#3F2,0 Bits du port B en entrées
60 POKE#3F3,255 Mise à 1 du registre de contrôle pour l'accés au registre de données du port B
70 A=PEEK(#3F2) Attente de la mise à 0 d'un interrupteur
80 IF A=0 THEN GOTO 100
90 GOTO 70
100 POKE #3F0,0 Boucle pour le clignotement de la LED
110 WAIT50
120 POKE#3F0,255

130 WAIT50

140 GOTO 70

boule_bl.gifCommande d'un moteur Pas à Pas

boule_bl.gifUn moteur pas à pas nécesite une certaine puissance pour être commandé. On utilise le plus souvent un montage en pont

boule rg.gifVoici une carte maison de contrôle des moteurs à courant continu ( convient aussi pour les moteurs pas à pas en mettant les entrées A et B au niveau 1) : schéma structurel et dessin du PCB

boule_bl.gifPrincipe de commande d'un moteur pas à pas :

Pour la commande un moteur pas à pas nécesite 2 signaux rectangulaires déphasés de pi/2

boule rg.gifPA6 et PA7 sont des sorties connectées aux entrées de la carte de puissance A et B

boule rg.gifPB0 est une entrée connectée à l'interrupteur fin de course avec une résistance de rappel de 10 kohms au + 5V

boule_bl.gif2 types de moteurs existent : bipolaire avec 4 fils de branchements et unipolaire avec 6 fils.

boule rg.gifPour le moteur unipolaire les points milieux sont à raccorder au pôle positif de la tension d'alimentation. Les 4 autres fils sont à brancher aux 4 sorties de la carte de puissance. Si le moteur vibre et ne tourne pas, il faudra inverser 2 à 2 les fils

boule rg.gif

Pour un moteur bipolaire, il est facile de repérer à l'ohmètre les 2 bobines et réaliser le branchement en pont sur la carte de puissance

boule_bl.gifLe programme demande l'angle de rotation, trace à l'écran la position de l'axe du moteur dans un cercle et actionne le moteur pas à pas. Il est aussi possible d'ajouter la prise en compte de la position de départ à l'aide de l'interrupteur à lame souple.

boule rg.gifPour créer 2 signaux déphasé de Pi/2 sur PA6 & PA7, il faut la suite logique binaire suivante :

Binaire
Décimal
01000000
64
11000000
192
10000000
128

boule rg.gifLa variable D dépend du nombre de pas du moteur. Dans l'exemple ci-contre le moteur est un 48 pas / tour . Il tourne de 15 degrés à chaque incrémentation de la boucle FOR NEXT. Il faudra adapter la variable D pour un autre moteur. Par exemple pour un moteur 200 pas / tour, D= C/3.6.

boule rg.gif

Le programme peut être modifié pour prendre en compte la position de départ. le logiciel fait tourner le moteur jusqu'à ce qu'il rencontre l'interrupteur à lame souple, l'entrée PB0 est mise à 0, et le logiciel arrête la rotation du moteur.

10 REM " commande moteur "

 
20 POKE#3F1,0 Mise à 0 du registre de contrôle pour l'accés au registre de transfert du port A
30 POKE#3F0,255 Bits du port A en sorties
40 POKE#3F1,255 Mise à 1 du registre de contrôle pour l'accés au registre de données du port A
50 CLS : HIRES Tracé d'un cercle à l'écran
60 CURSET 50,100,0
70 CIRCLE 44,1
80 PRINT"ANGLE DE ROTATION" Entrée de l'angle de rotation en degrés
90 INPUT C
100 CURSET 50,100,0 : DRAW B,A,0 Effacement de la droite précédente à l'écran
110 A=INT(40*SIN((C/180)*PI)) Tracé de la droite correspondante à l'angle de rotation
120 B=INT(40*COS((C/180)*PI))
130 CURSET 50,100,0

140 DRAW B,A,1

150 D=C/15 : FOR T=0 TO D-1 Boucle avec les valeurs décimales sur le Port A du tableau ci-contre
160 POKE#3F0,64
170 WAIT2
180 POKE#3F0,192
190 WAIT2
200 POKE#3F0,128
210 WAIT2
220 POKE#3F0,0
230 WAIT2
240 NEXT T
250 GOTO 80