-
Man kann die Trigger-Pins zusammen legen-das _kann_ funktionieren.
Vorteil: es spart Pins (grad nen Uno hat ja nicht so üppig viele).
Der Haken: es _kann_ passieren, dass die Sensoren dann das Echo der anderen empfangen-und die Entfernungen nicht stimmen. Bei guter Anordnung gehts, bei ungünstiger nicht.
Ausserdem sollte man aufpassen,dass man den Pin, wenn man viele Trigger an einen hängt, nich überlastet...so ganz ohne bisschen Strom gehn die auch nicht.
Die Echo-Pins sollte man unbedingt getrennt hernehmen, sonst merkt man ja gradenoch "vor irgendeinem der Sensoren könnte was sein"- ziemlich nutzlos.
Man kann die HC-SR04 auch umbauen, dann ist Echo und Trigger auf einem Pin möglich-hab ich aber selber noch nicht ausprobiert.
Zur If-Anweisung: dazu gibts dann auch noch die else(), und die else if() auch kann man if()`s beliebig ineinander verschachteln, und in manchen Fällen fährt man mit switch() besser.
-
also das mit den #define hab ich hinbekommen, also den Code für meine 5 Sensoren ausgelegt!
Nur geht es wie gesagt im loop Teil um die IF Anweisung:
Code:
void loop()
{
scan_FRONT_MIDDLE(); // Abstand Messen
distance_FRONT_MIDDLE = distance; // Distanz Vorne = Abstand
if(distance_FRONT_MIDDLE < triggerDistance) // Wenn kleiner als vorgegeben dann reagieren
{
backward(); // Zurück fahren
}
else
{
vorward(); // Weiter nach Vorne fahren
}
}
So siehts aus wenn ich ein Sensor hab bzw einmal scan_FRONT_MIDDLE abfrage,
jetzt hab ich aber noch :
void scan_FRONT_RIGHT()
void scan_FRONT_LEFT()
void scan_RIGHT()
void scan-LEFT()
und soll ja so sein das er zb im abstand von 50ms die einzelnen scan´s abfragt ..... so währe es doch richtig oder ?
ein scan nach dem anderen abfragen ?
- - - Aktualisiert - - -
ja also ich habe jetzt in meinem Sketch so gemacht, das ich Trigger und Echo Pins habe, da ich ja ein Mega 2560 mit einem Sensor Shield habe,
stört es mich nicht wenn ich 20 Pins für die 5 Ultraschall Sensoren belege!
-
Sieht bissel wie nen BASIC-Programm aus. ;)
Macht aber nix.
Ich würd es anders machen:
fahre vor()
{
while(hindernisDa)
{ fahreZurück;
frageSensorenAb();
}
frageSensorenAb();
}
So ähnlich mache ichs beim Monstertruck auch: solange er noch weit genug vom Zielpunkt entfernt ist, wird recht sorglos gefahren, und ab und zu halt die Position überprüft.
Wieso brauchst du eigentlich 20 Pins für 5 Sensoren?? Die brauchen _zweie_ jeder- mehr nicht. Sag bitte nicht, dass du die Dinger auch über den Mega mit Spannung versorgst??
-
Okay das mit dem Code sieht gut aus ich Versuch mal mein Code zu schreiben.
Nein hab mich falsch ausgedrückt. Mit Strom werden die Sensoren von dem Sensor Shield versorgt.
War ein Denkfehler. Ich brauch dann nur 10 Pins für die 5 Sensoren.
- - - Aktualisiert - - -
also würde der loop Teil dann so aussehen?
Code:
void loop()
{
vorward();
{
while(scan_FRONT_MIDDLE)
distance_FRONT_MIDDLE = distance;
if(distance_FRONT_MIDDLE < triggerDistance)
{
backward();
}
while(scan_FRONT_RIGHT)
distance_FRONT_RIGHT = distance;
if(distance_FRONT_RIGHT < triggerDistance)
{
backward();
{
while(scan_FRONT_LEFT)
distance_FRONT_LEFT = distance;
if(distance_FRONT_LEFT < triggerDistance)
{
backward();
}
while(scan_RIGHT)
distance_RIGHT = distance;
if(distance_RIGHT < triggerDistance)
{
backward();
}
while(scan_LEFT)
distance_LEFT = distance;
if(distance_LEFT < triggerDistance)
{
backward();
{
{
{
-
Benutz das Programm da besser nicht.
while() heisst ungefähr: solange()...damit kann man prima Endlosschleifen basten, und sucht sich dann dämlich am Fehler...
Die while()-Schleife wird _erst_ verlassen, wenn (Ausdruck) hinter While nicht mehr zutrifft!
Du musst dort also schon eine Bedingung definieren, die irgendwann unwahr wird-oder das Programm bleuibt ewig in der Schleife gefangen.
Sowas z.B. nehme ich, wenn ich ein Programm endgültig stoppen will:
while(1)
{ //hier geht nix mehr}
Da die "1" nie falsch werden kann, wird in dieser Schleife ewig geblieben.
Benutze ich z.B. beim Monstertruck, wenn er endgültig gestoppt werden soll:
Wenn der Akku zu leer ist um sicheren Betrieb zu gewährleisten, oder die falsche SD-Karte eingelegt ist (ich hab auf der richtigen ne Art "Schlüssel-Datei", nur wenn die gefunden wird, startet das Ding überhaupt -> kleine Spielerei).
Bei dir müsst es ungefähr so sein:
while(hindernis_da=1)
{
fahre etwas zurück;
gucke_ob_Hindernis_da_ist(); //extrem wichtig, damit hindernis_da auch umgestellt werden kann, musst du in der Schleife deine Sensoren auch abfragen!
if(hindernis_nicht_mehr_da) // der Teil kann genausogut in der Sensorenabfrage erledigt werden
{ hindernis_da=0;}
}
-
okay, das hab ich mir auch schon gedacht das man bei "while" die schelife beenden muss .... nur wie das dann aussieht das es auch funktioniert ?
in etwa so ?
Code:
void loop()
{
vorward();
{
while(scan_FRONT_MIDDLE = 1)
distance_FRONT_MIDDLE = distance;
if(distance_FRONT_MIDDLE < triggerDistance)
{
backward();
scan_FRONT_MIDDLE();
}
if(distance_FRONT_MIDDLE > triggerDistance)
{
vorward();
}
}
}
-
Ne-also Programme schreiben musst du wirklich noch üben.
Schau dir die Arduino-Referenzen zu den Befehlen mal genauer an.
Insbesondere ein scan_FRONT_MIDDLE wird wohl kaum, oder gar niemals, überhaupt aufgerufen.
Ausserdem hast du vermutlich da die geschweiften Klammern zum dem while() vergessen, somit wird, wenn while() zutrifft, nur die folgende Zeile aufgerufen- aber vermutlich auch die nicht, wenn du Glück hast, merkts der Compiler und schimpft da schon.
Obendrein ist es immer riskant, ein Unterprogramm in sich selber aufzurufen, wie du das da mit vorward() machst.
Nebenbei: gewöhn dir vernünftige Namen an, _merkbare_!
Deine Sache, ob du deutsche oder englische benutzt aber das Wort vorward gibts im englischen nicht, und im deutschen ebenfalls nicht- sowas liest sich echt grauenhaft. Wenn du vielleicht in ein, zwei Monaten noch mal an das Programm musst, kann dich solcher Murks zum weinen bringen. ;)
Bei mir heissen Unterprogramme einfach so:
fahreVorwaerts();
oder
scanneFront();
Da komm ich auch nach nem Jahr noch drauf, was da gemeint sein könnte...
Das Gleiche gilt auch für Variablen, je eindeutiger, umso besser.
-
Das kann so nich funktionieren. forward schreibt sich mit f ! :)
Tschuldigung das musste sein. Das Wort hat mich aus dem Bildschirm raus angesprungen... ;)
-
Das doofe ist-den Compilern ist das völlig Wurst ,bis auf die reservierten Wörter kann man da erfinden, wozu man lustig ist.
Das Hauptproblem haben dann die, die den Sermon mal lesen-und verstehn sollen....
-
@ Rabenauge
ja ich bin noch dabei dies zu lernen, ich mach das noch ned so lang ;-)
Ich brauch halt immer bissle bis es klappt! Okay ich schau mir das an und versuche es zu ändern!
Aber einfach kann man das mit den Sensoren ned programmieren, ich hab das mit "wihle" noch nicht gemacht !!!!
Ist mein erstes mal ^^
Des weiteren leuchtet mir das an deutsche Namen zu vergeben, auch dieser Rat, ist gut - da hast du recht dann kommt man
nicht durch einander und jemand änderst kommt auch damit klar wenn man mir mal unter die Arme greifen will!
Das war der Code der einwandfrei klappt aber halt mit einem Sensor! ( und auch schon mit Deutschen Namen ;-)
Code:
void loop()
{
scan_VORNE_MITTE(); // Abstand Messen
distance_VORNE_MITTE = distance; // Distanz Vorne = Abstand
if(distance_VORNE_MITTE < triggerDistance) // Wenn kleiner als vorgegeben dann reagieren
{
zurueck(); // Zurück fahren
}
else
{
vor(); // Weiter nach Vorne fahren
}
}
- - - Aktualisiert - - -
Das is es auch verstehe kann ich es nicht einfach so schreiben?
Das er einfach so einen nach dem anderen immer und immer wieder abarbeitet?
Natürlich gehts auch mit "while" und so oder sollte ich es so nicht machen ?
Also würde noch mal das gleiche für scan_VORNE_LINKS, scan_RECHTS und scan_LINKS dazu kommen.
Weil wie soll ich sagen? So verstehe ich es ..... in Distanz_VORNE_MITTE schreibt er den Wert hinein was der Sensor für eine
Distanz im Programm scan_VORNE_MITTE ermittelt und wenn der Wert kleiner ist wie in triggerDistanz soll er zurück fahren, drehen und
wieder vor fahren, so verstehe ich diesen Code.
Code:
void loop()
{
scan_VORNE_MITTE();
distanz_VORNE_MITTE = distanz;
if(distanz_VORNE_MITTE < triggerDistanz)
{
zurueck();
}
else
{
vor();
}
scan_VORNE_RECHTS();
distanz_VORNE_RECHTS = distanz;
if(distanz_VORNE_RECHTS < triggerDistanz)
{
zurueck();
}
else
{
vor();
}
}