Aller au contenu


Photo
- - - - -

Robot autonome

Robot autonome

  • Veuillez vous connecter pour répondre
21 réponses à ce sujet

#21 R1D1

R1D1

    Modérateur et Membre passionné

  • Modérateur
  • PipPipPipPipPip
  • 1 211 messages
  • Gender:Male
  • Location:Autriche

Posté 12 mai 2017 - 04:07

Et faire des fonctions aussi :)
En gros, à chaque fois que tu copies-colles du code, regarde quelle est la différence (par exemple, quand tu commandes ta LED, tu appliques toujours les 3 mêmes instructions, avec des valeurs différentes). Ce qui est en commun peut former le corps d'une fonction, ce qui change devient un argument de la fonction.
Exemple avec la LED :

        digitalWrite(led,HIGH);        // Led White
        digitalWrite(led2,HIGH);
        digitalWrite(led3,HIGH);
#define ROUGE B110
#define BLEU B011
#define BLANC B000
#define ETEINT B111

void allumerLED(int couleur)
{
        digitalWrite(led, couleur & B001);        // Led rouge
        digitalWrite(led2, couleur & B010);
        digitalWrite(led3, couleur & B100);
}
"couleur & B001" permet de faire un masque binaire (opération AND). En gros, selon la valeur de couleur, tu vas renvoyer HIGH ou LOW sur le pin correspondant.
Tu as juste à faire allumerLED(ROUGE); dans ton code, ce qui est plus pratique que de tout réécrire (et se tromper éventuellement). Il faut probablement adapter mon exemple à ton setup (j'ai supposé que tu commandais ta LED en BGR, mais ça dépend de comment elle est connectée à l'Arduino).
Pour compléter Ulysse, je dirais même que tu peux virer complètement tes boucles for (avec des conditions bien écrites). Dans un premier temps, pour n'en garder qu'une, l'indice est :
pos -= 2 équivalent à pos += -2
Bon courage :)
R1D1 - Calculo Sed Ergo Sum -- en ce moment, M.A.R.C.E.L.
Avatar tiré du site bottlebot

#22 Roms

Roms

    Membre

  • Membres
  • 12 messages
  • Gender:Male
  • Location:France, Bourgogne

Posté 13 mai 2017 - 02:33

Merci pour tous vos conseils et je pense avoir compris  :yahoo:  mais le cerveau a chauffé  :crazy:

#include<Servo.h>
Servo myservo;
long duration;
long distance;
int pos;

#define trigPin 13
#define echoPin 12
#define led A5
#define led2 A4
#define led3 A3
#define ROUGE B110    // définition du code couleur rouge
#define BLEU B011     // définition du code couleur bleu
#define BLANC B000    // définition du code couleur blanc
#define ETEINT B111   // définition du code couleur pour éteindre les leds

void allumerLED(int couleur){
        digitalWrite(led, couleur & B001);        // Association du code couleur avec les pins de sortie des leds
        digitalWrite(led2, couleur & B010);
        digitalWrite(led3, couleur & B100);
}

void capteurULT(){
        digitalWrite(trigPin, LOW);               //  Vérification de la présence d'un obstacle
        delayMicroseconds(2); 
        digitalWrite(trigPin, HIGH);
        delayMicroseconds(10); 
        digitalWrite(trigPin, LOW);
        duration = pulseIn(echoPin, HIGH);
        distance = (duration/2) / 29.1;
}

void setup(){   
  myservo.attach(3);          // Servomoteur surla broche 3
  pinMode(trigPin, OUTPUT);   // trigPin est une sortie
  pinMode(echoPin, INPUT);    // echoPin est une sortie
  pinMode(led, OUTPUT);       // led est une sortie 
  pinMode(led2, OUTPUT);      // led2 est une sortie
  pinMode(led3, OUTPUT);      // led3 est une sortie
  digitalWrite(led,HIGH);     // A5 au niveau haut   
  digitalWrite(led2,HIGH);    // A4 au niveau haut
  digitalWrite(led3,HIGH);    // A3 au niveau haut
}

void loop(){

  int x = 2;
  for (int pos = 20; pos > 19; pos = pos + x){  // Incrémentation et décrementation
  if (pos == 160) x = -2;                       // entre 20 et 160 avec un pas = 2
  delay(10);
    
  myservo.write(pos);               // Action du servomoteur
  delay(10);                       
  capteurULT();                     // Détection d'obstacle
         
        if (distance < 25) {        // Limite détection obstacle 25 cm ;
         
          if ( pos <= 110) {        // Limite pour l'affichage BLANC
             
              if ( pos <= 70) {     // Limite pour l'affichage BLEU 
              allumerLED(ROUGE);    // Affichage ROUGE entre 70 et 110
              delay(10);}   
              else {
              allumerLED(BLEU);
              delay(10);}}
         
          else {
          allumerLED(BLANC);
          delay(10);}}
       
        else {
        allumerLED(ETEINT);
        delay(10);}}
 
 }

Peut-on se servir de ce programme pour faire un robot suiveur ? 

 

Au lieu d'allumer des leds on actionne des moteurs et un autre servomoteur pour la direction du robot type voiture.







0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users