Tinkercad Projekt 5 - Orakel

Das Orakel von Delphi

Stelle dem Orakel eine Ja/Nein Frage im Serial Monitor. Das Orakel gibt dann eine zufällige Antwort, indem es die Servos auf die Antwort zeigen lässt.

Schwierigkeitsgrad: einfach

Starte die Simulation, zoome ein bisschen hinsein (sodass sich die Textfelder nicht mehr so stark gegenseitig überschneiden) und öffne den "Code"-Editor. Öffne den Serial Monitor, gibt eine Ja/Nein-Frage ein und bestäte mit ENTER oder mit der Schaltfläche "Senden". Schließe den "Code"-Editor und sieh dir die Antwort an:



Für dieses Projekt musst du folgendes können:
  • Servo ansteuern (Übung 16)
  • Text vom Serial Monitor empfangen (Übung 14)
  • Verzweigungen (Übung 8)
  • Rechnen mit Variablen (Arithmetik) (Übung 9)
  • Funktionen (Übung 12) und Prozeduren (Übung 10) helfen dir das Programm übersichtlich zu halten.
  • Switch-Case ist auch eine gute Alternative zu if-elseif-elseif-else (Übung 14)
Das Orakel ist natürlich nicht allwissend und baut die Antworten nur zufällig zusammen. Die Stellpositionen der Servos werden dafür nach Eingabe der Frage zufällig bestimmt. Dafür kannst du die random()-Funktion verwenden:
https://www.arduino.cc/reference/de/language/functions/random-numbers/random/

int zufallszahl = random(kleinste_zahl, groesste_zahl);

random() liefert dir eine Zufallszahl zwischen kleinste_zahl und groesste_zahl. Wenn man diesen Wertebereich allerdings sehr klein fasst, sind die Zahlen nicht mehr wirklich zufällig. Es ist also besser einen großen Bereich vorzugeben und die Zufallszahl dann danach erst kleiner zu skalieren (siehe z.B. Übung 13). random() wird zufälliger, wenn man vorher folgenden Befehl ausführt:

randomSeed(analogRead(0));

Mit random() kannst du also die nächste Zufallsposition der Servomotoren bestimmen. Im Demo-Entwurf stehen die Textfelder auf den Servopositionen 12°, 57,° 91,° 125,° und 170°. Genau diese Zahlen wird random() nicht ausspucken. Du musst dir also einen Trick überlegen wie du von einer Zufallszahl zu einer dieser Winkel kommst. Im Beispiel wird die Zufallszahl einfach so herunter skaliert, dass nur die Zahlen 1 bis 5 herauskommen können. Bei 1 wird dann Winkel 12° gestellt, bei 2 57° usw. Da gibt es aber auch andere Lösungsmöglichkeiten.

Das ganze machst du 3x, jeweils für jeden Servomotor.

Als Einstieg kannst du für jeden Servo ein Objekt erstellen und ausprobieren, ob du deren Winkel einzeln einstellen kannst.

Als nächstes lässt du zufällige Winkel errechnen, um die Servos zu stellen.

Die Servos sollen ja nur ihre Position verändern, wenn der Spieler eine Frage eingegeben hat. Das Demo-Programm ist recht simpel und schaut gar nicht drauf, was genau eingegeben wurde und ob es überhaupt eine Frage ist. Hauptsache, es wurde irgendetwas im Serial Monitor eingegeben und an den Arduino gesendet.

Der Text landet dann in der Empfangs-Warteschlange. Das Programm muss also so lange warten bis sich etwas in der Warteschlange befindet und dann erst die Winkel der Servos abhändern. Dafür bietet sich eine Schleife an. Während die Servos sich bewegen, sollte das Programm verzögern. Versuche das zu programmieren.

Jetzt ist es allerdings so, dass die Servos sich automatisch die ganze Zeit weiter bewegen, sobald man mal irgendetwas im Serial Monitor eingegeben hat.

loop() führt aus:
  1. Die Empfangs-Warteschlange ist am Anfang leer. Die Servos halten still und das Programm wartet darauf, dass etwas eingegeben wird.
  2. Die Empfangs-Warteschlange enthält Zeichen. Die Servos bewegen sich.
  3. Die Empfangs-Warteschlange enthält Zeichen. Die Servos bewegen sich.
  4. Die Empfangs-Warteschlange enthält Zeichen. Die Servos bewegen sich.
  5. usw.
Die Warteschlange muss also geleert werden. Das machst du, indem du etwas aus ihr ausliest (z.B. Serial.read()). Nachdem sich die Servos bewegt haben, musst du also so lange aus der Warteschlange lesen bis sie leer ist.

Falls du die Schaltung nicht selbst aufbauen willst, hier der Starter:

Du kannst dir natürlich auch eigene witzige Textschnipsel ausdenken, die das Orakel zusammensetzen soll.

Kommentare

Beliebte Posts aus diesem Blog

Tinkercad Übung 6 - LED mit Taster ansteuern

Tinkercad Übung 11 - LED dimmen

Tinkercad Übung 15 - Ultraschallsensor auslesen