
Zitat von
zerebrator
Dazu habe ich 3 Ultraschalsensoren Links ; Mitte ; Rechts
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
Code:
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 könnte dann so in etwa implementiert werden
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
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.
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:
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
Die entstehenden Fälle kannst Du problemlos in eine Tabelle eintragen und so wie ich es oben gezeigt habe den jeweiligen Zahlenwert errechnen.
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.

Zitat von
zerebrator
Ist die Switch Case Anweisung nicht für beispielweise Tastatur eingaben ?
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/
Lesezeichen