28 de ago de 2011

Projeto de acionamento por RFid.



Olá galera, dessa vez demorei a postar novidades, mais acho que o assunto que vou apresentar hoje é de grande interesse de muitos, pois se trata de uma tecnologia relativamente simples mais que traz muitos benefícios a automação em geral, tanto de empresas como do setor residencial.

RFid – Radio Frequency IDentification 

Há algum tempo venho lendo uma série de artigos envolvendo o uso desta tecnologia, mais ainda faltava por as mãos no hardware, e ver como realmente funciona na prática, para estimar qual a sensibilidade e eficiência este processo nos provê. 

Para este projeto foi adquirida junto a MikroE uma placa de expansão que contem todo o hardware necessário para funcionamento deste processo, este inclui na placa o receptor EM4095 e a antena, que ao meu ver são os dois componentes críticos do projeto, tudo isto ao custo de pouco mais de R$ 40,00 incluindo os 5 cartões RFid.


Vale lembrar que todas as placas de expansão comercializadas pela mikroElektronika, que no Brasil é representada pela empresa Microgenios, são totalmente compatíveis com a PK2Lab.

O projeto consiste de uma trava eletrônica, onde o usuário deve aproximar um cartão próximo ao equipamento para que seu acesso a determinada área seja permitida, neste exemplo temos a possibilidade de cadastrar um cartão para cada área, sendo este código armazenado na memória EEPROM do microcontrolador.

Abaixo temos o vídeo de funcionamento do projeto e o código, escrito em C no compilador MikroC PRO.



Código fonte:

/******************************************************************************

                      JL Audio Manutenção Eletrônica

Data:  09/2011
Autor: Jean Carlos
Projeto: RFid LOCK
Microprocessador: PIC18F4550
Clock do processador: 48MHz
Estação de desenvolvimento: PK2Lab
Compilador: MikroC V4.60.0.0
Versão atual:  1.0
Descrição:


                  Este programa demosntra o uso da placa de RFid da
                  empresa mikroE, atráves de dois cartões cadastrados
                  temos o acionamento de dois reles da placa PK2Lab.
                  Para efetuar o cadastro do cartão referente ao Rele 1
                  pressione a tecla RD6, e efetue um resete na placa,
                  para o rele 2, pressione a chave RD7.
                  Ao se aproximar do sensor um cartão não cadastrado
                  é gerado um aviso sonoro de erro.


Placa RFid:      mE RFid Reader Board
                 http://www.mikroe.com/eng/products/view/185/rfid-reader-board/
                 ac:RFid_Board
PK2Lab           Placa de desenvolvimento PK2Lab
                 http://pk2lab.blogspot.com
                 ac:PK2Lab
Software:        mikroC PRO for PIC
                 http://www.mikroe.com/eng/products/view/7/mikroc-pro-for-pic/


 * NOTAS:

     - mE RFid Reader deve ser conectada ao PORTB
     - Jumper em VCC para chaves TACT
     - Chaves de pull-down em RD6 e RD7
     - O Clock do processador deve ser maior ou igual a 32Mhz (RFid)




*******************************************************************************/
// Inclusão do Driver do leitor RFid (RFid_Driver.h e RFid_Driver.c)

#include "RFid_driver.h"

//******************************************************************************
// Variáveis Globais

sbit Rele1 at RE1_bit;
sbit Rele2 at RE2_bit;
sbit Rele1_Direction at TRISE1_bit;
sbit Rele2_Direction at TRISE2_bit;

sbit Cfg_Sw1 at RD6_bit;
sbit Cfg_Sw2 at RD7_bit;
sbit Cfg_Sw1_Direction at TRISD6_bit;
sbit Cfg_Sw2_Direction at TRISD7_bit;

sbit OUT_ at RB0_bit;
sbit RDY_CLK at RB1_bit;
sbit SHD at RB2_bit;
sbit MOD_ at RB3_bit;
sbit OUT_Direction at TRISB0_bit;
sbit RDY_CLK_Direction at TRISB1_bit;
sbit SHD_Direction at TRISB2_bit;
sbit MOD_Direction at TRISB3_bit;

char Rele1_RFid[8];
char Rele2_RFid[8];

char code_error;

//******************************************************************************
// Interrupção

void Interrupt() {
  RFid_Interrupt_Proc();
}

//******************************************************************************
// Rotinas Auxiliares

void Pause(){
Delay_ms(250);                      // Pausa
}

void Beep(){
   Sound_Play(880, 250);            // Toca som a 880Hz por 250ms
}

void Beep100ms(){
   Sound_Play(880, 100);            // Toca som a 880Hz por 100ms
}

void Beep3x(){
   Beep();
   Pause();
   Beep();
   Pause();
   Beep();
   Pause();
}

void Beep1seg(){
   Sound_Play(880, 1000);           // Toca som a 880Hz por 1 seg
}

void Beep_error(){
 Sound_Play(880, 20);
 Sound_Play(600,30);
 Sound_Play(880, 20);
}

//******************************************************************************
//Rotina Principal

void main() {

 ADCON1 = 0x0F;                     // Todos os pinos como IO digital
 CMCON = 7;                         // Desabilita os comparadores de tensão

 Rele1 = 0;
 Rele2 = 0;
 Rele1_Direction = 0;
 Rele2_Direction = 0;
 Cfg_Sw1_Direction = 1;
 Cfg_Sw2_Direction = 1;

 RFid_Init();                       // Inicia a placa RFid
 Sound_Init(&PORTE, 0);             // Configuração do buzzer


 if (Cfg_Sw1 || Cfg_Sw2){ // Caso a chave de configuração de um dos reles estiver pressionada...
   Beep3x();
  
   if (Cfg_Sw1){          // Grava cartão referente ao rele 1
     Rele1 = 1;
     Delay_ms(500);
     RFid_GetID();
     RFid_Store_ID2EEPROM(0x00);
     Rele1 = 0;
     Beep();

   }

   if (Cfg_Sw2){          // Grava cartão referente ao rele 2
     Rele2 = 1;
     Delay_ms(500);
     RFid_GetID();
     RFid_Store_ID2EEPROM(0x08);
     Rele2 = 0;
     Beep();

   }
  
  Delay_ms(2000);
  Beep1seg();
  // Sai do modo de configuração
 }
 else
 {

  // Inicio de RFid scanning e controle de reles
  Beep1seg();
 
  RFid_LoadFromEEPROM(0x00, Rele1_RFid); // Busca cartões cadastrados no EEPROM
  RFid_LoadFromEEPROM(0x08, Rele2_RFid);


   while (1){
     
      RFid_GetID(); // Retorna RFid
     
      Beep100ms();
     
      code_error = 1;

// Checa se o código retornado confere com algum código gravado na EEPROM
// Caso positivo, aciona o rele correspondente por 2 segundos
      if(RFid_Check_ID(Rele1_RFid)){
        Rele1 = 1;
        code_error = 0;
      }
     
      if(RFid_Check_ID(Rele2_RFid)){
        Rele2 = 1;
        code_error = 0;
      }
//
      if (code_error) {             // Se o código retornado não confere com algum código gravado na EEPROM, indica erro!!!
          Pause();
          Beep_error();
          Pause();
      }
      else{
          Delay_ms(2000);
          Rele1 = 0;               // Desliga o rele, após 2 segundos de retenção.
          Rele2 = 0;
      }
    }
  }
}
//******************************************************************************

Arquivos para download:   


Grande abraço a todos, e até a próxima!!!


Nenhum comentário:

Postar um comentário