Tabla de contenido:

Lector RFID AVR / Arduino con código UART en C: 4 pasos
Lector RFID AVR / Arduino con código UART en C: 4 pasos

Video: Lector RFID AVR / Arduino con código UART en C: 4 pasos

Video: Lector RFID AVR / Arduino con código UART en C: 4 pasos
Video: Módulos de radio frecuencia decodificados con arduino 2024, Noviembre
Anonim
Lector RFID AVR / Arduino con código UART en C
Lector RFID AVR / Arduino con código UART en C

La tecnología RFID está de moda y se encuentra en todas partes, desde los sistemas de inventario hasta los sistemas de identificación de credenciales. Si alguna vez ha estado en una tienda departamental y atravesó esas cosas que parecen detectores de metales en los puntos de entrada / salida, entonces ha visto RFID. Hay varios lugares para encontrar buena información sobre cómo configurar RFID, y este instructivo se enfoca en instalar el lector RFID Parallax (Serial TTL) en un AVR, con énfasis en el código C necesario para leer la entrada serial. El código está en C y no usa bibliotecas externas. De hecho, habla 2400 baudios directamente sin el uso de un UART sincronizándose con la velocidad en baudios del lector RFID y leyendo el pin digital al que está conectado. ¿Emocionado? Yo también.

Paso 1: Obtenga los productos

Obtener las mercancías
Obtener las mercancías

Necesitará la siguiente lista de piezas:

  • Lector RFID (Parallax # 28140 $ 39.99)
  • Etiqueta RFID (Parallax # 32397 $ 0.99)
  • Clon de AVR o Arduino (si usa un AVR estándar, también necesitará un máximo de 322, 5 condensadores de 1 uF y un conector DE9)
  • Placa de pruebas sin soldadura

Opcional

  • Encabezado de 4 posiciones
  • Cable

(y el max232, etc. para la comunicación de la información de la etiqueta) También puede conectar su pantalla LCD favorita en lugar de enviar datos de la etiqueta a través de RS232.

Paso 2: conecte las piezas

Conecte las piezas
Conecte las piezas
Conecte las piezas
Conecte las piezas
Conecte las piezas
Conecte las piezas

El lado del hardware es bastante fácil. En lugar de colocar mi lector RFID directamente en mi tablero, opté por hacer un cable rápido para poder mover el lector RFID un poco mejor. Para eso, simplemente corté 4 posiciones de una tira de cabezal de enchufe hembra que tenía tirada y soldé en tres cables. Cinta aislante completaba el conector del ghetto. El lector RFID tiene 4 conexiones:

  • Vcc
  • HABILITAR
  • FUERA
  • Gnd

Como probablemente lo adivinó, conecte Vcc a + 5V y Gnd a tierra. Debido a que el lector RFID consume tanta energía, puede golpear el pin ENABLE para apagarlo y encenderlo en varios intervalos. Simplemente elegí mantenerlo encendido. Debido a que está invertido, lo tira hacia BAJO para activarlo. Alternativamente, puede conectarlo a tierra. Lo conecté al PIND3 para darme opciones de habilitar / deshabilitar si así lo decidía. El pin OUT es donde el lector envía sus datos en serie después de leer una etiqueta. Lo conecté a PIND2. Nota, en el Universo Parallax, rojo significa ir. Es decir, un LED verde significa que la unidad está inactiva e inactiva, mientras que un LED rojo significa que la unidad está activa. * encogiéndose de hombros * Imagínese.

Paso 3: escriba el código

Escribe el código
Escribe el código

Para leer los datos del lector RFID, debe saber cuándo se ha enviado una etiqueta, extraer los datos del puerto serie y enviarlos a algún lugar.

Formato de datos del lector RFID

El lector RFID Parallax envía datos a un ritmo glacial fijo de 2400 baudios. Una etiqueta RFID tiene 10 bytes. Para permitir la detección / corrección de errores, dado que el lector podría activarse con ruido aleatorio, la RFID de 10 bytes está limitada por un centinela de inicio y parada. El centinela de inicio es el salto de línea (0x0A) y el centinela de parada es el retorno de carro (0x0D). Se parece a esto:

[Iniciar Sentinel | Byte 1 | Byte 2 | Byte 3 | Byte 4 | Byte 5 | Byte 6 | Byte 7 | Byte 8 | Byte 9 | Byte 10 | Detener centinela]Estos son los tres pasos principales.

Sepa cuándo se ha enviado una etiqueta

Usé una interrupción de cambio de pin en el AVR que notifica al firmware que se ha producido un cambio en un pin supervisado. Configurar el AVR para esto es fácil y requiere configurar la bandera, decirle a la MCU qué pin desea monitorear y configurar el bit de interrupción global. Configurar PCINT

BSET (PCICR, PCIE2); // registro de control de interrupción de cambio de pin pcie2 BSET (PCMSK2, PCINT18); // habilita la interrupción de cambio de pin para PCINT18 (PD2) BSET (SREG, 7); // Establecer SREG I-bitEscriba su rutina de servicio de interrupción Desea que su ISR sea corto, así que en mi vector de interrupción leo el byte completo, bit a bit, y almaceno el byte en una matriz global de caracteres volátiles. Hago lo siguiente en cada interrupción:

  • Verifica para asegurarte de que estoy en un comienzo
  • Centre la sincronización en el pulso medio a 2400 baudios (la velocidad del lector RFID)
  • Omita el bit de inicio y haga una pausa en el medio del siguiente bit
  • Leer cada bit en un entero sin signo
  • Cuando tenga 8 bits, coloque el byte en una matriz de caracteres
  • Cuando haya recopilado 12 bytes, informe a la MCU que se ha leído la etiqueta para la detección de errores.

Modifiqué el código SoftSerial de Mikal Hart, quien modificó el código de David Mellis para los retrasos determinados experimentalmente en las rutinas seriales.

Analizar salida RS232

La rutina PCINT contiene el código para leer la salida RS232 del lector RFID. Cuando obtengo 12 bytes (RFID de 10 bytes más centinelas) configuro bDataReady en 1 y dejo que el bucle principal procese los datos y los muestre.

// este es el manejador de interrupcionesISR (PCINT2_vect) {if (BCHK (PIND, RFID_IN)) // El bit de inicio pasa a nivel bajo return; uint8_t bit = 0; TunedDelay (CENTER_DELAY); // Centro en el bit de inicio para (uint8_t x = 0; x <8; x ++) {TunedDelay (INTRABIT_DELAY); // salta un poco, hermano… if (BCHK (PIND, RFID_IN)) BSET (bit, x); si no BCLR (bit, x); } TunedDelay (INTRABIT_DELAY); // omitir el bit de parada RFID_tag [rxIdx] = bit; ++ rxIdx; if (rxIdx == 12) bDataReady = 1;}

Muestre su etiqueta

En el main (), durante el ciclo for (ever), verifico si se ha establecido bDataReady, lo que indica que se ha enviado toda la estructura RFID. Luego verifico si es una etiqueta válida (es decir, los caracteres de inicio y parada son 0x0A y 0x0D, respectivamente), y si es así, la envío por mi conexión RS232.

for (;;) {if (bDataReady) {#ifdef _DEBUG_ USART_tx_S ("Byte de inicio:"); USART_tx_S (itoa (RFID_tag [0], & ibuff [0], 16)); ibuff [0] = 0; ibuff [1] = 0; USART_tx_S ("\ nByte de parada:"); USART_tx_S (itoa (RFID_tag [11], & ibuff [0], 16)); # endif if (ValidTag ()) {USART_tx_S ("\ nRFID Tag:"); para (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; }}

Paso 4: Código y despedida

Esta página contiene un archivo zip con el código correspondiente. Fue escrito en AVR Studio 4.16. Si usa el bloc de notas del programador, eclipse o vi (o algo más), deberá copiar un archivo Makefile confiable en el directorio y agregar estos archivos a la línea de origen. También tenga en cuenta que el tiempo para la sección de lectura en serie se basa en un MCU de 16 MHz. Si está ejecutando a una frecuencia de reloj diferente, deberá determinar experimentalmente los retardos sintonizados para centrarse en los pulsos de velocidad en baudios. Espero que este instructivo le haya ayudado de alguna manera. Si tiene alguna sugerencia sobre cómo podría mejorarse, ¡no dude en hacérmelo saber!

Recomendado: