Wiegand kártyaolvasó Raspberry-vel
2018. január 21. írta: eNeS

Wiegand kártyaolvasó Raspberry-vel

Először egy alapvetést tisztáznunk kell, vannak a kódzárak és a normál kártyaolvasók, mindkettőből létezik kártyát olvasni képes és számbillentyűzettel (keypad) szerelt verzió, de egy sarkalatos ponton különböznek:

  1. A kódzárnak van memóriája és a PIN (azonosító) kódokat, valamint a kártyaszámokat rá kell programozni, ezután a megfelelő kód beütése/bemutatása után nyit egy kontaktust, pl zárat. (nem továbbítja sehová az adatokat, mert önállló)
  2. Az önálló működésre képtelen egyszerű kártyaolvasó csak továbbítja a beolvasott PIN kódot/kártyaszámot egy rá kötött vezérlőre, és a vezérlő végez vele további műveleteket

Az e-bayen keresve nem mindig egyértelmű, melyikről van szó, érdemes ezért elolvasni az adatlapokat és a képhez hasonlító eszközök adatlapjait. Mivel nekem rendelkezésemre áll több Raspberry PI Zero W, amit fel tudok használni kártyavezérlőként is, így nem az önálló működésre kitalált változattal, hanem egy egyszerű olvasóval kezdtem kísérletezni, mivel így egyszerűbb a kódcsere is a későbbiekben, illetve a használat naplózása, hálózati működés, stb... A tesztegyed így néz ki:

w0.jpg

A legtöbb ilyen eszköz 12V DC tápfeszültséget igényel, illetve 5VDC jelszintet, ami a Raspberry-nek annyira nem baráti, mert az viszont 5VDC tápfeszültségről megy, és 3.3VDC jelszintekkel operál. De ezen lehet segíteni!

Bevásárlólista:

Eszköz Bruttó ár
RFID Reader 125Khz billentyűzetes közelítéses kártyaolvasó (*) 3860 Ft
Keystone betét Cat.5e UTP szerszám nélkül szerelhető, Excel (*) 633 Ft
Protolap az alkatrészek rögzítéséhez (*) 100 Ft
MT3608 2-24V to 5-28V 2A Step Up DC-DC konverter (*) 200 Ft
Trigger Switch Double MOS 5V-36V (*) 250 Ft
2 csatlakozós beforrasztható csavaros terminál (*) 2x30 Ft
3 csatlakozós beforrasztható csavaros terminál (*) 49 Ft
Logikai szintillesztő 5V->3.3V (*) 200 Ft
Műanyag doboz 75 x 54 x 27mm (*) 230 Ft
Proximity kártya 125Khz (*) 100 Ft
Összesen: 5682 Ft

Természetesen a vezérlő ára ebben nincs benne!


A fenti alkatrészekből az alábbi illesztő "modult" állítottam össze:

w1.jpg

A működés nagy vonalakban a következő:

A balról érkező jumper kábelek a Raspberry felől érkeznek a felső kettő 1-1 GPIO-ra van kötve, ezen zajlik a gyakorlati kommunikáció (D0 és D1), fentről a harmadik a GND, alatta a 3V3, ez mind kell a mellette jobbra található Logikai szintillesztő használatához. A bal alsó zöld csavaros terminálra érkezik az 5V az RPI lábáról, és egy újabb GPIO, ami a Szintillesztőtől jobbra levő MOSFET kapcsoló Trigger lábára van kötve, ezzel kapcsolhatjuk rá az 5V-ot a jobb oldalon a lap alatt csak sejthető MT3608 konverterre, ami az 5V-ot feltranszformálja 12VDC-re, és kiadja a kék/kék-fehér és barna/barna-fehér érpárakon, ahogy a POE tápellátás is szokott utazni. (csak ugyebár a standard POE 48V-os) A szerszám nélkül szerelhető Keystone UTP betét nagyon megkönnyíti a szerelést, bár nem filléres tétel, de szerintem praktikus. A Wiegand olvasó adatlapja szerint akár 100m is lehet a távolság az olvasó és a vezérlő között, amit az 5V jelszint miatt kissé csodálok, de 20m-ig biztosan nem lehet probléma. Nekem olyan 3 méter UTP kábel kellett, amit a másik oldalon sorkapoccsal közösítettem az olvasóból kiálló kábelekkel.

Bekötési rajz:

wiegand.JPG

 

Pár szó az olvasóról:

Az általam választott modellt úgy reklámozták, hogy "Wiegand26/Wiegand34/RS485/RS232/ABA" protokollokon tud kommunikálni.. megörültem, no mondom egyszerűen soros porton fogom kiolvasni RS232-vel a kártyaszámot/PIN kódot, az nem túl bonyolult. Hát nem, a leírtak fele sem igaz, csak Wiegand 26/34 bit e közül a kettő közül lehet választani. A Wiegand protokoll nem túl bonyolult, ám használata nem annyira egyszerű a gyors kommunikáció miatt. Két adatvonal van, a Data0 és Data1, alapállapotban mind a kettő HIGH állapotban van (vagyis 5V jelszinten), aztán bitenként küldi az adatokat, ha a Data0 LOW, akkor "0", ha a Data1 LOW, akkor "1" a bit állapota. Kértem az eladótól leírást az olvasóról, kis gondolkozás után küldött egy Word dokumentumot, amiből egyértelműen kiderült, hogy csak Wiegand protokollt tud az eszköz, illetve a különböző színű kábelek milyen célt szolgálnak. (ami egyébként az olvasó hátoldalán is szerepel szerencsére)

w2.jpg

A vörösre kéri a DC12V tápot, a feketére a GND-t, a zöldre a D0, a fehérre a D1 adatvonal kötendő.
Érdekesség még, hogy a kék és sárga kábelek is folyamatos 5V-on vannak,és amikor lehúzom őket GND-re, akkor a LED felvillan, illetve a belső csipogója megszólal, tehát szintillesztőn keresztül, ha további két GPIO-t beáldozunk, ezek a funkciók is vezérelhetőek. A leírásban szerepel, hogy ne tegyük 10cm-nél közelebb nagyobb fémtömeghez, és 30cm-nél közelebb ne szereljünk egymáshoz két olvasót (az egymás közti átolvasás, illetve a zavarok kiküszöbölése érdekében)

Tétel

Paraméter

Frekvencia

125khz

Működési feszültség

DC 12V (±5%)

Fogyasztás

45mA (készenlét)

70mA (működés)

Támogatott kártyák

RFID 125khz EM-ID

Olvasási távolság

0mm-100mm

Olvasási időköz

0.5S

Formátum

Wiegand 26/Wiegand 34

 

Kommunikáció átviteli távolság

WG26/34100M

Üzemi hőmérséklet

-25 ~ +75

Méret

86mm×86mm×18mm

Súly

130G

Kábelhossz

180mm±5mm

Anyag

ABS & Gyantával vízállósítva

w3.jpg

A kábelek telibe a hátulján jönnek ki középen, így vagy egy szabvány süllyesztett kötődoboz fölé kell szerelni, vagy hozzám hasonlóan egy kiemelőkeretre. Bekapcsolt állapotban éles kék fényt árasztanak a gombok, illetve a felettük balra látható négyzet, ami zölden villog olvastatáskor, meg persze csipog is. (ezzel szép kontrasztot alkot az RPI mellé szerelt illesztődoboz szellőzőrácsain átszűrődő piros fény, amit a MOSFET kapcsoló ad ki magából, ha bekapcsolt állapotban van) A kapcsoló márcsak azért is praktikus, hogy ne világítson egész éjszaka, meg ha nincs otthon senki, viszont mozgásra és ajtónyitásra bekapcsol, úgy állítottam be.
A csipogót le is ragasztottam kék ragasztószalaggal, mert elég hangos.

w4.jpg

Szoftver:

Kell egy vezérlő a használatához, aminek ugye szoftveres vonzata is van, hát elkezdtem nézelődni.
Először Python-nal próbálkoztam, egy szimpatikus és nem túl bonyolult pmiCardRreader nevűt találtam készen a használt RPIO könyvtárat kicserélve az RPi.GPIO könyvtárra, és a 26bites kártyaszámokon túl, néhány sornyi kód segítségével bővítettem a tudását a 4 biten továbbított billenyűkódok továbbításával is. Első tesztjeimen nem is volt probléma, csodásan olvasta a hozzá vásárolt 125khz-es proxy kártyákról a számokat, viszont ahogy elkezdtem használni a számbillentyűket, hogy a PIN kód kezelést is teszteljem, már látszott, hogy bizony néha maradnak ki bitek. :( Megpróbáltam a WiringPi könyvtár használatával is Pythonból, hátha gyorsabb lesz, de nem igazán jártam sikerrel. Egy-két nap sikertelen próbálkozás után feladtam, és beláttam, hogy a nem valósidejű működésű, multitaszk operációs rendszeren, a nem valósidejű alkalmazásra kitalált Python-al nem fogok stabil olvasási eredményeket kapni. Ezért kerestem egy alternatívát, ami C nyelven íródott, működött is:
Wiegand API Raspberry PI

Ezt továbbfejlesztettem, hogy Pythonból meg tudjam hívni, és máris stabilabb olvasási eredményeket sikerült elérnem, úgy, hogy továbbra is a Python alaprendszert használom, a C-ben írt Wiegand_IO könyvtár (egyébként wiringPi-re támaszkodva) pedig elvégzi az alacsonyabb szintű műveleteket, a bitek begyűjtését. Ez így leírva gyorsnak hangzik, de órákat sikerült eltöltenem azzal, hogy felélesztettem régi emlékeimet a C nyelv rejtelmeiről, a Nullával befejezett stringektől a pointerekig, és utána megtanultam, hogyan lehet Python library-ként elérhetővé tenni és fordítani egy C kódot.

Feltöltve a githubra:

Fordításhoz/telepítéshez python segédalkalmazás:

sudo python3 wiegand_setup.py install

Mintapélda a Wiegand_io használatára pythonból:

#!/usr/bin/python3
import wiegand_io
import time

def binaryToInt(binary_string,blen):
  binary_string = binary_string[1:(blen-1)] 
#Removing the first and last bit (Non-data bits) try: result = int(binary_string, 2) except: result = 0 return result wiegand_io.initreader(6,5) wstr,wbl = wiegand_io.wiegandread() while True: if (wiegand_io.pendingbitcount() > 0): wstr,wbl = wiegand_io.wiegandread() print("Python res:",wstr,wbl) if wbl==4: tstr = int(wstr,2) else: tstr = binaryToInt(wstr,wbl) print(tstr) time.sleep(0.01)

A fenti programban a használt GPIO6 és GPIO5 szerepel, ám hiányzik belőle a GPIO13 bekapcsolása, ami tápot ad az olvasónak.. a githubon a fentiek mellett van teljes értékű unit is a használathoz, a fenti minta csak demonstrációs célokat szolgál.

Utána már ízlés kérdése mihez kezd az ember a beérkező számokkal, én speciel MQTT-n továbbítom a kártyaszámok sha1 hash kódját a Domoticz felé, ami ott egyéb műveleteket indít, attól függően milyen kódot kapott.

Megjegyzés: természetesen a program minden Wiegand protkollt támogató eszközön használható, nem csak a képen láthatón, egyszerűen ehhez tudtam olcsón hozzájutni.

A bejegyzés trackback címe:

https://bitekmindenhol.blog.hu/api/trackback/id/tr1413588775

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.