Un moteur pas-à-pas employé seul ne permet pas de connaître sa position à la mise sous tension du système. Nous allons examiner les solutions qui s’offrent à nous pour connaître la position du pont. Dans ce qui suit, le Z est le zéro du pont, ceci afin de ne pas la confondre avec la valeur 0.
Quelques remarques préliminaires sur les moteurs pas-à-pas
Un moteur pas à pas bipolaire, si on le pilote par pas entiers, accomplit sa rotation via l’application sur ses bobines d’un courant positif ou négatif selon la séquence suivante (mode deux phases à la fois) :
Étape | Courant bobine A | Courant bobine B |
---|---|---|
0 | + | + |
1 | + | – |
2 | – | – |
3 | – | + |
Une fois à l’étape 3, on recommence à l’étape 0. Pour inverser le sens de rotation, on inverse la séquence. Au lieu de faire 0, 1, 2, 3, on fait 3, 2, 1, 0. À chaque étape correspond le franchissement d’un pas.
À l’allumage du système, on doit décider quelle est l’étape initiale. Par exemple l’étape 0. Par conséquent, bien que ne connaissant pas la position du moteur en général, on connaît sa position au sein d’un groupe de 4 pas.
Ceci reste vrai avec un fonctionnement par µPas. Que ce soit l’EasyDriver ou la DRV8824, à l’allumage et après un RESET, le courant dans les bobines est fixé à +70,71%, état appelé le Home State et cet état se retrouve bien entendu après avoir franchi 4 pas entiers ou 32µPas pour l’EasyDriver et 128 µPas pour la DRV8824.
Donc, avec un moteur 400 pas par tour, il suffit d’être capable de détecter 100 positions ou bien d’en détecter 1 sur 100 pour savoir où est le moteur.
Cette caractéristique facilite énormément la détection du 0 du pont. En effet, dans le cas de la DRV8824, si il avait fallu détecter la position au µPas près, il aurait fallu disposer d’un capteur capable de distinguer deux positions séparées de 0,028125°, soit de 0,037mm en bout de pont pour un pont de 150mm de diamètre, ce qui n’est pas une mince affaire. En réalité le capteur doit être capable de distinguer deux positions séparées de 128µPas, c’est à dire 4,71mm en bout de pont, ce qui est très facile à réaliser.
La solution sans capteur
Voici une première solution qui m’a été suggérée par Pierre59 sur le forum de Loco-Revue.
Il s’agit de faire le Z à la main une première fois. On allume l’électronique de commande et le pont est positionné, au moyen de poussoirs ou un autre moyen d’interaction avec l’électronique, sur un Z arbitraire qui correspond à une des voies de sortie. Le µPas à l’intérieur du bloc de 128 où se trouve le Z est mémorisé dans l’EEPROM du micro-contrôleur (ce qui revient à ne garder que les 7 bits de poids faible) sachant que la valeur 0 correspond au Home State.
À chaque mouvement ultérieur du pont, le numéro de bloc de 4 pas courant est également mémorisé en EEPROM afin de conserver de manière non volatile la position courante du pont quand on arrête le système.
En cas de coupure brutale de l’alimentation, il est nécessaire de garantir que le pont est dans un bloc de 4 pas connu. En effet si la coupure d’alimentation intervient à l’instant de passage d’un bloc au suivant, il se peut que le programme estime être dans le bloc suivant alors que l’arrêt effectif s’est produit dans le bloc courant. L’inverse est aussi possible d’ailleurs. De plus l’écriture en EEPROM alors que l’alimentation du micro-contrôleur se coupe peut être incertaine.
Il est donc nécessaire de disposer d’une petite réserve d’énergie et d’une détection de la coupure d’alimentation afin d’effectuer les opérations ultimes assurant que l’état est stable au moment de l’extinction.
Avantage pas de capteur.
Inconvénients procédure manuelle pour faire le Z, matériel de gestion de la coupure d’alimentation, pas de possibilité de détecter un mouvement manuel du pont lorsque le système est éteint.
Solution avec un capteur de position Zéro
La seconde solution consiste à assujettir à l’axe du moteur un ergot dont on sera capable de détecter la position en utilisant, par exemple, un capteur optique. Ce type de capteur est constitué d’une fourche entre les branches de laquelle un faisceau infrarouge est établi. Il s’agit donc de détecter la coupure du faisceau par l’ergot.
Comme expliqué à la fin du paragraphe sur les moteurs pas-à-pas, la précision n’a pas à être extraordinaire. En plaçant l’ergot à 40mm de l’axe du moteur, deux blocs successifs de 128µPas sont distants de 2,5mm.
Afin d’expérimenter cette solution, j’ai ajouté à mon banc d’essai un plateau sur lequel est fixé le moteur et le capteur.
La recherche du Z n’est pas très compliquée. Il suffit de faire tourner le moteur dans un sens quelconque jusqu’à ce que l’ergot soit détecté. Dans cette phase, il n’est pas nécessaire de respecter une vitesse de rotation réaliste. L’important est que le temps de recherche du zéro soit le plus court possible sans risquer de faire valdinguer une éventuelle locomotive stationnée sur le pont. Il faut aussi se prémunir d’un dysfonctionnement éventuel du capteur et n’effectuer qu’un tour complet.
Il vient donc la fonction suivante :
boolean chercheZero()
{
int microPas;
int blocPas;
boolean zTrouve = false;
/* Allume la LED indiquant que la recherche est en cours */
digitalWrite(ledPin, LOW);
/*
* Boucle de recherche. On effectue un tour complet
* (parcours de 100 blocs de 4 pas. Un bloc est constitué de
* 128 micropas). Pour chaque bloc, on parcoure 128 micro-pas
* à raison de 1,1ms par micro-pas. Soit 14s pour le tour
* complet
*
* zTrouve permet de savoir si on est sortit de la boucle en
* trouvant Z ou non.
*/
for (blocPas = 0; blocPas < 100; blocPas++) {
if (digitalRead(sensorPin) == 0) {
/* Z est trouvé */
zTrouve = true;
break;
}
/* Avance de 128 micro-pas */
for (microPas = 0; microPas < 128; microPas++) {
digitalWrite(stepPin, LOW);
delayMicroseconds(100);
digitalWrite(stepPin, HIGH);
delay(1);
}
}
/* Signale le fait que Z a été trouvé ou non */
if (zTrouve) {
/* Eteint la LED de recherche */
digitalWrite(ledPin,HIGH);
}
else {
/* problème, on fait clignoter rapidement la LED */
int i;
for (i = 0; i < 20; i++) {
digitalWrite(ledPin,HIGH);
delay(50);
digitalWrite(ledPin,LOW);
delay(50);
}
}
/*
* Si on a trouvé Z, on met à 0 la position actuelle
*/
positionActuelle = 0;
/* retourne true si on a trouvé Z */
return zTrouve;
}
Cette solution peut être améliorée en stockant la position atteinte en EEPROM. En cas de coupure intempestive de l’alimentation, il sera nécessaire de refaire le Z. Ceci peut être détecté automatiquement sans ajouter de matériel. En effet, il suffit à chaque mouvement du pont, de mettre un octet de l’EEPROM à 0 au début puis de le mettre à 1 à la fin. Si au démarrage du système cet octet est trouvé à 0, cela signifie que l’alimentation a été coupée alors que le pont était en mouvement et que le logiciel n’avait pas encore écrit sa nouvelle position en EEPROM. Il n’y a par contre pas de moyen de détecter une rotation manuelle du pont alors que le systèmes est éteint.
Avantage Procédure automatique pour trouver Z.
Inconvénients Procédure disgracieuse pour trouvez Z.
Solution avec un codeur absolu
Cette dernière solution consiste à mettre en œuvre un codeur absolu. Il s’agit d’une roue codeuse divisée en autant de secteurs qu’il y a de positions. Sur chaque secteur, on dispose radialement des zones noires ou blanches. Une zone code un 0 ou un 1 binaire. Les N zones disposées sur un secteur codent donc un nombre sur N bits.
Dans notre cas, nous avons 100 positions pour le moteur et il faut donc 100 secteurs. Le nombre N de bits est de 7 car ils faut être capables de coder au moins 100 valeurs différentes. Or 27 = 128. La roue codeuse a donc cet aspect :
Cette roue est assujettie à l’axe du moteur pas-à-pas et 7 capteurs IR réflectifs sont employés pour lire les 7 bits codant la position du moteur.
Il faut que le capteur soit relativement petit pour que la roue codeuse tienne facilement sous un pont tournant à l’échelle N. Mes investigations m’ont conduit à examiner deux capteurs IR réflectifs : le KTIR0711S de Kingbright et l’EE-SY193 d’Omron. Dans les deux cas il s’agit de composants montés en surface d’une dimension de 3,3mm sur 2,7mm. Après discussion avec mes camarades, mon choix s’est porté sur le capteur d’Omron car il semble plus précis.
Avantage Position du pont connue à l’allumage sans procédure y compris en cas de rotation manuelle.
Inconvénients Capteurs plus compliqués à mettre en œuvre.
Cette solution a ma préférence car elle évite toute procédure de détection du Z, qu’elle soit automatique ou manuelle.