Forum: PC Hard- und Software Sensorgesteuertes Auto mit Arduino Uno (R3)


von Vangola (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

ich bin neu auf diesem Forum habe aber eine Fragen zu meinem Projekt und 
zwar  möchte für meine Prüfung in der Schule ein Auto bauen, welches 
durch ein Microcontroller (Arduino Uno) gesteuert werden soll. Das Auto 
habe ich schon "gebaut" es hat zwei 3V-Motoren und drei 
Ultraschallsensoren (HC-SR04) zur Hinderniserkennung.
Den Code habe ich soweit auch fertig nur habe ich ein kleines Problem.
Hier die Stelle:

  scanvorne();
  if(cm >= 10){
  GoForward();
  delay(400);
    }
  else{
    Stop(); }
  scanlinks();
  if(cm >= 10){
    GoLeft();
    delay(300);}
  else{
    Stop();}
  scanrechts();
  if(cm3 >= 10){
    GoRight();
    delay(300);}
    else{
    Stop();}
  scanvorne();
  if(cm <= 10){
    GoBackward();
    delay(350);}
  else{
    Stop();}

Ich möchte dass das Auto nicht rumzuckt wie auf Drogen sondern erst 
soweit fährt bis es etwas erkennt und danach ausweicht und nicht wie 
jetzt, abscannt 3sec fährt und dann plötzlich die Richtung ändert, 
obwohl da nichts ist.

Ich bin ein Anfänger im Programmieren deswegen wird sich der eine oder 
andere etwas über einen Code ärgern oder sogar lachen.
Und ich weiß dass mir noch massen an Bauteilen fehlen um alles in 
"Echtzeit" durchführen zu lassen, deswegen muss es nur so ne grobe 
Richtung haben und so ungefähr arbeiten.

MFG Vangola

P.S. Danke schon mal im Voraus.
Ich hab ein Foto vom Auto und den kompletten Code dabei gelegt.

von Jürgen S. (jurs)


Lesenswert?

Vangola schrieb:
> Ich möchte dass das Auto nicht rumzuckt wie auf Drogen sondern erst
> soweit fährt bis es etwas erkennt und danach ausweicht


Dann mußt Du das auch genau so programmieren.

Schaue Dir bitte mal den Code Deiner loop-Funktion an und überlege was 
passiert, wenn alle Richtungen völlig hindernisfrei sind!

Dein Auto fährt erst vorwärts, weil nach vorne alles frei ist.
Dann fährt es gleich darauf nach links, weil links frei ist.
Links ist dann das neue vorne und es wird festgestellt, dass rechts frei 
ist.
Dann fährt das Auto nach rechts, dreht also wieder zurück.
Rückwärts fährt es dann allerdings nicht, weil nach vorne immer noch 
frei ist. Aber dann beginnt das Spiel von vorne.

Im übrigen frage ich mich, ob Du bei laufenden DC-Motoren überhaupt 
Deine Ultraschallsensoren zur Abstandsmessung einsetzen kannst. Die 
Motoren rappeln doch bestimmt und erzeugen Geräusche, die sicher auch 
bis in den Ultraschallbereich reichen. Ob der Ultraschallsensor dann das 
Echo der Motorengeräusche auffängt oder das Echo von seinem 
Trigger-Impuls?

Hat Dein Auto ein LCD-Display, auf dem während der Fahrt die wichtigsten 
Daten zur Kontrolle angezeigt werden, wie z.B. die Abstände, die von den 
Ultraschallsensoren gemessen werden?

von Vangola (Gast)


Lesenswert?

nein es hat keinen LCD-Display, es ist so wie auf dem Bild zu sehen

von Jürgen S. (jurs)


Lesenswert?

Vangola schrieb:
> nein es hat keinen LCD-Display, es ist so wie auf dem Bild zu sehen

Du brauchst dringend ein Feedback über das, was Du nicht direkt sehen 
kannst, z.B. ob die Ultraschallsensoren Hindernisse feststellen oder 
nicht.

Notfalls ziehe die Board-LED an Pin-13 als Hilfe heran.

Und ändere die Programmlogik, damit das Ding eine Strategie hat und 
nicht irgendwie durch die Gegend torkelt.

Z.B.:
1. Scannen in geradeaus Richtung
1.a) Wenn kein Hindernis, geradeaus fahren und weiter mit 1.
1.b) Wenn Hindernis, anhalten, Board-LED einmal blinken, weiter mit 2.
2. Scannen nach rechts
2.a) Wenn rechts frei, drehen nach rechts, weiter mit 1.
2.b) Wenn rechts Hindernis, Board-LED zweimal blinken, weiter mit 3.
3. Scannen nach links
3.a) Wenn links frei, drehen nach links, weiter mit 1.
3.b) Wenn links Hindernis, Board-LED dreimal blinken,
     wenden (2* drehen Rechts oder Links)

Oder so.

von Benjamin W. (benjamin2000)


Lesenswert?

Du kannst das zum Beispiel so machen:

Go forward();

scanforne();
If(cm < 5)
{
Stop();
Delay(500);
Go backward();
Delay(1000);
Stop();

   if(scanlinks < scanrechts)
  {
   GoRight();
   delay(600);
   Stop();
   Go forward();
  }

if(scanlinks > scanrechts)
{
GoLeft();
Delay(600);
Stop();
Go froward();
}

}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.