mardi 10 mars 2015

Programation

Bonjour à tous,
Aujourd'hui c'est l'étape finale, la programmation !
Bon voici le code simple :

/*
Capteur de distance à ultrasons HC-SR04 avec Arduino Uno
 TipTopBoards.com  06 01 2014  Rolland
 Cabler +5V et GND du détecteur sur l'arduino
 Trig -> pin 13
 Echo -> pin 12
 moteurDroit + 470R  -> pin 10
 Le robot tourne selon la distance trop près / trop loin
 */

#define trigPin 13 //Trig Ultrasons (sortie)
#define echoPin 12 //Echo Ultrasons (entrée)
#define moteurDroit 6 // moteurDroit
#define moteurGauche 5 // moteurGauche

void setup()
{
  Serial.begin (9600);
  pinMode(trigPin, OUTPUT);  //Trig est une sortie
  pinMode(echoPin, INPUT);   //Echo est le retour, en entrée
  pinMode(moteurDroit, OUTPUT);
}

void loop()
{
  long duration, distance;
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10); //Trig déclenché 10ms sur HIGH
  digitalWrite(trigPin, LOW);

  // Calcul de l'écho
  duration = pulseIn(echoPin, HIGH);
  // Distance proportionnelle à la durée de sortie
  distance = duration*340/(2*10000);  //Vitesse du son théorique

  if (distance < 35)
  {// Distance trop près
    digitalWrite(moteurDroit,LOW); //moteur gauche activé seulement
   
    digitalWrite(moteurGauche,HIGH); // moteur Gauche tourne
  }
  else
  {//Trop loin
    digitalWrite(moteurDroit,HIGH);
    delay(100);
    digitalWrite(moteurGauche,HIGH);
  }
  delay(100);  //0.1 sec entre deux mesures
}





Et voici un code un peut plus poussé :


/* Utilisation du capteur Ultrason HC-SR04 */

// définition des broches utilisées
int trig = 13;
int echo = 12;
long lecture_echo;
long cm;
int val;
int vitesse_u;
int vitesse_lente_u;

#define vitesse  200
#define dure_virage 800
#define vitesse_lente  80

int etat;
unsigned long temps;

int EN1 = 6;
int EN2 = 5;  //Roboduino Motor shield uses Pin 9
int IN1 = 7;
int IN2 = 4; //Latest version use pin 4 instead of pin 8
 
void MotorD(int pwm, boolean reverse)
        {
          analogWrite(EN1,pwm); //set pwm control, 0 for stop, and 255 for maximum speed
         if(!reverse)
         {
          digitalWrite(IN1,HIGH);  
         }
        else
        {
          digitalWrite(IN1,LOW);  
         }
        }
       
void MotorG(int pwm, boolean reverse)
        {
          analogWrite(EN2,pwm);
         if(!reverse)
         {
          digitalWrite(IN2,HIGH);  
         }
        else
        {
          digitalWrite(IN2,LOW);  
         }
        }

void setup()
{
  pinMode(trig, OUTPUT);
  digitalWrite(trig, LOW);
  pinMode(echo, INPUT);
  Serial.begin(9600);
  etat = 0;
  temps = millis();
  vitesse_lente_u = vitesse_lente;
  vitesse_u = vitesse;
  delay(8000);  //delai avant mise en route des moteurs
}

void loop()
{
  // mesure de distance
  digitalWrite(trig, HIGH);
  delayMicroseconds(10);
  digitalWrite(trig, LOW);
  lecture_echo = pulseIn(echo, HIGH);
  cm = lecture_echo / 58;
  Serial.print("Distancem : ");
  Serial.println(cm);
 
  if (etat ==0)  //virage gauche
  {
    MotorD(vitesse_u,true);
    MotorG(vitesse_lente_u,true);
    if ((temps + dure_virage) < millis())
    {
      etat = 1;
      temps = millis();
    }
  }
  else if(etat ==1)  //virage droite
  {
    MotorD(vitesse_lente_u,true);
    MotorG(vitesse_u,true);
    if ((temps + dure_virage) < millis())
    {
      etat = 0;
      temps = millis();
    }
  }
 
  if (cm < 30)  //detection murale
  {
    if(etat ==1)//si mur pendant virage droite on tourne a gauche
    {
      MotorD(vitesse_u,true);
      MotorG(vitesse_u,false);
      delay(3000);
    }
    else if(etat ==0) //si mur pendant virage gauche on tourne a droite
    {
      MotorD(vitesse_u,false);
      MotorG(vitesse_u,true);
      delay(3000);
    }
  }
 val = Serial.read();  //reception de commande
if(val!=-1)
   {
      switch(val)
       {
         case 's'://arret
             vitesse_lente_u = 0;
             vitesse_u = 0;
           break;
         case 'r'://redemarre        
             vitesse_lente_u = vitesse_lente;
             vitesse_u = vitesse;
           break;
       }
   }
}

Aucun commentaire:

Enregistrer un commentaire