[Projekt] jukebox4kids (Jukebox für Kinder)

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Moin moin,

    es ist etwas her, dass ich an der Jukebox gearbeitet habe.
    Die V2 läuft seit fast 2 Jahren stabil und dennoch ist noch nicht alles fertig :-|

    Ich habe den Code jetzt auf github gestellt, leider hatte ich keine
    Zeit gehabt, den Code ausführlich zu dokumentieren.

    Besser ein bissel als gar nichts:

    https://github.com/hdo/stm32_jukebox4kids

    Übrigens würde ich die V2 in dieser Form nicht mehr bauen.

    Nach einem Update meiner V1 mit einem Read-Only Root-FS läuft diese
    auch einwandfrei. Bei einem Proof-of-Concept habe ich eine eigenes
    Linux auf Basis von Buildroot gebastelt und diese hat auch in 5 Sekunden
    gebootet. Den Aufwand für eine Implementierung für den STM32 würde
    ich heute nicht mehr machen. Die Implementierung mit einem
    Rasberry Pi ist deutlich einfacher und besser wartbar (Python).
    Ferner hat man dann auch Netzwerk und ggf. LCD display
    (das steht als nächstes auf meiner Liste :)

    hdo

  • Mit der verbauten Version B des Raspberry hat mit nur beschränkte Möglichkeiten.
    Ich habe damals zursätzlichen einen ARM Cortex-M3 (ähnlich Arduino) verbaut,
    der die Kommunikation mit den Knöpfen und RFID-Reader erledigt hat.

    Mit dem neuen Raspberry B+ könnte es evtl. auch so gehen.


    Ich bin absoluter Raspberry Pi Anfänger.

    Mich interessiert, wie man so viele Buttons mit dem Pi verbinden kann?
    Werden die einfach an die Pins 17, 18, 27, 22, 23, 24 und 25 angeschlossen?

    http://www.element14.com/community/serv…846A4D286&01NA=

  • Hi

    Ich fand die Idee von deiner Jukebox einfach Klasse, da hab ich diese nachgebaut.
    Die verwendeten Komponenten unterscheiden sich allerdings.

    Zur Hardware:
    Board: Raspberry Pi 2
    Verstärker: Adafruit 20W Stereo Amplifier MAX9744 (Lautstärkensteuerung über I2C Bus am Raspi)
    Soundkarte: Creative Sound Blaster Play! per USB (die Onbaord-Karte klingt eigentlich auch gut, hätte wohl gereicht)
    Lautsprecher: 2x Visaton Breitbandlautsprecher 4 Ohm 10 W, FR 7
    Lautstärkenregler: Poti -> MCP3202 A/D Wandler -> Raspi (per SPI Bus)
    RFID: RDM6300 per UART am Raspi
    Display: LCD HD44780 direkt per GPIO am Raspi
    Netzwerk: Edimax EW-7811UN Wifi Dongle per USB
    Power: 12V Netzteil -> Amp -> DC Wandler auf 5V -> ATXRaspi -> Raspi
    Buttons: Per GPIO am Raspi

    Das Schema wie das ganze Verkabelt ist, unten als Bild angehängt.

    Zur Software:
    OS: Standard Wheezy Linux für Raspberry Pi
    Musikplayer: MPD (Music Player Deamon)
    Steuerung: Ist in C# geschrieben und läuft über die Mono .NET Runtime.
    Zur Ansteuerung der GPIO Pins hab ich die raspberry-sharp-io Library verwendet.
    Die Kommunikation mit dem MPD erfolgt über LibMpc.net.
    Im ID3 Kommentar Tag ist die jeweilige RFID-Kartennummer hinterlegt.
    Optional startet die Software noch ein Webserver, welche über ein kleines GUI eine Remote Bedienung ermöglicht.

    Hier ist der aktuelle Stand zu finden: https://github.com/mwinkler/RaspberryPi.Musicbox

    Features:

    • Ein/Aus über Taster (Raspberry Pi wird hoch- und wieder heruntergefahren, Amp geht in Standby um kein Strom zu verbrauchen)
    • Stufenlose Lautstärkenregelung (Maximale Lautstärke kann per Software konfiguriert werden)
    • Display mit anzeige der aktuellen Track Nr., total Tracks, Laufzeit, Laufschrift mit Titel
    • Kopieren der Musik per Share über WiFi
    • Automatisches herunterfahren, sofern 5 min. keine Musik abgespielt wurde

    Ideen:

    • Kleines Menü um gewisse Sachen zu Konfigurieren (zB. Max. Lautstärke, Wifi ein/aus)
    • Remote Bedienung
    • UPNP Support
    • Internet Radio Streaming


    Viele Grüsse

  • Hi Sonix,

    sehr schön deine Jukebox! Ich freue mich, dass auch andere
    sich an das Projekt wagen und es auch noch schön umsetzen.

    Deinen Kindern wird es sicherlich freuen. Unsere beiden Jukeboxen
    laufen fast den ganzen Tag.

    Ich arbeite bereits an einer V3, denn mittlerweile haben wir >300 RFID
    Karten rumliegen und es ist gar nicht so einfach eine Bestimmte zu suchen.

    Viel Spaß noch damit!

    VG

    hdo

    PS: Achja, welche Runtime benutzt du denn, um C# auf dem Raspi auszuführen? (Mono?)

    Einmal editiert, zuletzt von hdo26 (22. September 2015 um 07:27)

  • Kann ich mir gut vorstellen bei über 300 Karten.
    Genau, läuft über die .NET Mono Runtime. Hab im Post noch ein paar Sachen ergänzt.
    Bin echt gespannt auf deine dritte Generation.

    Einmal editiert, zuletzt von sonix (22. September 2015 um 10:35)

  • Moin!

    Ich bin etwa im Juni über dieses Projekt gestolpert und habe mir vorgenommen, dieses rechtzeitig vor Weihnachten abzuschließen.

    Im ersten Schritt habe ich den Raspberry Pi 2 erfolgreich mit MPD zum MP3-Player gemacht.
    Danach habe ich drei Buttons an den GPIO angeschlossen und kann nun auch die Funktionen Prev, Play/Pause, Next damit abbilden.

    Letztes Wochenende habe ich den RDM6300 RFID Reader in Betrieb genommen, auch das funktioniert nun. Ich kann mit den Karten die gewünschte Playlist starten.
    Aktuell habe ich dort noch das Problem, dass meine Buttons nicht mehr funktionieren, sobald das Skript einmal eine neue Playlist eingelesen hat.
    Vielleicht könnte mir dort jemand von euch mit der Software helfen. Ich stelle den Code heute Abend mal bereit.

    Als nächstes will ich das HD44780 20x4 Display anschließen und erstmal den Tracknamen/Nummer ausgeben.

    Als Verstärker/Lautsprecher habe ich ein Paar alte PC-Speaker ausgeschlachtet. So olle Brüllwürfel. Ich hoffe, die sind nicht zu mies. Eine Soundkarte wollte ich nicht extra einbauen, die vom Pi sollte reichen.
    Die alten Lautsprecher haben den Vorteil, dass ich sie mit 5V betreiben kann. Ich brauche also gar keinen Spannungswandler bzw. Netzteil mit 5V und 12V. Außerdem ist der Lautstärkeregler bereits on Bord, so dass sich der Pi darum gar nicht kümmern muss.

    Damit ich rechtzeitig fertig werde, müsste ich mich nun langsam mal um das Äußere kümmern. Meine temporären Taster will ich noch, wie hier im Thread schon von anderen gezeigt, durch Arcade Taster ersetzen. Die Frage lautet, ob ich auf irgendwas achten muss. Stichwort "Entprellung".

    Was für Kisten sind denn als Gehäuse zum empfehlen? Mir mangelt es deutlich an Kreativität für diese Dinge.

    Wie führe ich die Stromversorgung in das Gehäuse? Kabeleinführung oder Stecker? Nehme ich ein Steckernetzteil oder was anderes? Ich nehme an, am ordentlichsten wäre ein Netzteil im Player mit Kleingerätestecker C8 oder Kaltgerätestecker C14 nach außen.
    Dieses Netzteil vielleicht? http://www.reichelt.de/Schaltnetzteil…tnr=SNT+RS+15+5


  • Aktuell habe ich dort noch das Problem, dass meine Buttons nicht mehr funktionieren, sobald das Skript einmal eine neue Playlist eingelesen hat.
    Vielleicht könnte mir dort jemand von euch mit der Software helfen. Ich stelle den Code heute Abend mal bereit.

    Hier wäre mein Code. Keinen Plan, warum die Einrückungen hier nicht übernommen werden, ich hoffe, das ist trotzdem verständlich.
    Sobald die Zeile
    self.load_playlist(rfid[4:10])
    ausgeführt wird, wird die Callback-Funktion process_button() nicht mehr aufgerufen.


  • Moin Matze,

    beim HD44780 LCD muss ich passen,
    da ich dieses Display nur für meine Jukebox4KidsV2 verwendet
    habe und dort läuft das ganze auf einem ARM STM32.

    Auch bei den Buttons kann ich dir nicht wirklich
    weiterhelfen, da ich diese bei mir auch durch einen ARM
    verarbeite. Grundsätzlich sollte das aber funktionieren.

    Warum die Taster bei einem Playlist-Wechsel nicht mehr
    funktionieren ist sonderbar. Hast du mal versucht,
    nach einem Playlist-Wechsel ein paar Debug-Meldungen
    auszugeben? Nicht dass das Python-Skript sich danach
    beendet. Achja, dein Skript kann man überhaupt nicht
    lesen, da die wichtigen Einrückungen fehlen, aber das
    hast du ja selber festgestellt. Ansonsten probier
    doch mal Github GIST aus, dort sollte es kein Problem
    geben.

    Zur Not kannst du auch mal die Polling-Variante für
    das Einlesen der Buttons ausprobieren. Das Entprellen
    muss du nur bei der Interrupt-Variante machen. 200ms
    sollten reichen.

    Das Netzteil von Reichelt kannst du nehmen, achte aber
    bitte darauf das Netzteil ordentlich zu isolieren.

    Als Gehäuse habe ich die Zeller-Holzkisten verwendet.
    Diese kriegst du bei OBI für ca. 10 Euro. Ob du die normale
    Variante nimmst (zum Lackieren) oder die Variante 'Buche lackiert'
    ist dir selbst überlassen.

    Bitte stell auch mal Bilder rein wenn du soweit bist :)

    hdo

  • So, das sollte gehen:

    Externer Inhalt gist.github.com
    Inhalte von externen Seiten werden ohne deine Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklärst du dich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.

    Sobald Zeile 97 einmal ausgeführt wird, springt das Skript niemals mehr in die Funktion process_button in Zeile 61. Zu erkennen daran, dass die Textausgabe "Processing button" nicht erfolgt.
    Das Skript stürzt aber nicht ab, ich kann weiterhin die Playlisten wechseln.
    Kommentiere ich Zeile 97 aus, funktionieren meine Buttons auch noch nachdem ich eine RFID-Karte eingelesen habe (natürlich ohne den finalen Playlist-Wechsel)



    Das Netzteil von Reichelt kannst du nehmen, achte aber
    bitte darauf das Netzteil ordentlich zu isolieren.

    Was genau meinst Du? Was soll ich damit machen?
    Ich habe mir übrigens die Stecker/Schalter/Sicherung/Entstörfilter-Kombi dazu ausgeguckt: http://www.reichelt.de/Entstoerfilter…&artnr=FEH+2101

    Als Gehäuse habe ich die Zeller-Holzkisten verwendet.
    Diese kriegst du bei OBI für ca. 10 Euro. Ob du die normale
    Variante nimmst (zum Lackieren) oder die Variante 'Buche lackiert'
    ist dir selbst überlassen.

    "Zeller" war das richtige Google-Stichwort, danke. Reicht 30x20x15?

  • Das ist sonderbar. Probier es doch mal aus in der Interrupt-Routine nur ein Flag
    zu setzen und die Befehle nur in der While-Schleife abzuarbeiten.

    Mit Isolieren meine ich, dass du aufpassen musst, dass die 230V Leitungen keine anderen Leitungen berühren können.

    Meine Kinder neigen dazu, die Jukeboxen hin- und herzutragen.

  • Nachdem ich mich letzte Woche mit der Hardware beschäftigt habe (löten, bohren, sägen, malen), konnte ich mich gestern mal wieder der Software zuwenden.
    Ich habe inzwischen das Display angebunden, was prinzipiell auch macht, was es soll.

    Dem obigen Problem bin ich näher gekommen. Ich ahne, dass die Zeile

    Code
    buf = self.UART.read()


    das Programm anhalten und auf Eingaben vom RFID-Reader warten lässt. Die Endlosschleife läuft jedenfalls nicht durch, wie ich leicht erkennen kann, wenn ich jeden Durchlauf eine Ausgabe machen lasse. Vermutlich wird deshalb auch der Event Handler für die Buttons nicht aufgerufen.

    Ich habe noch nicht rausgefunden, wie ich dafür sorgen kann, dass das Program weiter läuft, wenn vom RFID-Reader nichts kommt.

  • Hi,

    probier mal den Serial-Port 'non-blocked' zu lesen, bzw. mit timeout=0.

    Schau mal, bei mir habe ich es so gemacht:

    https://github.com/hdo/jukebox4kids/blob/master/pyjukebox.py



    Nachdem ich mich letzte Woche mit der Hardware beschäftigt habe (löten, bohren, sägen, malen), konnte ich mich gestern mal wieder der Software zuwenden.
    Ich habe inzwischen das Display angebunden, was prinzipiell auch macht, was es soll.

    Dem obigen Problem bin ich näher gekommen. Ich ahne, dass die Zeile

    Code
    buf = self.UART.read()


    das Programm anhalten und auf Eingaben vom RFID-Reader warten lässt. Die Endlosschleife läuft jedenfalls nicht durch, wie ich leicht erkennen kann, wenn ich jeden Durchlauf eine Ausgabe machen lasse. Vermutlich wird deshalb auch der Event Handler für die Buttons nicht aufgerufen.

    Ich habe noch nicht rausgefunden, wie ich dafür sorgen kann, dass das Program weiter läuft, wenn vom RFID-Reader nichts kommt.

  • Danke, das hat mehrere Probleme gelöst.
    Leider nicht das Problem, dass nach dem Einlesen einer RFDI-Karte meine Buttons nicht mehr funktionieren.
    Das Problem scheinen hierbei die Anweisungen an MPC zu sein.
    Wenn ich in der Funktion zum Laden einer Playlist die MPC-Befehle auskommentiere, dann wird die Interrupt-Routine weiterhin aufgerufen.

  • Ich vermute, es hat was mit diesen Problemen zu tun:
    https://www.raspberrypi.org/forums/viewtopic.php?f=28&t=111232
    https://www.raspberrypi.org/forums/viewtop…123305&p=829723

    Genau wie in den beschriebenen Situationen, rufe ich beim Laden der Playlist ja auch os.system auf.

    Ich werde mal versuchen, nach dem Laden der Playlist die Event Handler mit remove_event_detect zu entfernen und danach mit add_event_detect neu zu setzen.

    Gibt es alternativ eine andere Möglichkeit, Kommandos an den MPC zu schicken als mit os.system?

    Edit: hier wird noch eine Lösung beschrieben: https://www.raspberrypi.org/forums/viewtopic.php?f=32&t=97152

    Einmal editiert, zuletzt von MatzeHH (5. November 2015 um 13:54)

  • Hi,

    hmm, interessant.

    Alternativ gibt es auch ein Python MPC-Modul wenn ich mich
    nicht irre.

    Ansonsten gäbe es noch 'subprocess.communicate()' als Möglichkeit
    statt 'os.system'. Google einfach mal danach.

    hdo


    Ich vermute, es hat was mit diesen Problemen zu tun:
    https://www.raspberrypi.org/forums/viewtopic.php?f=28&t=111232
    https://www.raspberrypi.org/forums/viewtop…123305&p=829723

    Genau wie in den beschriebenen Situationen, rufe ich beim Laden der Playlist ja auch os.system auf.

    Ich werde mal versuchen, nach dem Laden der Playlist die Event Handler mit remove_event_detect zu entfernen und danach mit add_event_detect neu zu setzen.

    Gibt es alternativ eine andere Möglichkeit, Kommandos an den MPC zu schicken als mit os.system?

    Edit: hier wird noch eine Lösung beschrieben: https://www.raspberrypi.org/forums/viewtopic.php?f=32&t=97152

  • Ja, in die Richtung geht ja auch die im Edit beschriebene Lösung. Ich werde das heute Abend mal testen.
    Wenn damit das Problem gelöst ist, würde ich meine Software als fertig bezeichnen.
    Dann geht es an den Zusammenbau, die Teile sind ja im Grunde schon fertig. Meine Frau hat das Gehäuse inzwischen auch hübsch gemacht.

    Vermutlich habe ich mit dem 20x4 Display etwas übertrieben. Mehr als die Tracknummer gebe ich da momentan nicht aus, Interpret/Titel macht bei meinem zweijährigen ja noch wenig Sinn.

  • Die Umstellung von os.system auf subprocess.call hat geholfen. Meine Software tut nun, was sie soll.
    Jetzt ist noch ein wenig basteln angesagt und dann mache ich auch bald ein paar Fotos.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!