Nieuw hier hopelijk kunnen jullie me helpen

Ik ben net begonnen met de Arduino.
Uiteraard met de playground begonnen en nu dacht ik een gemakkelijk project te beginnen.
Zoals zovelen wil ik eerst maar eens beginnen met een robotje welke niet tegen obstakels botst.

Hiervoor heb ik een Arduino uno aangeschaft met een motorshield, de Hc-sr04 en twee motoren (Robot Wheel Motor Tyre DC 3V 8V Arduino Smart Car | eBay'

Met elkaar verbonden:

en van software voorzien:

#include <AFMotor.h>
#define trigPin A4
#define echoPin A5
AF_DCMotor motor1(1, MOTOR12_64KHZ); // create motor #1, 8KHz pwm
AF_DCMotor motor3(3, MOTOR34_64KHZ); // create motor #3, 8KHz pwm

void setup() {
  Serial.begin (9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  motor1.setSpeed(255); // set the speed to 200/255
  motor3.setSpeed(255); // set the speed to 200/255
}

int CheckDistance()
{
  long duration, distance;
  digitalWrite(trigPin, LOW);  // Added this line
  delayMicroseconds(2); // Added this line

 const int pingPin=18, EchoPin=19;


	// The SRF005 is triggered by a HIGH pulse of 2 or more microseconds.
	// Give a short LOW pulse before to ensure a clean HIGH pulse:

	pinMode(pingPin, OUTPUT);
	pinMode(EchoPin, INPUT);  

	digitalWrite(pingPin, LOW);
	delayMicroseconds(2);
	digitalWrite(pingPin, HIGH);
	delayMicroseconds(2);         
	digitalWrite(pingPin, LOW); 
	duration = pulseIn(EchoPin, HIGH);
	delay(100);
  
  return distance;
}

void MotorForward(int delaytime)
{
  motor1.run(FORWARD);
  motor3.run(FORWARD);
  delay(delaytime);
}
void MotorBackward(int delaytime)
{
  motor1.run(BACKWARD);
  motor3.run(BACKWARD);
  delay(delaytime);
}
void MotorRelease()
{
  motor1.run(RELEASE);
  motor3.run(RELEASE);
  delay(1000);
}

void MotorLeft()
{
  motor1.run(FORWARD);
  motor3.run(BACKWARD);
  delay(600);
}

void MotorRight()
{
  motor1.run(BACKWARD);
  motor3.run(FORWARD);
  delay(500);
}

void loop() 
{
  int testDistance = CheckDistance();
  
   Serial.print(testDistance);
   Serial.println(" test");
   
  if (testDistance >= 30 || testDistance <= 0){
    Serial.println("Out of range");
    //go forward and check range again
    MotorForward(700);
    MotorRelease();
  }
  else 
  {
    Serial.print(testDistance);
    Serial.println(" cm");
    //object in path, reverse and turn to avoid
    MotorBackward(600);
    MotorRelease();
    MotorRight();
    MotorRelease();
    MotorForward(600);
    MotorRelease();
    MotorLeft();
    MotorRelease();
    
  }
   
  delay(500);
}

Nou heb ik alleen ergens een fout gemaakt.... want rijden doet hij wel (elke keer een 30 cm ofzo, daarna een stop enz) maar botsen doet hij ook.
Wie kan me helpen?

Nou het klopt toch dat ie stop? Als ik zo ff snel kijk dan scan je. Als de afstand voldoet dan verplaats je 700 (pulsen? oid) en stop je. Daarna ga je weer scannen......

Ja dat klopt. maar dat botsen moet er nog uit

de methode int CheckDistance() geeft distance terug maar distance wordt nooit gebruikt. dus die is waarschijnlijk alijd 0

Jantje:
de methode int CheckDistance() geeft distance terug maar distance wordt nooit gebruikt. dus die is waarschijnlijk alijd 0

hoe moet ik dat aanpassen dan?

ff uitzoeken hoe die sensor werkt. Je hebt de duration. Daar het Ultrasoon is kun je omrekenen uit duration wat de afstand is. Ff googelen lijkt me.

Hoi wouter-, welkom.

@janosik: daar geef je een waarde door aan die functie.
Die functie accepteert die waarde dan als de variabele delaytime.
De 700 is dus vermoedelijk een vooruit beweging gedurende 0.7 seconden.
Na die functie worden de motoren vrijgegeven, die stoppen dus met bewegen.

Ik denk dat wouter niet alleen moet kijken of de afstand kleiner dan 30 centimeter is, maar ook of ie niet groter dan een bepaalde waarde is.
Maar dat weet ik dus niet zeker.

[edit]
Hmm.
janosik heeft zijn post alweer weggehaald...
[/edit]

@MAS3
Ik had het idd ook gezien, maar een beetje te laat. Blijkbaar had je mijn al bericht gelezen voor ik het wiste. :wink:

@Wouter:
Misschien heb je hier wat aan: klik

Bedankt voor deze reacties! Janosik Die link van jou ziet er veel belovend uit! ik zal me hier morgen in verdiepen als ik wat helderder bent dank!

Jantje:
de methode int CheckDistance() geeft distance terug maar distance wordt nooit gebruikt. dus die is waarschijnlijk alijd 0

Jantje:
de methode int CheckDistance() geeft distance terug maar distance wordt nooit gebruikt. dus die is waarschijnlijk alijd 0

De distance wordt toch hier gebruikt?

 if (testDistance >= 30 || testDistance <= 0){
    Serial.println("Out of range");
    //go forward and check range again
    MotorForward(700);
    MotorRelease();
  }
  else 
  {
    Serial.print(testDistance);
    Serial.println(" cm");
    //object in path, reverse and turn to avoid
    MotorBackward(600);
    MotorRelease();
    MotorRight();
    MotorRelease();
    MotorForward(600);
    MotorRelease();
    MotorLeft();
    MotorRelease();
    
  }

Dit is jouw distance routine die een variable teruggeeft. Zou jij dan willen aangeven waar in deze routine distance gevuld wanneer deze wordt teruggegeven aan de aanroeper?

int CheckDistance()
{
  long duration, distance;
  digitalWrite(trigPin, LOW);  // Added this line
  delayMicroseconds(2); // Added this line

 const int pingPin=18, EchoPin=19;


	// The SRF005 is triggered by a HIGH pulse of 2 or more microseconds.
	// Give a short LOW pulse before to ensure a clean HIGH pulse:

	pinMode(pingPin, OUTPUT);
	pinMode(EchoPin, INPUT);  

	digitalWrite(pingPin, LOW);
	delayMicroseconds(2);
	digitalWrite(pingPin, HIGH);
	delayMicroseconds(2);         
	digitalWrite(pingPin, LOW); 
	duration = pulseIn(EchoPin, HIGH);
	delay(100);
  
  return distance;
}

Verder zou ik pinmodes in de setup() zetten tenzij je ze tussendoor programmatisch moet veranderen.

dan is het voor mij nog steeds een raadsel...

Er staat :

return distance;

Dit is het moment dat de functie CheckDistance() klaar is en het antwoord terug geeft aan de regel die deze functie heeft aangeroepen. het antwoord is distance.
Echter
Nergens in de functie CheckDistance() wordt deze variabele gevuld
Dus kan er van alles in staan.

Als je deze (toch wel basiskennis) nog niet in de vingers hebt, zou het zomaar eens handig kunnen zijn om nog eens de tutorials door te lopen of te googelen op "C C++ functies" of "C C++ functions". Lijkt mij hard noodzakelijk om dit door te krijgen.

je robot gaat telkens 0.7 seconden vooruit en kijkt dan of er iets in de buurt is, dus wellicht is dat een beetje te lang, maar dat kun je dus aanpassen door de 700 te verkleinen.

dan je distanceroutine (ik snap niet dat de jongens (nico en mas) hier over heen kijken.
maar goed

#include <AFMotor.h>
#define trigPin A4
#define echoPin A5
AF_DCMotor motor1(1, MOTOR12_64KHZ); // create motor #1, 8KHz pwm
AF_DCMotor motor3(3, MOTOR34_64KHZ); // create motor #3, 8KHz pwm

void setup() {
  Serial.begin (9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  motor1.setSpeed(255); // set the speed to 200/255
  motor3.setSpeed(255); // set the speed to 200/255
}

int CheckDistance()
{
  long duration, distance;
  digitalWrite(trigPin, LOW);  // Added this line
  delayMicroseconds(2); // Added this line

 const int pingPin=18, EchoPin=19;


 // The SRF005 is triggered by a HIGH pulse of 2 or more microseconds.
 // Give a short LOW pulse before to ensure a clean HIGH pulse:

 pinMode(pingPin, OUTPUT);
 pinMode(EchoPin, INPUT);  

 digitalWrite(pingPin, LOW);
 delayMicroseconds(2);
 digitalWrite(pingPin, HIGH);
 delayMicroseconds(2);         
 digitalWrite(pingPin, LOW); 
 duration = pulseIn(EchoPin, HIGH);
// delay(100);
  // oke dus duration wordt een tijd dat de puls heeft geduurd.
  return distance; // maar hier return je distance en die is 0 dus verbeteren door hier duration van te maken.
// dat komt omdat er in het voorbeeld een functie (uit een library) gebruikt wordt die je niet aanroept die de duration vertaalt in centimeters.
// zet het karretje op blokjes dan kun je op de serial monitor zien wat er gebeurt.
// experimenteer met de tijden want die zijn voor iedere kar anders.
groetjes paul deelen

}

void MotorForward(int delaytime)
{
  motor1.run(FORWARD);
  motor3.run(FORWARD);
  delay(delaytime);
}
void MotorBackward(int delaytime)
{
  motor1.run(BACKWARD);
  motor3.run(BACKWARD);
  delay(delaytime);
}
void MotorRelease()
{
  motor1.run(RELEASE);
  motor3.run(RELEASE);
  delay(1000);
}

void MotorLeft()
{
  motor1.run(FORWARD);
  motor3.run(BACKWARD);
  delay(600);
}

void MotorRight()
{
  motor1.run(BACKWARD);
  motor3.run(FORWARD);
  delay(500);
}

void loop() 
{
  int testDistance = CheckDistance();
  // testdistance wordt hier dus gevuld met een INT vanuit CheckDistance

   Serial.print(testDistance);
   Serial.println(" test");
   
  if (testDistance >= 30 || testDistance <= 0){
// <=0 is een beetje moeilijk maar kan wel als de waarde erg hoog is (eigenlijk unsigned INT gebruiken)    Serial.println("Out of range");
    //go forward and check range again
    MotorForward(700);
    MotorRelease();
  }
  else 
  {
    Serial.print(testDistance);
    Serial.println(" cm");
    //object in path, reverse and turn to avoid
    MotorBackward(600);
    MotorRelease();
    MotorRight();
    MotorRelease();
    MotorForward(600);
    MotorRelease();
    MotorLeft();
    MotorRelease();
    
  }
   
  delay(500);
}

shooter:
jdan je distanceroutine (ik snap niet dat de jongens (nico en mas) hier over heen kijken.
maar goed

Je bedoeld, dat je niet begrijpt hoe het kan dat ondanks dat het meerdere malen aan de TS is aangegeven (door nico en mas) dat de distance routine een niet gevulde waarde teruggeeft, het nog steeds niet is aangepast?

@edit: En jantje trouwens ook.....