Miesięczne archiwum: Czerwiec 2011

Czytnik RFID 125 kHz

Od dłuższego czasu w ofercie Nettigo jest czytnik kart RFID z interfejsem UART. Co to znaczy?

System RFID w uproszczeniu składa się z dwóch elementów – czytnika i tokenów. Token to fizyczna rzecz, mająca w sobie trochę elektroniki. Każdy token ma swój unikalny numer. Gdy token zostanie zbliżony do drugiego elementu – czytnika, ten będzie w stanie odczytać ten numer.

Jakie ma to zalety? Po pierwsze – token nie musi mieć swojego zasilania (wbudowanej baterii). Może być mały, lekki i odporny na wodę. Po drugie – nie jest potrzebny fizyczny kontakt tokena i czytnika – wystarczy token zbliżyć na kilka, kilkanaście centymetrów aby go odczytać.

Na rynku dostępnych jest kilka standardów, jeden z pierwszych to standard działający na częstotliwości 125 kHz. Urządzenia i tokeny do niego są proste a co za tym idzie niedrogie.

Jak skorzystać z RFID?

Pokażę teraz jak wygląda odczytywanie tokenów. Zestaw RFID sprzedawany przez Nettigo składa się z czytnika oraz 5 tokenów – 2 kart oraz trzech breloczków. Przyjrzyjmy się jednemu.

Token RFID

Token RFID

Jest na nim numer. Ale to nie numer, który zostanie odczytany przez czytnik. Dlaczego? Gdyby numer nadrukowany na tokenie oraz ten ‚w środku’ były takie same, łatwo byłoby sklonować token, a tak aby poznać jego numer trzeba go odczytać – nie jest to jakiś duży problem, ale zawsze utrudnienie.

Teraz – jak go odczytać. Przyjrzyjmy się czytnikowi. Jak napisałem ma interfejs UART, czyli można go podłączyć do Arduino korzystając z portu szeregowego, lub do komputera za pomocą konwertera USB/Serial.

Czytnik ma trzy złącza: 2, 3, i 5 pinów. Złącze dwu-pinowe jest przeznaczone na antenę dołączoną do zestawu. Nie ma znaczenia jak ją podłączymy. Pozostałe dwa złącza pozwoli opisać to zdjęcie:

Wyprowadzenia czytnika RFID

Wyprowadzenia czytnika RFID

Zaznaczyłem na czerwono piny nr 1 i tak złącze trzy-pinowe:

  1. LED – podłączenie dla diody sygnalizującą pracę czytnika (świeci ciągle gaśnie na chwilę w momencie odczytania tokena)
  2. +5V – wyprowadzone napięcie zasilania
  3. GND – masa

Jak widać rola jego jest informacyjna – można podłączyć diodę, która będzie ludziom sygnalizować że został odczytany token.

Złącze 5-cio pinowe to jest to co nam jest potrzebne aby uzyskać informację od czytnika:

  1. TX – czyli to co odczytuje czytnik
  2. RX – dane wysyłane do czytnika (ten model nie jest konfigurowalny, więc nie ma pożytku z tego)
  3. NC – nie używany
  4. GND – masa
  5. +5V – zasilanie

Zademonstruję podłączenie czytnika do komputera z wykorzystaniem konwertera USB/Serial – FTDI Friend. Podłączamy TX (pin 1) czytnika do RX na FTDI Friend, masę i zasilanie 5V – i gotowe:

Podłączenie czytnika RFID do FTDI Friend

Podłączenie czytnika RFID do FTDI Friend

Po wsadzeniu kabla USB do komputera i podpięciu monitora portu szeregowego (Hyperterminal na Windows, gtkterm lub minicom na Linuxie, lub monitor z Arduino IDE, parametry portu 9600,8,N,1) dostaniemy np taki ciąg:

0041DEF392FE

Najpierw – bajt o wartości 0x02 – symbol startu numeru karty, potem 5 bajtów zapisanych w ASCI w kodowaniu szesnastkowym (tutaj to 00-41-DE-F3-92), dwa znaki sumy kontrolnej (XOR 5 bajtów, tutaj to FE), bajt o wartości 0x03 – znak końca transmisji.

W dużym skrócie – to tyle. Podłączyć do Arduino można ‚tak samo’. Czyli podłączamy zasilanie i masę, oraz RX na Arduino (D0) z TX na czytniku i korzystając z Serial.read() można odczytywać dane.

Cały układ podłączony via FTDI Friend wygląda tak:

Caly uklad

Caly uklad

 

 

 

Debouncing klawiszy w Nettigo Keypad (i nie tylko)

Biblioteka do Nettigo Keypada została uaktualniona o domyślne wsparcie dla debouncingu. O co chodzi? Jeżeli naciskasz klawisz, może pojawić się zjawisko migotania podczas włączania i wyłączania przycisku. Wynika to właściwości styku mikroprzełącznika – jest to mechaniczne zetknięcie/rozłączenie styków, więc może być tak że pojawi się szereg impulsów podczas jednego przełączenia.

Gdy Arduino często sprawdza stan klawisza takie migotanie może zostać odczytane jako wielokrotne naciśnięcia i zwolnienia danego przycisku, mimo że został naciśnięty tylko raz.

Jak temu zapobiegać?

Potrzebny jest tak zwany debouncing. Można po odczycie stanu klawisza poczekać chwilę używając delay. Proste i skuteczne.

Pseudokod realizujący to wygląda tak:

obecny_stan_klawisza = odczytaj_klawisz();
if (obecny_stan_klawisza != poprzedni_stan) {
  poprzedni_stan = obecny_stan_klawisza;
  zrob_cos_po_zmianie_stanu();
  delay(50);
}

Taki kod po wykryciu zmiany stanu klawisza zapisuje jego nową wartość , wykonuje co trzeba po naciśnięciu/zwolnieniu klawisza i czeka 50 milisekund, zanim podejmie dalsze wykonywanie programu. Jeżeli więcej nic specjalnie szkic nie ma do roboty to zapobiegnie to odczytaniu migotania w następnym przebiegu loop.

Takie rozwiązanie, choć proste ma jednak jedną niezaprzeczalną wadę – Arduino nic nie może innego robić w czasie gdy czeka korzystając z funkcji delay. Nie zawsze jest to dopuszczalne. Jeżeli nasz szkic robi coś co wymaga szybkiej pracy, lub ścisłych zależności czasowych (generowanie obrazu, programowe implementacje różnych protokołów) takie rozwiązanie jest wykluczone.

Co zostaje? Trzeba zignorować wszystkie zmiany stanu klawisza w krótkim czasie po zaobserwowaniu jego wciśnięcia. Zapamiętujemy czas wciśnięcia klawisza i jeżeli zmiany stanu następują w krótkim czasie po tym – są ignorowane. Znowu – pseudokod:

obecny_stan_klawisza = odczytaj_klawisz();
if (obecny_stan_klawisza != poprzedni_stan && millis() - czas_ostatniego_wcisniecia > timeout) {
  poprzedni_stan = obecny_stan_klawisza;
  czas_ostatniego_wcisniecia = millis()
  zrob_cos_po_zmianie_stanu();
}

Oczywiście, na starcie szkicu musimy ustawić wartość czas_ostatniego_wcisniecia i timeout – zostawione bez nadanej wartość mogą stwarzać problemy. Czas jaki trzeba czekać ignorując zmiany stanu zależy od przełącznika. W wypadku mikroprzełączników 50 ms wystarcza w zupełności.

Dla wejść cyfrowych są gotowe biblioteki do obsługi debouncingu np Bounce, jednak dla naszego keypada ona się nie nadaje.

Dlatego biblioteka do Nettigo Keypada ma od wersji 0.3 domyślnie debouncowane klawisze. Domyślnie timeout jest ustawiony na 50 ms. Można go odczytać/zmienić przez funkcje getDebounceDelay i setDebounceDelay.