Table of Contents
Design
Hardware-Architektur
Zentraler Baustein ist ein Raspberry Pi Pico W. Darauf befinden sich ein RP2040-Controller, der die Steuerung des Geräts übernimmt. Auch die MP3-Player-funktionalität wird vom RP2040 übernommen (es ist kein DFPlayer Mini o.Ä. nötig). Ebenso wird die MicroSD-Karte direkt am RP2040 angeschlossen. Auf dem Raspberry Pi Pico W befindet sich außerdem ein Infineon CYW43439 WLAN (Wifi 4) und Bluetooth-Controller. Dieser wird benutzt um das Steuern und Befüllen des TonBERRY per App zu ermöglichen.
Für das Erkennen der auf die Box aufgelegten RFID-Chips wird der gleiche RC522 RFC Kit benutzt der schon im TonUINO eingesetzt wurde.
Zum Anschließen einer SD-Karte an den Pi Pico wird ein einfache Adapter, z.B. https://www.berrybase.de/sparkfun-microsd-transflash-breakout, benötigt.
Um einen Lautsprecher ansteuern zu können wird ein DAC + Verstärker benötigt. Hierfür scheinen ein Modul wie https://www.berrybase.de/sparkfun-i2s-audio-breakout-max98357a geeignet.
Mit einem Kombimodul wie https://www.berrybase.de/adafruit-audio-add-on-fuer-qt-py-und-xiao können die beiden vorherigen Punkte kombiniert werden.
TODO: sonstige hardware identisch zu TonUNIO, hier beschreiben (taster, lautsprecher, ...)
TODO: Evaluieren - was geht bzgl. Akku - Laden via USB Mögliche Optionen:
- https://www.adafruit.com/product/4712 (Vorsicht: benötigt Clock Stretching, das funktioniert auf dem RP2040 aber nur in Verbindung mit einem PIO, nicht mit den nativen I²C-Ports)
- https://www.adafruit.com/product/5397 (klingt eher nach einem Schätzeisen, ist aber vergleichsweise günstig)
- ...
Software-Architektur
Auf dem RP2040-Controller wird MicroPython eingesetzt. MicroPython zusammen mit dem Raspberry Pi Pico SDK bietet Unterstützung für WLAN und Bluetooth, SD-Karten-Zugriff.
Ein MP3-Dekoder sowie ein Treiber für den I2S-DAC laufen außerhalb von MicroPython auf dem zweiten Prozessor des RP2040, um die Audioausgabe ohne Aussetzer sicherzustellen. Die Ansteuerung des MP3-Players erfolgt über ein Python-Modul.
Treiber für MFRC522
- https://github.com/miguelbalboa/rfid Ist halt Arduino-C++. Wird nicht mehr maintained. Verweist für neue Designs auf...
- ... https://github.com/OSSLibraries/Arduino_MFRC522v2
Ebenfalls Arduino-C++. Schlecht maintained, grauenhafter Arduino-Style (spätestens hier bekommt man Pickel:
1bebfc9bbe/src/MFRC522v2.cpp (L52)), enthält aber ein paar nützliche Infos (z.B. Hinweis auf eine Magic Byte Sequence, mit der man die UID chinesischer Mifare-Chips ändern kann. Für dieses Projekt aber vmtl. irrelevant.). - https://github.com/libdriver/mfrc522 Code sieht ein bisschen Automotive aus, folgt teilweise den MISRA-Regeln. Autor hat sich hier ne Menge Mühe gemacht, aber frei von Antipatterns und fehlender Generalisierung ist der Code nicht (siehe z.B. beinahe identische Funktionen mfrc522_get_test_analog_control_aux_1() vs mfrc522_get_test_analog_control_aux_2()...)
- https://github.com/danjperron/micropython-mfrc522.git Code ist eher schwierig nachzuvollziehen, funktoiniert aber auf Anhieb mit micropython und dem RP2040 (ein passendes Beispiel liefert das Repo mit). Vorerst fällt die Entscheidung, diese Bibliothek zu benutzen und - soweit möglich - mit asyncio zu benutzen, bis wir an eventuelle Performancegrenzen stoßen und eine bessere Lösung brauchen.
Um die als Webanwendung angebotene Benutzeroberfläche des TonBERRY auszuliefern, sowie um die API die zur Ansteuerung des TonBERRY dient anzubieten wird das microdot web framework eingesetzt.
Um die verschiedenen Aktivitäten "simultan" auszuführen wird das asyncio Modul benutzt.
- MBL: Einfacher zu implementieren und meiner Meinung nach auch einfacher zu verstehen als Multithreading mit einem RTOS. Und schöner vom code als eine manuell geschriebene Event-Loop die zwischen den ganzen Aktivitäten multiplext.
- (verifizieren) Der TCP/IP stack und microdot unterstützen asyncio bereits
- Der SDcard und damit vermutlich auch vfat Treiber müssen um asyncio support erweitert werden. Dem SDcard treiber sollte man an der stelle vermutlich auch DMA support beibringen.
- Alles weitere (z.b. Tastendrücke, events vom MP3-Player) können vermutlich recht einfach über interrupt-handler und ThreadSafeFlag eingebunden werden.
Die Webanwendung selber ist eine mit (TODO: Javascript, CSS frameworks evaluieren) implementierte Webseite, die modernen Designrichtlinien entspricht und somit sowohl auf Handybildschirmen als auch an Desktop- oder Laptop-PCs benutzbar ist.
Die Kommunikation zwischen der Weboberfläche und dem TonBERRY findet über eine JSON REST API statt. Diese API kann ebenfalls von ggf. in Zukunft entwickelten Apps genutzt werden.
Features / User-Stories
-
Als Hörer möchte ich eine Karte/Figur auf das Gerät legen, damit das passende Hörspiel/Hörbuch/Musik abgespielt wird.
-
Als Hörer möchte ich die Karte/Figur vom Gerät entfernen, damit die Wiedergabe beendet wird.
-
Als Hörer möchte ich die Lautstärke des Lautsprechers mit einem oder mehreren haptischen Bedienelement/-en schrittweise erhöhen oder verringern, damit ich den TonBERRY in einer lauten Umgebung besser hören kann, und damit ich in einer ruhigen Umgebung meine Mitmenschen nicht störe.
-
Als Hörer möchte ich informiert werden, wenn mein TonBERRY einen AKKU hat, und der Akkustand oder die geschätzte Restlaufzeit einen bestimmten Schwellwert unterschreitet, damit ich weiß, wann ich den TonBERRY wieder aufladen muss.
-
Als Hörer möchte ich informiert werden, wenn zu einer Karte/Figur keine Audiodatei gefunden wird, damit ich weiß, dass ich dieser Karte/Figur noch keine Audiodatei zugeordnet habe, der TonBERRY aber angeschaltet ist und nicht ein anderes Problem mit dem TonBERRY besteht.
-
Als Hörer möchte ich, dass eine Stereo-Audiodatei bei der Wiedergabe zu einem Mono-Audiosignal gemischt wird, damit ich auf meinem Mono-TonBERRY beide Audiokanäle gleichermaßen hören kann.
-
Als Hörer möchte ich informiert werden, wenn das Ende einer Audiodatei oder einer Wiedergabeliste erreicht ist, damit ich den Grund erkennen kann, weshalb der TonBERRY plötzlich still ist.
-
Wiedergabefeatures von TonUNIO übernehmen:
- Einfacher Modus: Eine Datei / eine Liste von dateien wird mit einem RFID-Tag verknüpft, und jedes mal wenn der RFID-Tag aufgelegt wird beginnt die Wiedergabe von vorne
- Anmerkung: Kann unpraktisch sein in Umgebungen, in denen der RFID-Tag auch mal von der Box herunterfällt (Auto, Kind baut Klötzchenturm auf statisch ungeeignetem Untergrund, ...)
- MBL: Ja, aber dieses Bedienkonzept ist integraler bestandteil des originalkonzepts. Bei der Tonibox gibt es IIRC noch nicht mal einen Play/Pause/Stop button.
- Anmerkung: Kann unpraktisch sein in Umgebungen, in denen der RFID-Tag auch mal von der Box herunterfällt (Auto, Kind baut Klötzchenturm auf statisch ungeeignetem Untergrund, ...)
- Hörspiel-Sammlungs-Modus: Jedes Mal wenn der RFID-Tag aufgelegt wird, wird eine zufällige Hörspielfolge aus der mit dem Tag verknüpften Sammlung abgespielt.
- Idee: Merken, welche Folgen schon abgespielt wurden und dann nur eine der noch ungespielten Folgen wiedergeben?
- MBL: Wenn ich das richtig verstande habe war das in diesem Modus nicht erwünscht. Vermutlich weil die kids auch kein problem haben die selbe benjamin-blümchen kassette immer wieder zu hören...
- Idee: Merken, welche Folgen schon abgespielt wurden und dann nur eine der noch ungespielten Folgen wiedergeben?
- Hörbuch-Modus: Jedes Mal wenn der RFID-Tag aufgelegt wird, wird das mit diesem Tag verknüpfte Hörbuch dort fortgesetzt, wo zuletzt die Wiedergabe beendet wurde.
- Idee: Wiedergabe etwa 15 Sekunden früher wieder aufnehmen. Noch besser wäre, die Zeit zu messen, die zwischen Wiedergabestop und Fortsetzung der Wiedergabe verstrichen ist, und die Dauer des wiederholten Abschnittes entsprechend zu verlängern, bis zu einem Maximalwert von x Sekunden. Würde aber eine RTC erfordern.
- ...
- Einfacher Modus: Eine Datei / eine Liste von dateien wird mit einem RFID-Tag verknüpft, und jedes mal wenn der RFID-Tag aufgelegt wird beginnt die Wiedergabe von vorne
-
Als Elternteil möchte ich von meinem Handy aus neue Hörspielfolgen / Hörbücher / Musik auf den TonBERRY spielen und mit einer RFID-Karte/Figur verknüpfen
-
Als Elternteil möchte ich von meinem PC aus neue Hörspielfolgen / Hörbücher / Musik auf den TonBERRY spielen und mit einer RFID-Karte/Figur verknüpfen
-
Als Elternteil möchte ich Uhrzeiten festlegen, zwischen denen der TonBERRY keine Medien abspielt.
-
Als Elternteil möchte ich von meinem Handy/PC aus die mit einer RFID-Karte/Figur verbunden Medien löschen, damit auf dem TonBERRY platz für neue Medien ist.