Musikplayer


Im Mittelpunkt des Projekts „Musikplayer“ steht der RFID Reader. Die Grundidee des Projektes ist die Ausgabe einer Audiodatei beim einlesen einer Karte. Anfangs war die Umsetzung mit Spotify geplant, leider konnte dies auf Grund mehrerer Probleme nicht umgesetzt werde. Als Ersatz werden einfach mp3 Dateien gespielt die im Ordner gespeichert sind.


1. Schritt

Als erstes wurden die Bibliotheken für den RFID Scanner installiert, und der SPI ( Serial Peripheral Interface) am Raspberry ausgeschaltet. Es muss mit sudo pip3 install spidev noch Gerätedatei installiert werden über den der Zugriff im Betriebssystem Raspbian erfolgt. Um den unten stehenden Beispiel Code habe habe ich dann eine while True Schleife gebastelt, die darauf wartet das eine Karte gescannt wird. Hierbei wird direkt auch die Karten ID ausgegeben. Zum Testen kann man mit print die Nummer in der Konsole ausgeben. Der try Befehl kann mit Str + C beendet werden.


2. Schritt

Wenn das lesen der Karten einwandfrei funktioniert kann man sich im Internet einen Musikplayer installieren der die mp3-Dateien abspielt. In diesem Projekt wurde der vcl.Mediaplayer verwendet. Wenn der Mediaplayer funktioniert kann man beides zusammenfügen. Also mit einer if Anweisung die Kartennummer mit der eingescannten Karte vergleichen. In die if Bedingung können dann verschiedene Aktionen hinzugefügt werden. Hier werden Titel und Interpret einmal auf dem Display und einmal per Audio ausgegeben. Hinweis: Es ist wichtig den Player in der Schleife zu schließen(p.stop()) sonst werden die Dateien gleichzeitig gespielt.


3. Schritt

Display: hd44780.pdf So können dann alle Notwendigen Sachen auf dem Display ausgegeben werden. Hinweis: Auch hier sollte man das Display immer wieder lcd.lcd_clear() leeren.


4. Schritt

Als letztes muss der PIR Sensor angeschlossen werden. Mit dem Beispiel Code sollte man vorher die Senilität und die Zeit einstellen. Mit der Bibliothek GPIOzero kann man den Sensor ganz einfach ins Programm einbinden. Sonst kann man ihn auch ganz einfach über den GPIO.Pin ansprechen und mit dem Input arbeiten. Mit einer weiteren while Schleife und einer if Bedingung wartet der das Programm jetzt auf eine Bewegung bis es die zweite while Schleife startet. So lange sich nichts bewegt würde eine Meldung auf dem Display ausgegeben.


5. Schritt

Am Ende kann man zum Beispiel ein paar Pausen mit time.sleep() eingefügt, damit das Programm sinnvoll läuft. Außerdem kann eine weitere if Bedingung eingefügt werden um eine Fehlermeldung auszugeben wenn die Karte nicht hinterlegt ist. Zusätzlich gibt das Programm eine Aufforderung „eine Karte zu scannen“, wenn eine Bewegung erkannt wurde. Diese steht also mit in der if Bedingung.

Bauteile:

PIR „Passiv Infra Red Sensor


- erkennt bestimmte Menge an Infrarotstrahlen/wärme


- Sensor reagiert nur auf Bewegung


→ dafür extra Fesnel-Linse damit nicht statische Wärmequellen auslösen


- max 7 Meter , max. Ca. 120G mit 3,3V


- verstellbare sind Potenziometer Time(Tx) & Sensitive (Ti)


- Bibliothek → von gpiozero MotionSensor


Beispie um das Bauteil zu test:

Code.c
from gpiozero import MotionSensor 
pir = MotionSensor(4)
while True:
     if pir.motion_detected: 
          print("Es gab eine Bewegung")

httpsstatic.raspberrypi.orgfileseducationpostersgpio_zero_cheatsheet.pdf.pdf

RFID (Radio- Frequency Identification) Sensor


- erzeugt magnetisches oder elektronisches Feld


- RFID-Transponder wird dann passiv mit Energie versorgt


→ solang der Transponder in dem Feld ist, kann Datentransport stattfinden


- Bibliotheken → aus mfrc522 SimpleMFRC522


Beispiel um das Bauteil zu testen:

Code.c
import RPi.GPIO as GPIO
from mfrc522 import SimpleMFRC522
 
reader = SimpleMFRC522()
 
try:
        print("Bitte scanne eine Karte")
        id = reader.read()[0]
        print("Die Karten ID lautet:", id)
 
finally:
        GPIO.cleanup()

LCD-Display (Liquid Crystal Display)

- 4×20 Zeichen


- senden linear polarisiertes Licht aus


- nutzen Polifilter, zwischen zwei gekreuzten Filtern befinden sich Flüssigkristalle, je nach Ausrichtung verändert sich das Licht


- wird über das HD44780 Controller angesteuerter


- mit den I2C Datenbus müssen nur zwei GPIOs belegt werden


- Bibliotheken → lcddriver


Beispiel um das Bauteil zu testen:

Code.c
 import lcddriver
 from time import *
 lcd = lcddriver.lcd()
 lcd.lcd_clear()
 lcd.lcd_display_string("Huhu", 1)
 lcd.lcd_display_string(„Es hat geklappt", 2)

Quellcode


Code.c
 
#!/usr/bin/env python              
import os                               #Bibliotheken laden
import time
import vlc         
from mfrc522 import SimpleMFRC522
import lcddriver                   
from gpiozero import MotionSensor
 
lcd = lcddriver.lcd()              #lcd definieren 
lcd.lcd_clear()
 
p = vlc.MediaPlayer()              # Player öffnen 
 
reader = SimpleMFRC522()
 
pir = MotionSensor(23)             # Sensor auf in 23
try:
    while True:                                                       # Endlosschleife die auf Bewegung wartet
        if pir.motion_detected:                                       # aus der gpiozero wartet auf Bewegung
            p = vlc.MediaPlayer("Bitte scannen Sie eine Karte.mp3")   # Mediaplayer öffnen
            p.play()
            lcd.lcd_clear()
            lcd.lcd_display_string("Bitte scannen ", 1)
            lcd.lcd_display_string("Sie eine Karte", 2)
            time.sleep(5)
            lcd.lcd_clear()
            lcd.lcd_display_string("Nutzen Sie Str+C", 1)
            lcd.lcd_display_string("um zu beenden", 2)
 
            while True:                                                            # Endlosschleife die darauf wartet das eine Karte gescannt wird
                    id = reader.read()[0]                                      # dazu wird die jeweilige Karten ID auf dem Display ausgegeben 
                    lcd.lcd_clear()
                    print("Die Karten ID lautet:", id)
                    lcd.lcd_display_string("Die Karten ID: ", 1)
                    lcd.lcd_display_string('{0}'.format(id), 2)
                    p.stop()
                    time.sleep(2)
 
                    if (id == 129095266764):
                        p = vlc.MediaPlayer("Call me.mp3")
                        p.play()
                        time.sleep(3)
                        lcd.lcd_display_string("Es wird Call me von", 3)
                        lcd.lcd_display_string("Rae Jepsen gespielt", 4)
                        p = vlc.MediaPlayer("Carly Rae Jepsen - Call Me Maybe.mp3")
                        p.play()
                        time.sleep (2)
 
                    elif (id == 164276487417):
                        p = vlc.MediaPlayer("Almost There.mp3")
                        p.play()
                        time.sleep(4)
                        lcd.lcd_display_string("Es wird Almost There", 3)
                        lcd.lcd_display_string("gespielt", 4)
                        p = vlc.MediaPlayer("Disney's The Princess and The Frog OST - Almost There.mp3")
                        p.play()
                        time.sleep(2)
 
                    elif (id ==613034193387):
                        p = vlc.MediaPlayer("Happy.mp3")
                        p.play()
                        time.sleep(3)
                        lcd.lcd_display_string("Es wird Happy  ", 3)
                        lcd.lcd_display_string("Birthday gespielt :)", 4)
                        p = vlc.MediaPlayer("New Kids on the Block - Happy Birthday.mp3")
                        p.play()
                        time.sleep(2)
 
                    elif (id == 611859984696):
                        p = vlc.MediaPlayer("Linkin Park - Shadow Of The Day.mp3")
                        p.play()
                        lcd.lcd_display_string("Es wird Shadow ", 3)
                        lcd.lcd_display_string("of the Day gespielt", 4)
                        time.sleep(2)
 
                    elif (id != 611859984696 or 613034193387 or 164276487417 or 129095266764):      # prüft karte auf vorhandene Nummern
                        lcd.lcd_clear()
                        lcd.lcd_display_string("Diese Karte ist ", 1)
                        lcd.lcd_display_string("leider nicht", 2)
                        lcd.lcd_display_string("gueltig. Bitte versuchen", 3)
                        lcd.lcd_display_string("Sie eine andere ", 4)
 
        else:
            lcd.lcd_clear()
            p.stop()
            lcd.lcd_display_string("Leider wurde keine", 1)
            lcd.lcd_display_string("Aktivitaet erkannt.", 2)
            lcd.lcd_display_string("Warte auf Aktivitaet", 3)
            lcd.lcd_display_string("um Programm zu starten", 4)
            time.sleep(10)
 
except KeyboardInterrupt:
    p.stop()
    print ("Das Programm wird jetzt beendet")
    lcd.lcd_clear()
    lcd.lcd_display_string("Das Programm wird", 1)
    lcd.lcd_display_string("beendet....", 2)
    lcd.lcd_display_string("", 3)
    lcd.lcd_display_string("Auf Wiedersehen", 4)
    time.sleep(5)
 
lcd.lcd_clear()        
GPIO.cleanup()
 
 
}

Schaltplan