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













