Du hast 3 Sensoren: nennen wir sie mal us1, us2, us3.
us1 - ist der Linke
us2 - vorne mittig
us3 - ist der rechte
"ein Hinderniss anzeigt" steht für "der Schwellwert wurde überschritten" (dies kann später noch mit mehreren Schwellwerten erweitert werden)
wenn us2 ein Hinderniss anzeigt, soll was passieren?
wenn us1 ein Hinderniss anzeigt soll solange nach rechts gedreht werden bis kein Hinderniss mehr angezeigt wird.
Wenn us1 und us2 ein Hinderniss anzeigen soll solange nach rechts gedreht werden, bis Beide kein Hinderniss mehr anzeigen.
wenn us3 ein Hinderniss anzeigt soll solange nach links gedreht werden bis kein Hinderniss mehr angezeigt wird.
Wenn us3 und us2 ein Hinderniss anzeigen soll solange nach links gedreht werden, bis Beide kein Hinderniss mehr anzeigen.
wenn us1, us2 und us3 ein Hinderniss anzeigen soll solange rückwärts gefahren werden, bis entweder us1 oder us2 kein Hinderniss mehr anzeigen und dann um mindestens 60° gedreht werden.
Wenn us1 und us3 ein Hinderniss anzeogen aber nicht us2, soll was passieren?
wir haben jetzt also 7 Fälle die eine Aktion benötigen.
und 3 Eingänge (us1, us2, us3) die zu verarbeiten sind.
Werten wir eine Detektion an us1 mit 1,
an us2 mit 2 und an us3 mit 4,
bekommen wir folgende Wahrheitstabelle
Das könnte dann so in etwa implementiert werdenCode:us3|us2|us1 ---+---+--- 4 | 2 | 1 ---+---+--- 0 | 0 | 0 = 0 kein Handlungsbedarf ---+---+--- 0 | 0 | 1 = 1 nach rechts drehen ---+---+--- 0 | 1 | 0 = 2 Was soll passieren? ---+---+--- 0 | 1 | 1 = 3 stark nach rechts drehen ---+---+--- 1 | 0 | 0 = 4 nach links drehen ---+---+--- 1 | 0 | 1 = 5 was soll passieren? ---+---+--- 1 | 1 | 0 = 6 stark nach links drehen ---+---+--- 1 | 1 | 1 = 7 Rückwärts fahren und dann um mindestens 60° drehen ---+---+---
Das ist ein Denkanstoß und kein Code zum stur Abtippen, da ich mich an keine Sprachsyntax halte sondern einen Pseudocode nutze der nur das Konstrukt verdeutlichen soll.Code:if us1 < 16 then var1 = 1 else var1 = 0 if us2 < 16 then var2 = 2 else var2 = 0 if us3 < 16 then var2 = 4 else var2 = 0 var = var1 + var2 + var3 switch (var) case 1 rechts drehen break case 3 rechts drehen break case 4 links drehen break case 6 links drehen brake case 7 rückwärts merker7 = 1 default if merker7 == 1 then rechts drehen 60° merker7 = 0 else vorwärts
Die hier nicht berücksichtigten case(es) kann man natürlich (besser, sollte man) auch noch füllen, da alle nicht behandelten Fälle im Default landen.
bei einem System mit 2 Schwellwerten könnte man das erweitern:
Die entstehenden Fälle kannst Du problemlos in eine Tabelle eintragen und so wie ich es oben gezeigt habe den jeweiligen Zahlenwert errechnen.Code:if us1 < 16 then var1 = 8 else if us1 < 32 then var1 = 1 else var1 = 0 if us2 < 16 then var2 = 16 else if us2 < 32 then var2 = 2 else var2 = 0 if us3 < 16 then var3 = 32 else if us3 < 32 then var3 = 4 else var3 = 0
So kann man z.B. bei einem etfernteren Hinderniss schon eine kleine Kurskorrektur beginnen ohne die Geschwindikeit zu verlangsamen.
Reicht das nicht, kommt man dem Hinderniss ja immer näher und irgendwann gilt die Bedingung für das nahe Hinderniss, wo man dann eventuell sogar stoppt und im Stillstand dreht.
Kann man natürlich auch für Tastatur nehmen, aber Abfragen sei es nun IF-THEN oder SWITCH-CASE,
ist das eigentlich wurst welchen Variablentyp man abfragt.
Es ist eine Kontrollstruktur. Und die ist unabhängig von dem was man damit füttert.
Wenn ich ein Blech mit 4 Verschieden großen Löchern drin habe, ist dem das auch egal ob ich durch die Löcher Äpfel, Birnen oder Mandarinen fallen lasse.
Wenn ich vom kleinsten Loch zum größten gehe wird einfach alles nach Größe sortiert.
So ist es auch mit den Abfragen. Bedingung erfüllt? Ja/Nein, fertig.
Schau einfach mal hier:
http://www.arduino-tutorial.de/category/programmieren/








Zitieren


Lesezeichen