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 |
| + | |
| + | <syntaxhighlight lang="c"> |
| + | #include <ZumoMotors.h> |
| + | |
| + | #define THROTTLE_PIN 4 // throttle channel from RC receiver |
| + | #define STEERING_PIN 5 // steering channel from RC receiver |
| + | #define LED_PIN 13 // user LED pin |
| + | |
| + | #define MAX_SPEED 400 // max motor speed |
| + | #define PULSE_WIDTH_DEADBAND 25 // pulse width difference from 1500 us (microseconds) to ignore (to compensate for control centering offset) |
| + | #define PULSE_WIDTH_RANGE 350 // pulse width difference from 1500 us to be treated as full scale input (for example, a value of 350 means |
| + | // any pulse width <= 1150 us or >= 1850 us is considered full scale) |
| + | |
| + | |
| + | void setup() |
| + | { |
| + | pinMode(LED_PIN, OUTPUT); |
| + | |
| + | // uncomment one or both of the following lines if your motors' directions need to be flipped |
| + | //motors.flipLeftMotor(true); |
| + | //motors.flipRightMotor(true); |
| + | } |
| + | |
| + | void loop() |
| + | { |
| + | int throttle = pulseIn(THROTTLE_PIN, HIGH); |
| + | int steering = pulseIn(STEERING_PIN, HIGH); |
| + | |
| + | int left_speed, right_speed; |
| + | |
| + | if (throttle > 0 && steering > 0) |
| + | { |
| + | // both RC signals are good; turn on LED |
| + | digitalWrite(LED_PIN, HIGH); |
| + | |
| + | // RC signals encode information in pulse width centered on 1500 us (microseconds); subtract 1500 to get a value centered on 0 |
| + | throttle -= 1500; |
| + | steering -= 1500; |
| + | |
| + | // apply deadband |
| + | if (abs(throttle) <= PULSE_WIDTH_DEADBAND) |
| + | throttle = 0; |
| + | if (abs(steering) <= PULSE_WIDTH_DEADBAND) |
| + | steering = 0; |
| + | |
| + | // mix throttle and steering inputs to obtain left & right motor speeds |
| + | 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); |
| + | |
| + | // cap speeds to max |
| + | left_speed = min(max(left_speed, -MAX_SPEED), MAX_SPEED); |
| + | right_speed = min(max(right_speed, -MAX_SPEED), MAX_SPEED); |
| + | } |
| + | else |
| + | { |
| + | // at least one RC signal is not good; turn off LED and stop motors |
| + | digitalWrite(LED_PIN, LOW); |
| + | |
| + | left_speed = 0; |
| + | right_speed = 0; |
| + | } |
| + | |
| + | ZumoMotors::setSpeeds(left_speed, right_speed); |
| + | } |
| + | </syntaxhighlight> |
| | | |
| {{Pololu-Zumo-Shield-Arduino-TRAILER}} | | {{Pololu-Zumo-Shield-Arduino-TRAILER}} |