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

BATERIA DO ELEKTRYKA

BATERIA DO ELEKTRYKA

WitamMój dzisiejszy projekt jest powiązany z poprzednim, a mianowicie chciałbym pokazać w jaki sposób wykonać…

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

Nie przegap nowych projektów!

Zapisując się na nasz Newsletter będziesz miał pewność, że nie przegapisz żadnego nowego projektu opublikowanego w Majsterkowie!

Od teraz nie przegapisz żadnego projektu!

Masz uwagi?