Explication des fonctions « moteurs »
Note : il y a plusieurs façons de programmer ces fonctions moteurs. Notre implémentation n'en représente qu'une parmi plusieurs.
Table de vérité
Selon les signaux électriques envoyés aux broches IN1 et IN2, le MOTOR-A se comporte selon la table de vérité suivante :
IN1 | IN2 | MOTOR-A |
---|---|---|
LOW | LOW | Arrêt |
HIGH | LOW | Avance |
LOW | HIGH | Recule |
HIGH | HIGH | Arrêt |
LOW correspond à un signal électrique de 0 V et HIGH correspond à un signal électrique de 5 V. Le MOTOR-B a évidemment la même table de vérité.
Branchements avec la plaquette Arduino
Selon les branchements du Qbot, les broches du contrôleur de moteur doivent être connectées à la plaquette Arduino selon les branchements suivants :
Contrôleur de moteur | Plaquette Arduino |
---|---|
IN1 | D5 |
IN2 | D4 |
IN3 | D6 |
IN4 | D7 |
(La raison de l'inversion des broches D4 et D5 sera expliquée plus bas.)
Vitesse variable (PWM)
A priori, le Qbot pourrait donc avoir trois vitesses : pleine vitesse vers l'avant, arrêt et pleine vitesse vers l'arrière. Cela n'est pas idéal. Préférablement, nous voudrions pouvoir décider de la vitesse du Qbot. Aux premiers abords, les broches de la plaquette Arduino sont numériques : elles n'ont que deux valeurs (LOW ou HIGH, 0 ou 1, 0 V ou 5 V). Par contre, en alternant rapidement entre les deux états, on peut simuler des valeurs intermédiaires, et donc simuler un courant analogique pouvant avoir plusieurs valeurs. On appelle ce processus la Pulse Width Modulation (PWM). Par exemple, si la broche est à HIGH 50% du temps et à LOW l'autre 50% du temps, on simule une valeur analogique de 2,5 V. Si la broche est à HIGH durant 20% de son cycle, puis à LOW durant le reste du cycle, on vient d'obtenir une valeur de 1 V. Voir le document Arduino pour plus de détails sur le PWM.
Malheureusement, ce ne sont pas toutes les broches de la plaquette Arduino qui peuvent effectuer du PWM. Les broches ayant cette capacité sont identifiées par un ~ sur la plaquette Arduino (pas le blindage). Dans l'intervalle choisi pour le contrôleur de moteur, seules les broches D5 et D6 font du PWM. Voilà pourquoi les branchements sont inversés pour le premier moteur! La première entrée de chaque paire du contrôleur peut faire du PWM : c'est donc cette entrée qui va pouvoir décider de la vitesse du Qbot. La seconde entrée, qui ne peut avoir que des valeurs de LOW ou HIGH, ne fait que déterminer la direction de rotation du moteur.
Valeurs de vitesses possibles
Une broche PWM a une précision d'un octet, donc 8 bits. Ceci représente donc 28 = 256 valeurs, de 0 à 255. On décide ensuite qu'une vitesse négative correspond à un déplacement vers l'arrière et qu'une vitesse positive correspond à un déplacement vers l'avant. La fonction moteur simple accepte donc des valeurs de vitesse allant de -255 à +255.
Algorithme du programme simple (en théorie)
L'idée générale du programme simple est la suivante :
- Vérifier si la vitesse demandée est un nombre positif ou négatif.
- Si c'est un nombre positif : on avance! On envoie la valeur LOW aux broches déterminant la direction et on envoie la vitesse demandée aux broches déterminant la vitesse.
- Si c'est un nombre négatif : on recule! On envoie la valeur HIGH aux broches déterminant la direction et on envoie 1-abs (vitesse demandée) aux broches déterminant la vitesse. abs() dénote la valeur absolue.
Pourquoi l'opération sur la vitesse au point 3? Lorsque l'on recule, les broches de direction (IN2 pour le MOTOR-A et IN4 pour le MOTOR-B) sont à HIGH. En se référant à la table de vérité du contrôleur de moteur, le Qbot va reculer si la broche de vitesse est à LOW et arrêter si la broche de vitesse est à HIGH.
Mais, si on dit à la broche de vitesse d'aller au 2/3 de la vitesse vers l'arrière, le PWM fait en sorte que la broche de vitesse est à HIGH le 2/3 du cycle et à LOW l'autre 1/3 du cycle. Résultat : le robot est arrêté durant les 2/3 du cycle (HIGH-HIGH) et recule durant le 1/3 du cycle (LOW-HIGH). On ne recule pas à une vitesse de 2/3 du maximum, mais bien à 1/3 du maximum! En faisant 1-abs (vitesse demandée), on obtient le bon comportement.
Fonctionnement réel du programme simple
Dans les faits, rien n'est aussi simple! En allant voir la fonction simple, on constate qu'il y a une différence majeure : le cas où la vitesse demandée est positive correspond au cas où l'on recule sur la table de vérité. En effet, après la fabrication du Qbot, nous avons constaté que notre convention de filage entre le contrôleur de moteur et les moteurs étaient tel que la rotation « par avant » des moteurs faisait reculer le Qbot. Nous avons décidé d'inverser le comportement du programme pour compenser.
On prend aussi toujours la valeur absolue, car c'était plus simple lorsque nous essayions de comprendre dans quel sens les roues tournent. Dans les faits, cela n'est pas vraiment nécessaire dans le cas où la vitesse demandée est positive.
Fonctionnement du programme avancé
La fonctionnalité supplémentaire du programme avancé est de pouvoir faire tourner le Qbot, donc les roues ne vont pas à la même vitesse.
Il faut donc que la vitesse envoyée à chaque moteur soit différente, selon la direction de rotation. On décide, par analogie avec le plan cartésien, que l'on veut qu'une rotation vers la droite ait un argument en x positif. Lors d'une rotation vers la droite, le moteur de gauche (A) tourne plus vite que le moteur de droite (B). Donc, moteur A = y+x et moteur B = y-x. Ainsi, plus la vitesse de rotation est grande, plus la différence entre les vitesses des roues sera grande.
Si on veut tourner à gauche, l'argument en x est négatif et le comportement des roues s'inverse.
Quelques détails supplémentaires :
- Comme les arguments vont de -100 à +100, on doit donc les ramener sur -255 à +255 avant de faire l'addition et la soustraction.
- Il y a aussi une opération sur l'argument en x pour le rendre moins sensible.
- On doit encore prendre la valeur absolue pour éviter de demander une valeur PWM négative, ce qui est impossible.
- Lorsque y est négatif, donc que l'on veut reculer, il faut encore une fois faire l'opération décrite plus haut pour obtenir la valeur inversée de PWM.