Raspberry pi + pn532 (RfId na stronie WWW)

Raspberry pi + pn532 (RfId na stronie WWW)

 Wstęp.

   Ponieważ często tu zaglądam, to chciałbym się też podzielić swoim projektem. Może się komuś przyda, a może jakieś sugestie się pojawią, które pomogą usprawnić ten projekt.

Założenia i cel :

  Celem projektu jest wyświetlenie strony WWW w zależności od odczytanego taga RFID, a ponieważ kupiłem czytnik  PN532 to z nim się trochę pomęczyłem, jak wyszło …. . Sam projekt ma być częścią większej całości gdzie Raspberry będzie pracowało jako kiosk informacyjny (chrome w trybie kiosk ) – bez użycia myszki i klawiatury – a dane właśnie będą wyświetlane na podstawie przyłożenia karty do terminala.

Podłączenie fizyczne do Raspberry pi 3 :

  Moduł, który kupiłem pozwala na podłączenie poprzez SPI, I2C oraz UART. Sprawdziłem wszystkie 3 i najlepiej wyszło UART. SPI nie chciało działać z biblioteką libnfc, a I2C działało widocznie wolniej (choć to ocena subiektywna) niż UART. 

Samo podłączenie jest proste – ustawiamy zworki w tryb UART i podłączamy zasilanie oraz piny TX/RX według schematu :

Oprogramowanie (libnfc) :

  Do obsługi tego PN532 użyłem biblioteki libnfc, która pozawala na obsługę nie tylko tego czytnika, ale również innych czytników (w tym “gotowców” podpinanych pod port USB). Aby z niej jednak skorzystać należy najpierw “otworzyć” komunikacje UART. Robimy to następująco :

Aby ją zainstalować pobieramy ze strony : https://github.com/nfc-tools/libnfc

i instalujemy

a następnie należy skonfigurować w pliku : /etc/nfc/libnfc.conf

tworzymy plik konfiguracyjny

i ustawiamy dostępne czytniki (w tym przypadku UART)

Należy tylko zwrócić uwagę na ostatnią i przedostatnią linię. Dla RasPi_3 UART jest na porcie “ttyS0”, dla RasPi_2 na “ttyAMA0”

Jeśli wszytko poszło jak trzeba powinniśmy już zobaczyć urządzenie i odczytać tag :

Ale to dopiero połowa sukcesu – trzeba to jeszcze “pożenić” z serwerem WWW.

  Do wykonania tego użyłem języka C wykorzystując libnfc do odczytu TAGu i zapisu w pliku, z którego to pliku serwer WWW będzie mógł odczytać dane. Ponieważ to mój pierwszy program w języku C to zadanie wydawało się karkołomne, ale z pomocą przykładów zwartych w bibliotece – poszło dość sprawnie (choć nie wiem czy do końca poprawnie).

Oprogramowanie (libnfc – moja wersja odczytu tagu) :

w folderze : /home/pi/libnfc-1.7.1/examples/doc/ dodałem plik mielmar.c, który zawiera :

aby go skompilować należy :

powstanie plik wykonywalny /home/pi/libnfc-1.7.1/examples/doc/mielmar

 Program domyślnie ma pracować jako “daemon“, czyli domyślnie pracuje w tle i żeby go zabić trzeba zabić proces poleceniem kill -9 prgram z opcją –nodaemon koczy się kombinacją klawiszy Ctr+C.

  Program czeka na przyłożenie TAG-a – jeśli nie ma to wyświetla komunikat i czeka ponownie. Jeśli TAG jest to odczytuje, wyświetla i zapisuje do pliku w formacie JSON { “uID”: “d9659523” }, a następnie czeka na jego zabranie. Jeśli tag zostanie usunięty to wyświetla i zapisuje do pliku informacje w formacie JSON { “uID”: “” }
Program jest zapętlony i wykonuje się bez końca. / wszystko ma koniec :) /

Ważne – w programie jest ustawiona ścieżka do pliku, w którym zapisane będą dane – dlatego ważne jest aby katalog “/var/www/html/ramdisk/” z uprawnieniem do zapisu był utworzony przed uruchomieniem programu. Jak to zrobić o tym za chwilę.

Konfiguracja (połączenie programu z serwerem WWW)

  Jeśli program działa – to zgodnie z założeniem trzeba by go “spiąć” z serwerem WWW. W tym celu przede-wszystkim trzeba mieć serwer WWW :) . Jego instalacja wygląda następująco :

 Po zainstalowaniu pod adresem http://127.0.0.1/ w Raspberry lub http://adres IP RasPi/  na każdym komputerze w sieci lokalnej powinna wyświetlić się startowa strona Apacheche. Zanim przejdziemy do tworzenia swojej strony – jeszcze chwilę o zapisie danych.

  Ponieważ cały system Raspberry zapisany jest na karcie SD – która jak wiadomo nie lubi dużej ilości zapisów – warto zapisywać dane na ram-disku (czyli katalogu który nie jest zapisany na karcie – ale w pamięci RAM która udaje system dyskowy). Ma to dodatkową zaletę, ponieważ zapis/odczyt działa dużo szybciej niż na karcie, ale i wady :

  • po pierwsze zabiera RAM (na szczęście dużo go nie potrzeba)
  • po drugie wszystkie dane znikają w przypadku braku zasilania (lub restartu)

Stworzenie takiego dysku i podmontowanie (podłączenie jako katalog) nie jest w Linuxie specjalnie trudne i sprowadza się do  3 kroków 

1) Tworzymy w systemie plików katalog, w którym ma być ram-dysk. W moim projekcie “ramdisk” w katalogu “/var/www/html/”

2) Dodajemy wpis w pliku z “partycjami” /etc/fstab.  W nowej linii dodajemy wpis :
           “tmpfs    /var/www/html/ramdisk   tmpfs rw,nodev,nosuid,size=512   0   0
  U mnie cały plik wygląda tak :

WAŻNE – żeby nie “namieszać” w innych linijkach – bo system może nie wstać

3) Zrestartować Raspberry i sprawdzić czy dysk się podmontował (np. df -h)

Teraz już można uruchomić program, który tworzy i zapisuje dane do pliku w odpowiednim miejscu.  Jeśli program ma działać  w tle dobrze żeby uruchamiał się podczas  startu systemu. W tym celu można  dodać do pliku  “/etc/rc.local” następującą linikę “/home/pi/libnfc-1.7.1/examples/doc/mielmar >> /dev/null 2>&1” mój plik wygląda tak :

Po restarcie można sprawdzić czy program działa w tle

a w pliku wyjściowym “/var/www/html/ramdisk/rfid.html” zmieniają się dane po przyłożeniu/zabraniu TAG-a.

Przykładowa strona.

 Ja w swoim projekcie do odczytu danych wykorzystam javascript, ale nic nie szkodzi na przeszkodzie aby zrobić to np. poprzez PHP “inkludując” plik i odczytując jego zawartość. W moim przykładzie podmieniam zawartość pliku “index.html”  w katalogu “/var/www/html/”, jego nowa zawartość wygląda następująco :

A efekt końcowy na stronie  :

To już koniec. Pytania i uwagi proszę pisać w komentarzach.

Ocena: 4.86/5 (głosów: 7)

Podobne posty

3 komentarzy do “Raspberry pi + pn532 (RfId na stronie WWW)

  • Cześć, chcę zrobić podobny projekt i szukam taniego czytnika, który będzie w stanie odczytywać rfid i nfc. Jestem zielony w hardware wiec nie wiem czy ten który Ty użyłeś będzie wystarczał. Zamiast karty chcę używać telefonu i ewentualnie naklejek z tagiem nfc albo takich breloczków jak na stronie ali z linku tego czytnika. Mogę je zaprogramować właśnie z telefonu. Nie wiem jak ma się rfid do nfc i czy ten czytnik wystarczy, podpowiesz coś?

    Odpowiedz
  • Można to samo zrobić na RasPI ZeroW. Dużo taniej. Można też połączyć bibliotekę libnfc z Pythonem, jak to proponują na: [http://denethor.wlu.ca/raspberry_pi/rpi_PN532_nfc.shtml] http://denethor.wlu.ca/raspberry_pi/rpi_PN532_nfc.shtmlopis. A mając tego typu rozwiązanie, można dane z readera porównywać lub zapisywać w sql-u, co pozwoli nam identyfikować czy rejestrować zdarzenie z kartą/smartfonem zNFC.
    polecam blog Jarzebskiego, dla tych którzy chcą zorientować się o co chodzi z tym rfid infc.

    Odpowiedz
  • Dobry opis. wszystko działa. Jedynie w pliku mielcar.c należy dopisać bibliotekę #include string.h , inaczej zgłosi problem podczas kompilacji ze zrozumieniem funkcji strcmp(). Całość sprawdziłem na RaspberryPi Zero W. Działa na porcie UART dla ttyAMA0 a nie na ttyS0 jak to ma miejsce z RasPi3. Dla prawidłowego działania należy w katalogu boot dokonać korekty w dwóch pliczkach: cmdline.txt i config.txt. Pojawia się też problem z załadowaniem na czas funkcji libnfc podczas wywoływania skompilowanej wersji mielmar w pliku rc.local. Polecenie: ps -ax |grep mielcar tego faktu przecież nie podaje. Służę pomocą dla tych użytkowników, którzy chcą spróbować sił na raspberry Pi Zero W.

    Odpowiedz

Odpowiedz

anuluj

Masz uwagi?