UltraschallSenor Roboter

Hallo Zusammen

Ich arbeite für meine Abschlussarbeit an einem Roboter der mit Ultraschall funktioniert. Also funktionieren sollte. :o :confused:

Ich habe 3 Sensoren, einen nach vorne, rechst und links. Werden alle nacheinander Ausgelesen und geben gute Werte zurück. (Per Serial.println getestet) 8)

Für den Antrieb habe ich zwei DC Motoren mit einem Arduino-Motorboard angesteuert. Was auch (Genügend?)funktioniert.

Jetzt habe ich nur soweit geschrieben, dass der Roboter auf 60cm an das Hindernis heranfährt und dan den Rückwärtsgang einlegt. Das bedeutet er müsste um die 60 cm von dem Hindernis immer vorwärts und rückwärts pendeln.
also Hin und zurück und hin und zurück … :grin:

Er stockt jedoch und fährt komisch :roll_eyes: (gerade keine andere Beschreibung dazu gefunde)

Danach sollte er eigendlich, wenn die Distance kleiner als 60 cm ist kontrollieren wo es mehr abstand hat. Also etwa so:

if (distance <60)
{
if(distanceR>distance L)
{
fahren(1,0);
}
else()
{
fahren(0,1);
}
}

Das ist noch der Ganze Cod

#define echoPinM 7 // Echo Pin
#define trigPinM 8 // Trigger Pin
#define echoPinL 9 // Echo Pin
#define trigPinL 10 // Trigger Pin
#define echoPinR 12 // Echo Pin
#define trigPinR 11 // Trigger Pin
#define LEDPin 13 // Onboard LED
#define RechtsB 3
#define LinksB 5
#define RechtsG 2
#define LinksG 4

int maximumRange = 150; // Maximum Distance
int minimumRange = 0; // Minimum Distance
long duration, distanceM, distanceR, distanceL; // Berechnungen

void setup() {
Serial.begin (9600);
 pinMode (LinksG, OUTPUT);
 pinMode (RechtsB, OUTPUT);
 pinMode (LinksB, OUTPUT);
 pinMode (RechtsG, OUTPUT);
 pinMode(trigPinM, OUTPUT);
 pinMode(echoPinM, INPUT);
 digitalWrite(echoPinM, LOW);
 pinMode(trigPinL, OUTPUT);
 pinMode(echoPinL, INPUT);
 digitalWrite(echoPinL, LOW);
 pinMode(trigPinR, OUTPUT);
 pinMode(echoPinR, INPUT);
 digitalWrite(echoPinR, LOW);
 pinMode(LEDPin, OUTPUT); // Use LED indicator (if required)
}



void fahren(int L, int R)
{
  while (L == 0)
  {
    digitalWrite(LinksB, HIGH);
  }
while (L == 1)
  {
    digitalWrite(LinksG, HIGH);
  }
  while (R == 0)
  {
    digitalWrite(RechtsB, HIGH);

  }
  while (R == 1)
  {
    digitalWrite(RechtsG, HIGH);
  }
  while (L == 2)
  {
    digitalWrite(LinksG, LOW);
    digitalWrite(LinksB, LOW);
  }
  while (R == 2)
  {
    digitalWrite (RechtsG,LOW);
    digitalWrite (RechtsB,LOW);
  }
}





void Sensoren()
{
digitalWrite(trigPinM, LOW);
delayMicroseconds(2);

digitalWrite(trigPinM, HIGH);
delayMicroseconds(10);

digitalWrite(trigPinM, LOW);
duration = pulseIn(echoPinM, HIGH);

distanceM = duration/58.2; // Berechnung der Distance anhander der GEschwindigkeit
delay(100);

digitalWrite(trigPinR, LOW);
delayMicroseconds(2);

digitalWrite(trigPinR, HIGH);
delayMicroseconds(10);

digitalWrite(trigPinR, LOW);
duration = pulseIn(echoPinR, HIGH);


distanceR = duration/58.2; //Distance an der Geschwindigkeit

delay(100);

digitalWrite(trigPinL, LOW);
delayMicroseconds(2);

digitalWrite(trigPinL, HIGH);
delayMicroseconds(10);

digitalWrite(trigPinL, LOW);
duration = pulseIn(echoPinL, HIGH);


distanceL = duration/58.2; //Distance an der Geschwindigkeit des Sound 

delay(100);

}

void loop()
{

  Sensoren();

  while (distanceM >60)
  {
  fahren(0,0);

  Serial.println(distanceM);
  Serial.println(distanceL);
  Serial.println(distanceR);
  Serial.println(" ");
  Sensoren();
}


while(distanceM <60)
 {
  fahren(1,1);
  Serial.println(distanceM);
  Serial.println(distanceL);
  Serial.println(distanceR);
  Serial.println(" ");
  Sensoren();

}
}

Kann mir jemand helfen? oder kann sagen was so nicht geht?

benj98:
Kann mir jemand helfen? oder kann sagen was so nicht geht?

Du hast die “Hysterese” komplett vergessen!
Wenn Du Pech hast, schaltet Dein Fahrzeug direkt am Schaltpunkt zehnmal pro Sekunde zischen vorwärts und rückwärts um, aufgrund "springender Messwerte vom Sensor, die den Abstand ja immer um einige Millimeter verschieden liefern, bei direkt aufeinander folgenden Messungen.

Du mußt nicht einen einzigen Schaltpunkt definieren, sondern zwei verschiedene:

Du brauchst eeinen Vorwärtsschaltpunkt , z.B. (Abstand>62) und einen Rückwärtsschaltpunkt (z.B. (Abstand<58).

Du schaltest dann wie folgt:

  • Abstand>62 ==> Motor auf vorwärts schalten
  • Abstand<58 == Motor auf rückwärts schalten
    Und immer wenn der Abstand zwischen 58 und 62 ist ==> Immer den letzten Schaltzustand beibehalten und nicht ändern!

Der Bereich von 58 bis 62 ist dann der Hysteresebereich, in dem keine Schaltvorgänge stattfinden.
Das Fahrzeug pendelt dann immer im Abstand von 57 bis 63cm vor, zurück, vor, zurück etc. etc. etc.

Kleine Fehler grosse Wirkung.

Danke viel mal. Es funktioniert jetzt.

benj98: Es funktioniert jetzt.

Aber nicht mit dem oben geposteten Kode (hier noch mal wiederholt)

void fahren(int L, int R)
{
  while (L == 0) {
    digitalWrite(LinksB, HIGH);
  }
  while (L == 1) {
    digitalWrite(LinksG, HIGH);
  }
  while (R == 0)  {
    digitalWrite(RechtsB, HIGH);
  }
  while (R == 1) {
    digitalWrite(RechtsG, HIGH);
  }
  while (L == 2) {
    digitalWrite(LinksG, LOW);
    digitalWrite(LinksB, LOW);
  }
  while (R == 2) {
    digitalWrite (RechtsG, LOW);
    digitalWrite (RechtsB, LOW);
  }
}

Eine hübsche Sammlung von Todesschleifen.