Hallo,
mein arduino auto hängt sich an einer stelle immer auf, deshalb möchte ich einen counter in den sketch einbauen das es z.b. 3 mal versucht nach links zu fahen, wenn das nicht geht das es dann versucht nach rechts zu fahren. Ich hab nichts passendes zu so einem "counter" gefunden.
Was für befehle könnt ihr da empfehlen, bzw. was für anleitungen?
int LED = 13;
int Licht = 0;
int Ruecklicht = 1;
int Scheinwerfer = 2;
const long interval = 500;
unsigned long previousMillis = 0;
long laenge;
long cm;
int sensM = 8;
int sensR = 12;
int sensL = 3;
int MotorR = 4;
int MotorL = 7;
int zaeler = 0;
void setup()
{
pinMode(11, OUTPUT);
pinMode(10, INPUT);
pinMode(sensM, INPUT);
pinMode(sensL, INPUT);
pinMode(sensR, INPUT);
pinMode( 5 , OUTPUT);
pinMode( 6 , OUTPUT);
pinMode(MotorR , OUTPUT);
pinMode(MotorL , OUTPUT);
pinMode(Licht, INPUT);
pinMode(LED, OUTPUT);
pinMode(Ruecklicht, OUTPUT);
pinMode(Scheinwerfer, OUTPUT);
Serial.begin(9600);
}
void loop() {
digitalWrite(11, LOW);
delayMicroseconds(2);
digitalWrite(11, HIGH);
delayMicroseconds(5);
digitalWrite(11, LOW);
laenge = pulseIn(10, HIGH);
cm = (laenge * 34) / 2000;
Serial.print(cm);
Serial.println("cm");
int lsR = digitalRead(sensR);
int lsM = digitalRead(sensM);
int lsL = digitalRead(sensL);
if (cm > 10) {
if (lsL == HIGH && lsM == LOW && lsR == LOW) {
MotorGerade();
}
if (lsL == HIGH && lsM == HIGH && lsR == HIGH) {
MotorZurueck();
}
if(lsL == LOW && lsM == HIGH && lsR == HIGH){
MotorLinks();
}
if (lsL == HIGH && lsM == LOW && lsR == HIGH) {
MotorGerade();
}
if (lsL == LOW && lsM == LOW && lsR == HIGH) {
MotorGerade();
}
if (lsL == HIGH && lsM == HIGH && lsR == LOW) {
MotorRechts();
}
if (lsL == LOW && lsM == LOW && lsR == LOW) {
MotorLinks();
}
}
else {
MotorLinks();
}
Leuchten();
}
Da wird es wohl nichts fertiges geben.
Du zählst einfach in deiner "Linksfahrroutine" bis drei und springst dann in die Rechtsfahrroutine.
Was für befehle könnt ihr da empfehlen
Zu deinem Programmierstil würde
int counter;
passen.
Der würde mit
counter++;
oder mit
counter = counter+1;
erhöht. Aber generell wäre der Tip Die "Arduino - Sprache" ist C++ evtl. hilfreich. Damit solltest du reichlich Hilfe finden.
mein arduino auto hängt sich an einer stelle immer auf
Du hast eine mir unverständliche Logik für dein autonomes Auto programmiert.
Warum fehlt (lsL == LOW && lsM == HIGH && lsR == LOW)
?
michael_x:
Warum fehlt (lsL == LOW && lsM == HIGH && lsR == LOW)
?
weil es ein komindation ist die in realität nicht vorkommt, das würde heißen der linke linetraker ist auf schwarzem grund der mittlere ist auf weißem und der rechte ist auch wieder auf schwarzen, die einzige logischeschlüsse wären geradeaus oder zurück.
Dein Auto "hängt sich auf", weil (cm<10) und sich daran nichts ändert, egal wie lange das Kommando MotorLinks();
aktiv ist, rate ich mal. ?
Statt irgendwas zu zählen, wäre evtl auch überlegenswert nach Zeit (ein paar "nutzlosen" Sekunden MotorLinks ) zusätzlich zurück zu fahren ?
Mich würde mal interessieren was für Werte bei " Serial.print(cm);", bei der variable cm rauskommen.
Kannst du da mal ein Screenshot vom SerialMonitor machen.
Dein fehler ist entweder wie oben von michael_x beschrieben, das deine if Funktion "if(cm > 10}" immer in die else springt, oder du ein anderen Fehler in deiner abfrage hast, sodass immer der Fall ist "if (lsL == LOW && lsM == LOW && lsR == LOW) {
MotorLinks();
}" . Um das herrasuzufinden schreibe jeweils unter die Funktion " MotorLinks();" ein "Serial.println("1");" und in der else ein "Serial.println("2");"
dann weisst du was ausgeführt wird.
void loop() {
digitalWrite(11, LOW);
delayMicroseconds(2);
digitalWrite(11, HIGH);
delayMicroseconds(5);
digitalWrite(11, LOW);
laenge = pulseIn(10, HIGH);
cm = (laenge * 34) / 2000;
Serial.print(cm);
Serial.println("cm");
int lsR = digitalRead(sensR);
int lsM = digitalRead(sensM);
int lsL = digitalRead(sensL);
if (cm > 10) {
if (lsL == HIGH && lsM == LOW && lsR == LOW) {
MotorGerade();
}
if (lsL == HIGH && lsM == HIGH && lsR == HIGH) {
MotorZurueck();
}
if(lsL == LOW && lsM == HIGH && lsR == HIGH){
MotorLinks();
}
if (lsL == HIGH && lsM == LOW && lsR == HIGH) {
MotorGerade();
}
if (lsL == LOW && lsM == LOW && lsR == HIGH) {
MotorGerade();
}
if (lsL == HIGH && lsM == HIGH && lsR == LOW) {
MotorRechts();
}
if (lsL == LOW && lsM == LOW && lsR == LOW) {
MotorLinks();
Serial.println("1"); // hier
}
}
else {
MotorLinks();
Serial.println("2"); // und hier
}
Leuchten();
}