Ich benutze keine Bibliothek für das bisschen Ultraschall- das kann man zu Fuss auch machen:
Wie steuerst du deine Motoren an- mit PWM?Code:void pingVorne()// ******************** Vorn nach Hindernissen suchen ************************************** { delay(100); // ggf, alte Echos abklingen lassen, die halbe Zeit reicht auch digitalWrite(triggerVorne, LOW); delayMicroseconds(2); digitalWrite(triggerVorne, HIGH); //Trigger Impuls 10 µs delayMicroseconds(10); digitalWrite(triggerVorne, LOW); //Messung starten long laufZeit = pulseIn(echoVorne, HIGH,maxEntfernung); // Echo-Zeit messen, aber nicht zu lange warten float messung=laufZeit/ 58.2; //Laufzeit in cm umrechnen entfernungVorne = ((entfernungVorneAlt*0.2)+(messung*0.8)); // Ergebnis glätten if(entfernungVorne==0) // das gibts nicht, also muss die Bahn frei sein { entfernungVorne=120; } entfernungVorneAlt=entfernungVorne; Serial.print("Vorne: "); Serial.print(entfernungVorne); Serial.println(" cm"); }
Die läuft nämlich weiter, auch wenn in der Zwischenzeit andere Dinge erledigt werden.
Wenn du an einen Pin PWM(soundso) schickst, läuft die dort so lange, bis was anderes gesagt wird...
Ebenso Servo-Impulse- du kannst einem Servo ne Soll-Position senden, und schon andere Dinge tun, bevor es die erreicht-das funktioniert.
Man muss aber aufpassen: die Servo-Bibliothek verträgt sich nich unbedingt mit jeder anderen- beispielsweise gibt es Probleme mit programmierbaren LED's..das hängt mit den Timern zusammen.
In meinem (unfertigen) Test-Unterprogramm läuft das so ab:
-es wird vorn und hinten "gepingt"
-anhand der zurückgelieferten Distanzen wird die mögliche Geschwindigkeit festgelegt (je näher Hindernis, desto langsamer), und dann wird der berechnete Wert für die Geschwindigkeit ans eigetliche Fahrprogramm übergeben, also ungefähr so:
SpeedVorgabe=255;
fahreGeradeaus(); // das ist das eigentliche Fahrprogramm
Das Fahrprogramm nutzt dann diese Speed-Vorgabe als "Sollwert"- regelt aber nach Bedarf da noch selber dran herum.
Anschliessend schickt es die berechneten PWM-Werte an den Motortreiber.
Da sich die PWM nicht ändert (bis sie, beim nächsten Aufruf des Fahrprogrammes ggf, geändert _wird), fährt der locker und flüssig vor sich hin...
Hier gehts von vorne los:
Hauptprogramm ruft
Test-Unterprogramm, das ruft
Ping-Unterprogramm, berechnet anhand dessen Antwort die Soll-Geschwindigkeit, und schickt die zum
Fahrprogramm
und so weiter.
Das Ganze läuft _nicht_ über die Timer-Funktion einige Beiträge weiter oben, aber der läuft trotzdem im Hintergrund (wird im Hauptprogramm bei jedem Zyklus aufgerufen), der löst dann Zusatzaufgaben aus wie ab und an den Akku-Füllstand überprüfen usw.
Du kannst das ausprobieren: schick mal eine PWM an irgendeinen geeigneten Pin (an den du _irgendwas_ hängst, was dir auch anzeigt, dass die PWM weiter läuft, es geht schon mit ner LED+Vorwiderstand), und lass den Rechner danach mit delay(1000) einfach warten.
Du wirst sehen: das delay() beeinflusst die PWM _nicht!
Genauso kannst du in der Zeit irgendwelche Sensoren abfragen oder so- das juckt die PWM nicht, die läuft und läuft...
Lesezeichen