RFID-Projekte

Nachdem die Grundlagen für das Arbeiten mit RFID-Modulen gegeben sind, wollen wir uns jetzt ansehen, wie wir Projekte ganz praktisch umsetzen können. Dafür haben wir kleine Beispiel-Projekte für dich ausgearbeitet.

Kontaktlos LEDs zum Leuchten bringen

Fangen wir doch zuerst damit an, LEDs ohne Kontakt zum Leuchten zu bringen. Das Ziel ist es, jeder Karte eine Farbe zuzuordnen und eine LED entsprechend leuchten zu lassen. So sparen wir uns das nervige Umschalten. Natürlich lässt sich dieses Projekt auch beliebig erweitern z.B. mit einem RGB-LED-Strip, um dein ganzes Zimmer zum Leuchten zu bringen. Legen wir gleich mal los. Zuerst musst du eine RGB-LED an deinen Pi anschließen, im Folgenden findest du den Schaltplan.

RFID-LED Projekt
Anschlüsse PiAnschlüsse Breadboard
GPIO 181. Bein RGB-LED
GND2. Bein (das Längste) RGB-LED
GPIO 233. Bein RGB-LED
GPIO 244. Bein RGB-LED

Als nächstes kopieren wir wieder die Read.py-Datei in die farben.py-Datei, mit der wir jetzt arbeiten werden. Insgesamt gibt es drei Code-Stellen, die du einfügen musst, um die LEDs zum Leuchten zu bringen.

Wichtig ist, dass wir auch wirklich mit dem folgenden Befehl die RPi.GPIO Bibliothek importieren, wenn dort etwas anderes in Zeile steht, kannst du das ersetzen.

farben.py Zeile 1

import RPi.GPIO as gpio

Im nächsten Schritt müssen wir dem Pi erstmal sagen, dass wir RGB-LEDs angeschlossen haben. Dafür definieren wir zuerst Variablen mit den GPIO-Anschlüssen und legen dann den Zustand der Pins fest. Im nächsten Schritt definieren wir die Funktion ledsOff(). Die macht nichts anderes, als der Name schon sagt. Sie schaltet alle LEDs aus. Warum diese Funktion nützlich ist, werden wir später noch erfahren. Bei der Funktion end_read() ist noch das gpio.cleanup wichtig, damit werden die GPIO-Pins aufgeräumt und können dann wieder beim nächsten Start ordentlich benutzt werden.

Zeile 11 bis 28

# LED Setup
rot = 18
gruen = 23
blau = 24
gpio.setmode(gpio.BCM)
gpio.setup(rot, gpio.OUT)
gpio.setup(gruen, gpio.OUT)
gpio.setup(blau, gpio.OUT)

def ledsOff():
    gpio.output(rot, gpio.LOW)
    gpio.output(gruen, gpio.LOW)
    gpio.output(blau, gpio.LOW)

def end_read(signal,frame):
    global continue_reading
    continue_reading = False
    gpio.cleanup()

Jetzt, da wir die LED angeschlossen haben, müssen wir natürlich noch auslesen, welche Karte zu welcher Farbe gehört. Dafür haben wir drei verschiedene if-Bedingungen, das heißt für jede Möglichkeit jeweils eine Bedingung. Zuerst aber kontrollieren wir mit if type(data) is list:, ob sich in der Variable data überhaupt eine Liste befindet. Das ist wichtig, denn teilweise wird zwar eine Karte erkannt, aber der Inhalt der Karte kann nicht ordentlich gelesen werden. Das kann passieren, wenn du zum Beispiel die Karte zu schnell vom Lesegerät entfernst. Im nächsten Schritt wandeln wir, wie bekannt, die ASCII-Zahlen in Buchstaben um, dann kommen die Bedingungen. Dort benutzen wir if "gruen" in text, um zu kontrollieren ob sich der String "gruen" in der Variable text befindet. Das müssen wir machen, denn wenn wir nur "gruen" == text machen würden, könnte es dort teilweise zu falschen Ergebnissen kommen, wenn der Rest der Karte mit noch anderen Inhalten befüllt ist. In der Bedingung schalten wir zuerst alle LEDs aus und schalten dann immer die LED an, die wir auch anschalten wollen.

if status == MIFAREReader.MI_OK:
    data = MIFAREReader.MFRC522_Read(8)
    MIFAREReader.MFRC522_StopCrypto1()
    if type(data) is list:
        text = "".join(chr(x) for x in data)
        print text
        if "gruen" in text:
            ledsOff()
            gpio.output(gruen, gpio.HIGH)
        if "rot" in text:
            ledsOff()
            gpio.output(rot, gpio.HIGH)
        if "blau" in text:
            ledsOff()
            gpio.output(blau, gpio.HIGH)
    else:
        print "Es gab einen Fehler :("

So einfach ist der Programmcode dann auch 😉 Bevor du dein Programm aber testen kannst, musst du erst noch deine Karten mit der MyWrite.py-Datei so beschreiben, dass auf diesen auch wirklich gruen, rot und blau steht, sonst kann natürlich das Programm auch nicht funktionieren. Gegen den Fehlerteufel kannst du dir das Programm auch nochmal herunterladen:

$ wget cw42.de/p/farben.py

Das RFID-Soundboard

Gerade eben haben wir uns schon damit beschäftigt, die GPIOs und damit eine LED zu kontrollieren, aber natürlich haben wir damit auch noch andere Möglichkeiten. Eine davon ist ein interaktives Soundboard. Wir haben als Beispiel einfach mal Tiergeräusche genommen, aber natürlich lassen sich auch andere Geräusche abspielen, die im Zweifelsfall auch situationsbedingt weiterhelfen können. Damit du nicht selbst alles im Internet zusammensuchen musst, gibt es hier eine kleine Zusammenfassung von uns, die du dir einfach herunterladen kannst.

$ git clone https://github.com/coding-world/animal-sounds

Noch mehr Sounds findest du auch auf https://www.freesound.org/. Dort gibt es nur Creative-Commons-Sounds, das heißt du kannst diese einfach benutzen und verändern wie du willst.

Im nächsten Schritt müssen wir noch das Audio richtig einstellen. Der Raspberry Pi hat selbst keine Lautsprecher, deswegen brauchst du entweder Kopfhörer oder externe Lautsprecher, die du an den PI anschließen kannst. Wir haben in unserem Fall Lautsprecher genommen, die mit einem USB-Anschluss mit Strom versorgt werden und haben die Verbindung zwischen Raspberry Pi und den Boxen mit einem Klinkenstecker vorgenommen. Wenn du diese Art der Verbindung nutzt, musst du teilweise noch einmal die Einstellungen ändern, damit auch wirklich Sounds über den Kopfhöreranschluss abgespielt werden.

sudo raspi-config -> 1 System Options -> S2 Audio -> 0 Headphones

Falls dein Monitor oder Fernseher Lautsprecher eingebaut hat, die über HDMI funktionieren, kannst du auch HDMI als Sound-Ausgang wählen. Um zu testen, ob alles richtig verbunden/angeschlossen ist, kannst du mit dem folgenden Befehl einzelne Töne über das Terminal abspielen:

$ aplay animal-sounds/cow.wav

Wenn das klappt, solltest du das Muhen einer Kuh hören. Jetzt können wir uns daran machen, das Python-Programm dafür zu schreiben. Wir benutzen dabei eine Python-Bibliothek, die auf jedem Pi vorhanden ist, die pygame Bibliothek. Mit dieser können grafische Spiele programmiert werden. Das machen wir jetzt nicht, nutzen aber den Sound-Teil dieser Bibliothek – den mixer – um Sounds abzuspielen.

import pygame
pygame.mixer.init()
pygame.mixer.music.load("animal-sounds/cow.wav")
pygame.mixer.music.play()
while pygame.mixer.music.get_busy() == True:
    continue

Das Programm ist ganz simpel, in Zeile 1 wird die Bibliothek importiert und in Zeile 2 wird dann die Mixer Komponente initialisiert. In Zeile 3 wird festgelegt, wo sich die Sound-Datei befindet, du musst hier den Pfad von deinem Python-Programm zu der Sound-Datei angeben. In Zeile 5 wird diese Datei dann abgespielt. Da Python sich immer beendet, sobald die letzte Zeile des Programms ausgeführt wurde, können wir mit der while-Schleife in Zeile 6 das Programm solange pausieren, wie die Sound-Datei noch nicht komplett abgespielt wurde. Wenn du das Programm ausführst, solltest du wieder das Muhen einer Kuh hören. Wenn du in den Ordner animal-sounds wechselst (cd animal-sounds), kannst du dir mit ls alle Sounds anzeigen lassen, die du abspielen kannst.

Der nächste Schritt ist, diese Funktion in das Farben-Python-Programm einzubauen. Wir benutzen dabei als Grundlage die farben.py-Datei. Deswegen kopieren wir diese am besten in rfid-sounds.py. In diesem müssen wir am Anfang zuerst die Bibliothek importieren und dann initialisieren. Zeile 3-6 müssen wir dann in die if-Bedingungen einbauen. Wenn du das machst, müsste jetzt beim Vorhalten einer Karte der Sound abgespielt werden. Wir haben hier mal etwas vorbereitet.

if "kuh" in text:
    pygame.mixer.music.load("animal-sounds/cow.wav")
    pygame.mixer.music.play()
    while pygame.mixer.music.get_busy() == True:
      contiue
if "huhn" in text:
    pygame.mixer.music.load("animal-sounds/chicken.wav")
    pygame.mixer.music.play()
    while pygame.mixer.music.get_busy() == True:
      contiue
if "elefant" in text:
    pygame.mixer.music.load("animal-sounds/elephant.wav")
    pygame.mixer.music.play()
    while pygame.mixer.music.get_busy() == True:
      contiue

Das Ganze funktioniert ähnlich wie mit den Farben. Aber anstatt eine LED zu schalten, spielen wir dieses Mal Sounds ab. Natürlich musst du dafür auch die Karten neu beschreiben!

Weitere Möglichkeiten

Unser Hauptprojekt ist mal wieder zu Ende, aber der wahre Spaß fängt jetzt natürlich erst wirklich an! Falls dir die Ideen fehlen, hätten wir hier noch ein paar:

Twitter-Bot

Mit Twitter kannst du schnell kleine Nachrichten von maximal 280 Zeichen in die Welt senden. Wie wäre es also mit verschiedenen Karten, um der Welt deine Gefühlslage (gelangweilt, glücklich, <emotion einfügen> ) mitzuteilen und das nur mit dem RFID-Reader und Karte?

Zugangskontrolle

Wie wäre es mit einer smarten Zugangskontrolle, die dir genau protokolliert, wann du wie dein Zimmer betreten hast? Solche Systeme findest du auch bei größeren Arbeitgebern und bei Schließsystem. Sowas ließe sich natürlich auch mit einem Display oder weiterem verbinden.

Musik-Player

Dein Lieblingslied wird abgespielt, wenn du eine RFID-Karte über den Reader hältst. Das ist fast wie früher als man CDs einlegen musste und macht mächtig viel Eindruck. Außerdem ist es ein riesen Spaß für Alle.

Weitere RFID-Karten bekommst in der Regel bei allen gängigen Elektronik-Verkäufern!

Auf Wiedersehen

Wir hoffen, dir hat dieses kleine Kit gefallen! Wenn du noch mehr erleben und arbeiten willst, findest du viele weitere spannende Projekte auf codingworld.io. Dort helfen wir dir auch gerne bei Fragen und Problemen rund um dein Projekt.