Der Babycube
Falls Ihr direkt hier gelandet sein solltet, empfehle ich euch den ersten Teil des Tutorials zu überfliegen. 🙂 Im Tutorial Raspberry Pi Projekte für Anfänger – Teil 2 beginnen also mit einem Babycube – Im Grunde nichts anderes als eine Jukebox, welche 9 Tasten hat auf die Söhnchen oder Töchterchen drücken kann und schon spielt die Musik. Da das ältere Semster jedoch schnell von der Variation von 9 Liedern genervt ist, müssen die Lieder auswechselbar sein. Wir bewerkstelligen dies komfortabel mit unserem Webinterface. In diesem Teil widmen wir uns aber voll und ganz dem Raspberrry Pi-Setup. Im dritten Teil widmen wir uns dann vorallem dem Bau des Babycube.
Erste Überlegungen
Damit das Projekt gelingt haben wir im Quick`n`Dirty-Verfahren aufgeschrieben, was die Jukebox am Ende können muss, und was gemacht werden muss. Unsere Überlegungen ergaben folgendes:
Das muss die Box können:
- Gehäuse muss bombensicher sein (Kinderhände)
- Beleuchtete Tasten
- Akkubetrieb (aufladbar)
- 9 Tasten
- Stereosound
- nicht zu leicht, dass die Box bei der kleinsten Berührung umfällt aber auch nicht zu schwer
Materialliste
Als nächstes erstellen wir uns eine Materialliste. Viele der benötigten Produkte können wir jedoch anschliessend für weitere Projekte wiederverwenden.
- RaspberryPi Zero WH
- WM8960 Soundkarte
- BatteryShield
- 2x Akkus 18650
- 2x Lautsprecher ca. 5W
- dünne Litzenkabel
- 9 Taster ohne Hold
- 1 Taster mit Hold
- Ladeanschluss
- Lötkolben
- Lötzinn
- 2x Kurzes USB-Kabel Male -> Micromale
- Ladekabel
- GPIO-Anschlusskabel
- Montagematerial für RaspberryPi
- Einschlagmuttern
- Holz
Setup des RaspberryPi
Bevor wir uns um den Bau des eigentlichen Babycubes kümmern, bringen wir erstmal die Software und Komponenten zum laufen, testen auf Funktion und nehmen unsere Pythonprogramme in den Autostart.
Schritt 1 Raspbian installieren
Ich denke über diesen Schritt gibt es nicht viel zu berichten, alternativ hat es tausende Anleitungen im Netz. Also Raspbian von der Webseite herunterladen, mit Win32DiskImager auf die SD-Karte knallen, in den Raspberry Pi stecken und ab geht die Post. – Ä halt ganz sooo schnell auch nicht, die Soundkarte muss noch auf den RPi aufgesteckt werden. Den Strom holt sich bei uns der RPi vorerst noch vom Netzteil.
Unser Babycube braucht um sich die neuen Audio-Files zu holen auf jeden Fall eine Internetverbindung. Also muss das WLAN konfiguriert werden. Dies funktioniert am besten mit dem Befehl
sudo raspi-config
Ist man schon mal in dem Menü kann man eigentlich unter Interfaces direkt den SSH-Server aktivieren, das macht das Arbeiten mittels Tools wie Putty um einiges einfacher.
Schritt 2 – Kompilieren des Treibers für WM8960
Der etwas kniffligere 2. Schritt hat uns etwas gefordert, wir haben es aber nach einiger Zeit doch hingekriegt und erklären euch wie. Eine Anleitung findet Ihr aber auch hier
Als erstes führen wir ein Update aus und installieren git:
sudo apt-get update
apt-get install git
Als nächstes holen wir uns die zum kompilieren benötigte Software mittels git und versuchen mal eine Installation:
git clone https://github.com/waveshare/WM8960-Audio-HAT
cd WM8960-Audio-HAT
sudo ./install.sh
sudo reboot
Wenn die Installation geklappt hat – Your a lucky man, Dude !
Falls nicht, wie dies bei uns der Fall war, könnt Ihr versuchen die Dateien für den neusten Debian-Kernel aufzubereiten, indem Ihr die Datei wm8960.c bearbeitet und dort folgende Änderungen durchführt:
Ersetzen von allen
snd_soc_component_read32
durch
snd_soc_component_read
gefolgt von
static int wm8960_mute(struct snd_soc_dai *dai, int mute)
durch
static int wm8960_mute(struct snd_soc_dai *dai, int mute, int direction) und zuguter letzt
.digital_mute = wm8960_mute,
durch
.mute_stream = wm8960_mute,
Anschliessend mit
sudo ./install.sh
nochmals versuchen den Treiber zu konfigurieren. Ich hoffe es hat nun geklappt. Prüfen könnt Ihr dies mit dem Befehl
dkms status
Ein Reboot des Systems darf natürlich nicht fehlen. Mit
sudo raspi-config
das Standardinterface für Audio auf die neu installierte Soundkarte stellen.
Schritt 3 – Installation zusätzlicher Pakete
Um unser Projekt weitertreiben zu können, benötigen wir einige zusätzliche Pakete, welche wir mit folgendem Befehl installieren können:
sudo apt-get install vlc python3-pip rpi.gpio
Mit PIP installieren wir dann noch den mysql-connector um mit der Datenbank kommunizieren zu können, in welcher die Pfade der Musikdateien gespeichert sind, als auch noch python-vlc, welches uns erlaubt vlc in einem Python-Scriptt zu verwenden.
pip3 install vlc-python
pip3 install mysql-connector-python
So was fehlt noch? Aja richtig die Files.
Die Python-Files
Die Software haben wir in 2 Python-Programme aufgeteilt. Das erste File ist der Datei-Controller, das zweite spielt die Musik auf Knopfdruck. Grundsätzlich wollten wir einfach mal so ausprobieren wie alles funktioniert und möglichst schnell einen ersten Prototypen haben, deshalb sind die Files sicher noch verbesserbar.
dc.py
Dieses File nutzen wir um die Musikdaten vom Server herunterzuladen und als mp3-File mit dem richtigen Namen abzuspeichern. Ausserdem lassen wir am Anfang die 10 LEDs der Taster blinken, damit der User weiss, dass der Babycube bereit ist. Anschliessend leuchten die LEDs durchgehend. Ach quatsch ned so lang zeig das File.
import time
import mysql.connector
import os
import RPi.GPIO as GPIO
import requests
import os.path
GPIO.setmode(GPIO.BCM) # Pin Muster
GPIO.setup(9, GPIO.OUT) # Setze GPIO 9 auf out
GPIO.output(9, GPIO.HIGH) # LED an
time.sleep(1) # Schlafen für 1 sek.
GPIO.output(9, GPIO.LOW) # LED aus
time.sleep(1) # Schlafen für 1 sek.
GPIO.output(9, GPIO.HIGH) # LED an
time.sleep(1) # Schlafen für 1 sek.
GPIO.output(9, GPIO.LOW) # LED aus
time.sleep(1) # Schlafen für 1 sek.
GPIO.output(9, GPIO.HIGH) # LED an
url = 'http://meinWebseitenpfadbiszumfileordner'
try:
connection = mysql.connector.connect(host = "datenbankhost", user = "datenbankuser", passwd = "datenbankpasswort", db = "ldatenbankname")
connection.autocommit = True
except:
print ("Keine Verbindung zum Server")
exit(0)
while True:
cursor = connection.cursor(buffered=True)
cursor.execute("""SELECT * from audio_assigned""")
# Alle Elemente der Rheihe ausio_assigned auswählen
records = cursor.fetchall()
print("Looking for updates")
for row in records:
if row[3] == 2:
# Ein 2 wurde in die Datenbank geschrieben, wenn der Button geändert wurde
time.sleep(1)
# Schlafen für 1 sek.
print ("There is a change on Button" , row[0] )
print ("Download ...")
path= (row[2])
# Hier steht der Pfad des Musikfiles
name = (row[1])
# Der Filename
button = (row[0])
# Die Buttonnummer
os.remove('button' + str(button) + '.mp3')
# Löschen des alten mp3-Files
fullpath = "%s/%s%s" % (url,path,name)
r = requests.get(fullpath, allow_redirects=True)
with open('/home/pi/' + name , 'wb') as f:
f.write(r.content)
# Herunterladen der neuen Datei
os.rename(name, 'button' + str(button) + '.mp3')
# Umbennen auf Buttonxy.mp3
cursor2 = connection.cursor()
query1 = "UPDATE audio_assigned SET updated = 1"
# Updatestatus zurücksetzen
cursor2.execute(query1)
connection.commit()
cursor2.close()
elif row[3] == 1:
time.sleep(2)
print ("No changes on Button" , row[0])
time.sleep(0.1) # Zeit für die CPU
Mehr macht unser erstes Script eigentlich auch gar nicht. Es prüft also mittels einem gesetzten Wert in der Datenbank, ob Änderungen vorgenommen wurden und falls ja, wird die Datei heruntergeladen umbenannt und der Prüfwert zurückgesetzt.
button.py
Das button.py-File lässt die Musik erklingen. Die While true -Schleife fragt immer wieder ab ob ein Button gedrückt wurde und falls ja stoppen alle Lieder und das zu diesem Button gehörige wird abgespielt. In der Datenbank haben wir wiederum den gewünschten Volume-Wert gespeichert, welchen wir hier einlesen. Das File ist verkürzt, jedoch wiederholt sich der Code im Grndsatz für jeden der neun Buttons, welche unsre kleinsten dann drücken können.
# Sound1b.py
import RPi.GPIO as GPIO
import time
import vlc
import mysql.connector
try:
connection = mysql.connector.connect(host = "datenbankhost", user = "datenbankuser", passwd = "datenbankpasswort", db = "ldatenbankname")
connection.autocommit = True
except:
print ("Keine Verbindung zum Server")
exit(0)
GPIO.setmode(GPIO.BCM)
GPIO.setup(16, GPIO.IN)
GPIO.setup(26, GPIO.IN)
GPIO.setup(5, GPIO.IN)
GPIO.setup(25, GPIO.IN)
GPIO.setup(24, GPIO.IN)
GPIO.setup(23, GPIO.IN)
GPIO.setup(27, GPIO.IN)
GPIO.setup(22, GPIO.IN)
GPIO.setup(6, GPIO.IN)
p1 = vlc.MediaPlayer ('/home/pi/button1.mp3')
# definieren der Songs zu den Buttons
p2 = vlc.MediaPlayer ('/home/pi/button2.mp3')
p3 = vlc.MediaPlayer ('/home/pi/button3.mp3')
p4 = vlc.MediaPlayer ('/home/pi/button4.mp3')
p5 = vlc.MediaPlayer ('/home/pi/button5.mp3')
p6 = vlc.MediaPlayer ('/home/pi/button6.mp3')
p7 = vlc.MediaPlayer ('/home/pi/button7.mp3')
p8 = vlc.MediaPlayer ('/home/pi/button8.mp3')
p9 = vlc.MediaPlayer ('/home/pi/button9.mp3')
state = "STOPPED"
while True:
cursor = connection.cursor()
cursor.execute("""SELECT * from audio_config""")
records = cursor.fetchall()
for row in records:
volume = row[0]
print (volume)
if GPIO.input(16) == 1 and state == "STOPPED":
print ("stopped->playing")
p1.audio_set_volume(volume)
p1.play()
state = "PLAYING"
time.sleep(1)
#
elif GPIO.input(16) == 1 and state == "PLAYING":
print ("playing->stopped p1")
state = "PLAYING"
p1.stop()
p2.stop()
p3.stop()
p4.stop()
p5.stop()
p6.stop()
p7.stop()
p8.stop()
p9.stop()
time.sleep(1)
p1.audio_set_volume(volume)
p1.play()
elif GPIO.input(26) == 1 and state == "STOPPED":
state = "PLAYING"
print ("stopped->playing")
p2.audio_set_volume(volume)
p2.play()
time.sleep(1)
elif GPIO.input(26) == 1 and state == "PLAYING":
print ("playing->stopped p2")
state = "PLAYING"
p1.stop()
p2.stop()
p3.stop()
p4.stop()
p5.stop()
p6.stop()
p7.stop()
p8.stop()
p9.stop()
time.sleep(1)
p2.audio_set_volume(volume)
p2.play()
.
.
.
So das wars auch schon mit dem Raspberry Pi Projekte für Anfänger – Teil 2. Im dritten Teil werden wir beginnen das Gehäuse zu bauen und den Babycube fertig zu stellen. Wenn Ihr Fragen oder Probleme hat, hinterlasst uns einfach einen Kommentar, dann helfen wir euch weiter.