X25 Moteur pas-à-pas pour afficheur analogique

3/8/20

***Pour revenir à la page d’accueil** ICI


On trouve ces moteurs dans les tableaux de bord des autos  pour les afficheurs analogiques.
L'aiguille d'un compte-tours, d'un compteur kilométrique, d'un niveau d'essence est activée par un tel moteur.

On reconnait leur présence au déplacement pleine échelle à la mise du contact, puis retour au zero.


Principes  generaux

 

Pour une étude détaillée des moteurs pas-à-pas

On les trouve sous différentes formes mais le plus populaire est le X25/27 type 168 qui comporte une butée.









Noter que ce moteur a été conçu en Suisse par une filiale de Swatch.





Il comporte deux enroulements (1,2) et (3,4) que l'on connecte à 4 sorties digitales d'un Arduino
 D10,11,12,13 par exemple.
C'est un moteur de type Lavet, inventeur Français qui l'a breveté en 1936.



Le petit rotor comporte 6 dents et la démultiplication totale est 180.
Le pas de base du rotor correspond à 1/3° de l'axe de sortie, soit 180/3 = 60° pour le rotor.
Il existe aussi un micropas, pour 1/12° de l'axe mais l'on ne s'en occupera pas.
La roue de l'axe comporte un téton qui vient buter sur la zone en rouge du couvercle, ce
qui délimite une zone active de l'aiguille entre 0 et 315°.

A 360° d'axe correspond 360X3 = 1080 pas.
A 315° d'axe correspond donc (1080/360)X315 = 945 pas.

Au démarrage, on renvoie l'axe à 0°,ce qui revient à faire tourner le rotor de 945 pas.
Dans la plupart des cas l'axe étant déjà en butée, le rotor essaie d'entrainer le pignon central.
Celui ci est donc conçu de façon astucieuse avec des dents souples tolérant cette tentative d'entrainement.


******************Principe de fonctionnement avec la bibliothèque SwitecX25*******************

#include <SwitecX25.h>***************Reference

#define MaxSteps (315*3)     **********On definit la plage de rotation max, ici 315°, 3 pas par degrès


SwitecX25 motor1(MaxSteps, 10, 11, 12, 13);   ***********
On instancie un objet motor1 , connecté à D10,11,12,13

motor1.zero();   ************************************************ Remise à zéro du moteur, le rotor tourne 915 pas en sens anti-horaire

motor1.setPosition(222);   *************************************On communique l'objectif de 222 pas mais le moteur reste immobile

motor1.update();                 ***********************************Le moteur tourne vers l'objectif, d'où une certaine attente necessaire


L'idée est d'inclure cette dernière instruction,
motor1.update(); ,   dans loop() de façon à l'exécuter le plus souvent possible.





****************Compte-tours sensible, d'échelle 0 à 2000 t/mn pour réglage de carburation à bas régime***************

Le nombre de cylindres et la plage sont modifiables dans les premières lignes du code.










  
Logiciel du compte-tours 


********************************Banc d'essai **********************





Ce banc d'essai alimenté simplement par la prise USB de l'Arduino permet de connecter un moteur via 4 pinces croco et de le tester.

    
Logiciel du banc d'essai      

***********************Pilotage d'un moteur depuis un PC*****************
  
Logiciel de pilotage d'un moteur depuis un PC   

*****************Annexe*****************

Problème de remise à zéro résolu.
Olivier C. a trouvé cette solution, merci à lui.

En observant la classe SwitecX25 (https://github.com/clearwater/SwitecX25/blob/master/SwitecX25.cpp), j'ai remarqué que la fonction "zero()" n'utilise pas la table d'accélération, mais une simple boucle avec un délai constant "RESET_STEP_MICROSEC". Cette valeur est par défaut de 800, ce qui est légèrement trop rapide pour le moteur. En modifiant à 900, il n'y a plus aucun décrochage du rotor. L'aiguille s'initialise au zéro à peine plus lentement, ce qui n'est pas un souci.


void SwitecX25::zero()

{

currentStep = steps - 1;

for (unsigned int i=0;i<steps;i++) {

stepDown();

delayMicroseconds(RESET_STEP_MICROSEC);

}

currentStep = 0;

targetStep = 0;

vel = 0;

dir = 0;

}

s

Pour creuser le sujet du moteur Lavet

Ou encore ici

Ou enfin ici