Il y a peu de commentaires à faire car la plupart du code est constitué de variables et de directives nécessaires au bon fonctionnement des trois modules de la voiture (IR, moteurs et buzzer). Les toucher pourrait entraîner un fonctionnement chaotique de la voiture.
Mais vous pouvez ajouter d'autres fonctions et modules, (lumières, détecteur d'obstacles, pour ne citer que quelques exemples). Le "cœur" du programme est le "switch-case" suivant.
switch(IR.keycode)
{
case KEY_ZERO: bt_command = '0';break;
case KEY_ONE: bt_command = '1';break;
case KEY_TWO: bt_command = '2';break;
case KEY_THREE: bt_command = '3';break;
case KEY_FOUR: bt_command = '4';break;
case KEY_FIVE: bt_command = '5';break;
case KEY_SIX: bt_command = '6';break;
case KEY_SEVEN: bt_command = '7';break;
case KEY_EIGHT: bt_command = '8';break;
case KEY_NINE: bt_command = '9';break;
case KEY_PLUS: bt_command = CMD_FORWARD;break;
case KEY_MINUS: bt_command = CMD_BACKWARD;break;
case KEY_PREV: bt_command = CMD_LEFT_FRONT;break;
case KEY_NEXT: bt_command = CMD_RIGHT_FRONT;break;
case KEY_PLAY: bt_command = CMD_STOP;break;
default: break;
}
C'est lui qui décode la touche pressée sur la télécommande et l'assigne à la variable "bt_command". Comme nous allons le voir ci-dessous, les touches de 0 à 9 sont libres, les 5 autres étant utilisées pour commander les moteurs, avant, arrière, direction et arrêt. Rien ne doit être touché ici, nous le ferons plus tard. Une fois le décodage terminé, la fonction qui exécute l'action correspondante est appelée en lui passant la valeur contenue dans "bt_command" :
controlCar(bt_command);
C'est dans cette fonction " void controlCar(uint8_t cmd) " que nous devons ajouter les nouvelles actions à effectuer lorsque nous appuyons sur les touches de 0 à 9. Comme vous pouvez le voir, il n'a actuellement que les " case " définis dans le "if" ci-dessus pour les mouvements du moteur. Ici, nous créons les nouveaux appels de fonction à effectuer et nous créons ces fonctions à la fin de tout le code que vous avez maintenant, et tout ressemblera à ça :
/*
Programme 4WD Smart Car 02
Attention avec String.h qui m'a posé des soucis.
Avec une version récante de l'ide ça marche mais pas avec une encienne version
*/
#include <String.h>
#include "MotorDriver.h"
#include <IRremote.h>
#include <OS_Buzzer.h>
#define BUZZER_PIN A0 //buzzer connecté sur A0 de l'Arduino
Buzzer buzzer(BUZZER_PIN);
#define CTRL_INVALID 0XFF
#define CMD_FORWARD 'F'
#define CMD_RIGHT_FRONT 'R'
#define CMD_BACKWARD 'B'
#define CMD_LEFT_FRONT 'L'
#define CMD_STOP 'S'
#define RECV_PIN 2
IRrecv IR(RECV_PIN);
#define SPEED_STEPS 20
uint8_t speed0 = 100;
void setup() {
motordriver.init();
motordriver.setSpeed(100, MOTORA);
motordriver.setSpeed(100, MOTORB);
IR.enableIRIn(); // Démarage réception
}
uint8_t bt_command;
#define CAR_STOP 0
#define CAR_FORWARD 1
#define CAR_BACK 2
uint8_t car_status = CAR_STOP;
uint8_t new_status = car_status;
void loop() {
if (IR.decode()) {//Si decode est valide
if (IR.isReleased()) //
{
buzzer.on();//chaque fois que vous appuyez sur la touche, le buzzer émet un bip
delay(100); //durée du bip 100ms
switch (IR.keycode)
{
case KEY_ZERO: bt_command = '0'; break;
case KEY_ONE: bt_command = '1'; break;
case KEY_TWO: bt_command = '2'; break;
case KEY_THREE: bt_command = '3'; break;
case KEY_FOUR: bt_command = '4'; break;
case KEY_FIVE: bt_command = '5'; break;
case KEY_SIX: bt_command = '6'; break;
case KEY_SEVEN: bt_command = '7'; break;
case KEY_EIGHT: bt_command = '8'; break;
case KEY_NINE: bt_command = '9'; break;
case KEY_PLUS: bt_command = CMD_FORWARD; break;
case KEY_MINUS: bt_command = CMD_BACKWARD; break;
case KEY_PREV: bt_command = CMD_LEFT_FRONT; break;
case KEY_NEXT: bt_command = CMD_RIGHT_FRONT; break;
case KEY_PLAY: bt_command = CMD_STOP; break;
default: break;
}
buzzer.off(); //coupe le buzzer
}
IR.resume(); // Recevoir la valeur suivante
}
controlCar(bt_command);
bt_command = 0XFF;
}
void controlCar(uint8_t cmd) {
switch (cmd)
{
case '0': Cle_0 (); break;
case '1': Cle_1 (); break;
case '2': Cle_2 (); break;
case '3': Cle_3 (); break;
case '4': Cle_4 (); break;
case '5': Cle_5 (); break;
case '6': Cle_6 (); break;
case '7': Cle_7 (); break;
case '8': Cle_8 (); break;
case '9': Cle_9 (); break;
case CMD_FORWARD: new_status = CAR_FORWARD; break;
case CMD_RIGHT_FRONT:
if (car_status != CAR_STOP)new_status = CAR_FORWARD;
motordriver.goRight();
delay(600); /*valeur d'origine 200 trop faible
en angmentant, l'angle du virage est plus grand*/
break;
case CMD_BACKWARD: new_status = CAR_BACK; break;
case CMD_LEFT_FRONT:
if (car_status != CAR_STOP)new_status = CAR_FORWARD;
motordriver.goLeft();
delay(600);/*valeur d'origine 200 trop faible
en angmentant, l'angle du virage est plus grand*/
break;
case CMD_STOP: new_status = CAR_STOP; break;
default: break;
}
switch (new_status)
{
case CAR_STOP: motordriver.stop(); break;
case CAR_FORWARD: motordriver.goForward(); break;
case CAR_BACK: motordriver.goBackward(); break;
default: break;
}
car_status = new_status;
if ((cmd >= '0') && (cmd <= '9'))
{
speed0 = cmd - 0x30;
speed0 = map(speed0, 0, 9, 0, 255);
motordriver.setSpeed(speed0, MOTORA);
motordriver.setSpeed(speed0, MOTORB);
}
}
void speedUp() {
if (speed0 < 236)speed0 += SPEED_STEPS;
else speed0 = 255;
motordriver.setSpeed(speed0, MOTORA);
motordriver.setSpeed(speed0, MOTORB);
}
void speedDown() {
if (speed0 > 70)speed0 -= SPEED_STEPS;
else speed0 = 50;
motordriver.setSpeed(speed0, MOTORA);
motordriver.setSpeed(speed0, MOTORB);
}
void Cle_0 (){
// ici nous définissons les actions à effectuer lorsque la touche 0 est pressée
}
void Cle_1 (){
// ici nous définissons les actions à effectuer lorsque la touche 1 est pressée
}
void Cle_2 (){
// ici nous définissons les actions à effectuer lorsque la touche 2 est pressée
}
void Cle_3 (){
// ici nous définissons les actions à effectuer lorsque la touche 3 est pressée
}
void Cle_4 (){
// ici nous définissons les actions à effectuer lorsque la touche 4 est pressée
}
void Cle_5 (){
// ici nous définissons les actions à effectuer lorsque la touche 5 est pressée
}
void Cle_6 (){
// ici nous définissons les actions à effectuer lorsque la touche 6 est pressée
}
void Cle_7 (){
// ici nous définissons les actions à effectuer lorsque la touche 7 est pressée
}
void Cle_8 (){
// ici nous définissons les actions à effectuer lorsque la touche 8 est pressée
}
void Cle_9 (){
// ici nous définissons les actions à effectuer lorsque la touche 9 est pressée
}
Bien sûr, il existe d'autres moyens, mais à mon avis c'est le plus confortable.
Salutations.
Edité le code : dans les noms et les appels aux nouvelles fonctions, il y avait un accent et cela donnait une erreur lors de la compilation.