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.
#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......
@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]
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.
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?