Von der Firma digitspace.com habe ich für dieses Review kostenfrei das RFID Starter Kit für den Arduino UNO R3 zur Verfügung gestellt bekommen.
Dieses Set habe ich im gleichen Zuge mit dem Microbit Starter Kit für den BBC micro:bit von der Firma digitspace.com erhalten.
Bezug
Das RFID Starter Kit für den Arduino UNO R3 findest du im Shop von digitspace.com. Wenn man alle Teile des Sets einzeln auf ebay.de erwerben möchte so zahlt man deutlich mehr und daher lohnt sich der kauf eines solchen Sets.
Inhalt des RFID Starter Kit für den Arduino UNO R3
Das Set enthält folgende Bauteile:
- Arduino UNO R3 (Klon) inkl. USB Datenkabel*,
- IR Fernbedienung,
- 720 Pin Breadboard,
- diverse Breadboardkabel,
- Servomotor Typ SG90 inkl. diverse Ruderhörner,
- DHT11 Sensor (Temperatur & rel. Luftfeuchtigkeit),
- Joystick,
- Relaisshield,
- RealTimeClock DS3231,
- 16 Taster Shield,
- Regendetektorshield,
- 4 Phasen Schrittmotor inkl. Modul,
- 20×2 LCD Display,
- RFID Modul,
- diverse LEDs & Widerstände,
- 1x analoger Temperatursensor LM35DZ,
- 2x Piezo Buzzer,
- 4 Taster inkl. Kappen,
- 1fach 7 Segmentanzeige,
- 4fach 7 Segmentanzeige,
- Dot Matrix, sowie ein
- Schieberegister
* Das USB Datenkabel ist sehr kurz geraten, ich würde empfehlen eines mit min. 1m Kabellänge zu besorgen denn so kann man viel besser auf dem Schreibtisch mit dem Microcontroller arbeiten.
Beispielprojekt mit dem RFID Sensor
Den meisten dieser Bauteile aus dem RFID Starter Kit für den Arduino UNO R3 habe ich bereits separate Beiträge gewidmet. Jedoch möchte ich dir hier nun ein kleines Projekt mit dem RFID Sensor zeigen. Den RFID Sensor vom Typ RC522 habe ich bereits im Beitrag Arduino Lektion 20 – Teil 1: RFID RC522 – Kartenleser vorgestellt und auch im Beitrag Arduino Projekt: PIR & RFID Alarmanlage verwendet. Hier möchte ich dir nun zeigen wie du mit den Bestandteilen dieses Sets dir eine Anlage bauen kannst um mit einem RFID Chip Zugang zu gewähren oder zu verhinden.
benötigte Bauteile
- Arduino UNO R3,
- USB Datenkabel
- 720 Pin Breadoard,
- RGB LED Modul,
- Piezo Buzzer,
- RFID Shield RC522,
- diverse Breadboardkabel
Anschluß der Bauteile an den Arduino UNO R3
RFID – RC522 | |
SDA | D10 |
MOSI | D11 |
MISO | D12 |
IRQ | -bleibt frei- |
GND | GND |
RST | D9 |
3.3V | 3.3V |
RGB LED Modul | |
– | GND |
R | D7 |
G | D6 |
B | D5 |
Piezo Buzzer | |
+ | D4 |
– | GND |
Programmieren
Wenn du die Schaltung wie oben beschrieben aufgebaut hast dann kannst du mit der Programmierung fortfahren.
Vorbereitung – auslesen der RFID IDs
Bevor wir die eine Zugangsbeschränkung für bestimmte Karten erstellen können müssen wir diese erst einmal auslesen. Dem RFID Starter Kit für den Arduino UNO R3 liegen zwei RFID Chips bei, einmal in Kartenform und einmal als Schlüsselanhänger. Damit wir jedoch das RFID Modul am Arduino UNO betreiben können benötigen wir eine Bibliothek, es gibt für den Typ RC522 einige gute Bibliotheken im Internet, ich habe bisher die https://www.electrodragon.com/w/File:Rfid-master.zip verwendet und diese reicht vollkommen aus.
Wie du eine Bibliothek in die Arduino IDE integriest habe ich im Beitrag Arduino IDE, Einbinden einer Bibliothek ausführlich beschrieben.
Mit dem nachfolgenden Sketch kannst du die Kartennummern auslesen und dir auf dem seriellen Monitor der Arduino IDE ausgeben.
#include <SPI.h> #include <RFID.h> #define SS_PIN 10 #define RST_PIN 9 RFID rfid(SS_PIN, RST_PIN); const int RFID_IDs = 1; String ids[RFID_IDs] = {""}; //Zugelassene ID's void setup(){ Serial.begin(9600); SPI.begin(); rfid.init(); } void loop() { if (rfid.isCard() && rfid.readCardSerial()) { String serial = parseId(rfid); Serial.print("RFID Nummer: "); Serial.println(serial); boolean serialOK = false; for (int i = 0; i < RFID_IDs; i++) { if (serial == ids[i]) { serialOK = true; break; } } if (serialOK) { Serial.println("ID wurde gefunden!"); } else { Serial.println("ID wurde nicht gefunden!"); } delay(2000); } rfid.halt(); } String parseId(RFID rfid) { String result = ""; int position = 0; for (position = 0; position <= 4; position++) { String pos = getNumPosAsHEX(rfid, position); result = result + pos; } result.toUpperCase(); return result; } String getNumPosAsHEX(RFID rfid, int position) { return String(rfid.serNum[position], HEX); }
Auf dem seriellen Monitor solltest du nun jeweils die IDs der RFID Chips sehen.
RFID Nummer: B949E3B8AB ID wurde nicht gefunden! RFID Nummer: C6A3352B7B ID wurde nicht gefunden!
prüfen der RFID Chips
Nachdem wir nun die RFID IDs ausgelesen haben möchten wir eine davon für den Zugang gewähren und die andere nicht. Da wir jedoch eine beliebige Anzahl an RFID IDs haben können verwenden wir ein Array wobei wir die maximale Anzahl über Konstante pflegen.
const int RFID_IDs = 1; String ids[RFID_IDs] = {"B949E3B8AB"}; //Zugelassene ID's
Das RGB LED Modul wird über die Pins 7,6 & 5 angeschlossen.
#define redLed 7 #define greenLed 6 #define blueLed 5 void setup(){ ... pinMode(redLed,OUTPUT); pinMode(greenLed,OUTPUT); pinMode(blueLed,OUTPUT); }
In der Funktion “loop” prüfen wir bereits die RFID Chips und müssen hier “nur” zusätzlich die Funktionen für die LED steuern.
if (serialOK) { Serial.println("ID wurde gefunden!"); ok(); } else { Serial.println("ID wurde nicht gefunden!"); fail(); }
Wenn eine “korrekte” Karte vor das Lesegerät gehalten wurde dann soll die LED grün blinken.
void ok(){ digitalWrite(greenLed, HIGH); delay(250); digitalWrite(greenLed, LOW); }
Wenn eine unbekannte Karte vor das Lesegerät gehalten wird dann soll die LED rot blinken und zusätzlich ein Ton ausgegeben werden.
void fail(){ tone(BUZZER, 450, 250); digitalWrite(redLed, HIGH); delay(250); tone(BUZZER, 450, 250); digitalWrite(redLed, LOW); }
Video
ein einfaches Geschwindigkeitsspiel mit LEDs & Taster
Das Set enthält auch einige LEDs , Taster und Widerstände. Aus dieses läßt sich auch schnell ein einfach Geschwindigkeitsspiel mit LEDs und Taster basteln. Ziel des Spieles ist es die Seite des jeweiligen anderen Spielers zu erreichen, dabei muss man nur schnell genug auf die Taster drücken.
benötigte Bauteile
- Arduino UNO R3,
- USB Datenkabel
- 720 Pin Breadboard,
- 9 LEDs,
- 6x gelb
- 3x rot
- 9x 220 Ohm Widerstand,
- 2x 10 kOhm Widerstand,
- 2x Taster (inkl. Kappen), sowie
- diverse Breadboardkabel
Aufbau der Schaltung
Die Schaltung ist recht simple denn es ist im grunde “nur” 2x die Schaltung für einen Taster mit Pull Down Widerstand und 9x jeweils eine LED.
Das Steckbrett hat oben wie unten Kontaktleisten für “+” und “-” hier kannst du die 5V bzw. GND vom Arduino UNO mit einem Breadboardkabel anschließen und sparst dir einige Kabel.
Anschluß der Taster
Wie bereits erwähnt und verlinkt sind die Taster über Pull Down Widerstände mit dem Arduino UNO verbunden.
Für den Taster benötigst du einen 10 kOhm Widerstand sowie 2 Breadboardkabel.
Aufbau des Tasters
Der Taster verfügt über 4 Kontakte, welche jeweils über Kreuz zu einem Taster funktionieren.
Es sind jeweils 2 Kontakte oben und unten, die Kontakte auf der gleichen Seite sind jeweils miteinander verbunden.
In der Grafik habe ich dir einmal aufgezeichnet wie die Kontakte miteinander verbunden sind.
LEDs anschließen
Die 9 LEDs werden im gleichen Abstand auf das Breadboard gesteckt dabei wird jeweils ein 220 Ohm Widerstand mit der Anode verbunden und an die Kathode GND vom Breadboard.
Eine LED leitet den Strom nur in eine Richtung, sollte diese also in deinem Aufbau nicht leuchten, so hast du diese gewiss falsch herum eingebaut.
Programmieren
Die Programmierung ist nicht viel aufwändiger als der Aufbau der Schaltung.
Für die Taster benötigen wir zusätzlich eine Bibliothek damit die Taster entprellt werden.
#include <Bounce2.h>
Im nächsten Schritt definieren wir die Pins an welche die LEDs bzw. Taster angeschlossen wurden.
#define led1 2 #define led2 3 #define led3 4 #define led4 5 #define led5 6 #define led6 7 #define led7 8 #define led8 9 #define led9 10 #define btn1 11 #define btn2 12
Die LEDs fassen wir in ein Array zusammen damit wir später über einen Index auf die LED zugreifen können.
int leds[9] = {led1, led2, led3, led4, led5,led6,led7,led8,led9};
Für die Taster benötigen zwei Objekte der Bounce2 Library, im Konstruktor übergeben wir den Pin sowie ein “Timeout” in Millisekunden.
Bounce btn1Bounce = Bounce(btn1, 50); Bounce btn2Bounce = Bounce(btn2, 50);
Und für den aktiven Index eine globale Variable.
int index = 5;
In der “setup” Funktion werden die Pins der LEDs als Ausgänge sowie die Taster als Eingänge definiert.
void setup() { Serial.begin(9600); pinMode(led1, OUTPUT); pinMode(led2, OUTPUT); pinMode(led3, OUTPUT); pinMode(led4, OUTPUT); pinMode(led5, OUTPUT); pinMode(led6, OUTPUT); pinMode(led7, OUTPUT); pinMode(led8, OUTPUT); pinMode(led9, OUTPUT); pinMode(btn1, INPUT); pinMode(btn2, INPUT); start(); }
Zusätzlich habe ich den seriellen Port für die Ausgabe auf dem seriellen Monitor gestartet, hier kann man zbsp. Debugausgaben ausgeben lassen. Des Weiteren wird in der “setup” Funktion die Funktion “start” aufgerufen.
Die Funktion “start” aktiviert die 5. LED und setzt den Index auf den Wert 5.
void start(){ digitalWrite(led5, HIGH); index = 5; }
Die “loop” Funktion läuft dauerhaft auf dem Microcontroller bis dieser den Stromverliert oder ein Reset durchgeführt wird (aber auch dann sollte die loop wieder aufgerufen werden).
Zunächst müssen wir die Taster aktualisieren und danach die einzelnen Status abfragen. Wenn der Taster “losgelassen” wird dann wird entweder der Index um eins erhöht oder verringert. Zusätzlich wird dann die Funktion “updateLeds” aufgerufen.
void loop() { btn1Bounce.update(); btn2Bounce.update(); if(btn1Bounce.fell()){ index++; updateLeds(); } if(btn2Bounce.fell()){ index--; updateLeds(); } Serial.print("index="); Serial.println(index); }
In der Funktion “updateLeds” prüfen wir nun ob der Index gleich 8 oder 0 ist, wenn dieses so ist wird die jeweilige LED zum blinken gebracht und das Spiel ist beendet. Wenn der Index ungleich 8 & 0 ist dann wird die jeweilige LED aktiviert.
void updateLeds(){ if(index == 8){ blinkPlayerLed(led9); } else if(index == 0){ blinkPlayerLed(led1); } else { lightUpLeds(); } }
Die Funktion “blinkPlayerLed” erwartet als Parameter den Pin der jeweiligen LED welche zum blinken gebracht werden soll.
Zunächst werden alle LEDs deaktiviert und danach eine For-Schleife von 0 bis 9 somit wird 10x die LED im Intervall von 125ms zum blinken gebracht.
void blinkPlayerLed(int led){ clearLeds(); for(int i=0;i<10;i++){ Serial.println("blink"); Serial.println(led); digitalWrite(led,HIGH); delay(125); digitalWrite(led,LOW); delay(125); } start(); }
Am Ende der Funktion wird dann ein neues Spiel gestartet indem die Funktion “start” aufgerufen wird.
Die Funktion “lightUpLeds” deaktiviert zunächst alle LEDs um dann mit dem aktiven Index aus dem Array die LED zu aktivieren.
void lightUpLeds(){ clearLeds(); digitalWrite(leds[index], HIGH); }
Zum deaktivieren der LEDs dient die Funktion “clearLeds” hier wird in einer For-Schleife das Array durchlaufen und alle dort hinterlegten Pins auf LOW gesetzt.
void clearLeds(){ for(int i=0;i<10;i++){ digitalWrite(leds[i], LOW); } }
Hier nun das gesamte Sketch / Programm zum Spiel.
#include <Bounce2.h> #define led1 2 #define led2 3 #define led3 4 #define led4 5 #define led5 6 #define led6 7 #define led7 8 #define led8 9 #define led9 10 #define btn1 11 #define btn2 12 int leds[9] = {led1, led2, led3, led4, led5,led6,led7,led8,led9}; Bounce btn1Bounce = Bounce(btn1, 50); Bounce btn2Bounce = Bounce(btn2, 50); int index = 5; void setup() { Serial.begin(9600); pinMode(led1, OUTPUT); pinMode(led2, OUTPUT); pinMode(led3, OUTPUT); pinMode(led4, OUTPUT); pinMode(led5, OUTPUT); pinMode(led6, OUTPUT); pinMode(led7, OUTPUT); pinMode(led8, OUTPUT); pinMode(led9, OUTPUT); pinMode(btn1, INPUT); pinMode(btn2, INPUT); start(); } void loop() { btn1Bounce.update(); btn2Bounce.update(); if(btn1Bounce.fell()){ index++; updateLeds(); } if(btn2Bounce.fell()){ index--; updateLeds(); } Serial.print("index="); Serial.println(index); } void start(){ digitalWrite(led5, HIGH); index = 5; } void updateLeds(){ if(index == 8){ blinkPlayerLed(led9); } else if(index == 0){ blinkPlayerLed(led1); } else { lightUpLeds(); } } void clearLeds(){ for(int i=0;i<10;i++){ digitalWrite(leds[i], LOW); } } void lightUpLeds(){ clearLeds(); digitalWrite(leds[index], HIGH); } void blinkPlayerLed(int led){ clearLeds(); for(int i=0;i<10;i++){ Serial.println("blink"); Serial.println(led); digitalWrite(led,HIGH); delay(125); digitalWrite(led,LOW); delay(125); } start(); }
Video
Fazit & pers. Meinung
Das Set enthält sehr viele Bauteile und womit man gleich loslegen kann und so einiges Aufbauen kann. Der Preis ist für die Anzahl der Teile im Set angemessen jedoch sind die Versandkosten doch deutlich hoch. Somit kann man dieses Set ggf. im Shop von digitspace.com mitbestellen aber nur deswegen wäre das Set deutlich zu teuer.