Faire tourner un moteur à une vitesse précise

1.1.1        La théorie

Le but du projet sera de faire tourner un moteur électrique à un nombre de tours par minute donné.

Pour cela, on ajustera la largeur du signal PWM en fonction du temps qui se passera entre deux tours.

1.1.2        L’électronique

Coté électronique, on va reprendre pas mal de choses qu’on a déjà étudié.

-          Le PWM pour faire varier la vitesse du moteur

-          Le circuit L293D pour fournir le courant au moteur

-          Les interruptions pour mesurer le temps de rotation du moteur

-          Une barrière optoélectronique avec un rayon laser et un phototransistor TIL81 pour générer les interruptions.

Coté logiciel, ce sera un peu pareil, on pourra reprendre la gestion des éléments suivants :

-          Le PWM

-          Les interruptions

Le montage sera assez simple.

Coté moteur, je vais utiliser une récupération d’une ancienne imprimante HP à jet d’encre que je vais alimenter en 7.2V (comme un bloc d’accumulateur de modèle réduit, test pour un futur robot).

Pour l’alimentation de votre moteur, il faudra faire des tests, en effet chaque moteur accepte des fréquences PWM plus ou moins différentes, voir certains moteurs ne l’acceptent pas du tout, seul des tests ou une bonne fiche technique pourront vous le dire


 

1.1.3        La mécanique

Comme il faut faire une barrière optoélectronique avec le module laser d’un côté, le phototransistor de l’autre et entre les deux, le passage d’un objet entrainé par la rotation du moteur, il va falloir faire un montage mécanique correcte et assez précis.

Pour faire ça, j’ai utilisé les éléments suivants :

-          J’ai récupéré des éléments de construction de marque BUKI pour faire la structure

-          Une plaque de plastique à découper pour positionner le moteur et la barrière.

-          Des vis, écrous et rondelles pour fixer la structure et les éléments en plastiques.


 

Voici quelques photos pour montrer concrètement ce que cela donne

Avec les branchements


 

1.1.4        Le logiciel

Les différentes GPIO auront les fonctions suivantes :

-          GPIO18 : Signal PWM faisant varier la vitesse du moteur.

-          GPIO5/GPIO6 : Sens de rotation du moteur (seul l’une des sorties doit être à 1 pour positionner le sens de rotation). Si les deux sorties sont à 0 ou à 1, le moteur est à l’arrêt (Attention : sur un pont en H non protégé, mettre les deux sorties à 1 met l’alimentation en court-circuit et peut entrainer du dégât).

-          GPIO20 : Activation de la barrière laser (active à 0).

-          GPIO21 : Signal d’interruption pour compter le temps de chaque tour du moteur (1 si illuminé, 0 en coupure).

Pour la gestion des GPIO normales, la librairie GestionPinGPIO fera très bien l’affaire.

Par contre pour la gestion du PWM, j’ai réécrit la librairie car elle avait quelques défauts :

-          Il fallait initialiser la librairie WiringPi en lui faisant explicitement le setup, il y avait risque d’un double setup avec la librairie GestionPinGPIO, j’ai donc étendu la GestionPin qui fait l’initialisation pour la librairie PWM

-          J’ai ajouté un certain nombre de fonctions utiles.

Le projet a donc besoin des fichiers suivants :

-          tstCompteTours.cpp : le programme de test

-          GestionPin.h : l’entête de la classe de base de gestion des GPIO

-          GestionPin.cpp : la classe de base de gestion des GPIO

-          GestionPinGPIO.h : l’entête de la classe de gestion des GPIO

-          GestionPinGPIO.cpp : la classe de gestion des GPIO

-          GestionPinPWM.h : l’entête de la classe de gestion du PWM

-          GestionPinPWM.cpp : la classe de gestion du PWM

La commande de compilation est la suivante :


 

1.1.5        Le fonctionnement

Le programme demande le nombre de tour par minute auquel le moteur doit tourner

 

Puis lance le moteur en ajustant le PWM en fonction du temps entre deux interruptions jusqu’à s’approcher le plus possible de la valeur cible.

 

Le système de régulation est dans la fonction d’interruption, il décrémente la valeur du PWM si le nombre de tours réels est supérieur au nombre de tours cibles, sinon, il l’incrémente.

Le système impose donc une légère oscillation autour de la vitesse de rotation cible car l’ajustement est permanent.

La valeur cible est atteinte plus rapidement avec les valeurs de rotation élevées car il y a plus d’interruption et donc la régulation est plus rapide.

Même si le programme affiche en permanence les interruptions, il est possible de demander une nouvelle valeur cible en tapant le nombre suivi de Entrée/Return.

A chaque nouvelle demande, le PWM se positionne à la valeur moyenne et recommence sa régulation.

CTRL-C arrête le programme et désactive les GPIO.


 

Le système en fonctionnement, on voit bien le faisceau laser coupé par le bloc de plastique en rotation.

1.1.6        Liste des programmes

https://github.com/montotof123/raspberry/blob/master/240_CompteTour/GestionPin.cpp

https://github.com/montotof123/raspberry/blob/master/240_CompteTour/GestionPin.h

https://github.com/montotof123/raspberry/blob/master/240_CompteTour/GestionPinGPIO.cpp

https://github.com/montotof123/raspberry/blob/master/240_CompteTour/GestionPinGPIO.h

https://github.com/montotof123/raspberry/blob/master/240_CompteTour/GestionPinPWM.cpp

https://github.com/montotof123/raspberry/blob/master/240_CompteTour/GestionPinPWM.h

https://github.com/montotof123/raspberry/blob/master/240_CompteTour/tstCompteTours.cpp

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Lien vers la base du site.