Spisu treści:

Czytnik RFID AVR/Arduino z kodem UART w C: 4 kroki
Czytnik RFID AVR/Arduino z kodem UART w C: 4 kroki

Wideo: Czytnik RFID AVR/Arduino z kodem UART w C: 4 kroki

Wideo: Czytnik RFID AVR/Arduino z kodem UART w C: 4 kroki
Wideo: Programowanie płytek zgodnych ze środowiskiem Arduino - Jacek Jabłoński 2024, Listopad
Anonim
Czytnik RFID AVR/Arduino z kodem UART w C
Czytnik RFID AVR/Arduino z kodem UART w C

RFID to szaleństwo, które można znaleźć wszędzie – od systemów inwentaryzacyjnych po systemy identyfikatorów. Jeśli kiedykolwiek byłeś w domu towarowym i przechodziłeś przez te wyglądające na wykrywacze metali przedmioty w punktach wejścia/wyjścia, to widziałeś RFID. Istnieje kilka miejsc, w których można znaleźć dobre informacje na temat konfigurowania RFID, a ta instrukcja koncentruje się na instalacji czytnika Parallax RFID (Serial TTL) w odbiorniku AVR, z naciskiem na kod C potrzebny do odczytania wejścia szeregowego. Kod jest w C i nie używa żadnych zewnętrznych bibliotek. W rzeczywistości przemawia bezpośrednio do 2400 bodów bez użycia UART, synchronizując się z szybkością transmisji czytnika RFID i odczytując pin cyfrowy, do którego jest podłączony. Podekscytowany? Ja też.

Krok 1: Zdobądź towar

Zdobądź towar
Zdobądź towar

Będziesz potrzebować następującej listy części:

  • Czytnik RFID (paralaksa #28140 39,99 USD)
  • Znacznik RFID (paralaksa #32397 0,99 USD)
  • AVR lub klon Arduino (jeśli korzystasz ze standardowego AVR, potrzebujesz również kondensatora max232, 5 x 1uF i złącza DE9)
  • Płytka stykowa bez lutowania

Opcjonalny

  • 4-pozycyjny nagłówek
  • Drut

(i max232 itp. do przesyłania informacji o znaczniku) Możesz również podłączyć swój ulubiony ekran LCD zamiast wysyłać dane znacznika przez RS232.

Krok 2: Połącz części

Połącz części
Połącz części
Połącz części
Połącz części
Połącz części
Połącz części

Sprzętowa strona rzeczy jest dość prosta. Zamiast umieszczać czytnik RFID bezpośrednio w płytce prototypowej, zdecydowałem się na szybki kabel, aby móc nieco lepiej poruszać czytnikiem RFID. W tym celu po prostu odciąłem 4 pozycje z żeńskiej listwy gniazdowej, którą leżałem i przylutowałem na trzech przewodach. Taśma elektryczna uzupełniła złącze getta. Czytnik RFID posiada 4 złącza:

  • Vcc
  • WŁĄCZYĆ
  • NA ZEWNĄTRZ
  • Gnd

Jak się zapewne domyślasz, podłącz Vcc do +5V, a Gnd do masy. Ponieważ czytnik RFID zużywa tak dużo energii, możesz uderzać pinem ENABLE, aby go wyłączać i włączać w różnych odstępach czasu. Po prostu zdecydowałem się go włączyć. Ponieważ jest odwrócony, pociągnij go NISKI, aby go aktywować. Alternatywnie możesz podłączyć go do uziemienia. Podłączyłem go do PIND3, aby dać mi opcje włączania/wyłączania, jeśli zdecyduję. Pin OUT to miejsce, w którym czytnik wysyła swoje dane szeregowe po odczytaniu tagu. Podłączyłem go do PIND2. Uwaga, we Wszechświecie Paralaksy czerwony oznacza iść. Oznacza to, że zielona dioda LED oznacza, że urządzenie jest nieaktywne i bezczynne, a czerwona dioda LED oznacza, że urządzenie jest aktywne. *wzruszył ramionami* Idź rysunek.

Krok 3: Napisz kod

Napisz kod
Napisz kod

Aby odczytać dane z czytnika RFID, musisz wiedzieć, kiedy został przesłany tag, ściągnąć dane z portu szeregowego, a następnie gdzieś wysłać.

Format danych czytnika RFID

Czytnik Parallax RFID wysyła dane w stałym, lodowatym tempie 2400 bodów. Znacznik RFID ma 10 bajtów. Aby umożliwić wykrywanie/korektę błędów, ponieważ czytnik może zostać wyłączony z losowego szumu, 10-bajtowy RFID jest ograniczony przez sygnał startu i stopu. Wartownik początku to wysuw wiersza (0x0A), a wskaźnik zatrzymania to powrót karetki (0x0D). To wygląda tak:

[Start Sentinel |Bajt 1|Bajt 2|Bajt 3|Bajt 4|Bajt 5|Bajt 6|Bajt 7|Bajt 8|Bajt 9|Bajt 10| Zatrzymaj Strażnika]To są trzy podstawowe kroki.

Dowiedz się, kiedy tag został przesłany

Użyłem przerwania zmiany pinu w odbiorniku AVR, który powiadamia oprogramowanie układowe, że nastąpiła zmiana na monitorowanym pinie. Konfiguracja AVR do tego jest łatwa i wymaga ustawienia flagi, poinformowania MCU, który pin chcesz monitorować, oraz ustawienia globalnego bitu przerwania. Skonfiguruj PCINT

BSET(PCICR, PCIE2); // zmiana pinów rejestru kontrolnego przerwań pcie2 BSET(PCMSK2, PCINT18); // włącz przerwanie zmiany pinu dla PCINT18 (PD2) BSET(SREG, 7); // Ustaw SREG I-bitNapisz swoją procedurę obsługi przerwań Chcesz, aby ISR był krótki, więc w moim wektorze przerwań czytam cały bajt, bit po bicie, i przechowuję bajt w globalnej, nietrwałej tablicy znaków. Przy każdym przerwaniu wykonuję następujące czynności:

  • Sprawdź, czy jestem na początku
  • Wyśrodkuj czas na środkowym impulsie przy 2400 bodach (szybkość czytnika RFID)
  • Pomiń bit początkowy i zatrzymaj się na środku następnego bitu
  • Odczytaj każdy bit do liczby całkowitej bez znaku
  • Kiedy mam 8 bitów, wstaw bajt do tablicy znaków
  • Po zebraniu 12 bajtów poinformuj MCU, że tag został odczytany w celu wykrycia błędów.

Zmodyfikowałem kod SoftSerial od Mikala Harta, który zmodyfikował kod od Davida Mellisa dla eksperymentalnie określonych opóźnień w procedurach szeregowych.

Parsowanie wyjścia RS232

Procedura PCINT zawiera kod do odczytu wyjścia RS232 z czytnika RFID. Po uzyskaniu 12 bajtów (10-bajtowy RFID plus wartownicy) ustawiam bDataReady na 1 i pozwalam głównej pętli przetwarzać dane i wyświetlać je.

// to jest procedura obsługi przerwania ISR(PCINT2_vect){ if (BCHK(PIND, RFID_IN)) // Bit startu staje się niski return; uint8_t bit = 0; Dostrojone opóźnienie (CENTER_DELAY); // Wyśrodkuj bit startowy for (uint8_t x = 0; x < 8; x++) { TunedDelay(INTRABIT_DELAY); // pomiń trochę, bracie… if (BCHK(PIND, RFID_IN)) BSET(bit, x); w przeciwnym razie BCLR(bit, x); } TunedDelay (INTRABIT_DELAY); // pomiń bit stopu RFID_tag[rxIdx] = bit; ++rxIdx; if (rxIdx == 12) bDataReady = 1;}

Wyświetl swój tag

W main(), podczas pętli for(ever), sprawdzam, czy ustawiono bDataReady, sygnalizując, że cała struktura RFID została wysłana. Następnie sprawdzam, czy jest to prawidłowy tag (tj. znaki początku i końca to odpowiednio 0x0A i 0x0D), a jeśli tak, wysyłam go przez moje połączenie RS232.

for (;;){ if (bDataReady) {#ifdef _DEBUG_ USART_tx_S("Bajt początkowy: "); USART_tx_S(itoa(znacznik_RFID[0], &ibuff[0], 16)); ibuff[0] = 0; ibuff[1] = 0; USART_tx_S("\nBajt zatrzymania: "); USART_tx_S(itoa(RFID_tag[11], &ibuff[0], 16));#endif if (ValidTag()) { USART_tx_S("\nZnacznik RFID: "); for(uint8_t x = 1; x < 11; x++) { USART_tx_S(itoa(znacznik_RFID[x], ibuff, 16)); if (x != 10) USART_tx(&apos:&apos); } USART_tx_S("\n"); } rxIdx = 0; bDataReady = 0; }}

Krok 4: Kod i pożegnanie

Ta strona zawiera plik zip z odpowiednim kodem. Został napisany w AVR Studio 4.16. Jeśli używasz notatnika programisty, eclipse lub vi (lub czegoś innego), będziesz musiał skopiować zaufany plik Makefile do katalogu i dodać te pliki do linii źródłowej. Pamiętaj również, że czas dla sekcji odczytu szeregowego jest oparty na MCU 16 MHz. Jeśli pracujesz z inną częstotliwością zegara, będziesz musiał eksperymentalnie określić dostrojone opóźnienia, aby skoncentrować się na impulsach szybkości transmisji. Mam nadzieję, że ta instrukcja pomogła ci w jakiś sposób. Jeśli masz jakieś sugestie, jak można to ulepszyć, daj mi znać!

Zalecana: