[Projekt] jukebox4kids (Jukebox für Kinder)

  • Wertes Forum,

    auch bin mit meiner Version der Jukebox fertig - weit vor Weihnachten..das war dann doch einfach als befürchtet.

    ................

    Hallo,

    Ich versuche mich an einem recht änlichem Projekt, bzw. habe auch diesen Code "https://fsahli.wordpress.com/2015/11/02/mus…y-raspberry-pi/" als Vorlage genützt. RFID hatte ich erst mit einem RDM6300 über UART probiert, aber den hab ich nur unter Rasbian zumlaufen bekommen, habe jetzt einen einfachen USB Leser gekauft der Kartennummer + Enter ausgiebt und damit funktionier es.

    1) Locale mp3 & m3u kann ich mitlerweile abspielen, leider hab ich mit dem AdarfruitSpeakerBonnet immer laute Knackser zwischen den mp3s, kann man das beheben oder sollte ich doch eine USB Soundcarte + Lautsprecher kaufen?
    2) wie hast du Buttons (Pause/Play, Next) integriert?

    Karten für next/volume habe ich in der box.py direkt eingefügt

    vielen Dank

    Einmal editiert, zuletzt von SuedBadner (7. November 2017 um 16:01)

  • SuedBadner mich würde mal interessieren wie du die Tastatureingaben handhabst. Im Prinzip haste dann ja eine virtuelle Tastatur die aber auf der Konsole Eingaben macht, oder? Dazu muß ja theoretisch erstmal ein Benutzer auf der Konsole eingeloggt sein. Wie hast du den Auto-Login realisiert? Oder gibt es da andere Möglichkeiten?

    Wenn ihr schnell hilfreiche Antworten wollt, lest bitte diesen Artikel (Fehlerberichte - wie Sie Softwarefehler melden sollten) und beherzigt die darin enthaltenen Ratschläge. Herzlichen Dank!

  • Ich hatte mit einem RDM6300 RFID-Leser unter Raspian angefangen, da hatte ich es auch geschafft auf eine Karte eine MP3 / M3U Datei abspielen zu lassen. Dann hatte ich dieses Projekt für ~3 Monate ruhen lassen, hatte mir nicht wirklich Notizen gemacht und nicht mehr wirklich nachvollziehen können was ich getan hatte. Also habe ich mich dort bedient https://github.com/fsahli/music-card. leider hab ich den alten RFID leser dort nicht eingebunden bekommen. Hab dann für 7€ einen UsB Leser gekauft und damit funktioniert es gut. Sound läuft bei mir über ein Adafruit Sound Bonnet und 2 Lautsprechern.

    Momentan nutze ich mehr oder weniger genau die skripte aus diesem github, habe nur in der box.py Befehle für mehrere nicht Musik sondern Befhlskarten eingefügt (Lautstärke, Play, Next,...) "

    wie in einem Komentar

    Zitat


    1. Modify box.py line 26, “client.add(plist)” instead of “client.add(plist)”

    2. When assigning cards (with add_card.py), I use the playlist name as I see it in the MusicBox GUI (i.e. no path / .m3u extension)

    geschrieben hab ich die box.py angepasst um lokale Datein abspielen zulassen.

    in /etc/rc.local hab ich das "python /home/RFID/box.py &" eingefügt damit es automatisch startet

    jetzt schaue ich wie ich meine Arcade Buttons in dieses Script einbinden kann (um Pause, next,... damit einzubinden) und vielleicht schaffe ich es auch unabhängig von diesem Pi Musikbox Image laufen zu lassen, dann es braucht doch recht lange zum starten und die funktionalität die dieses Image bietet brauche ich eigentlich nicht (webstream, etc.)

    Das ist mein Code für die Buttons (nach https://learn.adafruit.com/playing-sounds…spberry-pi/code)

    Solange ich die beiden verschiedenen Dateien starte läuft es wie ich will, nur bekomme ich sie nicht in eine Datei, ist das sinnvoll ?

    3 Mal editiert, zuletzt von SuedBadner (8. November 2017 um 16:55)

  • Hallo zusammen,

    Bin auch gerade dabei eine Box zu bauen und schreibe aber meinen eigenen Code in Python zusammen mit xmms2.

    Zum parallelisieren benötigst Du Threads, das hat bei mir gut funktioniert. Google mal Python und Threads.

    Ich habe über raspiconfig Auto Login eingestellt und starte das Script über .bashrc, da ich sonst den Kartenleser nicht auslesen konnte.

    Kann meinen Code später gerne aber ich bin absoluter Python Neuling entsprechend ist er quick & dirty geschrieben.

  • Guten Abend alle Miteinander,

    ich hänge wieder fest.

    Ich habe mich wie zuvor beschrieben an diesem Projekt vergriffen.

    MiczFlor RFID Jukebox

    Als Player wird hier VLC verwendet. Über die RFID Karten spielt er bereits ab.

    Jetzt habe ich auch meine Schalter mal aufgenaut und Stecke eigentlich gerade im Python fest, da ich nicht weiß wie ich die Befehle von den Schaltern in VLC reinbekomme.

    Hierfür habe ich jetzt eine Menge gelesen.

    Es gibt

    LibVLC als Beispiel um es anzusprechen. Ich finde aber keine Befehle.

    in Beispiel Skript in Python wäre dieser

    Allerdings wird hier nicht VLC verwendet.

    Welche funktionen möchte ich gerne im VLC nutzen:

    Vol +

    Vol -

    Track +

    Track -

    Play/Pause

    Meine Schaltung habe ich soweit aufgebaut. Ist auch in der Anlage.

    Könnt ihr mir bitte sagen woher ich die entsprechenden Befehle bekomme und wie ich diese einbinden kann?

    Es müsste eigentlich auch über Befehle im Terminal gehen den VLC Plaer anzusprechen aber auch hier habe ich nicht wirklich was gefunden was auch funktioniert.

  • Hi,

    hatte dort auch schon was geschrieben, da ich mir auch eine Box nach MiczFlor gebaut habe.

    Es fehlte dort in dem Skript auf jeden Fall etwas wie pause, next usw. Die Befehle dazu habe ich gefunden. Somit solltest Du das auch auf die GPIO legen können:

    https://github.com/MiczFlor/RPi-J…mment-334958040

    Ich mache es bisher nur mit Karten. ABer wie gesagt, der Befehl zum Ansteuern von vlc sollte ja auch so machbar sein.

    Gruß

  • Hi Danke für die Infos.

    Die Seite habe ich auch gefunden aber durch die help Funktion hatte man die Befehle auch bekommen.

    MiczFlor

    hatte deinen zusätzlichen Eintrag schon in seinen Skript mit aufgenommen.

    Allerdings habe ich nicht verstanden wie ich den Befehl eintragen muss. Wenn ich den ins Terminal eingebe kommt immer eine Fehlermeldung.

    Kann mir einer sagen wie und wo das zum testen eingetragen werden muss.

    Ich hatte gedacht das die Fehlermeldungen kommen, da der VLC nicht richtig eingestellt ist. Dort hatte ich jetzt rumgespielt und jetzt habe ich VLC soweit bearbeitet das es nicht mehr startet.

    Könnt ihr mir bei den Befehlen nochmal bitte helfen?

  • Also wenn du libvlc benutzen willst, wirst du um ein Python-Binding nicht herumkommen. Dazu böten sich ctypes, SWIG oder Cython (nicht zu verwechseln mit CPython!) an. Aber wenn ich das richtig sehe, wird das Binding bereits vom VLC-Projekt selbst angeboten. Das scheint ctypes-basiert zu sein und es gitb auch Beispielcode. Einfach "import vlc" und dann nach Vorkommen von "vlc." in dem Beispielcode suchen.

    Wo hakt es denn genau? Die Doku zu libvlc findet sich hier (ist aus deren Wiki auch verlinkt).

    Wenn ihr schnell hilfreiche Antworten wollt, lest bitte diesen Artikel (Fehlerberichte - wie Sie Softwarefehler melden sollten) und beherzigt die darin enthaltenen Ratschläge. Herzlichen Dank!

  • Assarbad

    Ich habe jetzt mal versucht den Befehl per Python auszuführen.

    Der Skipt sieht wie folgt bis jetzt aus:

    Leider reagiert momentan nichts bei Tastendruck.

    Wenn ich diese Zeile im Terminal eingebe springt er zum nächsten Track:

    echo "next" | nc.openbsd -w 1 localhost 4212

    Wenn ich es direkt im Python eingebe auf dem Desktop dann kommt eine Fehlermeldung. SyntaxError und markiert next.

    Hat Jemand einen Tipp für mich.

  • Natürlich. Du beendest den String ja nach dem echo , indem du wieder das doppelte Anführungszeichen verwendest. Entweder escapen oder ein einfaches verwenden, woher soll denn der Parser wissen, wann du den String als beendet ansiehst?. os.system sollte nicht mehr verwendet werden, setze besser auf das subprocess Modul. Steht auch in der Doku.

  • Ich habe jetzt in der Zeile folgendes versucht: (os.system("echo "next" | nc.openbsd -w 1 localhost 4212"))

    os.system("echo next | nc.openbsd -w 1 localhost 4212")

    os.system("echo 'next' | nc.openbsd -w 1 localhost 4212")

    subprocess("echo "next" | nc.openbsd -w 1 localhost 4212")

    subprocess("echo 'next' | nc.openbsd -w 1 localhost 4212")

    Ich glaube irgendetwas verstehe ich an deiner Aussage nicht.

    Kannst du mir das vielleicht weiter erläutern?

  • Also zunächst einmal das Modul subprocess importieren. Bitte schau dir auch einmal die Doku dazu an: https://docs.python.org/3/library/subprocess.html

    dann nicht das Modul aufrufen, das ist Quatsch. Für die meisten Befehle funktioniert die Funktion call einwandfrei, weil du hier aber eine Pipe im Aufruf hast, geht es jetzt etwas anders als mit os.system:

    Python
    import subprocess
    command = subprocess.Popen(["nc.openbsd", "-w", "1", "localhost", "4212"], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
    command.communicate("next")

    Das command.communicate("next") ersetzt hier das echo, im Endeffekt erreichst du das selbe: Den Befehl nc.openbsd "mit einem String füttern"

    Alles in allem also hier dein Code mit ein paar Verbesserungen:

    Statt sys.exit kannst du in deinem Fall ein break einbauen, das sorgt in diesem Beispiel für eine Unterbrechung der Schleife und somit auch dafür, dass das Programm am Ende ankommt.

    Noch allgemein zu den Strings:

    Du kannst nicht das Zeichen direkt in einem String haben, das die Begrenzung des Strings festlegt. Folgende Beispiele gehen aber allesamt:

    Python
    "String mit 'quote'"
    'String mit "quote"'
    "String mit \"quote\""
    'String mit \'quote\''
  • alwiz79,

    ich benötige dringend deine Hilfe. Ich komme mit dem Projekt nicht mehr weiter.

    Dein Code würde mir bestimmt weiterhelfen, lieber wäre mir, ich könnte direkt mit Dir Kontakt aufnehmen.

    Kann man Forum-Mitglieder direkt anschreiben?

    Cunlean

    ich habe manchmal auch das Problem, dass *NEUE* Playlisten nicht abgespielt werden, obwohl definitiv alles korrekt (Pfade, Dateinamen, etc.).

    Bei mir hilft dann ein Reboot, und ein erneutes Scannen der Musikbibliothek aus er PiMusicbox Oberfläche heraus (das sollte man zu Gunsten der Bootzeiten, ja ausschalten).

    Ich bin erst am Wochenende wieder daheim, aber dann könnte ich ja meinen Code bei Bedarf posten

  • Ich bedanke mich nochmal für deine Hilfe. Aber ich bin für heute platt. Ich habe die Zeilen einfach mal kopiert und eingefügt. Tut leider so noch nicht.

    Ich habe auch einfach versucht den Pin auf LOW zu ziehen in dem ich GND kurz direkt dran gehalten habe. Da ich der Schaltung gerade nicht vertraut habe.

    Mein Reboot Skript funktioniert immerhin.

    Siehst du vielleicht noch ein Problem, warum VLC nicht vorspult?


    Reboot sieht so aus

    Gute Nacht.

  • @hailogugo wenn du ohnehin auf einen Socket schreibst, kannste doch auch gleich die socket-Bibliothek, oder eine darauf aufbauende benutzen. Also statt diesem seltsamen Umweg mit `echo "next"` über ne Shell.

    Wenn ihr schnell hilfreiche Antworten wollt, lest bitte diesen Artikel (Fehlerberichte - wie Sie Softwarefehler melden sollten) und beherzigt die darin enthaltenen Ratschläge. Herzlichen Dank!

  • Guten Abend wieder einmal.

    ich habe wie von Linus geschrieben den Skript erstellt. Leider funktioniert dieser nicht.

    Woran kann das liegen?

    Ich habe die Datei nun hier als Anlage hinzugefügt. Vielleicht ist irgendein Fehler durchs kopieren passiert aber ich habe es gerade nochmal verglichen und Nichts auffälliges gefunden.

    Ich bin immer noch blutiger Anfänger! Ich habe mir eine Menge durchgelesen und versucht zu verstehen.

    Assarbad kannst du mir hier vielleicht ein Beispiel gebenwie ich den Skript im Python dann schreiben müsste?

    Ich habe mir auch die Seite durchgelesen aber werde da nicht wirklich schlau raus.

    Ich möchte das Gerät gerne auf Weihnachten meinem Patenkind schenken. Das ist mein Ziel. Danach will ich noch was anderes mit einem Pi umsetzen, deshalb wollte ich erstmal eine "einfaches" Projekt machen.


    Noch ein gedanke. Im Skript von MiczFlor kann man die Bedienung auch mit RFID Karten hinterlegen. Kann man im Python nicht einfach nur eine Zahlenfolge hinterlegen die geschrieben wird für z.B. nächstes Lied und diese Zahlenreihenfolge hinterlege ich im rfid_trigger_play.sh als next? Mehr macht die RFID Karte doch auch nicht!?

    Habe jetzt weiter gefummelt. Ich müsste dann ja den Befehl so eingeben das er über die Tastatur des RFID Readers kommt. Man stellt ja schließlich den Skript auf den RFID Anschluss ein.

  • Moin moin,

    Guten Abend wieder einmal.

    ich habe wie von Linus geschrieben den Skript erstellt. Leider funktioniert dieser nicht.

    Woran kann das liegen?

    Also "funktioniert nicht" ist leider wenig hilfreich. Auch wenn's erstmal doof klingt, lies mal bitte folgendes hier durch: https://www.chiark.greenend.org.uk/~sgtatham/bugs-de.html ... ist ernsthaft gut gemeint, weil du dir damit selber hilft indem du uns die Angaben zukommen läßt, welche uns ermöglichen dir wirklich zu helfen statt ins Blaue zu spekulieren.

    Am wichtigsten wäre, was genau du als Fehler siehst? Schlägt Python fehl? Hängt das Skript? Was sind die Symptome?

    Assarbad kannst du mir hier vielleicht ein Beispiel gebenwie ich den Skript im Python dann schreiben müsste?

    Ich habe mir auch die Seite durchgelesen aber werde da nicht wirklich schlau raus.

    Du meinst wie man einen socket-Client schreibt? Das ist doch auf der verlinkten Seite im Detail beschrieben.

    Ich möchte das Gerät gerne auf Weihnachten meinem Patenkind schenken. Das ist mein Ziel. Danach will ich noch was anderes mit einem Pi umsetzen, deshalb wollte ich erstmal eine "einfaches" Projekt machen.

    Geht mir ja nicht anders, aber als einfaches Projekt würde ich das nicht sehen. Und auf der Softwareseite bin ich ziemlich firm ... also sowohl mit Linux und anderen Unixen wie auch mit der Programmierung.

    Noch ein gedanke. Im Skript von MiczFlor kann man die Bedienung auch mit RFID Karten hinterlegen. Kann man im Python nicht einfach nur eine Zahlenfolge hinterlegen die geschrieben wird für z.B. nächstes Lied und diese Zahlenreihenfolge hinterlege ich im rfid_trigger_play.sh als next? Mehr macht die RFID Karte doch auch nicht!?

    Habe jetzt weiter gefummelt. Ich müsste dann ja den Befehl so eingeben das er über die Tastatur des RFID Readers kommt. Man stellt ja schließlich den Skript auf den RFID Anschluss ein.

    Also bei Tastatur wäre ich vorsichtig, weil das schnell nach hinten losgehen kann. Mein RFID-Leser ist am seriellen Port und da kann ich bequem immer die entsprechenden Zahlen der RFID-Karten einlesen.

    Ich würde dir jedoch raten noch eine Abstraktionsschicht dazwischen zu flanschen. Ich persönlich habe vor mir die Zuordnung von Kartennummern zu Playlists in eine SQLite3-Datenbank zu schreiben (Python hat die Unterstützung dafür üblicherweise eingebaut), aber eine INI-Datei täte aus auch. Sowohl INI als auch JSON kann Python üblicherweise (hängt natürlich auch ein wenig vom Build ab) nativ schreiben und lesen.

    Dadurch sparst du dir jede Menge Ärger wenn mal eine Karte verloren geht. Statt dann wahlweise den Code des Skripts anpassen zu müssen oder x Einträge an irgendeiner anderen Stelle, kann die Zuordnung der Kartennummer einfach auf eine neue Kartennummer gelegt werden.

    Ich probiere nachher nochmal dein Skript auf Raspbian, aber ich vermute ganz stark, daß ich ohne deine Verkabelung usw. da auch nicht viel sehen werde.

    Welche Distro benutzt du? Raspbian?

    Wenn ihr schnell hilfreiche Antworten wollt, lest bitte diesen Artikel (Fehlerberichte - wie Sie Softwarefehler melden sollten) und beherzigt die darin enthaltenen Ratschläge. Herzlichen Dank!

  • Hi,

    ja ich denke es liegt auch gerade an meiner Verkabelung und dem HifiBerry Miniamp in Kombi.

    Ich habe gestern nochmal alles einzeln angeklemmt und HifiBerry mit alle PINs über Kabelbrücken verbunden. Das tut soweit wieder. Jetzt wollte ich nochmal gucken mit Skripten und vor allem mit einem Testskript ob meine Schaltung funktioniert. Hierbei lege ich einfach den Reboot Befehlt auf einen Pin. Davon habe ich in meinem Buch eine sehr gute Anleitung und das tat auch schon.

    Ich habe mir es ehrlich gesagt leichter vorgestellt. Hilf nichts dann muss ich mal mehr lesen und gucken wie ich es umgesetzt bekomme.

    Danke für die ganzen Kommentare.

    Was bei mir nun auf Jedenfall geht ohne das ich Schalter betätige sondern durch direkte Eingabe in Terminal ist:

    - Lauter Leiser über ALSA mit HIFIBerry

    - Vor Zurück


    Auch habe ich geschafft das Web-Interface an die ALSA Befehle anzupassen.

    Ich melde mich wieder wenn ich Fragen habe.

    Sonst mit meine korrigierten Anleitung.

Jetzt mitmachen!

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