servo drehen und dabei mit Ultraschallsensor distanzen ausmessen

Hallo Zusammen

Ich bin gerade dabei an meiner Maturaarbeit zu arbeiten, in welcher ich einen Roboter bauen möchte, der Objekte erkennt und sie umfahren kann. Das Ziel ist, dass der Roboter aus einem Labyrinth selbst den Weg heraus findet.

Ich bin nun auf ein Problem gestossen, welches ich nicht lösen kann. Ich arbeite mit dem Adafruit Motorshield v2.3. Ich habe den Arduino so programmiert, dass er solange fahren soll, bis der Ultraschallsensor ein Objekt erkennt (entfernung 5cm). Sobald dies eintritt, soll der Servo den Ultraschall Sensor um 180 Grad drehen. Sprich der Servo springt zuerst auf 0 Grad und dreht Schrittweise bis auf 180 Grad. Der Ultraschallsensor soll während der Servo dreht jedoch immer weiter messen und wenn der Servo auf 180 Grad ist, soll mir das Programm die Servo Position zurück geben, bei welcher der Sensor die längste Distanz zu einem Objekt erkennt hat. Das ganze habe ich versucht in eine Funktion einzubauen.

Könntet ihr euch meine Funktion kurz anschauen und herausfinden ob da irgendwo ein Fehler ist, denn während der Servo dreht, erhalte ich keine Werte vom Ultraschallsensor.

vielen Dank und Gruss

autonomes_fahren_anfang.ino (3.4 KB)

Hallo,

bau dir doch die Messerei komplett in einer Function zusammen, die kannst Du dann zu dir beliebigen Zeitpunkten aufrufen. Wenn es dann ohne Servo klappt dann muss es auch während einer kleinen Fahrpausue des Servos gehen. So wie Du das jetzt hast fehlt meiner Meinung nach der ping in der for schleife.

Heinz

Hi

Und verabschiede Dich von delay() und dem Warten, bis diese Funktion endlich Ihr Ende gefunden hat.
Du willst IMMER die aktuelle Entfernung haben.
Du willst IMMER den Winkel des Servo anpassen können.
Auch willst Du IMMER die Drehzahl der Motoren anpassen können.

Nicht nur alle zig Sekunden, wenn Deine Ping-Funktion die ganzen PulseIn und delay() überstanden hat - da ist Dein Roboter nämlich schon mit Vollgas gegen die nächste Wand gebrettert - da Du nicht auf 'Tiefen' prüfst, werden ja keine Abgründe vor dem Gefährt auftauchen, in Die Es stürzen könnte, während Du noch die ganzen Entfernungen der ganzen Winkel misst.

Akut zerschellt Dein Roboter, ohne auch nur ansatzweise mitzubekommen, daß Er bereits tot ist.
Gib Ihm zumindest die Chance, Das mitzubekommen.

Dafür könnte man sogar einen Interrupt missbrauchen - die Pins 2 und 3 (Interrupt 0 und 1, zumindest an Uno und Nano) würden Das ermöglichen.
An den anderen Pins wäre auch ein PCINT (PinChangeINTerrupt) möglich, hier musst Du selber feststellen, welcher Pin den Interrupt ausgelöst hat - bei nur einem überwachtem Pin aber auch lösbar :wink:

(ich würde den Ping starten, mir also die Zeit merken - und in der ISR den Zeitpunkt des Echo festhalten wie ein Flag setzen, daß wir ein Echo haben - der Rest ist Dreisatz in loop() )

MfG

Rentner:
Hallo,

bau dir doch die Messerei komplett in einer Function zusammen, die kannst Du dann zu dir beliebigen Zeitpunkten aufrufen. Wenn es dann ohne Servo klappt dann muss es auch während einer kleinen Fahrpausue des Servos gehen. So wie Du das jetzt hast fehlt meiner Meinung nach der ping in der for schleife.

Heinz

Hallo Heinz, die Messerei, wie du sie nennst, habe ich schon in einer Funktion, trotzdem misst der sensor nicht, ich rufe die funktion jedoch mehrere male auf, ist es möglich, dass dadurch Fehlmessungen entstehen? Im seriellen Monitor wird nämlich immer 0 angezeigt wenn der Servo dreht.

Lieber Gruss