#include <IRremote.h>
#include <Servo.h>
//Servomoteur
// Créer un objet pour contrôler un servomoteur
Servo myservo;
//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;
//mode d'execution
const int MODE_AUTO = 0;
const int MODE_MANUEL = 1;
int mode = MODE_MANUEL;
const int MODE_STOP = 10;
const int MODE_AVANCE = 11;
const int MODE_RECULE = 12;
const int MODE_AV_RAPIDE = 13;
const int MODE_AR_RAPIDE = 14;
const int MODE_DROITE = 15;
const int MODE_GAUCHE = 16;
const int MODE_AV_DROITE = 17;
const int MODE_AV_GAUCHE = 18;
const int MODE_AR_DROITE = 19;
const int MODE_AR_GAUCHE = 20;
const int MODE_LED = 21;
int sous_mode_manuel = MODE_STOP;
void setup()
{
// configure les broches de commande du moteur en sortie
pinMode(vitesse1,OUTPUT);
pinMode(vitesse2,OUTPUT);
pinMode(direction1,OUTPUT);
pinMode(direction2,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()
{
int led_on =false;
// Signal IR reçu
if (irrecv.decode(&results))
{
// changement de mode par le bouton rouge de la télécommande (POWER)
//automatique ou manuel
if(results.value==16580863)
{
if (mode == MODE_AUTO)
mode = MODE_MANUEL;
else
mode = MODE_AUTO;
}
else if(mode == MODE_MANUEL)
{
if(results.value==16597183) // Stop (FUNC / STOP) bouton de la télécommande
sous_mode_manuel = MODE_STOP;
else if(results.value==16613503) // (VOL +) bouton de la télécommande faire avancer le robot
sous_mode_manuel = MODE_AVANCE;
else if(results.value==16617583) // (VOL-) bouton de la télécommande faire reculer le robot
sous_mode_manuel = MODE_RECULE;
else if(results.value==16589023) // rotation gauche (<<) touche recule rapide de la télécommande
sous_mode_manuel = MODE_GAUCHE;
else if(results.value==16605343) // rotation droite (>>) bouton avance rapide la télécommande
sous_mode_manuel = MODE_DROITE;
else if(results.value==16609423) // avant droite avec la touche ( ST/REPT ) de la télécommande
sous_mode_manuel = MODE_AV_DROITE;
else if(results.value==16621663) // avant gauche (playe) bouton de la télécommande
sous_mode_manuel = MODE_AV_GAUCHE;
else if(results.value==16601263) // inverse à droite (HAUT) bouton de la télécommande
sous_mode_manuel = MODE_AR_DROITE;
else if(results.value==16584943) // inverse à gauche (BAS) bonton de la télécommande
sous_mode_manuel = MODE_AR_GAUCHE;
else if(results.value==16625743) //Allume la LED bleu avec la touche ( EQ ) de la télécommande
sous_mode_manuel = MODE_LED;
if(results.value==16593103) // Arrêt de la LED bleu avec la touche ( 0 ) de la télécommande
{
digitalWrite(LEDBLEU,LOW);
}
}
// 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(750);
}
// mode automatique
if(mode == MODE_AUTO)
{
// 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,true); //J'avance tout droit
moteur2(180,false); //J'avance tout droit
}
else
{
moteur1(180,true); //J'avance tout droit
moteur2(180,false); //J'avance tout droit
}
}
else // Mode Manuel controle le robot avec la télécommande
{
Serial.println(results.value, DEC);
switch (sous_mode_manuel)
{
case MODE_LED: //Allume la LED bleu avec la touche ( EQ ) de la télécommande
if (led_on)
{
digitalWrite(LEDBLEU,LOW);
led_on = false;
}
else
{
digitalWrite(LEDBLEU,HIGH);
led_on = true;
}
break;
case MODE_STOP: // Stop (FUNC / STOP) bouton de la télécommande
digitalWrite(vitesse2,LOW); // roue droite a l'arrêt
digitalWrite(vitesse1,LOW); // roue gauche a l'arrêt
break;
case MODE_AVANCE:// (VOL +) bouton de la télécommande faire avancer le robot
motor(235,235);
break;
case MODE_RECULE:// (VOL-) bouton de la télécommande faire reculer le robot
motor(-235,-235);
break;
case MODE_DROITE:// rotation droite (>>) bouton avance rapide la télécommande
motor(0,-130);
break;
case MODE_GAUCHE:// rotation droite (>>) bouton avance rapide la télécommande
motor(0,130);
break;
case MODE_AV_DROITE:// avant droite avec la touche ( ST/REPT ) de la télécommande
motor(200,100);
break;
case MODE_AV_GAUCHE:// avant gauche (playe) bouton de la télécommande
motor(100,200);
break;
case MODE_AR_DROITE:// inverse à droite (HAUT) bouton de la télécommande
motor(-235,-235);
break;
case MODE_AR_GAUCHE:// inverse à gauche (BAS) bonton de la télécommande
motor(235,235);
break;
}
}
}
//Fonctions
//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);
}
}
// 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
{
digitalWrite(direction1,HIGH); // direction roue gauche avant
analogWrite(vitesse1,left); // vitesse de la roue gauche
}
//inverser la roue gauche
else if(left<0)
{
digitalWrite(direction1,LOW); // inverse à gauche en direction
analogWrite(vitesse1,-left); // vitesse de la roue gauche
}
else // roue gauche a l'arrêt
{
digitalWrite(vitesse1,LOW);
}
if(right>0) // roue droite avant
{
// direction de la roue droite avant
digitalWrite(direction2,LOW);
analogWrite(vitesse2,right);
}
else if(right<0) // roue droite en arrière
{
// inverse à droite en direction
digitalWrite(direction2,HIGH);
analogWrite(vitesse2,-right);
}
else // roue droite a l'arrêt
{
// roue droite a l'arrêt
digitalWrite(vitesse2,LOW);
}
}
// SEB03000
Aucun commentaire:
Enregistrer un commentaire