Sommario:

Lettore RFID AVR/Arduino con codice UART in C: 4 passaggi
Lettore RFID AVR/Arduino con codice UART in C: 4 passaggi

Video: Lettore RFID AVR/Arduino con codice UART in C: 4 passaggi

Video: Lettore RFID AVR/Arduino con codice UART in C: 4 passaggi
Video: RFID Reader RYRR10S with Arduino Tutorial 2024, Dicembre
Anonim
Lettore RFID AVR/Arduino con codice UART in C
Lettore RFID AVR/Arduino con codice UART in C

L'RFID è la mania, che si trova ovunque, dai sistemi di inventario ai sistemi di identificazione dei badge. Se sei mai stato in un grande magazzino e hai camminato attraverso quelle cose che sembrano metal detector nei punti di ingresso/uscita, allora hai visto l'RFID. Ci sono molti posti dove trovare buone informazioni sulla configurazione dell'RFID, e questa istruzione si concentra sull'installazione del lettore RFID Parallax (Serial TTL) su un AVR, con enfasi sul codice C necessario per leggere l'input seriale. Il codice è in C e non utilizza librerie esterne. Infatti, parla direttamente a 2400 baud senza l'uso di un UART sincronizzandosi al baud rate del lettore RFID e leggendo il pin digitale a cui è connesso. Emozionato? Anche io.

Passaggio 1: prendi la merce

Prendi la merce
Prendi la merce

Avrai bisogno del seguente elenco di parti:

  • Lettore RFID (parallasse # 28140 $ 39,99)
  • Tag RFID (parallasse #32397 $ 0,99)
  • AVR o clone di Arduino (se usi un AVR di serie, avrai anche bisogno di un max232, condensatori 5 x 1uF e un connettore DE9)
  • breadboard senza saldatura

Opzionale

  • Intestazione a 4 posizioni
  • Filo

(e il max232 ecc. per la comunicazione delle informazioni sui tag) Puoi anche collegare il tuo schermo LCD preferito invece di inviare i dati dei tag tramite RS232.

Passaggio 2: collegare le parti

Collegare le parti
Collegare le parti
Collegare le parti
Collegare le parti
Collegare le parti
Collegare le parti

Il lato hardware delle cose è abbastanza semplice. Invece di inserire il mio lettore RFID direttamente nella mia breadboard, ho deciso di creare un cavo rapido in modo da poter spostare un po' meglio il lettore RFID. Per questo, ho appena tagliato 4 posizioni da una striscia di intestazione della presa femmina che avevo in giro e saldata su tre fili. Il nastro isolante ha completato il connettore del ghetto. Il lettore RFID ha 4 connessioni:

  • Vcc
  • ABILITARE
  • FUORI
  • Gnd

Come probabilmente avrai intuito, collega Vcc a +5V e Gnd a massa. Poiché il lettore RFID consuma così tanta energia, puoi battere il pin ENABLE per spegnerlo e riaccenderlo a vari intervalli. Ho semplicemente scelto di tenerlo acceso. Poiché è invertito, lo tiri in BASSO per attivarlo. In alternativa, puoi collegarlo a terra. L'ho collegato a PIND3 per darmi opzioni di abilitazione/disabilitazione se decidessi di farlo. Il pin OUT è dove il lettore invia i suoi dati seriali dopo aver letto un tag. L'ho collegato a PIND2. Nota, nell'Universo Parallax, rosso significa vai. Cioè, un LED verde indica che l'unità è inattiva e inattiva, mentre un LED rosso indica che l'unità è attiva. *alza le spalle* Vai a capire.

Passaggio 3: scrivi il codice

Scrivi il codice
Scrivi il codice

Per leggere i dati dal lettore RFID, devi sapere quando è stato inviato un tag, estrarre i dati dalla porta seriale, quindi inviarli da qualche parte.

Formato dati lettore RFID

Il lettore RFID Parallax invia i dati a un ritmo fisso e glaciale di 2400 baud. Un tag RFID è di 10 byte. Per consentire il rilevamento/correzione degli errori, poiché il lettore potrebbe essere attivato da rumore casuale, l'RFID a 10 byte è delimitato da una sentinella di avvio e arresto. La sentinella di inizio è l'avanzamento riga (0x0A) e la sentinella di arresto è il ritorno a capo (0x0D). Sembra così:

[Avvia Sentinella |Byte 1|Byte 2|Byte 3|Byte 4|Byte 5|Byte 6|Byte 7|Byte 8|Byte 9|Byte 10| Ferma la sentinella]Questi sono i tre passaggi principali.

Sapere quando è stato inviato un tag

Ho usato un Pin Change Interrupt sull'AVR che notifica al firmware che si è verificata una modifica su un pin monitorato. La configurazione dell'AVR per questo è semplice e richiede l'impostazione del flag, la comunicazione all'MCU del pin che si desidera monitorare e l'impostazione del bit di interruzione globale. Configura PCINT

BSET(PCICR, PCIE2); // registro di controllo dell'interruzione del cambio pin pcie2 BSET(PCMSK2, PCINT18); // abilita l'interrupt di cambio pin per PCINT18 (PD2) BSET(SREG, 7); // Imposta SREG I-bitScrivi la tua routine di servizio di interruzione Vuoi mantenere la tua ISR breve, quindi nel mio vettore di interruzione leggo l'intero byte, bit per bit, e memorizzo il byte in un array di caratteri volatile globale. Faccio quanto segue ad ogni interrupt:

  • Controlla per assicurarti di essere un po' all'inizio
  • Centrare la temporizzazione sull'impulso medio a 2400 baud (la velocità del lettore RFID)
  • Salta il bit iniziale e metti in pausa a metà del bit successivo
  • Leggi ogni bit in un intero senza segno
  • Quando ho 8 bit, inserisci il byte in un array di caratteri
  • Quando ho raccolto 12 byte, informa l'MCU che il tag è stato letto per il rilevamento degli errori.

Ho modificato il codice SoftSerial di Mikal Hart che ha modificato il codice di David Mellis per i ritardi determinati sperimentalmente nelle routine seriali.

Analizza uscita RS232

La routine PCINT contiene il codice per leggere l'uscita RS232 dal lettore RFID. Quando ho ottenuto 12 byte (RFID a 10 byte più sentinelle) ho impostato bDataReady a 1 e lascio che il loop principale elabori i dati e li visualizzi.

// questo è l'interrupt handlerISR(PCINT2_vect){ if (BCHK(PIND, RFID_IN)) // Il bit di inizio va a tornare basso; uint8_t bit = 0; TunedDelay(CENTER_DELAY); // Centra sul bit di inizio for (uint8_t x = 0; x < 8; x++) { TunedDelay(INTRABIT_DELAY); // salta un po', fratello… if (BCHK(PIND, RFID_IN)) BSET(bit, x); altrimenti BCLR(bit, x); } TunedDelay(INTRABIT_DELAY); // salta il bit di stop RFID_tag[rxIdx] = bit; ++rxIdx; if (rxIdx == 12) bDataReady = 1;}

Mostra il tuo tag

Nel main(), durante il ciclo for(ever), verifico se bDataReady è stato impostato, segnalando che l'intera struttura RFID è stata inviata. Quindi controllo per vedere se è un tag valido (cioè i caratteri di inizio e fine sono 0x0A e 0x0D, rispettivamente) e, in tal caso, lo invio alla mia connessione RS232.

for (;;){ if (bDataReady) {#ifdef _DEBUG_ USART_tx_S("Byte iniziale: "); USART_tx_S(itoa(RFID_tag[0], &ibuff[0], 16)); ibuff[0] = 0; ibuff[1] = 0; USART_tx_S("\nByte di arresto: "); USART_tx_S(itoa(RFID_tag[11], &ibuff[0], 16));#endif if (ValidTag()) { USART_tx_S("\nRFID Tag: "); for(uint8_t x = 1; x < 11; x++) { USART_tx_S(itoa(RFID_tag[x], ibuff, 16)); if (x != 10) USART_tx(&apos:&apos); } USART_tx_S("\n"); } rxIdx = 0; bDataReady = 0; }}

Passaggio 4: codice e addio

Questa pagina contiene un file zip con il relativo codice. È stato scritto in AVR Studio 4.16. Se usi il blocco note del programmatore, eclipse o vi (o qualcos'altro) dovrai copiare un Makefile affidabile nella directory e aggiungere questi file alla riga di origine. Inoltre, i tempi per la sezione di lettura seriale si basa su un MCU a 16 MHz. Se stai correndo a una frequenza di clock diversa, dovrai determinare sperimentalmente i ritardi sintonizzati per centrare gli impulsi della velocità di trasmissione. Spero che questa istruzione ti abbia aiutato in qualche modo. Se hai qualche suggerimento su come potrebbe essere migliorato, non esitare a farmelo sapere!

Consigliato: