|
[ Home
] [ Seitenende ] [ Teil 2a ] [ Teil 2b ] |
|
|||||
|
Roboter-Auto „Joy-Car“ - Teil 1 Es werde Licht beim Roboter-Auto
„Joy-Car“ Das Roboter-Auto „Joy-Car“
ist
zusammengebaut und hat den ersten Funktionstest
erfolgreich bestanden. Obwohl, einen Funktionstest zum Testen aller verbauter
Komponenten wie z.B. aller Sensoren (2 Ultraschall-Sensoren für die
Entfernungsmessung, 3 Infrarot-Sensoren für das Line-Tracking, 2
Infrarot-Sensoren für die Hinderniserkennung und 2 Infrarot-Sensoren für die
Geschwindigkeitserfassung der beiden Antriebsmotoren) sowie aller Rot-Grün-Blau-LEDs (je 2 Doppel-LEDs an der Vorder- und
je 2 Doppel-LEDs an der Rückseite) gibt es nicht, sodass wir die einzelnen
Komponenten selbst testen müssen. Doch zunächst müssen wir den „Joy-Car“-Roboter in Betrieb nehmen,
indem wir die 4 Mignon Batterien
vom Typ „AA“ mit der richtigen Polung in das 6 Volt Batteriefach einsetzen. Damit
das in der Batterie
befindliche elektro-chemische Kraftwerk gegen Auslaufen des stark ätzenden Elektrolyten
geschützt ist, befindet sich dieses in einem elektrisch leitenden
Metallbecher (= Kathode als Minuspol „-“). In der Mitte des Metallbechers ist
ein mehrere Millimeter dicker Stift (= Anode
als Pluspol „+“) in der Größe dreier
Streichhölzer verbaut, der oben als kleiner Knubbel („+“) aus dem Becher herausragt. Wenn man alle Mignon-Batterien mit der richtigen
Polung in das Batteriefach einsetzt, dann ergeben
diese wegen der Reihenschaltung
zusammen eine Batteriespannung
UBatt
= 4 x 1,5 V = 6 V. Dabei entspricht der
spiralförmige Federkontakt
im Batteriefach dem Minuspol
„-“
einer Mignon-Batterie. Da
Batterien in der Regel nicht wieder aufladbar sind, bezeichnet man
diese auch als Primärzellen. Im
Gegensatz dazu bezeichnet man wieder aufladbare „Batterien“ als Sekundärzelle, auch Akkumulator oder
Akku genannt. Obwohl das Batteriefach des „Joy-Car“-Roboter über einen eigenen
Ein-/Aus-Schiebeschalter verfügt, benutzen wir diesen nicht, da man zur
Bedienung stets das Batteriefach
aus der Halterung herausnehmen muss. Stattdessen benutzen wir den kleinen Ein-/Aus-Schiebeschalter des „Joy-Car“-Mainboards (siehe Seite 47 der PDF-Datei
„MB-Joy-Car_Anleitung_2021-04-30.pdf“): (Zum Vergrößern bitte
auf das Bild klicken!) Da die RGB-LEDs und die Antriebsmotoren recht viel Strom
verbrauchen, werden wir das an die „+“
und „-“-Klemmen angeschlossene Batteriefach „BAT“ später abklemmen und stattdessen eine „USB 2.0“-Stecker
in Form eines kleinen Adapters
anklemmen, sodass sich z.B. eine Powerbank zwecks
ausdauernder Energieversorgung anschließen lässt (siehe blaue Schraubklemmen im roten Kasten). An die „+“
und „-“-Klemmen der blaue Schraubklemmen mit der Beschriftung
„BAT“
lässt sich nämlich eine externe Stromversorgung
mit einer Spannung von UBat = 4,5 V … 9 V anschließen (siehe Spezifikationen). - Auf der „Joy-Car“-Webseite
gibt es eine Garage mit Anleitungen, wo man alles findet, was man wissen
muss. Angefangen vom Zusammenbau, über Erklärungen, bis hin zur Programmierung und Einrichtung des
Joy-Cars. Dort kann man sich die ZIP-Archiv-Datei
„MakeCode-Tutorials.zip
(11,0 MiB)“ kostenlos auf den heimischen PC oder Notebook herunterladen
und in das Verzeichnis „MakeCode-Tutorials“ entpacken. Dort
wechseln wir ins Unterverzeichnis „07_led“ und laden das erste „MakeCode“-Programm
„JoyCar-Tutorials-07-led01.hex“ in den „BBC micro:bit“-Mikrocontroller: (Vergrößern: auf das
Bild klicken! | Programm „JoyCar-Tutorials-07-led01.hex“)
Wir schalten die „micro:bit“-Entwicklungsumgebung von der Microsoft „MakeCode“-Block-Programmierung auf die (Mikro-) „Python“-Programmierung um: (Vergrößern: auf das
Bild klicken! | Programm „JoyCar-Tutorials-07-led01.py“) Diesbezüglich stellt sich die Frage, weshalb
wir ohne Not in die (Mikro-) „Python“-Programmierung wechseln. Ganz
einfach: a)
weil wir zweisprachig
programmieren, b)
weil es sich bei „Python“
um eine höhere Programmiersprache
handelt und c)
weil sich der Quellkode
von „Python“ mittels der künstlichen
Intelligenz (KI) Wenn man also den Quelltext des (Mikro-) „Python“-Programms mittels „Copy &
Paste“ in die Texteingabezeile von ChatGPT eingefügt, dann liefert die KI von OpenAI folgende Antwort: (Vergrößern: auf das
Bild klicken! | Programm „JoyCar-Tutorials-07-led01.py“) Da das „strip“-Statement in die „dauerhaft“-Endlosschleife programmiert wurde,
könnte man meinen, dass das Statement
unendlich oft wiederholt werden muss, damit die 8 LED NeoPixel-Streifen ununterbrochen leuchten. (Zum Vergrößern bitte
auf das Bild klicken!) Darüber
hinaus meint die KI von ChatGPT, dass es zwischen jedem Statementaufruf eine Verzögerung von
einer Sekunde gibt, die letztlich den Regenbogen-Effekt mit dem Farbwechsel
herbei führt.
Gäbe es
aber zwischen jedem Statementaufruf
eine Verzögerung von einer Sekunde nebst Farbwechsel, dann würde jede einzelne LED-Anzeige deutlich wahrnehmbar und störend flackern! Wie es im
obenstehenden „strip“-Statement heißt, bezieht sich der Regenbogen nur auf die Regenbogenfarben und nicht darauf, dass dieser
effektvoll glitzert oder sich dessen Farbverlauf fortwährend ändert. Soweit zum Verständnis des Regenbogens. Wenn
man sich den obenstehenden Quellkode des Programms
„JoyCar-Tutorials-07-led01.py“
anschaut, (Zum Vergrößern bitte
auf das Bild klicken!) dann stellt man fest, dass die acht NeoPixel mittels des „strip“-Statements nach dem Programmstart im „micro:bit“-Rechner zunächst
konfiguriert, initialisiert und über den Port
„Pin P0“ angesteuert(!)
werden: (Zum Vergrößern bitte
auf das Bild klicken!) Dabei wird mittels der sogenannten Instanziierung
das Objekt
namens „strip“ erzeugt und mittels
des „strip“-Objekts die Programm-Bibliothek (= Befehlssammlung), engl. „library“, des
„NeoPixel“-Herstellers „adafruit“ verfügbar gemacht: 1.
Und zwar mit dem ersten „strip“-Statement <strip = neopixel.create(DigitalPin.P0, 8, NeoPixelMode.RGB)> 2.
Mit dem zweiten „strip“-Statement <strip.show_rainbow(1, 360)> werden dann die acht RGB-LEDs aufgesteuert, sodass
diese hell leuchten. Dabei erfolgt die Stromversorgung der acht RGB-LEDs wegen der größeren
Vorsorgungsspannung nebst Stromstärken über das „JoyCar“-Mainboard: (Zum Vergrößern bitte
auf das Bild klicken!) Wegen der „Endlosschleife“ mit der Funktion
„on_forever“ meint die KI von ChatGPT, dass das zweite „strip“-Statement <strip.show_rainbow(1, 360)> immer wieder neu gestartet d.h. aufgerufen wird, sodass
es zwischen den Aufrufen des Statements zwangsläufig jeweils zu einer Ladepause
von einer Sekunde kommt, da das Statement stets auf’s Neue in den Arbeitsspeicher des „micro:bit“-Rechners geladen und von dort ausgeführt werden muss: >> Das Skript definiert dann eine Funktion „on_forever“, die einen
Regenbogen-Effekt auf dem LED-Streifen anzeigt, Wir wissen aber inzwischen, dass es beim
fortwährenden Ausführen der „on_forever“-Funktion eben zu keiner Ladepause von einer
Sekunde kommt, was die Vermutung nahe legt, dass es nicht
wirklich des fortwährenden Aufrufen des Statement
<strip.show_rainbow(1, 360)> bedarf: (Vergrößern: auf das
Bild klicken! | Programm „joy-car_teil_01_prog_02.hex“) Und siehe
da, das Statement <strip.show_rainbow(1, 360)> muss nicht fortwährend in der „Endlosschleife“ mit der Funktion „on_forever“ ausgeführt werden, um die acht RGB-LEDs ununterbrochen leuchten zu lassen! Darüber hinaus lässt sich das ununterbrochene
Leuchten der acht RGB-LEDs aus Gründen der Energieersparnis auch nach fünf
Sekunden mittels der beiden Statements 1.
Statement <strip ausschalten> 2.
Statement <strip anzeigen> wieder ausschalten! Dabei dienst das erste Statement wieder der Konfiguration bzw. der Initialisierung und das zweite Statement der Ausführung! Wir geben den geänderten und erweiterten Quelltext des (Mikro-) „Python“-Programms (Vergrößern: auf das
Bild klicken! | Programm „joy-car_teil_01_prog_02.py“) wieder mittels „Copy
& Paste“ in die Texteingabezeile von ChatGPT ein, um uns die
Funktionsweise des Programms wie folgt erklären zu lassen: (Zum Vergrößern bitte
auf das Bild klicken!) Wenn man sich die Hardware eines sogenannten Regenbogen-Gerätes anschaut, (Zum Starten des Videoclips bitte auf das Bild
klicken!) dann wird schnell deutlich, wie das Regenbogenmuster mittels der zehn
RGB-LEDs auf dem Vollkreis von 360o abgebildet wird.
Dabei erfolgt der umlaufende Farbwechsel der RGB-LEDs wegen der Trägheit
des menschlichen Auges sehr zügig, sodass ein kompletter Farbwechselumlauf weniger als zwei Sekunden dauert. Diesbezüglich lässt sich das Farbspektrum des Regenbogenmusters mittels zweier Parameter wie folgt festlegen: Statement <strip.show_rainbow(0, 360)> Dabei legt man mit dem ersten Parameter = 0 fest
mit welchem Wert das Farbspektrum des Regenbogenmusters starten soll und mit zweiten Parameter = 360
legt man fest, wo das Farbspektrum enden soll: (Vergrößern: auf das
Bild klicken! | Programm „joy-car_teil_01_prog_03.hex“) Wie man im obenstehenden Quellkode unschwer
sieht, wurde die Helligkeit der RGB-LEDs aus Energiespargründen maßgeblich auf den Wert 32
reduziert, um auf diese Weise zu erreichen, dass die vier 1,5 Volt Mignon-Batterien länger durchhalten. Darüber hinaus wurde das „strip“-Statement <strip.show_rainbow(0, 359)> in die <for Index von 0 bis 359> Schleife verlagert, um zu zeigen, wie sich das volle Farbspektrum, schrittweise über alle RGB-LEDs verteilt, in weniger
als eine Sekunde aufbaut. Am Ende des Programms wird der „LED-Streifen“, engl. „strip“,
automatisch ausgeschaltet, um Energie
zu sparen. Dabei wird der Ausschaltvorgang mit dem ersten
Statement initialisiert 1.
Statement <strip ausschalten> 2.
Statement <strip anzeigen> und erst mit dem zweiten Statement umgesetzt, d.h. veranlasst! ‚Als Nächstes wandeln wir den Quellkode des „MakeCode“-Programms um in den von (Micro-) Python und erweitern
das bisherige Programm um die Index-Anzeige, um auf diese Weise herauszufinden, ob der Index bei 0
oder 1 zu zählen anfängt. Dazu muss man wissen, dass die Zahl null
in der Mathematik und in der Informatik auch eine Zahl ist „mit der man rechnen muss“
und rechnen kann. Wenn also das Regenbogen-Farbspektrum von 360
Grad programmiertechnisch umgesetzt werden soll, dann muss man in der Schleife den Wertebereich
von 0 bis 359 programmieren. Der Knackpunkt im Kopf der <for … next>-Schleife ist aber der, dass sich der Index im Wertebereich bis 360 befinden muss! Dabei
befindet sich der Wert 359 im Wertebereich [ bis 360 ], während sich der Wert 360
bereits außerhalb des Wertebereichs
[ bis 360 ] befindet: (Vergrößern: auf das
Bild klicken! | Programm „joy-car_teil_01_prog_04.py“) Wichtig zu wissen ist also, dass der Schleifenzähler Index der <for … next>-Schleife beim Index = 0
beginnt und beim Index = 359 aufhört. Und zwar mit dem Wertebereich [ 0, …, 359 ], was nach Adam Riese insgesamt 360 verschiedenen Werten entspricht! Interessant ist bei dem obenstehenden Programm
noch, dass das Farbspektrum des Regenbogens mit dem Index = 0
beginnt, sodass alle acht RGB-LEDs rund herum rot leuchten. Demzufolge wird das Farbspektrum des Regenbogens erst mit dem Index
= 1 gestartet. Wenn man also erreichen will, dass
alle acht RGB-LEDs sofort mit dem Farbspektrum des Regenbogens
leuchten, dann muss man dafür sorgen, dass das „strip“-Statement mit dem Farbspektrum nicht
bei 0 beginnt, sondern bei 1:
Statement <strip.show_rainbow(1, Index) Beim nachfolgenden Programm „joy-car_teil_01_prog_05.hex“
sieht man, dass das Farbspektrum des Regenbogens tatsächlich mit dem Index = 0
beginnt, sodass alle acht RGB-LEDs rund herum zunächst
rot leuchten. Beim zweiten
Schleifendurchlauf mit dem Index = 1
allerdings leuchten dann alle acht RGB-LEDs in den Regenbogenfarben: (Vergrößern: auf das
Bild klicken! | Programm „joy-car_teil_01_prog_05.py“) Im
Zusammenhang mit dem Startwert Index = 1 für das bunte Farbspektrum des Regenbogens
könnte man auch auf die Idee kommen und den Schleifenzähler mit dem Index-Startwert der <for …
next>-Schleife beim Index = 1 wie folgt beginnen zu lassen: (Vergrößern: auf das
Bild klicken! | Programm „joy-car_teil_01_prog_06.py“) Wenn man
das Programm „joy-car_teil_01_prog_06.hex“
startet, dann wird man bei der Ausführung im Vergleich zum vorherigen Programm „joy-car_teil_01_prog_05.py“ wider Erwarten keinen Unterschied feststellen
können, da das bunte Farbspektrum des Regenbogens
wie gehabt mit dem Index = 0 beginnt, sodass zunächst alle acht RGB-LEDs rund herum rot leuchten! Der Grund
dafür, weshalb sich gegenüber dem Vorgängerprogramm
im Verhalten nichts ändert, ist ganz einfach der, dass die Wertzuweisung im Statement <Index =
1> (siehe Zeile 7) durch die Initialisierung des
Schleifenzählers Index der <for … next>-Schleife (siehe Zeile 8) mit dem Startwert Index = 0
überschrieben wurde!
Wenn man also möchte, dass alle acht RGB-LEDs von Anfang an
mit dem vollen Farbspektrum des Regenbogens leuchten, dann muss man
nur den Schleifenzähler Index der <for … next>-Schleife (siehe Zeile 7)
sofort mit dem Startwert Index = 1
(siehe roter Kreis)
beginnen lassen: (Vergrößern: auf das
Bild klicken! | Programm „joy-car_teil_01_prog_07.py“) Wenn man also den „Index“-Schleifenzähler bei der <for … next>-Schleife (siehe Zeile 7) im Range [ 1, …, 360 ] arbeiten lässt, dann
leuchten alle RGB-LEDs von Anfang an
mit dem vollen Farbspektrum des Regenbogens. Sollte man meinen! Aber das Programmieren des „Index“-Schleifenzählers der <for … next>-Schleife (siehe Zeile 7) mit dem Range [ 1, …, 360 ] ist das eine und das
„eigenwillige Verhalten“ des Farbspektrums beim Regenbogen ist das andere! Obwohl jetzt die <for … next>-Schleife mit dem „Index“-Schleifenzähler im Range [ 1, …, 360 ] arbeitet, kümmert das das Farbspektrum des Regenbogens nicht im geringsten, startet dieses stets mit der Farbe Rot
(siehe Zeile 10), obwohl der Schleifenzähler den Wert Index = 1 hat: (Vergrößern: auf das
Bild klicken! | Programm „joy-car_teil_01_prog_08.py“) Um herauszufinden, weshalb das Farbspektrum des Regenbogens stets bei der Farbe Rot (siehe Zeile 10) anfängt,
brauchen wir weitere Informationen. Mal sehen, was die KI von ChatGPT dazu
herausfindet. Wir fügen den Quellkode
des obenstehenden Programms
mittels Copy & Paste in die Texteingabe von ChatGPT ein und erfahren
folgendes: (Zum Vergrößern bitte
auf das Bild klicken!) Wir bemühen die KI von ChatGPT ein weiteres
Mal mit der Frage: „Weshalb starten die NeoPixel LEDs stets mit der Farbe
Rot?“ und erfahren folgendes: (Zum Vergrößern bitte
auf das Bild klicken!)
Ein
schillernder Regenbogen zum Ein- oder Ausschalten Zur Vermeidung von Lichtverschmutzung,
der Energieverschwendung und wegen des Bedienkomforts
sollte sich elektrisches Licht jederzeit stets manuell oder automatisch
per Schalter
oder Taster ein- oder ausschalten lassen! Wenn später das fahrende Roboter-Auto „Joy-Car“ auch rechts oder links
abbiegen soll, dann muss der Fahrtrichtungswechsel
zuvor durch Betätigen des Fahrtrichtungsanzeigers
(= Blinker) angezeigt werden. Dabei verhält es sich so, dass der
Fahrzeugführer den Blinkhebel nach
dem Abbiegen des Kfz nicht wieder manuell
in die Mittenstellung bringen
muss, da dies automatisch erfolgt.
Und zwar in Abhängigkeit des Lenkradeinschlags
der Vorderräder. Demzufolge sollte sich der Blinker nach dem Abbiegen, wenn
die Vorderräder wieder auf Geradeausfahrt stehen, automatisch abschalten. Da der „micro:bit“-Rechner über zwei Taster A und B
verfügt, verwenden wir diese im nachfolgenden Programm „joy-car_teil_01_prog_10.hex
dazu, den schillernden Regenbogen jederzeit ein- oder ausschalten zu können: (Vergrößern: auf das
Bild klicken! | Programm „joy-car_teil_01_prog_10.py“) Wie man anhand des roten und grünen
Kastens
sieht, befinden wir uns jetzt mitten in der Objekt orientierten Programmierung (OOP).
Dazu gleich mehr. Bei den bisherigen „MicroPython“-Programmen bis zum Programm „joy-car_teil_01_prog_09.py“
verhielt es sich so, dass wir diese als Ganzes,
d.h. linear von oben, engl. „on top“, nach unten, engl. „ top down“, als Monoblock ohne jegliche Verzweigungen in irgendwelche Unterprogramme oder Funktionen programmiert haben. Wie der Name
„Funktion“ bereits ausdrückt, tut
sich was in einer Funktion, wird in einer Funktion etwas herbeigeführt oder eine Aufgabe bewerkstelligt, d.h. gelöst. Ein weniger gutes Beispiel, das aber sehr
anschaulich ist, wäre ein gut ausgebildeter und disziplinierter Soldat beim
Militär, der, gemäß Befehl und bedingungslosem Gehorsam, ohne Wenn und Aber
wie eine Tötungsmaschine funktioniert und dabei Menschenrechte
verletzt und ignoriert. Von einem „guten“ Soldaten erwartet man, dass er
einfach nur funktioniert und Befehle ausführt. Und zwar ohne groß
nachzudenken oder Widerspruch zu leisten. Wer als Soldat Befehle verweigert
oder nicht ausführt, landet demzufolge wegen Befehlsverweigerung im
Militärgefängnis. Von einem Smartphone als
elektronisches Kommunikationsgerät erwartet man, dass es gemäß der
zugesicherten Eigenschaften (BGB), wie erwartet
einwandfrei funktioniert, Kommandos entgegennimmt und z.B. Webseiten
aufruft, Musik oder Videos abspielt. Und wenn etwas mal nicht so
funktioniert, wie es sein sollte, dann erinnert man sich als IT-Fachmann an
den Spruch, dass „der größte Fehler als ‚DAU’ immer vor der PC-Tastatur
sitzt“. Damit ist natürlich der Mensch als Anwender gemeint, verächtlich auch
als „DAU“ bezeichnet: „Dümmster, anzunehmender User“.
Im obenstehenden Programm „joy-car_teil_01_prog_10.hex
haben wir es also mit zwei Funktionen und zwar mit den Tastern A und B
zu tun. Wenn man das obenstehende Programm „joy-car_teil_01_prog_10.py“
mit dem vorherigen Programm „joy-car_teil_01_prog_09.py“
vergleicht, dann fällt auf, dass das Statement <strip = neopixel.create(DigitalPin.P0,
8, NeoPixelMode.RGB)> vom Hauptprogramm
in die Funktion <on_button_pressed_a()> verschoben
wurde (siehe grüner Kasten). Und zwar mit der Folge, dass die Klasse
„neopixel()“ nun nicht
mehr von außen aus dem Hauptprogramm
heraus erreichbar ist!
Und das, obwohl die Instanz- bzw. Objektvariable „strip“ mittels des Statements <global strip> als globale Variable deklariert wurde! Der Grund dafür ist der, dass es die globale
Instanz- bzw. Objektvariable auch
geben muss, diese existieren muss! Und zwar im Hauptprogramm (siehe roter Kasten) mit dem Statement <strip: neopixel.Strip =
None> Dabei bedeutet die Angabe „None“,
dass die neue Instanz „strip“ zwar instanziiert und der Klasse „neopixel()“ zugewiesen, aber eben noch nicht initialisiert
wurde, da die Initialisierung erst später
durch Betätigen des „Tasters A“ beim Aufruf der Funktion <on_button_pressed_a()> mittels des Statements <strip = neopixel.create(DigitalPin.P0,
8, NeoPixelMode.RGB)> erfolgt. - Jetzt wissen wir, a)
dass es nicht nur globale
Variablen im Hauptprogramm
gibt, b)
sondern auch lokale
Variablen in den jeweiligen Funktionen, c)
dass man aus der Funktion heraus auf eine Variable im Hauptprogramm
d)
dass sich die neue
Instanz bzw. Objektvariable „strip“ im Hauptprogramm unbestimmt
deklarieren (= None) Wenn man den obenstehenden Quellkode des Programms „joy-car_teil_01_prog_10.py“
in die Texteingabezeile der KI von ChatGPT mittels „Copy and Paste“ einpflegt, dann kann man sich
von ChatGPT erklären lassen, was
es mit der Instanziierung
auf sich hat (Zum Vergrößern bitte
auf das Bild klicken!) und was eine Instanzvariable
ist: (Zum Vergrößern bitte
auf das Bild klicken!) Selbstverständlich kann man sich von der KI der ChatGPT auch erklären lassen, was das das obenstehende Programm „joy-car_teil_01_prog_10.py“
macht und wie es funktioniert: (Zum Vergrößern bitte
auf das Bild klicken!) Diesbezüglich muss noch erläutert werden,
weshalb im obenstehenden Programm „joy-car_teil_01_prog_10.py“
die Batteriespannung UBatt als auch die Stromstärke IBatt des „Joy-Car“-Mainboards abgefragt und
angezeigt werden.
Als nächstes verbessern wir das bisherige
Programm dahingehend, dass man nur noch einen (Wechsel-) Taster A benötigt, um die 8 bunten RGB-LEDs des Regenbogens ein- oder ausschalten:
(Vergrößern: auf das
Bild klicken! | Programm „joy-car_teil_01_prog_11.py“) Wie man im obenstehenden Quellkode sieht, gibt
es jetzt die neue Funktion mit dem ·
Statement <NeoPixel_anzeigen(anzeigen_ja_nein, Helligkeit_LEDs)> und den Übergabe-Parametern
anzeigen_ja_nein und Helligkeit_LEDs (siehe roter Kasten), sodass mittels
dieser beim Aufrufen der Funktion bereits festlegen
lässt, ob die 8 bunten RGB-LEDs ein-
oder ausgeschaltet
werden sollen und falls ja, mit welcher Helligkeit diese leuchten sollen (siehe grüner Kasten). Demzufolge gibt es im Hauptprogramm die beiden korrespondierenden
globalen Variablen <schalte_Ein_Aus> und <NeoPixel_Helligkeit> mit den Übergabewerten [ schalte_Ein_Aus
= True ] und [ NeoPixel_Helligkeit = 32 ] (siehe blauer
Kasten),
die beim Aufrufen der Funktion <NeoPixel_anzeigen(anzeigen_ja_nein, Helligkeit_LEDs)> mit auf den Weg
gegeben werden (siehe grüner Kasten). Diesbezüglich verfügt die Funktion <NeoPixel_anzeigen(anzeigen_ja_nein, Helligkeit_LEDs)> über ihre eigenen lokalen
Variablen <anzeigen_ja_nein> und <Helligkeit_LEDs> in Form der Parameter (siehe roter Kasten). Dabei müssen die lokalen Variablen (= Parameter) der Funktion <NeoPixel_anzeigen()> vom Typ her mit denen der globalen Variablen <schalte_Ein_Aus> und <NeoPixel_Helligkeit> im Hauptprogramm
vom Typ „boolean“ (= wahrheitsgemäß „richtig“ oder „falsch“) und „integer“ (= ganzzahlig numerisch) unbedingt identisch sein!
Wichtig zu wissen ist auch noch, dass die Funktion <NeoPixel_anzeigen()> den booleschen Wert der Variablen <anzeigen_ja_nein> nach dem Ein-
oder Ausschalten ins Gegenteil
verkehrt, sodass von vormals „True“ auf „False“ gewechselt wird und umgekehrt.
Auf diese Weise wird dann nämlich der Wechsel-Schalter
„Taster A“ realisiert. Beim Tastendruck auf den Wechsel-Schalter
„Taster A“ wird in der Laufschrift des „micro:bit“-Rechners als Hilfestellung für
den Programmierer angezeigt, ob der Wert
der lokalen, booleschen Variablen <anzeigen_ja_nein> auf „True“ oder „False“
steht. Wenn es darum geht zu wissen und zu verstehen,
wie das obenstehende Programm „joy-car_teil_01_prog_11.hex“
funktioniert, dann kann man sich wie gehabt von der KI der ChatGPT helfen
lassen: (Vergrößern: auf das
Bild klicken! | Programm „joy-car_teil_01_prog_11.py“) Da der Taster B
jetzt frei geworden ist, dieser nicht mehr zum Ausschalten der 8 bunten RGB-LEDs des Regenbogens gebraucht wird, lässt
sich dieser anderweitig verwenden, nämlich zum Umschalten der Helligkeit. Und zwar mittels der globalen Variablen <NeoPixel_Helligkeit> und der Umschaltung von [ NeoPixel_Helligkeit = 32 ] auf [ NeoPixel_Helligkeit = 255 ] und wieder zurück. Dabei wird der jeweilige Variablenwert beim Aufrufen der Funktion (siehe grüner
Kasten)
mit dem ·
Statement <NeoPixel_anzeigen(anzeigen_ja_nein, Helligkeit_LEDs)> an die lokale Variable <Helligkeit_LEDs> im Funktionskopf übergeben (siehe roter Kasten): (Vergrößern: auf das
Bild klicken! | Programm „joy-car_teil_01_prog_12.py“) Da sich die Funktion <on_button_pressed_b():> noch etwas vereinfach lässt, geht’s mit dem Programmieren
gleich weiter: (Vergrößern: auf das
Bild klicken! | Programm „joy-car_teil_01_prog_13.py“) Wenn wissen will, wie das obenstehende Programm „joy-car_teil_01_prog_13.hex“
funktioniert, dann kann man sich wie gehabt von der KI der ChatGPT helfen
lassen: (Vergrößern: auf das
Bild klicken! | Programm „joy-car_teil_01_prog_13.py“) Wir erweitern das obenstehende Programm ein
letztes Mal. Und zwar indem wir die Batteriespannung des Batteriefaches
vom „JoyCar“-Mainboard messen! Dazu ist es allerdings erforderlich,
dass wir die bisherige Funktion <messe_UBatt()> dahingehend abändern,
sodass die gemessene Spannung
UBatt
nicht mehr in der Funktion
selbst angezeigt wird. Da wir die gemessene Spannung UBatt der globalen Variablen <UBatt> zunächst nur auswerten wollen, müssen wir diese
mittels des Statements <return(UBatt)> an das aufrufende Hauptprogramm
wie folgt zurückliefern (siehe roter Kasten): (Vergrößern: auf das
Bild klicken! | Programm „joy-car_teil_01_prog_14.py“) Zum Einsatz kommt dann die Funktion der Spannungsmessung <messe_UBatt()> erstmals bei der „Wenn … dann“-Abfrage im ·
Statement <if messe_UBatt() >= 4.4:> (siehe grüner Kasten).
Und wie funktioniert das Ganze, das
obenstehende Programm? So lange die im Leerlauf gemessene Spannung UBatt >= 4,4 V ist werden der Schriftzug „Regenbogen“ als Laufschrift im LED-Display des „micro:bit“-Rechners angezeigt und die
beiden „input“-Abfragen der Taster A
und B ausgeführt. Sollte dann die Batteriespannung im Laufe der Zeit bis auf weniger als UBatt < 4,4 V abgesunken
sein, so wird die Laufschrift „Batterien wechseln!“ des „JoyCar“-Mainboard Batteriefaches angezeigt, um dem Anwender zu
signalisieren, dass die Batterien entladen sind
und die Elektronik des des „JoyCar“-Mainboard nebst der „NeoPixel“-LEDs zu spinnen anfangen,
um schließlich den Dienst gänzlich zu quittieren. Dabei gilt
es noch anzumerken, dass das Testen
des Ladezustandes einer Batterie stets unter Last erfolgen
sollte, da das Messen der Leerlaufspannung (ohne Last) wegen des Innenwiderstandes
der Batterie zu falschen Ergebnissen führt. Wenn man beim „JoyCar“-Roboterauto alle 8 „NeoPixel“-LEDs bei voller
Helligkeit zum Leuchten bringt, dann stellt sich eine Stromstärke von bis zu Iges = 8 * 60 mA = 480 mA ein. Bei einer mittleren
Lastspannung von 4 x 1,15 V
= 4,6 V entspräche dies einem
Lastwiderstand RLast = ULast / ILast = 4,6 V / 0,480 A ≈
9,58 W und einer entnommenen
Verbraucherleistung von PLast = ULast * ILast =
ILast * RLast * ILast =
ILast2 * RLast = ( 0,48 A )2
* 9,58 W = 0,2304 A Bedenkt man abschließend, dass die 8 „NeoPixel“-LEDs, die ja in Regenbogenfarben leuchten, wegen der unterschiedlichen
Farben teils auch unterschiedlich
hell leuchten bzw. unterschiedliche Durchflussströme IFluss aufweisen, dann
müsste man alle 8 „NeoPixel“-LEDs in ein und der
selben Farbe, wie z.B. Rot,
leuchten lassen, um auf diese Weise zu einem noch größeren Laststrom von mehr als 480 mA
zu kommen. Eine herkömmliche 1,5 Volt „Mignon“-Batterie
von Typ „AA“ und IEC-Klasse „LR6“ verfügt über eine
gespeicherte, elektrische Energie von Wel = 3,0 Wh. Bei 4 x 1,5 V „Mignon“-Batterien entspricht dies einer
gespeicherten, gesamten Energie von Wel, ges = 4
* Wel = 4 * 3,0 Wh = 12 Wh. Demzufolge ließen sich die 8 „NeoPixel“-LEDs in Regenbogenfarben bis zu tDauer = Wel, ges / PLast = 12 Zum Vergleich: Moderne Smartphones
verfügen heutzutage über eine Akkukapazität von QBatt = 5000 mAh = 5 Ah. Würde man an dem Smartphone-Akku die 8 „NeoPixel“-LEDs in Regenbogenfarben leuchten lassen, dann
könnte man diese tDauer = QBatt / ILast = 5 Ah / 480 mA = 5 Dazu muss aber noch gesagt werden, dass in den
Smartphones sogenannte „Lithium-Ionen-Akkus“
verbaut werden, die nicht nur wesentlich kleiner, leichter und wieder
aufladbar sind als z.B. „Alkali-Mangan“-Batterien, sondern auch über eine
mehr als doppelt so große Akkukapazität verfügen. - Lassen wir uns von der KI der ChatGPT noch ausführlich
erklären, wie das Programm „joy-car_teil_01_prog_14.hex“
(Vergrößern: auf das
Bild klicken! | Programm „joy-car_teil_01_prog_14.py“) |
|
|||||
|
[
Home ]
[ Seitenanfang ] [ Teil 2a ] [ Teil 2b ] |
|