Music Player mit Raspberry Pi und RFID-Reader - AZ-Delivery

Nach einem Jahr Erfahrung mit der Toniebox kann ich nachvollziehen, warum die kleinen Figuren, mit denen man Musik oder Märchen hören kann, so beliebt sind. Unsere seinerzeit 1 1/2 -jährige Enkelin kam auf Anhieb damit klar und hatte schnell ihre Lieblingsfigur mit den Kinderliedern ausgewählt. Inzwischen hat sie eine stattliche Sammlung an Figuren, denn beide Großeltern wohnen nicht am Ort und wollen bei ihren Besuchen nicht nur Naschies mitbringen.

Es geht auch preiswerter, wie unser Kunde und Kooperationspartner Thorsten Voss gezeigt hat. Er hat mit Teilen aus unserem Sortiment und einem stetig weiterentwickelten Sketch eine schöne Alternative geschaffen, die nicht nur für das Kinderzimmer, sondern auch für einen Kindergarten mit vielen Kindern geeignet ist. AZ-Delivery hat das zum Anlass genommen, die verwendete Hardware als Bundle zu verkaufen. Das TonUINO Set besteht aus MP3 Player, Nano V3.0, RFID Kit und 10 x 13,56 MHz RFID Karten. Und Herr Voss bietet inzwischen fertige Platinen an und hat eine Internetseite für die Community.

Nachdem ich das RFID-Kit bereits mit dem Raspberry Pi für das Projekt „Zugangskontrolle“ ausprobiert hatte, wollte ich mit einem meiner vielen alten Raspis eine preiswerte Lösung für den Musik-Player selbst programmieren. Durch die viele Beschäftigung mit Arduino-Sketchen rosten meine Python-Kenntnisse sonst ein. Aber ich habe nicht nur meine Fähigkeiten wiederbelebt, sondern auch neue Erkenntnisse dazu gewonnen. Haben Sie Interesse? Dann erfahren Sie jetzt mehr über den Anschluss des RFID-Kartenlesers an den Raspi, das Lesen und Beschreiben der Karten bzw. Chips, das Abspielen von Liedern oder ganzer Playlists, und selbstverständlich auch den Autostart des Programms, um den Raspi „headless“, also ohne Tastatur und Monitor, zu betreiben und herunter zu fahren.

Was benötigen wir?

1

Beliebiger Raspberry Pi, bevorzugt Raspi mit WiFi und Bluetooth

1

RFID Kit RC522

1

RFID Keycard  10x30x, oder  50x

Opt.

Bluetooth Lautsprecher

Opt. 

1 Taster zum Ausschalten

Das Schöne am Raspberry Pi ist, dass er grundsätzlich alles für unser Projekt hat. Die Musik kann auf der Micro-SD-Karte gespeichert werden und die Schnittstelle für den RFID-Card Reader muss nur aktiviert werden. Worauf warten wir noch? 

Bibliotheken und Schaltplan

Auf der Produktseite für das RFID Kit RC522 finden wir unter Wichtige Downloads & Links  sowohl Raspberry Pi Libraries als auch Raspberry Pi Schematics..

Auf dem Schaltplan ist schnell zu erkennen, dass der RFID-Card Reader an der SPI-Schnittstelle angeschlossen wird, die wir in der Konfiguration aktivieren müssen:

Schaltplan

Im oberen Teil des nächsten Bildes sieht man die Fehlermeldung, wenn die SPI-Schnittstelle (engl. Serial Peripheral Interface) noch nicht aktiviert wurde.

SPI aktivieren

Für die Abfrage der RFID-Karte gibt es verschiedene Programm-Bibliotheken (Python-Module). Mit dem auf der Produktseite und im eBook verwendeten Modul pi-rc522 hatte ich anfänglich Probleme, die Karten zu erkennen. Das lag daran, dass ich den IRQ-Pin nicht angeschlossen hatte. Entsprechende Hinweise sowie ein neues Schaltbild sind jetzt ergänzt.

Bei meinen Recherchen im Internet habe ich bei github die Bibliothek von pimylifeup gefunden, die ohne IRQ auskommt. Damit hat geklappt, was ich mir vorgenommen hatte.

Hier zunächst die Links für alle, die mehr wissen dazu wollen. 

https://github.com/pimylifeup/MFRC522-python   Die Programm-Bibliothek

https://pimylifeup.com/raspberry-pi-rfid-rc522/   Der Blog von pimylifeup

Für dieses Projekt installieren wir die Bibliothek mit pip3 direkt auf den Raspi. Wer ein aktuelles Raspberry Pi OS (ehemals Raspbian) nutzt, hat bereits die notwendigen Programme pip3 und spidev installiert. Wir brauchen nur noch die Bibliothek von pimylifeup installieren. Das geschieht im Terminal mit:

 sudo pip3 install mfrc522

Wir alle sind von den Bibliotheken in der Arduino IDE verwöhnt, denn hier werden stets Beispielprogramme mitgeliefert, die man für eigene Bedürfnisse anpassen kann. Bei pimylifeup werden im o.g. Blog Programmfragmente zum Lesen und Beschreiben der RFID-tags gezeigt, die ich hier für meine Zwecke „gepimpt“ habe. Hier mein Sketch zum Lesen und möglichen Beschreiben der RFID-tags (download ReadWrite_MFRC522.py). Zu Beginn sind Hinweise zu den Voraussetzungen und zur Schaltung eingefügt.

Programmcode

Nach dem Import der Bibliothek wird zunächst das Objekt reader instanziiert und dann werden die Methoden read() bzw write() darauf angewendet. Diese habe ich jeweils in die selbstdefinierten Funktionen Read() und Write() eingebunden. Im Hauptprogramm werden die id und der text gelesen und ausgegeben; dann wird gefragt, ob ein neuer Text (newData) – z.B. der Dateiname unserer Musikdateien – eingegeben werden soll. Auf eine Schleife zum wiederholten Lesen und Schreiben mehrerer RFID tags habe ich der Einfachheit halber verzichtet.

 # Demo program for RFID reader RC522
 # based on library/python-module and examples by pimylifeup
 # preparations:
 # Open Raspberry Pi Configuration and activate SPI
 # connect RFID reader to Raspberry Pi - physical pin numbers
 # SDA - Pin 24     SCK - Pin 23     MOSI - Pin 19
 # MISO - Pin 21   IRQ - not connected
 # GND - Pin 25   RST - Pin 22     3.3V - Pin 17
 #
 # If you have a current OS, pip3 and spidev are included
 # Install library/python-module with
 # sudo pip3 install mfrc522
 #
 # by Bernd Albrecht for AZ-Delivery Dec 2021
 
 #!/usr/bin/env python3
 import RPi.GPIO as GPIO
 from mfrc522 import SimpleMFRC522
 reader = SimpleMFRC522()
 
 def Read():
     print("Hold RFID card/chip close to reader!")
     id, text = reader.read()
     print("id = ",id)
     print("Text = ",text)
 
 def Write(newData):
     print("Hold RFID card/chip close to reader!")    
     reader.write(newData)    
     Read()
 
 # main program:
 Read()
 answer = input("Do you want to write text to RFID card/chip? y/n ")
 if answer=="y" or answer=="Y" or answer=="z" or answer=="Z" or answer=="j" or answer=="J":
     newData = input("Insert new Data for RFID tag!   ")
     Write(newData)
     GPIO.cleanup()
 else:
     GPIO.cleanup()

Ich benutze diesen Sketch, um RFID-Karten für meinen Music Player vorzubereiten. Ich schreibe einfach den Dateinamen des Musikstücks aus dem Unterordner /Music/ auf die Karte bzw. den Chip. Dabei bitte keine Leerzeichen oder „exotische“ Zeichen benutzen; das englische ABC, Zahlen und der Unterstrich funktionieren einwandfrei.

Beispiel: EdSheeran_Perfect.mp3

Aber es geht auch:   playlist.xspf   für eine mit VLC erstellte Wiedergabeliste.

Mit den so beschriebenen RFID-Karten probiere ich dann mein Python-Programm MusicPlayer_MFRC522.py aus. Gegenüber dem ersten Programm kommen zwei neue Programm-Module hinzu, die eher selten verwendet werden.

Das Modul os wird benötigt, um das Programm VLC zum Abspielen der Musik zu nutzen (os.system('cvlc /home/pi/Music/'+song)) und den Raspberry Pi geordnet herunter zu fahren (os.system(´sudo shutdown – h now´)). Bei dem Programm cvlc wird auf das Starten der grafischen Oberfläche von VLC verzichtet und damit Zeit gespart.

Das Modul _thread wird benötigt, um während des Abspielens der Musik weiterhin RFID-Karten abfragen zu können und so das nächste Lied abzuspielen oder - in Verbindung mit dem Taster zwischen den Pins 39 und 40 - das Programm zu beenden.

Also, um das Programm zu beenden und den Raspberry Pi herunter zu fahren, müssen erstens die physikalischen Pins 39 (Ground) und 40 kurzgeschlossen und zweitens eine beliebige RFID-Karte an den Reader gehalten werden.

 #!/usr/bin/env python3
 import os
 import RPi.GPIO as GPIO
 from time import sleep
 from mfrc522 import SimpleMFRC522
 import _thread
 
 reader = SimpleMFRC522()
 GPIO.setwarnings(False)
 GPIO.setup(40,GPIO.IN,pull_up_down=GPIO.PUD_UP)
 
 def play():
     global id, song
     os.system('cvlc /home/pi/Music/'+song)
 
 ##def Read():
 ##   global id, song
 ##   print("Hold RFID card/chip close to reader!")
 ##   id, song = reader.read()
 ##   print("id = ",id)
 ##   print("Text = ",song)
 
 while GPIO.input(40)==True:
     print("Hold RFID card/chip close to reader!")
     id, song = reader.read()
     print(id)
     print(song)
     
     _thread.start_new_thread(play,())
     print("Music is playing ...")
     while reader.read()[1]==song:
         sleep(1)
     print("Music stopped playing. ")    
     os.system('killall vlc')
 
 GPIO.cleanup()
 os.system('sudo shutdown -h now')

Audioausgabe

Für die Ausgabe der Musik gibt es verschiedene Möglichkeiten: Meist voreingestellt ist die Ausgabe über HDMI, also das TV-Gerät oder den Monitor mit eingebauten Lautsprechern. Wer einen Bluetooth-Lautsprecher hat, dem sei diese Option empfohlen. Die schlechteste Option ist m.E. die eingebaute 3,5mm-Klinkenbuchse. Wer Kopfhörer oder Lautsprecher mit Klinkenstecker verwenden möchte, sollte sich ein preiswertes USB-Soundmodul gönnen. Zwischen den Optionen umgeschaltet wird mit rechtem Mausklick auf das Lautsprechersymbol.

Autostart

Wenn alle Einstellungen gemacht sind, kann der Raspi „headless“ betrieben werden. Sicheres Beenden des Programms und Herunterfahren des Raspberry Pi sind Teil des Music Players, fehlt noch der Autostart. Dafür werden verschiedene Möglichkeiten beschrieben:

Die erste Methode mit der Datei /etc/rc.local funktionierte bei mir allerdings nicht (mehr?). Vielleicht eine Nebenwirkung des neuen Raspberry Pi OS „Bullseye“?

Die zweite Methode mit der im Verzeichnis /home/pi versteckten Datei .bashrc funktioniert super: Die Datei mit

 sudo nano /home/pi/.bashrc

öffnen und am Ende die folgenden zwei Zeilen (ggf. mit Ihren Änderungen) eingeben:

 echo Running at boot
 python3 /home/pi/pi-rfid/MusicPlayer_MFRC522.py &

bashrc edit

Für mich habe ich komplette Wiedergabelisten erstellt für die wichtigsten Ereignisse, z.B. romantische Abendessen zu zweit, oder Klassik hören, wenn im TV wieder mal auf 100 Kanälen nichts zu finden ist. Die RFID-Karten können übrigens auch wunderbar beklebt werden, so dass vom Kleinkind bis zum Greis alle damit umgehen können. Viel Spaß beim Nachbauen.

Projekte für anfängerRaspberry pi

3 Kommentare

Ulli Sundermann

Ulli Sundermann

Hallo, ich habe 2 solcher Projekte mit euren Komponenten realisiert, bei mir fanden jedoch der Arduino Nano und ein ESP 32 bisher Verwendung, da sie sofort betriebsbereit sind und nicht erst booten müssen. Der Beitrag hat mich aber noch einmal inspiriert den Pi mit einem Sonos System zu koppeln, im Netzwerk laufen zu lassen und die RFID Karten dann über ein ESp ebenfalls im Netzwerk eingeloggt als Handgerät dann an den Pi zu übertragen und die hinterlegte Playlist abzuspielen. Vielen Dank für die Inspiration.
Gruß aus NRW

Andreas Wolter

Andreas Wolter

@Helmut Hoppe: eine “serienreife” Variante können wir nicht anbieten. Die Blogbeiträge dienen lediglich als Inspiration für eigene Projekte. Im Beitrag ist das TonUINO Kit verlinkt. Vielleicht ist das etwas für Sie.

Grüße,
Andreas Wolter
AZ-Delivery Blog

Helmut Hoppe

Helmut Hoppe

Hallo, ich finde das Projekt sehr spannend. Leider habe ich nicht die Zeit und auch nicht die tieferen Kenntnisse um diese Projekt für meine Anwendung Serienreif zu gestalten. Aus diesem Grund die Frage: gibt es eine Endnutzer taugliche Version die “einfach” in ein Gehäuse eingebaut werden kann und per wenige Handgriffe genutzt werden kann. Es sollen eine begrenzte Anzahl von Liedern (MP3) von einer SD-Karte abgespielt werden können. Per Podi oder Taster etwas lauter/leiser gestellt werden können und das Abspielen sollte ein/aus (start/stopp) schaltbar sein.
Ein userseitiges downloaden der MP3s wäre super.
Ich such ein Komplettpaket zum integrieren in meine Geräte. Viele Grüße Helmut Hoppe

Kommentar hinterlassen

Alle Kommentare werden von einem Moderator vor der Veröffentlichung überprüft

Empfohlene Blogbeiträge

  1. ESP32 jetzt über den Boardverwalter installieren - AZ-Delivery
  2. Internet-Radio mit dem ESP32 - UPDATE - AZ-Delivery
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1 - AZ-Delivery
  4. ESP32 - das Multitalent - AZ-Delivery