Bonjour à tous, j’ai récemment programmer un petit robot à l’aide d’une carte arduino, d’un shield moteurs officiel, d’un capteur a ultrasons, de deux moteurs etc… J’ai réussi à le rendre totalement autonomes mais j’ai par la suite voulu ajouter un moyen de le commander à l’aide d’une petite radiocommande et d’un récepteurIR. Cependant, j’ai revu mon programme dans tout les sens mais rien à faire, lorsque l’instruction "irrecv.enableIRIn();" apparait dans mon programme, les moteurs refusent de fonctionner (en revanche le reste telles que les leds répondent bien aux différentes instructions). Il me suffit d’enlever cette instruction pour que tout qu’ils acceptent de refonctionner mais bien sur elle m’est nécessaire pour utiliser la radiocommande… Voici mon programme:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 | //Radiocommande: #include <IRremote.h> int RECV_PIN = 10; IRrecv irrecv(RECV_PIN); decode_results results; //Capteur HC-SR04: ( VCC=5v; GND=GND; Echo=7; Trig=6) #define echoPin 7 // Echo Pin #define trigPin 6 // Trigger Pin int maximumRange = 150; // Maximum range needed int minimumRange = 0; // Minimum range needed long duration, distance; // Durée que l'on utilise pour calculer la distance void setup() { //Affichage sur l'ordinateur: Serial.begin(9600); //Radiocommande: irrecv.enableIRIn(); // Active le récepteur IR Bloque le fonctionnement des moteur!!!!!!!!!! //LED: pinMode(2,OUTPUT); //Led rouge qui brillera quand distance <= 15 cm pinMode(4,OUTPUT); //Led verte qui brillera quand ça avance //Capteur HC-SR04: pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); //Moteur A: pinMode(9, OUTPUT); pinMode(12, OUTPUT); //Moteur B: pinMode(13, OUTPUT); pinMode(8, OUTPUT); } void loop() { if (irrecv.decode(&results)) { //Si on appui sur un bouton Serial.println(results.value, HEX); //Affiche la valeur en hexadécimal du bouton pressé if (results.value==0xFFE21D){ //Si le bouton pressé est celui CH+ //Robot mit en fonctionnement automatique //LEDS: digitalWrite(4,HIGH); //LED verte allumée en temps normal digitalWrite(2,LOW); //LED rouge éteinte en temps normal //Motor A: digitalWrite(12, LOW); //Direction (Forward ici) digitalWrite(9, LOW); //Frein (Disengage ici) analogWrite(3, 120); //Valeur pour vitesse //Motor B: digitalWrite(13, LOW); //Direction (Forward ici) digitalWrite(8, LOW); //Frein (Disengage ici) analogWrite(11, 117); //Valeur pour vitesse //Capteur HC-SR04: digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance = duration/58.2; //Calcul de la distance en cm à l'aide de la vitesse du song if (distance >= maximumRange || distance <= minimumRange){ Serial.println("-"); //"-" s'affiche à l'écran de l'ordinateur lorsque le capteur HC-SR04 ne détecte pas la distance ou que celle-ci est hors de l'intervalle de tolérance } else { //La distance est correctement mesurée par le capteur Serial.println(distance); //La distance est affiché en cm à l'écran de l'ordinateur if (distance <=15){ //LEDS: digitalWrite(2,HIGH); //Allume la LED rouge digitalWrite(4,LOW); //Eteint la LED verte //Moteurs qui s'arrêtent (avant de changer le sens de rotation pour ne pas les endommager): digitalWrite(9, HIGH); //Frein du moteur A (engaged ici) digitalWrite(8, HIGH); //Frein du moteur B (engaged ici) delay(350); //Temps d'arrêt //Recul: digitalWrite(12, HIGH); //Direction A (Backward ici) digitalWrite(9, LOW); //Frein A (Disengage ici) analogWrite(3, 100); //Valeur A pour vitesse digitalWrite(13, HIGH); //Direction B (Backward ici) digitalWrite(8, LOW); //Frein B (Disengage ici) analogWrite(11, 100); //Valeur A pour vitesse digitalWrite(2,HIGH); //Allume la LED rouge delay(500); //Temps de recule //Moteurs qui s'arrêtent (avant de changer le sens de rotation pour ne pas les endommager): digitalWrite(9, HIGH); //Frein du moteur A (engaged ici) digitalWrite(8, HIGH); //Frein du moteur B (engaged ici) digitalWrite(2,HIGH); //Allume la LED rouge delay(300); //Temps d'arrêt //Rotation: digitalWrite(12, LOW); //Direction A (Forward ici) digitalWrite(9, LOW); //Frein A (disengage ici) analogWrite(3, 100); //Valeur A pour vitesse digitalWrite(13, HIGH); //Direction B (Forward ici) digitalWrite(8, LOW); //Frein B (disengage ici) analogWrite(11, 100); //Valeur B pour vitesse digitalWrite(2,HIGH); //Allume la LED rouge delay(300); //Temps de la rotation //LEDS: digitalWrite(2,LOW); //Allume la LED rouge digitalWrite(4,HIGH); //Eteint la LED verte } else{ //Dans le cas où la distance mesurée est suffisamment grande pour continuer d'avancer //Ne change pas les instructions intiales données en premier } } delay(70); //Temps avant une nouvelle acquisition de la distance (Une faible valeur permet de meilleur résultats, ie moins d'obstacle pris dans la gueule } if (results.value==0xFFC23D){ //Si la touche play/stop est pressée //Robot en stand-by: //LEDS: digitalWrite(4,LOW); //LED verte éteinte digitalWrite(2,HIGH); //LED rouge allumé //Freins activés: digitalWrite(9, HIGH); //Frein A (Engaged ici) digitalWrite(8, HIGH); //Frein B (Engaged ici) } if (results.value==0xFFA25D){ //Si la touche CH- est pressée //Robot en mode manuel: //LEDS: digitalWrite(4,HIGH); //LED verte allumée en temps normal digitalWrite(2,LOW); //LED rouge éteinte en temps normal //Freins activés: digitalWrite(9, HIGH); //Frein A (Engaged ici) digitalWrite(8, HIGH); //Frein B (Engaged ici) //Commandes permmettant le pilotage: if (results.value==0xFF18E7){ //Si la touche 2 est pressée //Marche avant: digitalWrite(9, HIGH); //Frein A (Engaged ici) digitalWrite(8, HIGH); //Frein B (Engaged ici) delay(400); //Temps d'arrêt pour les moteurs digitalWrite(12, LOW); //Direction A (Forward ici) digitalWrite(9, LOW); //Frein A (Disengage ici) analogWrite(3, 120); //Valeur A pour vitesse digitalWrite(13, LOW); //Direction A (Forward ici) digitalWrite(8, LOW); //Frein A (Disengage ici) analogWrite(11, 117); //Valeur A pour vitesse } if (results.value==0xFF38C7){ //Si la touche 5 est pressée //Marche arrière: digitalWrite(9, HIGH); //Frein A (Engaged ici) digitalWrite(8, HIGH); //Frein B (Engaged ici) delay(400); //Temps d'arrêt pour les moteurs digitalWrite(12, HIGH); //Direction A (Backward ici) digitalWrite(9, LOW); //Frein A (Disengage ici) analogWrite(3, 120); //Valeur A pour vitesse digitalWrite(13, HIGH); //Direction B (Backward ici) digitalWrite(8, LOW); //Frein B (Disengage ici) analogWrite(11, 117); //Valeur B pour vitesse } if (results.value==0xFF10EF){ //Si la touche 4 est pressée //Virage à gauche: digitalWrite(9, HIGH); //Frein A (Engaged ici) digitalWrite(8, HIGH); //Frein B (Engaged ici) delay(400); //Temps d'arrêt pour les moteurs digitalWrite(12, LOW); //Direction A (Forward ici) digitalWrite(9, LOW); //Frein A (Disengage ici) analogWrite(3, 120); //Valeur A pour vitesse digitalWrite(13, HIGH); //Direction B (Backward ici) digitalWrite(8, LOW); //Frein B (Disengage ici) analogWrite(11, 117); //Valeur B pour vitesse } if (results.value==0xFF5AA5){ //Si la touche 6 est pressée //Virage à droite: digitalWrite(9, HIGH); //Frein A (Engaged ici) digitalWrite(8, HIGH); //Frein B (Engaged ici) delay(400); //Temps d'arrêt pour les moteurs digitalWrite(12, HIGH); //Direction A (Backward ici) digitalWrite(9, LOW); //Frein A (Disengage ici) analogWrite(3, 120); //Valeur A pour vitesse digitalWrite(13, LOW); //Direction B (Forward ici) digitalWrite(8, LOW); //Frein B (Disengage ici) analogWrite(11, 117); //Valeur B pour vitesse } } irrecv.resume(); // Receive the next value } } |
D’avance merci pour votre aide!