26 novembre 2013

Programme robot Jardise de seb3000

#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