Go Down

Topic: Ajout d'un deuxieme hr-sc04 pour plus de précsion de on ti robot (Read 204 times) previous topic - next topic

matrixfromspace

Salut a tous voila voila justilise ce code
Code: [Select]
// variable hc sr04
const int trigPin = 6;
const int echoPin =7;
// variable moteur droit
const int vitesseMotD=3;
const int sensMotD=12;
const int freinMotD=9;
const int intensiteMotD = A0;
// variable moteur gauche
const int vitesseMotG=11;
const int sensMotG=13;
const int freinMotG=8;
const int intensiteMotG = A1;
// variable pour rotation
int a=0;
int sens = random(0,2);
// variable temps pour analyse blocage
int time2 =0;

void setup() {
  Serial.begin (115200);
  // initialisation HC SR04
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  // intialisation moteur droit
  pinMode (vitesseMotD,OUTPUT);
  pinMode (freinMotD,OUTPUT);
  pinMode (sensMotD,OUTPUT);
  // initialisation moteur gauche
  pinMode (vitesseMotG,OUTPUT);
  pinMode (freinMotG,OUTPUT);
  pinMode (sensMotG,OUTPUT);
  // conditions initiales : moteurs a l arret
  stopMot(); 
}

void loop() {
  long time = millis();
  Serial.print("temps ecoule :");
  Serial.println(time);
  long duration, distance;
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = (duration/2) / 29.1;
  if (distance < 20) {
    //Serial.println("Mur detecte");
    stopMot();
    delay(100); // 5 secondes temps arbitraire
    rotation();
    delay(300);

}
  else {
   
    //Serial.println("aucun mur detecte");
    if (analogRead(intensiteMotD)>155 || analogRead(intensiteMotG)>155){
      Serial.println("Moteur bloque!");
      reculer();
      delay(500);
      rotation();
      delay(500);
    }
    else if (time2>2000 && (analogRead(intensiteMotD)>130 || analogRead(intensiteMotG)>130)){
        reculer();
        delay(500);
        rotation();
        delay(500);
        time2 = 0;
    }
    else if  (analogRead(intensiteMotD)>130 || analogRead(intensiteMotG)>130){
      time2= millis();// temps pour analyse blocage
    }
    else {
      avancer();
     
  }
   
 }
 
  if (distance >= 30000 || distance <= 0){
    //Serial.println("Out of range");
    stopMot();
  }
  else {
   // Serial.print("Distance: [");
    //Serial.print(distance);
    //Serial.println(" cm");
  }
  delay(200);
}


void stopMot() {
  //moteur Droit
  digitalWrite(vitesseMotD,LOW);
  digitalWrite(sensMotD,LOW);
  digitalWrite(freinMotD,LOW);
  //moteur Gauche
  digitalWrite(vitesseMotG,LOW);
  digitalWrite(sensMotG,LOW);
  digitalWrite(freinMotG,LOW);
}

void avancer(){
  digitalWrite(sensMotD,LOW); // sens 1
  digitalWrite(sensMotG,HIGH); // sens 1
  analogWrite(vitesseMotG,255); // vitesse max
  analogWrite(vitesseMotD,253); // vitesse modere
  // afficher l'intensite
  Serial.print("intensite moteur gauche : ");
  Serial.println(analogRead(intensiteMotG));
  Serial.print("intensite moteur droit : ");
  Serial.println(analogRead(intensiteMotD));
  Serial.println("  ");
}

void rotation(){
  if (a%=5){
    sens = random(0,2); // 2 exclus
  }
  //Serial.print("sens est :");
  //Serial.println(sens);
  a=a+1;
  digitalWrite(sensMotD,sens); // sens est high(1) ou low(0)
  digitalWrite(sensMotG,sens);
  analogWrite(vitesseMotG,255); // vitesse max
  analogWrite(vitesseMotD,255); // vitesse modere
}

void reculer(){
digitalWrite(sensMotD,HIGH); // sens 1
  digitalWrite(sensMotG,LOW); // sens 1
  analogWrite(vitesseMotG,255); // vitesse max
  analogWrite(vitesseMotD,253); // vitesse modere
}
 

qui fonctionne plutôt pas mal mais j'aimerai ajouter un deuxième hr-sc 04 a l'avant et voir un troisième en scan 180 sur le toi des inspiration pour le code?? en fait j'aimerai remplacer la fonction random qui choisi la direction en cas de détection d'obstacle par les scan 180 d'un détecteur qui choisira la direction vraiment appropriée.

j'utilise un arduino uno + motorshield 3 j'ai aussi un nano sous la main

Merci d'avance

J-M-L

montez le hr-sc 04 sur un servo et faites le regarder dans différentes directions...

Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums
Pas de messages privés SVP

duino_nano

Bonjour,

Autre suggestion: faire tourner le robot et mesurer constamment la distance pendant qu'il tourne.


Si la distance mesuré est plus grande qu'un seuil déterminé (ex. 100 cm), arrêter la rotation et avancer!!

matrixfromspace

Rebonjour
 Je reprend ce post après une abscence bien trop longue a mon gout
en fait l'idée est d'ajouter un deuxieme hr sc04 a l'avant de mon robot
afin qu'il puisse déterminer si il a un passage a droite ou a gauche exemple
si le capteur droit est ok le robot vire de 45° a droite et rescan mon soucis
 est que j'ai besoin d'etre mis sur la voie pour le code nécessaire svp


voila voila bises a tous

lesept

J'ai fait un truc dans le genre en Python sur un Raspberry, pour lire 3 capteurs ultrasons. Voici ce que ça donne :

Code: [Select]
start = time.time()
stop1 = 0
stop2 = 0
stop3 = 0

while GPIO.input(GPIO_ECHO1)==0 and GPIO.input(GPIO_ECHO2)==0 and GPIO.input(GPIO_ECHO3)==0:
  start = time.time()

mesure  = True
mesure1 = False if GPIO.input(GPIO_ECHO1)==0 else True
mesure2 = False if GPIO.input(GPIO_ECHO2)==0 else True
mesure3 = False if GPIO.input(GPIO_ECHO2)==0 else True

while mesure:
  if GPIO.input(GPIO_ECHO1)==0 and mesure1==True:
    stop1 = time.time()
    mesure1 = False

  if GPIO.input(GPIO_ECHO2)==0 and mesure2==True:
    stop2 = time.time()
    mesure2 = False

  if GPIO.input(GPIO_ECHO3)==0 and mesure3==True:
    stop3 = time.time()
    mesure3 = False

  mesure = mesure1 or mesure2 or mesure3

# Calculate pulse length
elapsed1 = stop1-start
elapsed2 = stop2-start
elapsed3 = stop3-start


Ça peut être facilement étendu à un nombre quelconque de capteurs.
J'utilise des variables booléennes pour savoir si chaque capteur a terminé sa mesure. Lorsque tous ont terminé, la variable mesure devient FALSE et on sort du while.

Je ne connais pas encore assez l'arduino pour le traduire...

J'espère que ça peut t'aider...

matrixfromspace

Merci beaucoup

L'Idée est bonne mais j'aimerai bien m'affranchir du fait de faire bouger mes capteurs
quitte a en multiplier le nombre autour du rover je pense que sa va simplifier le calcul
 de la direction en fonction de celle trouvée par les capteurs mobiles.

Je vien de mettre la main sur une nouvelle librairy qui permettrai de gérer jusqu'a 50 capteurs
je vous en dis plus quand j'aurai mis le nez dedans.

Cordialement.

"..putain le cauchemar de malade j'ai vu un 2..."


Go Up