Raspberry Pi Projekte für Anfänger – Teil 2

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:

Materialliste

Als nächstes erstellen wir uns eine Materialliste. Viele der benötigten Produkte können wir jedoch anschliessend für weitere Projekte wiederverwenden.

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.

Die mobile Version verlassen