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!!!


6 de ago de 2011

Exemplo de projeto em linguagem Assembly

Olá pessoal,

Neste segundo momento, gostaria de apresentar a vocês, um código desenvolvido em linguagem assembly, e que uso como base para o desenvolvimento dos meus programas nesta linguagem.

O código em sí, é muito enxuto e de fácil entendimento, porém traz informações e registradores que muitas vezes não são lembrados pelos programadores, sendo estes, fonte de muitos dos problemas encontrados princípalmente pelos que iniciam na atividade de programação de microcontroladores.

O microcontrolador utilizado neste exemplo é o PIC16F877A, um componente muito completo em termos de periféricos, já que possui internamente módulos de PWM e conversão AD, aliado a grande facilidade de uso, disponibilidade de acesso e quantidade de memória.

Uma das características mais procuradas em um desenvolvedor de software, seja ele voltado a qualquer área, é a capacidade de comentar os seus códigos, portanto tentem fazer o máximo possível de comentários em seus trabalhos, pois isto facilitará uma futura manutenção ou mesmo upgrade no seu código, bom por hoje é isto, grande abraço a todos.


Segue o código:

;*******************************************************************
;                                                                  
;                     JL Audio Manutenção Eletrônica              
;                                                                   
; Data:                                                               
; Autor: Jean Carlos
; Projeto:
; Microprocessador: PIC16F877A
; Clock do processador: 8MHz
; Estação de desenvolvimento: PK2Lab
; Compilador: MPLAB IDE v8.20a
; Versão atual:  1.0
; Descrição:
;
;*******************************************************************
; Includes (Arquivo padrão para o PIC16F877A)
#INCLUDE <P16F877A.INC>     

;*******************************************************************
; Bits de Configuração                        
;*******************************************************************
__CONFIG _CP_OFF&_WRT_OFF&_DEBUG_OFF&_CPD_OFF&_LVP_OFF&_WDT_OFF&_BODEN_ON&_PWRTE_ON&_XT_OSC

;_CP_OFF          ==> Memória de programa desprotegida contra leitura
;_WRT_OFF       ==> Sem permissão para escrever na memória de programa
;_DEBUG_OFF  ==> Debug desabilitado
;_CPD_OFF       ==> Memória EEPROM protegida contra leitura
;_LVP_OFF        ==> Programação em baixa tensão desabilitada
;_WDT_OFF       ==> WDT Desativado
;_BODEN_ON    ==> BROWN-OUT Ativado
;_PWRTE_ON    ==> POWER-ON RESET Ativado
;_XT_OSC          ==> Oscilador a cristal (8MHz)

;*******************************************************************
;Paginação do Bloco de Memória              
;*******************************************************************

#DEFINE    BANK0    BCF STATUS,RP0    ;Seta BANK 0 De Memória
#DEFINE    BANK1    BSF STATUS,RP0    ;Seta BANK 1 De Memória

;*******************************************************************
;Variáveis                                      
;*******************************************************************
; Definição dos nomes e endereços de todas as variáveis utilizadas
; pelo sistema

    CBLOCK    0x20    ;Endereço inicial de memória de usuário
               


    ENDC            ;Fim do bloco de memória       

;*******************************************************************
;Flags internos                         
;*******************************************************************
; Definição de todos os flags utilizados no programa.

;*******************************************************************
;Constantes                      
;*******************************************************************
; Definição de todas as constantes utilizadas no programa

;*******************************************************************
;Entradas                                  
;*******************************************************************
; Definição de todos os pinos que serão utilizados como entrada

;*******************************************************************
;Saídas                                     
;*******************************************************************
; Definição de todos os pinos que serão utilizados como saida
               
;*******************************************************************
;Vetor de Reset                                    
;*******************************************************************
;Endereço inicial de processamento de reset
    ORG    0x00       
    GOTO    INICIO
   
;*******************************************************************
;Vetor de Interrupção             
;*******************************************************************
;Endereço inicial de processamento de interrupção
    ORG    0x04       
    RETFIE            ;

;*******************************************************************
;Inicio do Programa                     
;*******************************************************************
   
INICIO

    BANK1
;    BSF        PCON,OSCF    ; Determina a frequencia do oscilador interno

    MOVLW    B'00000000'
    MOVWF    TRISA        ; Inicia PORTA como saidas                       
    MOVLW    B'00000000'
    MOVWF    TRISB        ; Inicia PORTB como saidas
    MOVLW    B'00000000'
    MOVWF    TRISC        ; Inicia PORTC como saidas                       
    MOVLW    B'00000000'
    MOVWF    TRISD        ; Inicia PORTD como saidas
    MOVLW    B'00000000'
    MOVWF    TRISE        ; Inicia PORTE como saidas

    MOVLW    B'10000000'
    MOVWF    OPTION_REG      ; Prescaller 1:2 no TMR0
                                               ; Pull'ups desabilitados
                       
    MOVLW    B'00000000'
    MOVWF    INTCON               ; Todas as interrupções desligadas
    MOVLW    B'00000110'          ; PORTA Como I/Os digitais (Analógicos desabilitados)
    MOVWF    ADCON1
    MOVLW    B'00000111'
    MOVWF    CMCON               ;Define modo do comparador interno desabilitado

    BANK0                                 ; Banco 0
    CLRF    PORTA                     ; Limpa o PORTA
    CLRF    PORTB                     ; Limpa o PORTB
    CLRF    PORTC                     ; Limpa o PORTC
    CLRF    PORTD                     ; Limpa o PORTD
    CLRF    PORTE                     ; Limpa o PORTE


;*******************************************************************
;*                   Inicialização das Variáveis                     
;*******************************************************************
; Inicialização de todas as variáveis utilizadas no programa

;*******************************************************************
;*                   Inicio da Rotina Principal                   
;*******************************************************************
MAIN


; Espaço reservado a rotina  principal do programa


GOTO MAIN

;*******************************************************************
;Rotinas Auxiliares                       
;*******************************************************************

; Espaço reservado as rotinas auxiliares do programa


;*******************************************************************
;Fim do Programa                     
;*******************************************************************
END                        ; Finaliza o código.