Go Down

Topic: sensor HC-SR04 (Read 6644 times) previous topic - next topic

Dewaele

Kan je de code bekijken , voor een auto met twee sensor.
met een sensor geen probleem , met twee lukt het niet

altijd problemen  bij    duration = pulseIn( echoPin1, HIGH );

 const int trigPin1  = 9 ;
 const int echoPin1 = 10 ;
 const int trigPin2  = 11 ;
 const int echoPin2 = 12 ;
 
 const int revright = 3;       //REVerse motion of Left motor
 const int fwdleft = 6;       //ForWarD motion of Left motor
 const int revleft = 5;      //REVerse motion of Right motor
 const int fwdright = 4;

 
void setup() {
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(trigPin1, OUTPUT);
  pinMode(echoPin1, INPUT );
  pinMode(trigPin2, OUTPUT);
  pinMode(echoPin2, INPUT );
 
  Serial.begin(9600);
 
 
}
 
      void loop() {
     
      digitalWrite(trigPin1 , LOW);
      delayMicroseconds(2);
      digitalWrite(trigPin1, HIGH);
      delayMicroseconds(10);
      digitalWrite(trigPin1, LOW);
      duration = pulseIn( echoPin1, HIGH );
      distance = (duration * 0.0343) / 2;
     
          digitalWrite(trigPin2 , LOW);
      delayMicroseconds(2);
      digitalWrite(trigPin2, HIGH);
      delayMicroseconds(10);
      digitalWrite(trigPin2, LOW);
      duration = pulseIn( echoPin2, HIGH );
      distance = (duration * 0.0343) / 2;
         if (distance < 25)
   
         {

  digitalWrite(3,  LOW);
  digitalWrite(4,  LOW);
  digitalWrite(5,  LOW);
  digitalWrite(6,  LOW);
    delay(1000);


       
  digitalWrite(3, HIGH);
  digitalWrite(4, LOW);
  digitalWrite(5, HIGH);
  digitalWrite(6, LOW);
  delay(500);

       
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
  digitalWrite(5, LOW);
  digitalWrite(6, LOW);
  delay(2000);


   
  digitalWrite(3, LOW );
  digitalWrite(4, LOW );
  digitalWrite(5, HIGH );
  digitalWrite(6, LOW );
  delay(500);
 

  digitalWrite(3,  LOW);
  digitalWrite(4,  LOW);
  digitalWrite(5,  LOW);
  digitalWrite(6,  LOW);
  delay(1000);
 

     
   
     } else  {
  digitalWrite(3, LOW);
  digitalWrite(4, HIGH);
  digitalWrite(5, LOW);
  digitalWrite(6, HIGH);
          }}

MAS3

Hoi Dewaele, welkom.

Gelieve [code] [/code] tags te gebruiken als je code gaat plaatsen.
De code is dan beter leesbaar en zal niet ineens rare dignen gaan doen(dat is hier ook niet gebeurd), en is zo eenvoudig te kopieren naar een IDE zodat die code eens goed onderzocht kan worden.

Je geeft aan dat je bij 1 sensor geen probleem hebt, maar bij 2 wel en dat het probleem ontstaat bij "duration = pulseIn( echoPin1, HIGH );"

Klopt dit precies zo, dus bij echopin1 ?
En wat is dan het probleem dat je krijgt ?

Is er een reden dat je voor deze pins gekozen hebt, en welke Arduino variant gebruik je eigenlijk ?

Bij een Uno zijn de pinnen 10, 11 en 12 ook in gebruik voor SPI communicatie, maar daar maak je hier verder schijnbaar geen gebruik van en bovendien is pin 10 daar dan nog de meest onschuldige maar toch moet je wel altijd even kijken naar wat pins allemaal zouden kunnen doen.

Heb je al geprobeerd of de problemen aanhouden als je andere pins gebruikt ?
Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

Dewaele

Hoi ,

Ik gebruik de UNO .
Als ik met 1 sensor werk werken alle pins , nu gaat pin 3,4,5,6 naar  driver L298N .
Als ik met 1 sensor , de sensor op 3en 4 zet en 8,9,10 ,11 naar driver geen probleem .
Alles al gedaan met 2 sensoren , alle pinnen van 2 tot 12 niets lukt .
Als ik de code wil  Verifiëren heeft ie fout     duration = pulsen ( echoPin 1, HIGH ) ;

MAS3

#3
Dec 05, 2019, 12:07 am Last Edit: Dec 05, 2019, 12:12 am by MAS3
Hoi.

Uit je eerste vraag kon ik niet opmaken dat het probleem tijdens de compilatie (dat is wat er gebeurt als de IDE aan het verifiëren is) ontstaat.
De IDE geeft niet alleen aan dat er iets fout is, maar ook wat de IDE dan denkt dat er fout is.
Wanneer ik jouw tekst hierboven naar de IDE kopieer en 'm dan laat verifiëren, komt de volgende, voor mij heel duidelijke foutmelding:

Code: [Select]
sketch_dec04a.ino:34:7: error: 'duration' was not declared in this scope
'duration' was not declared in this scope


Het betekent dat je een variabele moet definieren voordat je 'm kan gaan gebruiken.
Dit heeft dus niets te maken met het aantal sensoren dat je gebruikt of wil gebruiken.
Wanneer je variabele elke iteratie (dat is als de loop opnieuw begint) gereset mag worden, dan kun je die variabele definiëren meteen voor de eerste keer dat je 'm wil gebruiken.

Als je wil dat ie altijd beschikbaar is, dus ook buiten loop, dan moet je 'm al daarvoor definiëren.
Dat heb je met de constanten (een "variabele" die niet variabel is) ook al gedaan.

Een voorbeeld van de 1e mogelijkheid is dan:

Code: [Select]
     int duration = pulseIn( echoPin1, HIGH );

Maar int is zeker niet de goede soort, want je gaat 'm later bewerken met een getal achter de komma, en een int heeft geen komma.

Hier (klik !) kun je meer informatie (in het Engels) vinden over welke soorten variabelen er beschikbaar zijn.

O ja.
De IDE stopt met compileren en geeft een foutmelding bij de eerste fout die ie tegenkomt.
Het is dus mogelijk dat je meerdere fouten moet gaan opspeuren na het oplossen van de eerste.
Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

shooter

zorg er ook voor dat je links en rechts goed gescheiden houd dus durationlinks en durationrechts etc.
je zult best wel veel last hebben van herrie in de omgeving door de gebruikte sensoren. daar kun je weinig aan doen. (komt vanzelf goed als je verder bent.
als het werkt zoals je voor ogen had ga dan alle delays eruit werken en vervangen door millis().
daar gaat het karretje veel sneller op reageren en dan stopt het ook als je in een tijd zit.
en afhankelijk hoe het in elkaar zit, heb je een richting voor een wiel en een snelheid, als je de snelheid allebei op een PWM uitgang zet dan kun je de snelheid regelen.
allereerst even alle variabelen declareren boven de setup met float of int.
paul deelen
shooter@home.nl
making controls with codesys PLC and arduino

Dewaele

Hoi
Al vast bedankt voor de tips , zijn al wat verder maar zijn er nog niet .
Doet aĺles goed maar er werk maar 1 sensor.
Als ik de 2 sensors aansluit van pin 8 ,9 ,10 ,11 werkt enkel pin 10 en 11 .
Als ik pin 2,3,4,5 gebruik werkt enkel pin 4,5 , dus altijd sensor 2 .
Als ik sensor 2 op pin 2,3 zet en sensor 1 op 4,5  werkt sensor 2

Dewaele

In  void loop geven we opdracht aan sensor 1 boven en sensor 2 onder , als ik sensor 1 onder en sensor 2 boven  zet werkt sensor 1 .
En sensor 2 niet

MAS3

Plaats je huidige code eens in een reactie hier onder, in code tags alsjeblieft.
Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

Dewaele

weet niet juist wat code tags zijn .

 [ int trigPin2  = 2 ;
  int echoPin2 = 3 ;
  int trigPin1  = 4 ;
  int echoPin1 = 5 ;   ]
 
 
[  int revright = 8 ;       //REVerse motion of Left motor
  int fwdleft = 9 ;       //ForWarD motion of Left motor
  int revleft = 10 ;      //REVerse motion of Right motor
  int fwdright = 11 ;

  int duration = pulseIn( echoPin2, HIGH );
  int distance = (duration * 0.0343) / 2;]

 
[  void setup() {
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(trigPin1, OUTPUT);
  pinMode(echoPin1, INPUT );
  pinMode(trigPin2, OUTPUT);
  pinMode(echoPin2, INPUT ); ]
 
  Serial.begin(96000);
}
   [     void loop() {
       
      digitalWrite(trigPin2, LOW);
      delayMicroseconds(2);
      digitalWrite(trigPin2, HIGH);
      delayMicroseconds(10);
      digitalWrite(trigPin2, LOW);
      duration = pulseIn(echoPin2, HIGH);
      distance = (duration * 0.0343) / 2;]
 
 
    [  digitalWrite(trigPin1, LOW);
      delayMicroseconds(2);
      digitalWrite(trigPin1, HIGH);
      delayMicroseconds(10);
      digitalWrite(trigPin1, LOW);
      duration = pulseIn(echoPin1, HIGH);
      distance = (duration * 0.0343) / 2;]
     
          if (distance < 30){
 

 
   
         

[  digitalWrite(8,  LOW);
  digitalWrite(9,  LOW);
  digitalWrite(10,  LOW);
  digitalWrite(11,  LOW);
    delay(1000);   ]


       
[  digitalWrite(8, LOW);
  digitalWrite(9, HIGH);
  digitalWrite(10, LOW);
  digitalWrite(11, HIGH);
  delay(500); ]

       
 [ digitalWrite(8, LOW);
  digitalWrite(9, LOW);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
  delay(2000);  ]


   
 [ digitalWrite(8, LOW );
  digitalWrite(9, LOW );
  digitalWrite(10, LOW );
  digitalWrite(11, HIGH );
  delay(500);          ]
 

 [ digitalWrite(8,  LOW);
  digitalWrite(9,  LOW);
  digitalWrite(10,  LOW);
  digitalWrite(11,  LOW);
  delay(1000); ]
 

     
   
   [  } else  {
  digitalWrite(8, HIGH);
  digitalWrite(9, LOW);
  digitalWrite(10, HIGH);
  digitalWrite(11, LOW);
          }}               ]



in void loop neemt ie altijd het tweede , als ik sensor 1 zet stopt de wagen op sensor 1

als ik sensor 2 zet stopt de wagen op sensor 2 en werkt 1 niet


MAS3

#9
Dec 07, 2019, 01:35 am Last Edit: Dec 07, 2019, 01:38 am by MAS3
Quote
weet niet juist wat code tags zijn
Dat dus niet ;)

Om code in je posts te plaatsen, doe je het best eerst ctrl-t in de IDE.
Daarmee word het inspringen van de code tekst netjes opgeruimd en overzichtelijk opgesteld.
Vervolgens kun je de code kopieren.

Wanneer je dan de code in de post wil zetten, type je
[code]
(Zet hier je gekopieerde code neer)
[/code]


In je post zou het er dan ongeveer zo uit komen te zien:

Code: [Select]

(Zet hier je gekopieerde code neer)


Dit en nog veel meer tips kun je terugvinden in "Hoe gebruik je het forum - LEES AANDACHTIG AUB !" (klik !), dat je bovenaan het Nederlandstalige gedeelte kunt vinden, of op de link in deze regel te klikken.
Een gedeelte van die informatie is in het Nederlands, en het andere gedeelte in het Engels.

Ik snap nu wat er fout gaat, maar ik heb moeite om dat uit je vraag te halen.
Maar als ik de code er naast leg dan snap ik het helemaal.
Ik ga nu omschrijven wat ik zie nadat ik je recentst geplaatste code in mijn IDE heb gezet en eens bekeken heb (daarom vroeg ik dus om die code).
Daarbij wijs ik naar regelnummers, zodat jij het als het goed is snel en gemakkelijk terug kunt vinden.
In de functie loop, ga je van regel 31 tot en met regel 36 een ping zenden en een echo ontvangen met een van je sensoren.
In regel 37 ga je het resultaat omrekenen naar een afstand, en kopieert dat dan naar de variabele genaamd distance.

Direct daarna ga je in regel 40 beginnen met het zenden van een ping en het ontvangen van de echo daarvan, en in regel 46 ga je het resultaat omrekenen naar een afstand, en kopieert dat dan naar de variabele genaamd distance.

Vervolgens ga je de variabele genaamd distance verwerken.
Er is maar 1 variabele genaamd distance, en die kan maar 1 waarde bevatten.
Wanneer je meer wil verwerken, dan moet je dus meer verwerken.
Anders heeft het niet veel nut om met meer dan 1 sensor te werken.

Neem ook shooter's advies ter harte, en kijk eens naar de tekst onder al mijn posts.
Die tekst staat daar met een goede reden.

Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

Dewaele

Code: [Select]

  int trigPin2  = 2 ;
  int echoPin2 = 3 ;
  int trigPin1  = 4 ;
  int echoPin1 = 5 ;
 
 
  int revright = 8 ;       //REVerse motion of Left motor
  int fwdleft = 9 ;       //ForWarD motion of Left motor
  int revleft = 10 ;      //REVerse motion of Right motor
  int fwdright = 11 ;
  int duration = pulseIn( echoPin2, HIGH );
  int distance = (duration * 0.0343) / 2;


 
  void setup() {
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(trigPin1, OUTPUT);
  pinMode(echoPin1, INPUT );
  pinMode(trigPin2, OUTPUT);
  pinMode(echoPin2, INPUT );
 


 
      Serial.begin(9600);
}
 
      void loop() {
      digitalWrite(trigPin2, LOW);
      delayMicroseconds(2);
      digitalWrite(trigPin2, HIGH);
      delayMicroseconds(10);
      digitalWrite(trigPin2, LOW);
      duration = pulseIn(echoPin2, HIGH);
      distance = (duration * 0.0343) / 2;
     
      digitalWrite(trigPin1, LOW);
      delayMicroseconds(2);
      digitalWrite(trigPin1, HIGH);
      delayMicroseconds(10);
      digitalWrite(trigPin1, LOW);
      duration = pulseIn(echoPin1, HIGH);
      distance = (duration * 0.0343) / 2;
     
          if (distance < 30){
 
     digitalWrite(8,  LOW);
     digitalWrite(9,  LOW);
     digitalWrite(10,  LOW);
     digitalWrite(11,  LOW);
     delay(1000);


       
     digitalWrite(8, LOW);
     digitalWrite(9, HIGH);
     digitalWrite(10, LOW);
     digitalWrite(11, HIGH);
     delay(500);
     
     digitalWrite(8, LOW);
     digitalWrite(9, LOW);
     digitalWrite(10, LOW);
     digitalWrite(11, LOW);
     delay(2000);


 
     digitalWrite(8, LOW );
     digitalWrite(9, LOW );
     digitalWrite(10, LOW );
     digitalWrite(11, HIGH );
     delay(500);
 

     digitalWrite(8,  LOW);
     digitalWrite(9,  LOW);
     digitalWrite(10,  LOW);
     digitalWrite(11,  LOW);
    delay(1000);
   
          } else {
  digitalWrite(8, HIGH);
  digitalWrite(9, LOW);
  digitalWrite(10, HIGH);
  digitalWrite(11, LOW);
          }}

nicoverduin

Zoals Mas al zei. Je overschrijft distance bij het verwerken van de 2e sensor. Maak ze distance1 en distance2 dan kom je wel verder
Met vriendelijke groet / kindest regards
Nico Verduin
www.verelec.nl
Do not PM me for personal consultancy unless you are willing to pay for it.

Dewaele

Code: [Select]
hoi
heb distance 1 en distance 2 overschreven zie code
mijn auto start niet ,sensors werken altijd .

[code ]
  int trigPin2  = 2 ;
  int echoPin2 = 3 ;
  int trigPin1  = 4 ;
  int echoPin1 = 5 ;
 
 
  int revright = 8 ;       //REVerse motion of Left motor
  int fwdleft = 9 ;       //ForWarD motion of Left motor
  int revleft = 10 ;      //REVerse motion of Right motor
  int fwdright = 11 ;
  int duration = pulseIn( echoPin2, HIGH );
  int distance   = (duration * 0.0343) / 2;


 
  void setup() {
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(trigPin1, OUTPUT);
  pinMode(echoPin1, INPUT );
  pinMode(trigPin2, OUTPUT);
  pinMode(echoPin2, INPUT );
 
 
      Serial.begin(9600);
}
 
      void loop() {
      digitalWrite(trigPin2, LOW);
      delayMicroseconds(2);
      digitalWrite(trigPin2, HIGH);
      delayMicroseconds(10);
      digitalWrite(trigPin2, LOW);
      duration  = pulseIn(echoPin2, HIGH);
      distance = (duration * 0.0343) / 2;
     
     if (distance ,1 < 30)
     {
       
      digitalWrite(trigPin1, LOW);
      delayMicroseconds(2);
      digitalWrite(trigPin1, HIGH);
      delayMicroseconds(10);
      digitalWrite(trigPin1, LOW);
      duration = pulseIn(echoPin1, HIGH);
      distance  = duration * 0.0343 / 2;
     
          if (distance, 2 < 30)
         
 
     digitalWrite(8,  LOW);
     digitalWrite(9,  LOW);
     digitalWrite(10,  LOW);
     digitalWrite(11,  LOW);
     delay(1000);


       
     digitalWrite(8, LOW);
     digitalWrite(9, HIGH);
     digitalWrite(10, LOW);
     digitalWrite(11, HIGH);
     delay(500);
     
     digitalWrite(8, LOW);
     digitalWrite(9, LOW);
     digitalWrite(10, LOW);
     digitalWrite(11, LOW);
     delay(2000);


 
     digitalWrite(8, LOW );
     digitalWrite(9, LOW );
     digitalWrite(10, LOW );
     digitalWrite(11, HIGH );
     delay(500);
 

     digitalWrite(8,  LOW);
     digitalWrite(9,  LOW);
     digitalWrite(10,  LOW);
     digitalWrite(11,  LOW);
     delay(1000);
   
          } else {
  digitalWrite(8, HIGH);
  digitalWrite(9, LOW);
  digitalWrite(10, HIGH);
  digitalWrite(11, LOW);
          }}

nicoverduin

Misschien eerst ff een beginners tutorial dan mbt variabelen?
Met vriendelijke groet / kindest regards
Nico Verduin
www.verelec.nl
Do not PM me for personal consultancy unless you are willing to pay for it.

MAS3

Hoi.

Mooi, de code tags lukken nu bijna helemaal goed.

Nu de code zelf nog  ;)

Een compiler zoals die in de IDE zit, leest de tekst die jij intypt, en maakt daar dan de bits van die de controller nodig heeft om te doen wat jij graag zou willen.
Dat betekent dat je heel goed moet opletten wat je intypt, anders gebeurt er iets heel anders of helemaal niets.
Maar dat geldt ook voor jou (en natuurlijk ook voor mij), en de tips die gegeven worden.
Nico heeft je precies de oplossing getoond, maar jij heb er iets heel anders van gemaakt.
Dat andere is veel ingewikkelder dan wat Nico je vertelde.

distance1 != distance
distance1 != distance,1

Het is niets anders dan wat je met de aansluitingen van je sensoren doet in de code.
Het laatste stuk van je code moet ook worden aangepast aan de nieuwe situatie, anders ge je nog steeds iets missen.
In ieder geval gaat er sowieso nog iets mis met het verwerken van de 2e sensor (want zoals het nu is zal dat nooit op de door jou bedoelde wijze gebeuren).
Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

Go Up