Cartões RFID são normalmente usados para controle de acesso e tickets de ônibus e metrôs. Eles são convenientes porque não precisam de contato direto para transferir informações de/para o cartão. Como estes cartões são alimentados pelos próprios leitores, dispensam o uso de baterias que precisariam ser recarregadas.
O primeiro passo é descobrir como desenvolver um leitor simples. Nós sabemos que o cartões RFID é alimentado pelo campo magnético emitido pelo leitos. As tags¹ RFID transferem informação de volta ao leitor consumindo este campo magnético, que é detectado pelo leitor como uma variação no campo.
¹ São chamados de “tags” RFID todos os elementos que armazenam informações e são móveis, como o cartão, neste caso específico.
O projeto mais comum de um leitor RFID faz uso de um circuito ressonante série. Ele consiste de um indutorsimples e um capacitor, excitados por uma fonte de tensão de baixa impedância. Se o Q do circuito for alto o suficiente, a tensão no ponto de amostragem (Vsample) vai exceder a tensão de alimentação. Quando o RFID é alimentado por este campo magnético o Q do circuito cai. O resultado é uma pequena alteração na tensão de amostragem (Vsample no circuito mostrado).
Eu criei um leitor simples com componentes encontrados em minha sucata. Usando um gerador de função como fonte de sinal e um osciloscópio no ponto de amostragem, eu pude sintonizar a frequência até encontrar o ponto ressonante do circuito. Eu continuei substituindo os capacitores neste circuito até encontrar a frequência que eu estava procurando. O cálculo da frequência é este:
Por alguma razão eu me confundi e iniciei o projeto tendo em mente a frequência de 150kHz ao invés de 125kHz. As tags RFID respondem bem a uma frequência mais alta, então eu mantive assim para evitar voltar a trás e redesenhar todo o circuito. 🙂
Com um ajuste simples eu verifiquei quais alterações aconteciam quando a tag RFID era submetida a 4 ou 5 ciclos de frequência da portadora. Uma vez que o sinal precisa ser AC e não DC, eu assumi que a frequência de transmissão seria 150kH/8 = 18.75kHz ou 150kHz/10 = 15kHz. Este detalhe eu encontrei em um site que foi realmente útil por conter boas informações sobre RFID:http://instruct1.cit.cornell.edu/courses/ee476/FinalProjects/s2006/cjr37/Website/index.htm.
A tag aparentemente codifica o dado usando FSK. As duas frequências representam o 0 e 1 lógicos.
Com esta informações em mãos, eu avancei e iniciei o projeto do meu próprio indutor-antena. Uma vez que eu mantive a idéia de usar 150kHz como frequência da portadora, eu fiz o cálculo e fiquei com uma indutância de 160uH e um capacitor de 10nF. Eu utilizei a seguinte equação para estimar o número de voltas que precisaria em minha bobina:
Onde x, y são o comprimento e a largura da bobina, h é a altura e b é a espessura da parte condutora. Eu utilizer x=y=6cm, h=1cm e b=0.3cm. O número encontrado foi 34. Eu enrolei a bobina em uma caixa de papel que encontrei, de onde eu extrai o x e y. Depois de enrolada, a bobina foi extraída e presa com fita adesiva.
Para um ajuste fino da frequência ressonante do sistema todo eu decidi brincar com o valor da capacitância. Usando o gerador de função para variar a frequência e visualizando o pico da saída com um osciloscópio, eu variei os valores dos capacitores até que o pico da resposta ressonante fosse a 150kHz. O capacitor final foi de 0.056uF. Uma vez que o meu capacitor precisa ser um valor de mercado, a bobina que eu construí precisa ter uma indutância maior que 160uH.
O próximo estágio era projetar o circuito analógico. Eu usei o confiável AMPOP TL062 (eu já possuia vários desses em casa). As frequências envolvidas neste circuito são relativamente baixas, então a baixa peformace em frequência deste AMPOP não é problema. Eu havia decidido evitar um circuito complexo, então elegi o circuito mais simples que poderia ser usado.
Então, a idéia é usar um simples diodo detector. Este detector de tensão passar por um primeiro AMPOP configurado como amplificador inversor com uma resposta em frequência passa baixa. Isso removerá uma boa parte do volume da portadora. O próximo estágio do circuito analógico é extrair o sinal FSK. O circuito mais simples que me veio a mente foi um filtro ressonante passa banda com frequência central em torno de 17kHz. Isso só me custaria um AMPOP. Este circuito foi desenhado no SPICE e o gráfico da frequência de resposta é mostrado no final desta página.
A saída do passa banda é um sinal que pode ser diretamente conectado à um microcontrolador PIC. Eu escolhi para este projeto o bom e velho microcontrolador PIC16F628A. Com o comparador interno eu posso receber o sinal diretamente do AMPOP e extrair o sinal digital.
A decodificação do sinal FSK é feita por software, o que realmente é interessante para não aumentar a nossa lista de componentes.
Para decodificar o sinal FSK eu implementei três subrotinas que usam o TMR0 para marcar o tempo passado entre as mudanças detectadas na saída do comparador. Nenhuma interrupção é usada. Ao invés disso, as rotinas foram colocadas em loop até que um estado de mudança é detectado. O loop que faz a detecção leva em torno de três ciclos de CPU para rodar; assim, dependendo de quando a mudança ocorre, o erro máximo é de 3 ciclos.
Alguém que conhece como o hardware do PIC funciona poderia me perguntar porque eu não usei o módulo CCP (Compare and Capture). Infelismente eu utilizei o módulo PWM para gerar a portadora de 150kHz. Como o CCP compartilha recursos com o módulo PWM, apenas um deles pode ser ativado por vez.
Para ter uma idéia geral de como o sinal FSK aparece depois de digitalizado, eu adicionei um modo debug onde ele irá capturar um número de ciclos de CPU ocorridos entre cada mudança no sinal de entrada.
Devido às limitações da memória on-chip, somente 80+64 pontos de dados foram capturados. Isso não é grande o sufuciente para decodificar o dado, mas é suficiente para nós desenharmos uma visão geral de como o sinal se parece.
Saída do modo Debug, logo após o final do contador de ciclos
Neste gráfico, os números no eixo Y representam o tempo (em ciclos de CPU) entre cada mudança de estado no sinal de entrada. Eu decidi que 85 era um número bom para saber se o sinal de entrada era zero ou um. No futuro eu acabei decidindo alterar a rotina de decodificação para contar o tempo gasto entre cada borda de subida do sinal (uma vez que o sinal não possui componente DC, isto economizaria memória já que eu só guardaria um bit ao invés de dois). Assim, a constante utilizada no firmware do PIC cresceu e eu estou usando 170 (2x 85).
A sequência decodificada dos dados se parece com:
0000000000000000000000001111111111111111000001111110000001111100000011111000000111111 ... ... 111111000001111110000001111100000011111111110000000000001111111111100000011111000000000000 ... 0000001111110000001111111111000000111111000000000000000000000000111111111111111100000
Você pode ver que o dado inicia com vários zeros, seguidos de alguns números 1 que são o dado atual. A sequência inteira continua a se repetir.
Eu conheço o sinal codificado em Manchester, então, a partir do sinal, eu posso chegar à seguinte conclusão:
1. A sinal inicia com uma sequencia de zeros, superior a vinte zeros.
2. A segunda sequência também é sempre uma sequência de 1 com pelo menos 15 bits.
3. Para cada bit existem entre 10 e 12 números zero ou um.
4. O bit é zero se não existe nenhuma mudança no sinal durante o tempo de um bit.
Um gráfico rápido pode ser desenhado:
111111000001111110000001111100000011111111110000000000001111111111100000011111000000000000 -----------|-----------|----------|_________|___________|__________|----------|___________ 1 1 1 0 0 0 1 0
Com essas regras em mente, eu adicionei a função para decodificar o dado. Como um resumo de todo o sistema eu adicionei os seguintes diagramas:
Diagrama de blocos
![Diagrama de Blocos Leitor RFID](http://www2.eletronica.org/projetos/leitor-rfid/block.png)
Esquemáticos:
Analógico
Microcontrolador
Simulação Passa-Faixa:
Conclusão
Atualmente eu ajustei o Vcc para 10V. A tensão se +5V é extraída a partir de um regulador de tensão 78L05. O Vref é setado pata a metade da tensão de alimentação, 2,5V. Isso é feito utilizando um simples divisor resistivo de 4,7k ohm.
O código fonte pode ser baixado logo abaixo. Existem duas versões:
Revisão 1: 1º de Maio de 2007 – Lançamento inicial
Revisão 2: 5 de Maio de 2007 – Revisão 2
Recursos adicionados:
Auto start, iniciado quando o pino PB7 é colocado em nível alto;
Suporte a um buzzer, saída no pino 4
Detecção automática do cartão
Desenvolvido por Rick Huang.
Adaptado para o português por Eletronica.org, com autorização do autor.