Lekce 10 - Raspberry Pi - Připojení RFID čtečky
V minulé lekci, Raspberry Pi - Drátová komunikace s Arduino UNO, jsme si vytvořili komunikaci mezi Raspberry Pi a Arduinem UNO pomocí USB kabelu.
Dnes k našemu Raspberry Pi připojíme RFID čtečku a budeme skrz ni přečítat RFID karty a čipy. Naprogramujeme si k tomu jednoduchý kód v Pythonu a vysvětlíme si, k čemu je taková RFID technologie dobrá.
Jako už mnohokrát předtím zde ukáži vlastní zapojení a schéma zapojení vytvořené pomocí Fritzing.
Potřebné součástky
K úspěšnému zapojení budeme potřebovat:
- Raspberry Pi,
- RFID čtečku,
- libovolnou kartu či čip,
- při nejlepším nepájivé pole a několik drátků, případně pouze drátky.
Co je RFID?
Rádio frekvenční identifikace neboli RFID je technologie bezdrátové komunikace pomocí radiových vln mezi RFID čtečkou a čipem s anténou. Dále také můžeme mluvit o RFID komunikaci mezi RFID writerem a čipem s anténou. RFID writer zapisuje data na RFID čip, která pak můžeme přečíst pomocí RFID čtečky.
RFID VS NFC
Protože často panuje rozpor mezi těmito dvěma technologiemi, rád bych zmínil, jaký je mezi nimi rozdíl. NFC je forma bezdrátové komunikace používaná pouze na krátké vzdálenosti. Tato technologie je podobně jako RFID založena na radiových vlnách, ale narozdíl od RFID se používá i v jiných oblastech než jen pro identifikaci. Komunikace na krátkou vzdálenost se stala populární díky komplexním možnostem jejího použití pro autorizaci různých typů činností a zasílání malého množství dat. NFC používají vysokou frekvenci - 13.56 MHz. Teoretický dosah je asi 20 centimetrů, ale v praxi musí být vzdálenost mezi zařízeními vyměňujícími si mezi sebou konkrétní data zhruba 5 až 6 centimetrů. U zařízení založených na RFID technologii se mění dosah podle frekvence od 10 cm až do 12 m vzdálenosti.
RFID čtečka
RFID čtečka, kterou budeme dnes používat, má ale stejnou frekvenci jako je právě NFC, a to 13.56 MHz. Také není zároveň schopná do čipu zapisovat, pouze je dokáže číst. Čtečka obsahuje čip MFRC522, který má zabudovanou detekci chyb a měl by být schopný podle typu zapisovat i číst RFID komunikaci. RFID čtečka potřebuje ke svému chodu 3.3V.
Pokud si koupíte stejný model jako mám já, je defaultně dodáván bez pinů. V balení jsou však piny, které se musí k RFID čtečce připájet.
Zapojení RFID čtečky
- Se zapojováním začneme u prvního pinu s nápisem 3.3V, který zapojíme hned do prvního pinu v pinoutu pin 3V3.
- Další pin s nápisem RST zapojíme do GPIO25 nebo jiného GPIO pinu.
- GND pin pak zapojíme, jak jinak než do GND pinu na Raspberry Pi.
- IRQ pin necháme prázdný, ten potřebovat nebudeme.
- MISO pin zapojíme do dalšího GPIO pinu, u mě to je například GPIO9.
- MOSI pin zapojíme do GPIO10.
- A nakonec SCK a SDA do GPIO pinů 11 a 8.
Zapojení je velmi jednoduché MFRC522 čip jednoduše posílá data do Raspberry Pi. Velmi důležité je samozřejmě GND zapojit do GND, aby byla RFID čtečka uzemněna. Dále nezapojit napájení 3.3V do 5V, mohlo by to RFID čtečku odpálit.
Programová část
Máme tedy RFID čtečku zapojenou a víme, jak funguje. Teď si s její pomocí, a prostřednictvím knihoven Pythonu, vyzkoušíme načíst pár čipů.
Import knihoven
Dnes budeme používat především dvě knihovny. První bude tradičně
GPIO
knihovna. Druhá bude knihovna pro samotný čip čtečky tedy
mfrc522
. Tyto knihovny samozřejmě musíme mít nainstalované
pomocí pip viz minulé díly. První knihovnu importujeme jednoduše:
import RPi.GPIO as GPIO
Uložíme tak knihovnu do proměnné GPIO
, abychom neustále
nemuseli psát její název. Z knihovny mfrc522
si naimportujeme
jen SimpleMFRC522
:
from mfrc522 import SimpleMFRC522
SimpleMFRC522
je pouze základně nastavená část knihovny
mfrc522
, kterou budeme potřebovat. Není nutné importovat celou
knihovnu.
Uložení do proměnné
Vytvoříme si proměnnou ctecka
, do které uložíme
SimpleMFRC522()
, abychom nemuseli opět vypisovat dlouhý název
části knihovny. Proměnnou budeme moci využívat úplně stejně. Do druhé
proměnné text
pak pomocí metody
ctecka.read()
uložíme ID čipu. Když se k RFID čtečce
přiblíží čip, program to zaznamená a ID čipu uloží do naší
proměnné.
Výpis textu
Než začneme s výpisem, musíme proměnnou text
trochu
pozměnit. Kdybychom ji nyní vypsali, dostali bychom kromě ID i další věci,
které nepotřebujeme. My ale chceme pouze ID, a proto uložíme do proměnné
text
jen nultou část celého výpisu:
text = str(text[0])
Tímto kódem zabráníme výpisu dalších, zbytečných informací. Teď
máme k dispozici jen ID, se kterým můžeme dál pracovat. Asi jste si
všimli, že jsme ID přetypovali na string funkcí str()
, který
nám bude lépe vyhovovat. Pomocí příkazu print
si vypíšeme
například text přiložte kartu. Tento krok je jen estetická
část programu. ID kód čtečky, který máme nyní uložen v proměnné
text
, si vypíšeme příkazem print
.
Vyčištění GPIO
Nakonec vyčistíme GPIO piny pomocí příkazu GPIO.cleanup()
.
Cleanup nám zařídí, abychom mohli bez větších problémů piny znovu
použít. Kdyby náš program měl být například ve smyčce.
Konečná podoba našeho kódu:
import RPi.GPIO as GPIO from mfrc522 import SimpleMFRC522 ctecka = SimpleMFRC522() print("přiložte kartu") text = ctecka.read() text = text[0] print(text) GPIO.cleanup()
Shrnutí
Zobrazí se nám tedy pobídka a po přiložení RFID čipu i samotný RFID kód. Nakonec se ještě vyčistí GPIO piny, abychom je mohli použít znovu.
Bonus upgrade
Aby byl náš kód použitelný v reálném provozu, ještě si ho trochu upravíme. Po spuštění kódu a přiložení karty dostaneme výpis. Toho využijeme, abychom ověřili, jaká karta byla naskenována. Když bude karta v naší "databázi", bude přijata. Když ne, karta bude zamítnuta.
Přidání podmínek
Místo abychom vypisovali kód, ošetříme situace, kdy bude přístup
povolen nebo přístup odepřen. Nejprve si smažeme náš print
s
vypsáním RFID kódu. Nahradíme ho:
if text == "kód který nám předtím vypsala jedna z kartiček":
Na konci if
nezapomeneme dvojtečku. Když se naše proměnná
text
bude rovnat kódu RFID čtečky, provede se nějaký příkaz,
např. vypíše se text. My si do if
vložíme print
s
nápisem přístup povolen.
Druhý if
bude mít dvě podmínky:
if text != "náš kód text" and text != "":
Aby se příkaz provedl, musí být splněny obě podmínky, tj. text se
nebude rovnat kódu a zároveň nebude prázdný. Druhou podmínku máme z toho
důvodu, že se čeká na přiložení karty, ale než kartu přiložíme, bude
vždy v proměnné text
prázdno. Tímto kódem se vyvarujeme
situaci, kdy by if
reagoval na prázdno vypsáním přístup
odepřen.
Kód po úpravách vypadá takto:
import RPi.GPIO as GPIO from mfrc522 import SimpleMFRC522 ctecka = SimpleMFRC522() print("přiložte kartu") text = ctecka.read() text = str(text[0]) if text == "701117799140": print("přístup povolen") if text != "701117799140" and text != "": print("přístup odepřen")
Věřím, že se vám připojení RFID čtečky a nakódování podmínek podařilo. Své dojmy a případné dotazy můžete zanechat v diskusi pod článkem 🙂
V další lekci, Raspberry Pi - Membránová klávesnice 4x4 , si k Raspberry Pi připojíme membránovou klávesnici 4x4.