Alors pour ce tuto sur comment asservir un moteur CC avec un PID
Il est important de comprendre les différents morceaux du code.
Il faut savoir :
=> Savoir utiliser un driver de moteur avec le PWM pour piloter un moteur CC dans les deux sens et le faire aller plus ou moins vite.
Tu peux faire des fonctions intermédiaire avancer reculer et arrêt qui prennent la valeur de vitesse souhaitée en paramètre si ça peut te faciliter le travail en fonction du driver de moteur que tu utilises.
Mais il faudra pour des raison de practicité une fonction générale, qui prend la valeur de vitesse souhaitée en paramètre et qui en fonction de cela gère directement avancer ou reculer en fonction de la valeur de vitesse spécifiée.
=> Savoir utiliser les codeurs pour lire la vitesse du moteur
Lire les messages que j'ai posté ici en plus du tutoriel ne serait pas une mauvaise chose =)
De plus il y a aussi ce sujet sur un robot 2WD qui répond à pas mal de question
Capture1.JPG
J'ai notamment pas du tout compris l'avant dernière ligne... la variable count s'incrémente-t-elle à chaque fois qu'il y à un front montant sur l'encodeur A ou B ?
Dans le code du tutoriel, oui la variable s'incrément à chaque fous qu'il y a un front montant sur la voie A qui est branchée sur le pin 2 grâce à cette ligne de code :
attachInterrupt(0,counter, CHANGE); // on crée l'interruption sur changement sur la pin 2 => interruption 0, la routine counter va se faire toute seule sans l'appeler à chaque changement d'état sur le pin 2
ça peut être déroutant mais oui qui l'interruption 0 sur une arduino uno et nano est reliée au pin 2.
Il est possible de doubler la résolution du codeur en comptant aussi sur la voie B. En mettant la voie B sur le Pin 3 et en faisant appel à l'interruption 1 liée au pin 3.
Si c'est juste un compteur, pourquoi c'est directement la vitesse de rotation du moteur, car on a pas de référence de temps, non ?
Il y a une base de temps. Elle est définie avec le Timer 1 par ces lignes :
Timer1.initialize(100000); // On défini le timeur : 100000 microseconds ( 0.1 sec - or 10Hz )
Timer1.attachInterrupt( timerIsr ); // attach the service routine here la fonction timerIsr est une routine qui va se faire automatiquement 10* par secondes sans l'appeler
Dans la fonctions timerIsr on remt à 0 le compteur, et on fait ça 10 fois par secondes ... ça nous donne une base de temps ... On a : un nombre de ticks / 0,1 s ...
Reste à définir le nombre de ticks / tours et tu peux avoir ton unité en RPM.
=> Savoir combiner le tout en utilisant le PID => Tuto final : Comment asservir un moteur CC avec un PID
J'ai aussi regardé la librairie du PID mais je n'arrive pas à comprendre ce que renvoi la commande PID.Compute(): je ne comprends pas à quoi correspond le Output. Est-ce la nouvelle consigne de vitesse du moteur ?
Tu as une consigne ( valeur de vitesse souhaitée )
Tu as une mesure ( valeur de vitesse mesurée )
Le PID va utiliser l'erreur ( consigne - mesure ) avec "compute" pour déterminer un "ordre moteur correctif " à appliquer.
Output est cet ordre moteur correctif .
Dans le cas d'un moteur il sera la valeur de PWM à appliquer au moteur.
Donc oui Output c'est bien la nouvelle consigne du moteur.