Ce que vous allez faire
Nous avons utilisé un moteur à courant continu, qui convient bien
à l'entraînement en rotation d'un dispositif tel qu'un ventilateur,
une platine tourne-disque, un mandrin de tour ou de fraiseuse, etc.
Par contre, si vous avez besoin de contrôler finement la position d'un objet (ex. porte-outil de tour, tête de lecture d'un lecteur de DVD ou d'un scanner, pousse-seringue), vous devrez utiliser un autre type de moteur, le moteur pas à pas, qui fait l'objet de ce cours.
Les consignes sont les suivantes :
A la mise sous tension, le moteur est arrêté.
Si vous appuyez sur le bouton rouge, vous faites tourner le moteur en continu dans le sens horaire.
Si vous appuyez sur le bouton bleu, vous faites tourner le moteur en continu dans le sens anti-horaire.
Si le bouton vert est relâché, le moteur tourne en mode full-step. S'il est appuyé, le moteur tourne en mode half-step (voir Détails pratiques).
Notre moteur pas à pas
Je vous invite à lire cette page Wikipedia sur le sujet afin d'avoir une idée de leur principe de fonctionnement et des différents types de moteurs pas à pas.
Ce que l'article Wikipedia en français appelle "pas complet" est en réalité appelé "wave drive" en anglais, et "couple maximal" est appelé "full-step drive". C'est probablement une mauvaise traduction. Quoi qu'il en soit, nous utiliserons la terminologie anglaise, c'est celle qui vous sera le plus utile.
Celui que nous allons utiliser est le 28BYJ-48, un moteur pas à pas unipolaire à 4 phases bien connu des hobbyistes pour être facile à se procurer et peu coûteux. Celui qui est recommandé dans les pré-requis est de plus prévu pour fonctionner sous une tension de 5V, ce qui nous facilite les choses. Reportez-vous à sa data sheet pour les détails techniques.
Ce moteur est équipé d'un réducteur 1/64, ce qui signifie que chaque tour du moteur provoque une rotation de 5.625° de l'axe de sortie. Ne vous attendez donc pas à le voir tourner très vite, d'autant que vous ne pouvez pas le piloter à plus de 100Hz (100 pas par seconde).
Sachez aussi qu'il existe des circuits intégrés spécialisés dans la commande de moteurs pas à pas afin d'en décharger le micro-contrôleur. Ils présentent en outre l'avantage d'intégrer des mécanismes de protection que nous n'avons pas ici. Cependant, dans les cas où ces mécanismes ne sont pas indispensables, ils représentent un coût supplémentaire parfois inacceptable (produits à faibles marges).
Le matériel
Pour les mêmes raisons que pour le moteur à courant continu, nous allons utiliser notre module L9110S et notre module d'alimentation MB102. Reportez-vous au cours précédent pour les détails.
Nous utiliserons également 3 boutons poussoir avec des capuchons de couleur rouge, bleue et verte pour les identifier. Libre à vous d'utiliser un autre système de repérage si vous préférez, c'est la fonctionnalité qui compte.
Le schéma de câblage est le suivant :
Résumé des connexions :
- PD2 = Poussoir ROUGE
- PD3 = Poussoir BLEU
- PD4 = Poussoir VERT
- PC3 = L9110S A-IA
- PC4 = L9110S A-IB
- PC5 = L9110S B-IA
- PC6 = L9110S B-IB
Si vous vous trompez dans le câblage du moteur, soit il fera du surplace, soit il aura des hoquets. Avant de chercher un bug dans votre code, vérifiez donc que tout est en ordre de ce côté. ;)
Détails pratiques
On peut traduire sous forme de chronogrammes les explications de la page Wikipedia pour visualiser concrètement ce que nous devons implémenter.
Pour le mode wave drive, ça donne :
Pour le mode full-step :
Et pour le mode half-step :
Ces chronogrammes concernent un moteur bipolaire, mais si nous relions le commun d'un moteur unipolaire à la masse, on se trouve exactement dans les mêmes cas de figure.
Si on considère que les chronogrammes pris de haut en bas correspondent respectivement à PC3, PC4, PC5 et PC6, on peut représenter chaque pas par un nombre exprimant l'état des sorties, ce qui donne les tableaux suivants pour un tour complet du rotor :
const uint8_t WAVE_DRIVE[] = { 0x08, 0x40, 0x10, 0x20, }; const uint8_t FULL_STEP_DRIVE[] = { 0x28, 0x48, 0x50, 0x30, }; const uint8_t HALF_STEP_DRIVE[] = { 0x08, 0x48, 0x40, 0x50, 0x10, 0x30, 0x20, 0x28, };
Pour finir, pensez à utiliser les résistances pull-up internes pour les boutons poussoirs, et un timer pour séquencer les pas à un rythme de 100Hz.
Pour aller plus loin
Une fois que tout fonctionne, testez différentes fréquences, aussi bien inférieures que supérieures à 100Hz.
Ensuite, modifiez votre code pour comparer le mode wave drive au mode full-step. Testez ici aussi différentes fréquences.
Que retenez-vous de l'ensemble de vos essais ?
Transformer un moteur unipolaire en bipolaire
Un petit bonus pour finir : si vous voulez vérifier que votre code fonctionne bien avec un moteur pas à pas bipolaire mais que vous n'en avez pas sous la main, vous pouvez modifier votre bon vieux 28BYJ-48 - il suffit en effet d'un petit coup de cutter bien placé :
Les étapes sont les suivantes :
- Enlevez le capuchon en plastique bleu à l'aide d'un tournevis plat.
- Dessoudez le fil rouge.
- Coupez la piste qui relie les 2 points milieu à l'aide d'un cutter.
- Enlevez l'autre extrémité du fil rouge du connecteur.
- Remettez le capuchon bleu en place, c'est terminé.