Ligne 10 : |
Ligne 10 : |
| | | |
| Ce programme utilise la [http://arduino.cc/en/Reference/PulseIn bibliothèque PulseIn] d'Arduino pour lire le signal en provenance du récepteur. Par défault, l'exemple par du principe que les canaux accélérateur (''throttle'') et direction (''steering'') sont connecté respectivement sur les broches 4 et 5 (comme sur le diagramme). Le signal des deux canaux est analysé pour déterminer la vitesse du moteur droit et moteur gauche (ce qui permet un contrôle plus intuitif). | | Ce programme utilise la [http://arduino.cc/en/Reference/PulseIn bibliothèque PulseIn] d'Arduino pour lire le signal en provenance du récepteur. Par défault, l'exemple par du principe que les canaux accélérateur (''throttle'') et direction (''steering'') sont connecté respectivement sur les broches 4 et 5 (comme sur le diagramme). Le signal des deux canaux est analysé pour déterminer la vitesse du moteur droit et moteur gauche (ce qui permet un contrôle plus intuitif). |
| + | |
| + | == Code == |
| + | Voici une copie de l'exemple avec traduction des commentaires pour vous aider à mieux comprendre le fonctionnement du croquis/sketch |
| + | |
| + | Nous recommandons de toujours charger l'exemple depuis les codes d'exemples de la bibliothèque Zumo. |
| + | |
| + | <syntaxhighlight lang="c"> |
| + | #include <ZumoMotors.h> |
| + | |
| + | #define THROTTLE_PIN 4 // Canal accélération (throttle) du récepteur RC |
| + | #define STEERING_PIN 5 // Canal de direction (steering) du récepteur RC |
| + | #define LED_PIN 13 // broche de la LED utilisateur |
| + | |
| + | #define MAX_SPEED 400 // Vitesse max moteur |
| + | #define PULSE_WIDTH_DEADBAND 25 // Différence de largeur d'impulsion depuis 1500 us (microseconds) à ignorer (pour compenser l'offset/décalage de la position centrale) |
| + | #define PULSE_WIDTH_RANGE 350 // Différence de largeur d'impulsion depuis 1500 us qui doit être considéré comme l'amplitude totale de l'entrée (valeur max) |
| + | // Par exemple une valeur de 350 signifie l'utilisation d'une largeur d'impulsion (pulse width) <= 1150 us OU >= 1850 us |
| + | // est considérée comme ayant atteint l'amplitude maximale de l'entrée (de la manette de contrôle) |
| + | |
| + | |
| + | void setup() |
| + | { |
| + | pinMode(LED_PIN, OUTPUT); |
| + | |
| + | // Décommenter une ou deux ligne pour corriger la direction du moteur (si nécessaire) |
| + | //motors.flipLeftMotor(true); |
| + | //motors.flipRightMotor(true); |
| + | } |
| + | |
| + | void loop() |
| + | { |
| + | // accélération : Attend que l'entrée passe à HIGH puis démarre le compteur de temps. |
| + | // le comtpeur de temps est stoppé dès que le signal passe à LOW |
| + | int throttle = pulseIn(THROTTLE_PIN, HIGH); |
| + | // direction |
| + | int steering = pulseIn(STEERING_PIN, HIGH); |
| + | |
| + | int left_speed, right_speed; |
| + | |
| + | if (throttle > 0 && steering > 0) |
| + | { |
| + | // Les deux signaux RC sont correctes; allumer la LED |
| + | digitalWrite(LED_PIN, HIGH); |
| + | |
| + | // Le signal RC encode l'information sur un signal ayant une largeur d'impulsion "centrale" de 1500 us (microseconds); |
| + | // Soustraire 1500 pour obtenir une valeur centrée sur 0 |
| + | throttle -= 1500; |
| + | steering -= 1500; |
| + | |
| + | // Appliquer la zone morte (deadband) où toute variation du signal est ignoré |
| + | if (abs(throttle) <= PULSE_WIDTH_DEADBAND) |
| + | throttle = 0; |
| + | if (abs(steering) <= PULSE_WIDTH_DEADBAND) |
| + | steering = 0; |
| + | |
| + | // Combiner les valeurs d'accélération (throttle) et de direction (steering) pour |
| + | // obtenir la vitesse du moteur gauche et du moteur droit |
| + | left_speed = ((long)throttle * MAX_SPEED / PULSE_WIDTH_RANGE) - ((long)steering * MAX_SPEED / PULSE_WIDTH_RANGE); |
| + | right_speed = ((long)throttle * MAX_SPEED / PULSE_WIDTH_RANGE) + ((long)steering * MAX_SPEED / PULSE_WIDTH_RANGE); |
| + | |
| + | // Limiter les vitesses (borner) à des vitesses max |
| + | left_speed = min(max(left_speed, -MAX_SPEED), MAX_SPEED); |
| + | right_speed = min(max(right_speed, -MAX_SPEED), MAX_SPEED); |
| + | } |
| + | else |
| + | { |
| + | // Au moins un des signaux RC n'est pas correct; Eteindre la la LED et stopper les moteurs |
| + | digitalWrite(LED_PIN, LOW); |
| + | |
| + | left_speed = 0; |
| + | right_speed = 0; |
| + | } |
| + | |
| + | // Appliquer les vitesses sur les moteurs |
| + | ZumoMotors::setSpeeds(left_speed, right_speed); |
| + | } |
| + | </syntaxhighlight> |
| | | |
| {{Pololu-Zumo-Shield-Arduino-TRAILER}} | | {{Pololu-Zumo-Shield-Arduino-TRAILER}} |