Kursmaterial: Beispielprogramme

Aus letsgoing
Wechseln zu: Navigation, Suche

Inhaltsverzeichnis

Beispiele

In diesen Kapitel findest du einige Programm-Beispiele. Du kannst sie als “’Steinbruch”’ oder als Nachschlagewerk verwenden. Die meisten Blöcke, die in der Blockreferenz vorgestellt wurden, sind hier in einem Programm integriert. Im Text wird kurz erläutert, welche Funktion ein Block im Programm hat.

Falls LDR-Wert größer als, dann...., sonst ....

setze analoge Variable auf - serial println - falls / sonst - warte ms - serial println

ArduBlock:
Pr Sen LdrFallsLdrWertGroeserDannSonst AB.png

Erläuterung:
Wiederhole fortlaufend: loop-Block: Alles was in der Klammer unter “’mache”’ steht wird nacheinander abgearbeitet. Sobald das Programm unten angekommen ist, fängt es oben wieder an.
Der am Analog-Pin 1 anliegende Wert wird in die Variable ldr geschrieben.
Falls die Variable “’ldr”’ größer als 500 ist, dann setze digital Pin 13 auf HIGH, sonst auf LOW
Warte 200 Millisekunden
Gib auf dem Serial Monitor die Zeichenkette “’Wert ldr”’ gefolgt vom Wert der Variablen “’ldr”’ aus.

blaue RGB dimmen: Werte nur alle 200 ms anzeigen lassen

warte Millis - Unterprogramm

Aufgabe: Der PWM-Wert für die blaue LED soll über die Variable “’farbwert”’ alle 20 ms um 1 erhöht werden. Der momentan erreichte Wert dieser Variable soll aber, der besseren Lesbarkeit willen, nur alle 200 ms auf dem Serial Monitor angezeigt werden.

Problem: Wenn du in das Programm eine Wartezeit (delay) von 200 ms einbaust, dann stockt das Programm an dieser Stelle für 200 Millisekunden. Die Variable “’farbwert”’ wird während dieser Pause nicht weiter hochgezählt. Was tun?

warte Millis: Mit dem Block “’Warte Millis”’ kann man diese Problem lösen. Alles was in diesem Block unter “’mache”’ steht, ist das Pausenprogramm, das permanent abgearbeitet wird. Unter “’Zeit”’ schreibt, man, alle wie viele Millisekunden das Rahmenprogramm ausgeführt werden soll. Das Rahmenprogramm steht unterhalb vom “’warte Millis Block”’.

Unterprogramm: Damit die Sache etwas übersichtlicher ist, wollen wir das Pausenprogramm in ein Unterprogramm auslagern. Wir ziehen den Block “’Unterprogramm”’ in die “’mache-Schleife”’. Dem Gegenstück “’Unterprogramm”’ müssen wir exakt den gleichen Namen geben. Dieser Block hat keine Konnektoren.

Nun zum Unterprogamm:
1. der Farbwert wird um 1 hochgezählt
2. die RGB wird mit dem neuen Wert versehen und somit etwas dunkler leuchten (common Anode)
3. Falls der “’farbwert”’ einen Wert größer als 254 annehmen sollte, wird er auf den Wert Null zurückgesetzt.
4. Das Programm wartet 20 Millisekunden bevor eine neue Schleife durchlaufen wird.

ArduBlock:
Pr Led DimmenSerialprint AB.png

Taster entprellen

setze digitale Variable - logischer Operator nicht - invertieren

Aufgabe: Softwarelösung für das Entprellen ein Tasters / Schalters

Problem:Wenn man auf den Taster drückt, federt er. Das bedeutet der Kontakt wird nicht direkt geschlossen, sondern in Bruchteilen von Sekunden mehrfach auf und zu gemacht, bis er endlich ganz geschlossen ist. Dadurch kommt es zu unerwünschten Effekten: z.B. obwohl man nur einmal auf den Taster gedrückt hat, wird die LED erst ein und dann gleich wieder ausgeschaltet.
Wenn man diesen Effekt vermeiden will, muss man nach dem Schließen des Kontakts ca. 100ms warten, bis das Federn aufgehört hat. Der englische Begriff für das Entprellen lautet “’debounce”’. Eine einfache Variante besteht darin eine Pause (delay) von 100 ms einzubauen.

millis: Da wir das Programm nicht wirklich anhalten wollen, arbeiten wir mit der Funktion “’millis”’. Mit dem Befehl “’millis”’ wird nach dem Programmstart eine Stoppuhr gestartet, die die Millisekunden zählt. Im folgenden Programm wird unser Schalterprogramm nur dann gestartet, wenn die verstrichene Zeit größer als die festgelegt Pause (debouceDelay) ist.

ArduBlock:
Pr Sen TasterEntprellen AB.png

Servo, Servo Trennen

Servo Winkel einstellen, Servo verbinden, Servo trennen

ArduBlock:
Pr Rov ServoWinkelVerbindenTrennen AB.png

Erläuterung:
Der Servo hat drei Kabel: Das rote kommt an 5 Volt, das schwarze an Gnd, das orange bzw. weiße an einen Pin (hier Pin8).
Manche Servos brauchen mehr als 500 mA Strom. Der Arduino liefert über seinen Spannungswandler jedoch nur maximal 500 mA. Auf der Platine des letsgoING-Fahrzeugs kann man daher die Servos direkt über die Batteriespannung betreiben. Dazu muss die Pin-Brücke an Pin 8-2 auf BATT gesetzt werden. Nun kannst du den Servo an D8-2 anschließen. Signal kommt auf 1.

Der Servo dreht auf 0 Grad. Nach einer Wartezeit von 1000 ms dreht er auf 180 Grad. Er hält aktiv diese Position bis wir ihn mit dem Block “’Servo Trennen”’ freischalten. Nun lässt er sich für eine Sekunde mit der Hand freidrehen, bevor das Programm wieder von vorne anfängt.
Den Block “’Servo verbinden”’ brauchen wir nur, wenn im Programm der “’Servo trennen”’-Block vorkommt. Standardmäßig schreibt der Block “’Servo drehe auf Grad”’ den “’Servo verbinden Befehl”’ ins Setup des Programms. Da dies jedoch nur einmal ausgeführt wird, würde in unserem Fall beim 2. Durchlauf nichts mehr passieren.

LED-Balken hochzählen

for-Schleife - led bar - analoge Variable - Serial print

Aufgabe: Zu Beginn soll kein Balken leuchten. Im Sekundentakt soll ein Balken hinzukommen. Wenn alle leuchten, soll das Programm von vorne beginnen.

led bar: Die led bar wird mit Pin 6 (gelbes Kabel) und Pin 7 (weißes Kabel) verbunden. Rotes Kabel an 5V, Schwarzes Kabel an 0V.

Untergrenze und Obergrenze festlegen
Wenn man als Untergrenze 0 und als Obergrenze 10 festlegt, dann werden die Balken gleichmäßig auf diese Werte verteilt: Null ist kein Balken – 10 sind 10 Balken.


ArduBlock:
Pr Led LedBarBalkenHochzaehlen AB.png

Quadrat fahren - gefahrene Strecke messen

Fahre Distanz, drehe Winkel, Messung starten, Distanz ermitteln, bremsen

Aufgabe Teil A: Das Fahrzeug soll ein Quadrat mit Seitenlänge 50 cm fahren.

Lösung:
Im “’Wiederhole 4 mal - Block”’ stehen die Anweisungen
“’fahre 50cm mit Geschwindigkeit 50 vorwärts (HIGH)”’
“’drehe um 90 Grad mit Drehgeschwindigkeit 50 im Uhrzeigersinn (HIGH)”’.

Aufgabe Teil B: Das Fahrzeug soll während der Fahrt über die LED-Bar die gefahrene Strecke anzeigen. Ein Balken soll 10 cm gefahrene Strecke markieren.

Lösung:
Messung starten - Fahrzeug starten: Mit dem Block “’Messung starten”’ wird der Startwert jetzt auf Null gesetzt. Anschließend wird über den Block “’ Fahre mit Geschwindigkeit 50 und Richtung HIGH”’ das Fahrzeug in Bewegung gesetzt.

solange-Schleife: Das Fahrzeug soll nun solange fahren, wie die Variable “’Distanz gefahren”’ kleiner als 100 cm ist. Die tatsächlich gefahrene Strecke muss in der “’solange -Schleife”’ ständig neu in die Variable “’Distanz gefahren”’ eingelesen werden. Dies erreicht man, indem man die analoge Variable “’Distanz gefahren”’ auf den Block “’Distanz ermitteln”’ setzt.

led bar: Als untere Grenze wählt man bei der led bar den Wert 0. Als obere Grenze den Wert 100. Als Wert wird die Variable “’Distanz gefahren”’ eingetragen.

Schleife verlassen: Wenn die gefahrene Distanz nicht mehr kleiner als 100 cm ist, kann das Programm die “’solange-Schleife”’ verlassen. Das Fahrzeug wird mit dem Block “’bremsen”’ aktiv gestoppt. Es rollt nicht aus!. Nach 5 Sekunden Pause beginnt das Programm von vorne.

Pr Rov QuadratFahren AB.png

Pr Rov StreckeMessen AB.png

Kurven fahren - fahre Kurve Distanz

Aufgabe: Das Fahrzeug soll mit dem “’Fahre Kurve Distanz Block”’ bestimmte Strecken fahren

Mit dem Fahre-Kurve-Block legt man sowohl die Vorwärtsbewegung (Translation) als auch die Drehbewegung (Rotation) fest. In der LGI_Drive-Library werden aus diesen beiden Bewegungen die Geschwindigkeiten für die beiden Motoren berechnet.

Mit diesem Block können vom Geradeauslauf über weite und enge Kurven bis hin zur Drehung um die eigene Achse alle Bewegungen ausgeführt werden.
Bei einer reinen Drehbewegung bewegt sich ein Motor mit der eingegebenen Geschwindigkeit vorwärts, der andere rückwärts. Die resultierende Bewegung ergibt sich aus der Addition der Vorwärtsbewegung und Drehbewegung.

Beispiel:
Will ich, dass mein Fahrzeug eine “’weite Kurve”’ fährt, muss es sich leicht drehen und mit mittlerer Geschwindigkeit vorwärts fahren. Dazu gebe ich der Drehbewegung den Wert 10 [-100 bis 100] und der Vorwärtsbewegung den Wert 50 [-100 bis 100].
Die Berechnung sieht dann so aus:

Motor 1 = Vorwärtsbewegung + Drehbewegung = 50 + 10 = 60
Motor 2 = Vorwärtsbewegung - Drehbewegung = 50 - 10 = 40

a)Fahre 50 cm vorwärts
b)Fahre 50 cm rückwärts
c)Fahre 50 cm in einem weiten Bogen vorwärts nach links
d)Fahre 50 cm in einem engeren Bogen vorwärts nach links
d)Fahre 50 cm in einem leichten Bogen rückwärts in die Ausgangsposition
e)Drehe dich um die eigene Achse gegen den Uhrzeigersinn 50 cm
f)Drehe dich um das linke Rad 50 cm
g)Drehe dich um die eigene Achse im Uhrzeigersinn 50 cm

ArduBlock:
Sw Ab FahreKurveBeispiele.png

Neopixel QTouch

Aufgabe: Beim Berühren von Q-Touch1 soll die Neopixel-GRB rot leuchten, bei Berühren von Q-Touch2 soll sie aus gehen.

Mit den Blöcken werden automatisch die beiden Libraries Adafruit_NeoPixel.h und LGI_QTouch.h einbunden.

a) Setup für Neopixel: Wir verwenden keine RGB-Neopixel, sondern eine GRB-Neopixel (green, red, blue) mit 800kHz. Im Beispiel sind die Neopixel mit Pin 8 verbunden. Es wird hier nur ein Pixel verwendet.

b) Die Pins der beiden Q-Touch-Buttons werden im Setup festgelegt: Q-Touch-Button2 hängt an Pin1 und hat Pin2 als Partnerpin. Q-Touch-Button2 hängt an Pin2 und hat Pin1 als Partnerpin.

c) Über den Serialprint-Befehl werden die beiden Offset-Werte einmalig angezeigt. Nach einem Reset hat man 1000 ms Zeit den SerialMonitor einzuschalten.

d) Falls Q-Touch-Button1 berührt, dann soll die GRB-Neopixel rot leuchten.

d) Mit dem Block “’Daten an Pixel”’ senden werden die Informationen wirksam.

e) Falls Q-Touch-Button2 berührt, dann soll die GRB-Neopixel ausgehen.

f) Mit dem Block “’Daten an Pixel”’ senden werden die Informationen wirksam.


ArduBlock:
Pr Neo NeopixelAnschalten QTouch AB.png

Bluetooth Kommunikation

Aufgabe: Vom Monitor des Tablets sollen Daten an den Arduino gesandt werden. Wenn man A sendet, dann soll der Arduino AAA zurückgeben. Wenn man 
B sendet, dann soll der Aruino BBB zurücksenden. Vor dem Übertragen des Programms muss du das BT-Modul ausstecken!


a) Setze in den Setup den Block ”Setup Bluetooth HWSerial”
b) Wenn du das Grove-Modul verwendest, dann füge den Block ”BT Grove Starten und WartenBisVerbunden HW Serial” ein
c)Setze Char-variable ”Buchstabe” auf ”BT read HWSerial Monitor”
d) falls “’Buchstabe”’ == A, dann schreibe AAA
e) falls “’Buchstabe”’ == B, dann schreibe BBB
Nach dem Übertragen des Programms muss du das BT-Modul wieder bei Pin0 (gelb) und Pin1 (weiß) einstecken!
Bevor du Daten empfängst, musst du deinen Arduino und das BT-Modul Resetten!

ArduBlock:
Pr Bto BTSerialprint AB.png

Arbeit mit dem Programmablaufplan

Hier kann kannst du den PAP-Designer umsonst herunerladen:
friedrich-folkmann.de/papdesigner/Hauptseite.html

Mit einem Programmablaufplan kann man zeigen, welche Vorgänge nacheinander ausgeführt werden. Die Aufgabenstellung liegt meist als Text vor.

1. Lies diesen Text sehr aufmerksam durch.
2. Unterstreiche alle Schlüsselworte: Schlüsselworte sind alle Begriffe, die Auskunft darüber geben, wann was unter welchen Bedingungen wie oft geschieht. Denke daran, dass unser Mikrocontroller das Programm Zeile für Zeile abarbeitet.
Der Programmablauf wird auch als Flussdiagramm bezeichnet. Man kann sich vorstellen, dass man oben in ein Boot einsteigt und mit dem Boot einen Fluss herunter treibt.

Verzweigung

PAP Symbol:

Sw Pap Verzweigung.png

Verzweigung
In einem Programm kann es immer wieder zu einer Verzweigung kommen, an der prinzipiell zwei Möglichkeiten offen stehen: Ja oder Nein! Wie lautet
die Entscheidungsfrage?
Beispiele:
Zählschleife: Ist die Zählvariable größer als der Sollwert, dann Schleife verlassen.
Variable TRUE oder FALSE: Ist eine Variable TRUE, dann den ja-Weg gehen, sonst den FALSE - Weg gehen.
Variable TRUE: Nur wenn die Variable TRUE ist, dann abbiegen.
Variable größer als: Nur wenn Varialbe größer als bestimmter Wert oder andere Variable, dann abbiegen

Eingabe

PAP Symbol:

Sw Pap Eingabe.png
Eingabe
Mit dem Eingabesymbol werden Vorgänge erfasst, die von außen kommen. z.B. wenn ein Wert über einen Sensor eingelesen wird.

Ausgabe

PAP Symbol:

Sw Pap Ausgabe.png
Ausgabe
Mit dem Ausgabesymbol werden Vorgänge erfasst, die nach draußen gehen: z.B. wenn Werte auf dem Serial Monitor angezeigt werden sollen oder eine
LED ein- oder ausgeschaltet wird. Oder ein Motor mit einer bestimmten Geschwindigkeit sich drehen soll.

Vorgang

PAP Symbol:

Sw Pap Vorgang.png
Vorgang
Mit dem Symbol “’Vorgang”’ werden z.B. Berechnungen oder Operationen gekennzeichnet: z.B. setze eine Variable auf folgenden Wert oder
invertiere einen Wert.


Die Symbole kannst du mit Pfeilen verbinden. Auch Schleifen werden mit Pfeilen gekennzeichnet. Bei Arduinoprogrammen gibt es in der Regel kein Ende. Der Block “’Wiederhole fortlaufend”’ beinhaltet entweder die Anweisung “’falls i kleiner Unendlich”’ oder die Anweiung “’solange TRUE”’, was immer der Fall ist.

Meine Werkzeuge
Namensräume

Varianten
Aktionen
Navigation
Projekte
letsgoING Material
letsgoING Hardware
letsgoING Software
Sensoren
Aktoren
LED
Bluetooth
Wissen
Werkzeuge