Bon voilà j'ai avancé dans mon code , je peux maintenant contrôler mon robot avec ma télécommande.
Après plusieurs heures de programmation et d’acharnement, j'ai enfin réussi.
Bon ça demande quelque réglage dans le code pour le mode automatique , car ça donne des gros a coûts , comme si quelque
chose l’empêché d'avancer aux démarrages.
Sinon ya le mode manuel pour piloter le robot avec la télécommande.
Ou
le mode automatique du robot , pour qu'il puisse circuler tout seul.
Matériel mis sur le robot:
1 Capteur de Distance infrarouge IR Sharp GP2Y0A02YK0F
1 Capteur de distance infrarouge Sharp GP2Y0A21
1 capteur de niveau gris
2 motoreducteur
1 servomoteur
1 carte DFRduino Duemilanove 328
1 carte Arduino Motor Bouclier (L293) (SKU: DRI0001) Module contrôleur de moteurs (2x1A)
1 ventilo gamer
1 LED bleu
1 LED rouge
1 télécommande infrarouge
1 batterie de 9V6
voici le code:
//déclare #include <IRremote.h> #include <Servo.h> //Servomoteur // Créer un objet pour contrôler un servomoteur Servo myservo; //capteur gris qui fera office de phare a l'avans du robot int gris = 2; // broche analogique utilisé pour capteur gris //Capteur de Distance infrarouge IR Sharp GP2Y0A02YK0F int capteur = 0; //Capteur de distance infrarouge Sharp GP2Y0A21 int capteur2 = 1; // Variable pour lire la valeur du capteur de la broche analogique int val; // Variable pour lire la valeur du capteur2 de la broche analogique int val2; //LED bleu int LEDBLEU = 2; //Motoreducteur const int vitesse1=6; const int vitesse2=5; const int direction1=7; const int direction2=4; // IR PIN module récepteur et variable int RECV_PIN = 11; IRrecv irrecv(RECV_PIN); decode_results results; //motoréducteur pour le mode déplacement automatique void Moteur1(int valeur_vitesse, boolean sens_avant) { analogWrite(vitesse1,valeur_vitesse); //Valeur_vitesse = 0 à l'arrêt, et 255 pour vitesse maximum if(sens_avant) { digitalWrite(direction1,HIGH); } else { digitalWrite(direction1,LOW); } } void Moteur2(int valeur_vitesse, boolean sens_avant) { analogWrite(vitesse2,valeur_vitesse); //Valeur_vitesse = 0 à l'arrêt, et 255 pour vitesse maximum if(sens_avant) { digitalWrite(direction2,HIGH); } else { digitalWrite(direction2,LOW); } } void setup() { // configure les broches de commande du moteur en sortie pinMode(vitesse1,OUTPUT); pinMode(vitesse2,OUTPUT); pinMode(direction1,OUTPUT); pinMode(direction2,OUTPUT); //capteur gris office de phare pinMode(gris,OUTPUT); //LEDBLEU broche en mode sortie pinMode(LEDBLEU,OUTPUT); // Attache le servo sur la broche 3 à l'objet servo myservo.attach(3); int i; for(i=4;i<=8;i++) pinMode(i,OUTPUT); //Met les pin 4,5,6,7 en mode sortie Serial.begin(9600); // désactiver les moteur par défaut digitalWrite(vitesse2,LOW); digitalWrite(vitesse1,LOW); // début de récepteur IR irrecv.enableIRIn(); } void loop() { //Mode automatique pour le controle , avec la télécommande. // mode automatique (POWER) bouton rouge de la télécommande if(results.value==16580863) { // Définit la position d'asservissement en fonction de la valeur à l'échelle myservo.write(val); // L'échelle pour l'utiliser avec le servo (valeur entre 0 et 300) val = analogRead(capteur); val = map(val, 0, 115, 0, 300); // Attend que le servo pour y arriver delay(200); val2 = analogRead(capteur2); val2 = map(val2, 0, 115, 0, 300); // Si on est à moins de quelque cm d'un obstacle pour les deux capteurs if ((val <=95) || (val2 <= 95)) { Moteur1(0,true); //J'arrete le moteur 1 Moteur2(0,true); // J'arrete le moteur 2 delay(200); //J'attend 2 seconde Moteur1(180,true); //J'avance tout droit Moteur2(0,true); // J'arrete le moteur 2 delay(600); //La valeur à mettre reste à définir en fonction de la vitesse du robot Moteur1(180,false); //J'avance tout droit Moteur2(180,true); //J'avance tout droit } else { Moteur1(180,false);//J'avance tout droit Moteur2(180,true); //J'avance tout droit } } // Mode Manuel controle le robot avec la télécommande Serial.println(results.value, DEC); // Signal IR reçu if (irrecv.decode(&results)) { //Allume la LED bleu avec la touche ( EQ ) de la télécommande if(results.value==16625743) { digitalWrite(LEDBLEU,HIGH); } // Arrêt de la LED bleu avec la touche ( ST/REPT ) de la télécommande if(results.value==16609423) { digitalWrite(LEDBLEU,LOW); } // (VOL +) bonton de la télécommande faire avancé le robot if(results.value==16613503) { motor(235,235); } // (VOL-) bonton de la télécommande faire reculé le robot else if(results.value==16617583) { motor(-235,-235); } // rotation gauche (<<) touche recule rapide de la télécommande else if(results.value==16589023) { motor(0,130); } // rotation droite (>>) bontonn avance rapide la télécommande else if(results.value==16605343) { motor(0,-130); } // avant gauche (playe) bouton de la télécommande else if(results.value==16621663) { motor(100,200); } // avant droite (FUNC / STOP) bouton de la télécommande else if(results.value==16597183) { motor(200,100); } // inverse à gauche (BAS) bonton de la télécommande else if(results.value==16584943) { motor(-235,-235); } // inverse à droite (HAUT) bouton de la télécommande else if(results.value==16601263) { motor(235,235); } // recevoir la prochaine valeur irrecv.resume(); // court délai d'attente pour répéter le signal IR // (L'empêcher d'arrêter si aucun signal reçu) delay(100); } // aucun signal IR reçu else { // roue droite a l'arrêt digitalWrite(vitesse2,LOW); // roue gauche a l'arrêt digitalWrite(vitesse1,LOW); } } // fonction pour contrôler le moteur void motor(int left, int right) { // limiter la vitesse max if(left>255)left=255;//gauche else if(left<-255)left=-255;//gauche if(right>255)right=255;//droite else if(right<-255)right=-255;//droite // roue gauche roue avant if(left>0)//gauche a l'arrét { // direction roue gauche avant digitalWrite(direction1,HIGH); // vitesse de la roue gauche analogWrite(vitesse1,left); } //inverser la roue gauche else if(left<0) { // inverse à gauche en direction digitalWrite(direction1,LOW); // vitesse de la roue gauche analogWrite(vitesse1,-left); } // roue gauche a l'arrêt else { digitalWrite(vitesse1,LOW); } // roue droite avant if(right>0) { // direction de la roue droite avant digitalWrite(direction2,LOW); analogWrite(vitesse2,right); } // roue droite en arrière else if(right<0) { // inverse à droite en direction digitalWrite(direction2,HIGH); analogWrite(vitesse2,-right); } // roue droite a l'arrêt else { // roue droite a l'arrêt digitalWrite(vitesse2,LOW); } } // SEB03000