Índice:

Leitor RFID AVR / Arduino com código UART em C: 4 etapas
Leitor RFID AVR / Arduino com código UART em C: 4 etapas

Vídeo: Leitor RFID AVR / Arduino com código UART em C: 4 etapas

Vídeo: Leitor RFID AVR / Arduino com código UART em C: 4 etapas
Vídeo: How to Use I2C LCD with Arduino | Very Easy Arduino LCD I2C Tutorial | Arduino 16x2 LCD I2C Tutorial 2024, Novembro
Anonim
Leitor AVR / Arduino RFID com código UART em C
Leitor AVR / Arduino RFID com código UART em C

RFID é a mania, encontrada em todos os lugares - de sistemas de inventário a sistemas de identificação de crachás. Se você já foi a uma loja de departamentos e passou por aquelas coisas que parecem detectores de metal nos pontos de entrada / saída, então você viu RFID. Existem vários lugares para encontrar boas informações sobre a configuração de RFID, e este instrutível concentra-se na instalação do leitor Parallax RFID (Serial TTL) em um AVR, com ênfase no código C necessário para ler a entrada serial. O código está em C e não usa nenhuma biblioteca externa. Na verdade, ele fala 2400 baud diretamente sem o uso de um UART, sincronizando com a taxa de baud do leitor RFID e lendo o pino digital ao qual está conectado. Animado? Eu também.

Etapa 1: Obtenha os bens

Obtenha os bens
Obtenha os bens

Você precisará da seguinte lista de peças:

  • Leitor RFID (Parallax # 28140 $ 39,99)
  • Tag RFID (Parallax # 32397 $ 0,99)
  • AVR ou clone do Arduino (se você usar um AVR padrão, também precisará de um capacitor max232, 5 x 1uF e um conector DE9)
  • Placa de ensaio sem solda

Opcional

  • Cabeçalho de 4 posições
  • Arame

(e o max232 etc. para comunicação das informações do tag) Você também pode conectar sua tela LCD favorita em vez de enviar dados do tag via RS232.

Etapa 2: conectar as peças

Conecte as peças
Conecte as peças
Conecte as peças
Conecte as peças
Conecte as peças
Conecte as peças

O lado do hardware é muito fácil. Em vez de colocar meu leitor RFID diretamente na placa de ensaio, optei por fazer um cabo rápido para poder mover o leitor RFID um pouco melhor. Para isso, cortei 4 posições de uma régua de encaixe fêmea que eu tinha deitado e soldada em três fios. Fita elétrica completou o conector do gueto. O leitor RFID tem 4 conexões:

  • Vcc
  • PERMITIR
  • FORA
  • Gnd

Como você provavelmente já deve ter adivinhado, conecte Vcc a + 5V e Gnd ao aterramento. Como o leitor RFID consome muita energia, você pode bater o pino ENABLE para desligá-lo e ligá-lo em vários intervalos. Eu simplesmente escolhi continuar. Como ele está invertido, você o puxa para BAIXO para ativá-lo. Como alternativa, você pode conectá-lo ao aterramento. Eu o conectei ao PIND3 para me dar opções de habilitar / desabilitar se eu decidir. O pino OUT é para onde o leitor envia seus dados seriais depois de ler uma tag. Eu o conectei ao PIND2. Note, no Universo Parallax, vermelho significa ir. Ou seja, um LED verde significa que a unidade está inativa e ociosa, enquanto um LED vermelho significa que a unidade está ativa. * encolher os ombros * Vai entender.

Etapa 3: Escreva o Código

Escreva o código
Escreva o código

Para ler os dados do leitor RFID, você precisa saber quando uma etiqueta foi enviada, retirar os dados da porta serial e enviá-los para algum lugar.

Formato de dados do leitor RFID

O leitor Parallax RFID envia dados em um ritmo glacial fixo de 2.400 baud. Uma etiqueta RFID tem 10 bytes. A fim de permitir a detecção / correção de erros, uma vez que o leitor pode ser desligado do ruído aleatório, o RFID de 10 bytes é delimitado por uma sentinela de início e parada. A sentinela de início é alimentação de linha (0x0A) e a sentinela de parada é retorno de carro (0x0D). Se parece com isso:

[Iniciar o Sentinel | Byte 1 | Byte 2 | Byte 3 | Byte 4 | Byte 5 | Byte 6 | Byte 7 | Byte 8 | Byte 9 | Byte 10 | Stop Sentinel]Estas são as três etapas principais.

Saiba quando uma tag foi enviada

Usei uma interrupção de alteração de pino no AVR que notifica o firmware de que ocorreu uma alteração em um pino monitorado. Configurar o AVR para isso é fácil e requer definir o sinalizador, dizer ao MCU qual pino você deseja monitorar e definir o bit de interrupção global. Configurar PCINT

BSET (PCICR, PCIE2); // registro de controle de interrupção de alteração de pino pcie2 BSET (PCMSK2, PCINT18); // habilita a interrupção de mudança de pino para PCINT18 (PD2) BSET (SREG, 7); // Definir SREG I-bitEscreva sua rotina de serviço de interrupção. Você deseja manter seu ISR curto para que em meu vetor de interrupção eu leia o byte inteiro, bit a bit, e armazene o byte em uma matriz global de caracteres voláteis. Eu faço o seguinte em cada interrupção:

  • Verifique se estou começando
  • Centralize o tempo no pulso do meio a 2400 baud (a velocidade do leitor RFID)
  • Pule o bit de início e pare no meio do próximo bit
  • Leia cada bit em um inteiro sem sinal
  • Quando eu tiver 8 bits, coloque o byte em uma matriz de caracteres
  • Quando eu coletar 12 bytes, informe ao MCU que a tag foi lida para detecção de erros.

Eu modifiquei o código SoftSerial de Mikal Hart que modificou o código de David Mellis para os atrasos determinados experimentalmente nas rotinas seriais.

Analisar saída RS232

A rotina PCINT contém o código para ler a saída RS232 do leitor RFID. Quando obtenho 12 bytes (RFID de 10 bytes mais sentinelas), defino bDataReady como 1 e deixo o loop principal processar os dados e exibi-los.

// este é o manipulador de interrupçãoISR (PCINT2_vect) {if (BCHK (PIND, RFID_IN)) // O bit de início vai para baixo return; uint8_t bit = 0; TunedDelay (CENTER_DELAY); // Centralizar no bit de início para (uint8_t x = 0; x <8; x ++) {TunedDelay (INTRABIT_DELAY); // pula um pouco, irmão… if (BCHK (PIND, RFID_IN)) BSET (bit, x); else BCLR (bit, x); } TunedDelay (INTRABIT_DELAY); // pula o bit de parada RFID_tag [rxIdx] = bit; ++ rxIdx; if (rxIdx == 12) bDataReady = 1;}

Exibir sua tag

No main (), durante o loop for (ever), eu verifico se bDataReady foi definido, sinalizando que toda a estrutura RFID foi enviada. Em seguida, verifico se é uma tag válida (ou seja, os caracteres de início e parada são 0x0A e 0x0D, respectivamente) e, em caso afirmativo, envio-a pela minha conexão RS232.

para (;;) {if (bDataReady) {#ifdef _DEBUG_ USART_tx_S ("Byte inicial:"); USART_tx_S (itoa (RFID_tag [0], & ibuff [0], 16)); ibuff [0] = 0; ibuff [1] = 0; USART_tx_S ("\ nParar byte:"); USART_tx_S (itoa (RFID_tag [11], & ibuff [0], 16)); # endif if (ValidTag ()) {USART_tx_S ("\ nTag RFID:"); 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; }}

Etapa 4: Código e despedida

Esta página contém um arquivo zip com o código relevante. Foi escrito em AVR Studio 4.16. Se você usar o bloco de notas do programador, eclipse ou vi (ou qualquer outra coisa), você precisará copiar um Makefile confiável para o diretório e adicionar esses arquivos à linha de origem. Observe também que o tempo para a seção de leitura serial é baseado em um MCU de 16 MHz. Se você estiver operando em uma frequência de clock diferente, precisará determinar experimentalmente os atrasos sintonizados para centralizar nos pulsos de taxa de transmissão. Espero que este instrutivo tenha ajudado de alguma forma. Se você tiver alguma sugestão sobre como pode ser melhorado, não hesite em me avisar!

Recomendado: