quinta-feira, 24 de novembro de 2011

Acionamento de Carga Sem Fio

Projeto:  Ligar e desligar cargas sem fio!

Descrição: O projeto utiliza dois módulos de rádio frequência capazes de transmitir e receber informações, estes podem operar em 315MHz ou 433.92MHz a frequência de operação depende somente dos módulo que podem ser adquiridos em outras faixas frequências.

Vantagem: Ligar ou desligar um T.V a distancia ou qualquer outra carga.

Resumo de funcionamento do módulo de transmissão.


O módulo transmissor possui 5 pinos que são descritos na imagem abaixo:




Pino 1: GND
            0V
Pino 2: Data In
            O pino Data In é a entrada dos dados a serem a transmitidos, geralmente a taxa de transmissão destes módulos é baixa, em torno de 8Kbps na modulação ASK. 
Pino 3: VCC
           A tensão de alimentação pode variar desde 3V até 12V, mas isto influencia na potência do sinal de saída, ou seja na distancia de operação.


Pino 4: ANT
        Para a antena podemos utilizar um fio flexível de uns 20cm de comprimento.
Para que o módulo funcione é necessário que se tenha um encoder, este por sua vez faz o empacotamento dos bits em suas entradas e os envia de forma serial para o módulo.
O encoder que utilizaremos é o HT12E da Holtek ele tem a versão com 20 pinos e 18 pinos, nós utilizaremos a versão de 18pinos.


Data Sheet


O HT12E possui 8 pinos de endereço e 4 pinos de dados, os pinos de endereço garantem que a informação enviada pelo TX tenha o mesmo endereço da informação no RX gerando uma certa segurança na transmissão.
Esta codificação deve ser igual no TX e no RX para que ambos "conversem".

Ex:


Se os pinos de endereço do TX estiverem com a configuração abaixo os mesmo pinos de endereço do RX devem possuir a mesma configuração.






Você pode inserir uma palavra binária de até 4 bits no encoder através dos pinos 10,11,12 e13. O pino 14 (TE) é o pino de habilitação, ou seja para que os 4 bits sejam transmitidos este pino deve estar em nível lógico 0.



Resumo de funcionamento do módulo de recepção.


O módulo receptor possui 8 pinos que são descritos na imagem abaixo:



Pino 1: GND
            0V
Pino 2: Data Output
            O pino Data Output é a saída dos dados recebidos, geralmente a taxa de transmissão destes módulos é baixa, em torno de 8Kbps na modulação ASK. 
Pino 3: Linear Out
           Saída linear.
Pino 4: VCC
           A tensão de alimentação pode variar desde 3V até 12V, mas isto influencia na potência do sinal de saída, ou seja na distancia de operação.
Pino 5: VCC
           A tensão de alimentação pode variar desde 3V até 12V, mas isto influencia na potência do sinal de saída, ou seja na distancia de operação.

Pino 6: GND
            0V

Pino 7: GND
            0V



Pino 1 : ANT
        Para a antena podemos utilizar um fio flexível de uns 20cm de comprimento.
Para que o módulo funcione é necessário que se tenha um decoder, este por sua vez faz o desempacotamento dos bits  recebidos pelo módulo e os apresenta em suas entradas paralelas.
O decoder que utilizaremos é o HT12D da Holtek ele tem a versão com 20 pinos e 18 pinos, nós utilizaremos a versão de 18pinos.



O HT12D possui 8 pinos de endereço e 4 pinos de dados, os pinos de endereço garantem que a informação enviada pelo TX tenha o mesmo endereço da informação no RX gerando uma certa segurança na transmissão.











Código fonte para o compilador MikroE escrito em 'C' para o TX.



sbit TE  at RD7_bit;
sbit INT_0  at RB0_bit;
sbit INT_1  at RB1_bit;

void main() {

  ADCON1 = 0x0F; // desabilita entradas analógicas
  TRISB = 0B00000011; // configura pinos RB0 e RB1 como entradas
  TRISD = 0B00000000; // configura PORTD como saída
  
  
  for(;;){
  
  if(INT_0 == 0){
  
     PORTD = 0x01;   // envia a palavra binária 01 em hexadecimal para o módulo TX
     TE = 0;         // habilita transmissão
     delay_ms(10);
     TE = 1;
  

  }
  
  if(INT_1 == 0){

     PORTD = 0x02;   // envia a palavra binária 02 em hexadecimal para o módulo TX
     TE = 0;         // habilita transmissão
     delay_ms(10);
     TE = 1;


  }
    
  }


}


Código fonte para o compilador MikroE escrito em 'C' para o RX.


sbit RELE1  at RC0_bit;
sbit RELE2  at RC1_bit;


void main() {


  ADCON1 = 0x0F; // desabilita entradas analógicas
  TRISC = 0B00000000; // configura PORTC como saída
  TRISD = 0B11111111; // configura PORTD como entrada




  for(;;){


  if(PORTD == 0x01){
     RELE1 = 1;   // liga rele 1
  }else RELE1 = 0;


  if(PORTD == 0x02){
     RELE2 = 1;   // liga rele 1
  }else RELE2 = 0;


  }


}


Adquira os módulos transmissor e receptor da Hi-Z Vale!





domingo, 20 de novembro de 2011

Termômetro com LM35


No projeto abaixo iremos desenvolver um termômetro digital utilizando o PIC18F e o sensor de temperatura LM35.



Projeto:  Medir a temperatura ambiente e mostrá-la no display LCD.

Descrição: O projeto mede a temperatura ambiente através do sensor de temperatura LM35 e a apresenta no display de LCD.

Vantagem: O sensor de temperatura LM35 tem uma precisão de 0.5 grau celsius e em algumas faixas ele é linear.

Resumo de funcionamento do sensor LM35.

Data Sheet

O sensor de temperatura LM35 é um dispositivo que varia a sua tensão de saída conforme a variação da temperatura ambiente, sua faixa de variação é de 10mV por grau Celsius sendo assim podemos utilizar uma regra de 3 para descobrirmos a temperatura atual.




O circuito abaixo ilustra o diagrama elétrico do Kit Easy 18F com o sensor LM35.



Para que o PIC leia o sinal analógico da temperatura é necessário passá-lo pelo conversor analógico/digital, o conversor A/D deste microcontrolador tem uma resolução de 10 bits, sendo assim podemos medir um valor que tenha uma correspondência binária de até 1023.

Ex: tensão de alimentação é de 5V, então o valor máximo de medida é de 1023, e o valor minimo é 0.

Utilizando a regra de 3 para calcular a variação de temperatura na sua correspondência binária.



Sendo assim temos que escolher um canal para efetuar a medida, pois o conversor A/D deste PIC possui 13 canais para mediadas analógicas, iremos escolher somente um canal, pois estaremos medindo somente uma grandeza analógica.


A escolha do canal é feita através da biblioteca do PIC.


Código Fonte: O código fonte foi escrito na linguagem C, para o compilador C18 da microchip.
Segue o código.




/* Termômetro Digital               */
/* Rodrigo Mira de Oliveira        */
/* www.hizvale.com.br */
/* HI-Z Vale */
#include<P18F4520.h>
#include<adc.h>


// *** Bits de Configuração

        #pragma config OSC     = HS     // (8 MHz crystal)
        #pragma config FCMEN    = OFF
        #pragma config IESO     = OFF
        #pragma config PWRT     = OFF
        #pragma config BORV     = 3
        #pragma config WDT      = OFF
        #pragma config WDTPS    = 32768
        #pragma config MCLRE    = ON
        #pragma config LPT1OSC  = OFF
        #pragma config PBADEN   = OFF
        #pragma config STVREN   = ON
        #pragma config LVP      = OFF
        #pragma config XINST    = OFF       // Extended Instruction Set
        #pragma config CP0      = OFF
        #pragma config CP1      = OFF
        #pragma config CPB      = OFF
        #pragma config WRT0     = OFF
        #pragma config WRT1     = OFF
        #pragma config WRTB     = ON       // Boot Block Write Protection
        #pragma config WRTC     = OFF
        #pragma config EBTR0    = OFF
        #pragma config EBTR1    = OFF
        #pragma config EBTRB    = OFF





#include "LCD8.h"

const char MSG1[] = "Temperatura";

void PrintLCD4(unsigned int data){

/*************************************************************************
Quebra numero de quatro digitos para imprimir no LCD

EX: 1024
1024/1000 = '1'
1024%1000 = 024
024/100 = '0'
024%100 = 24
24/10 = '2'
24%10 = '4'

*************************************************************************/
/*PutLCD(' ');
PutLCD((data / 1000) + 0x30);
data = data % 1000;
PutLCD((data / 100) + 0x30);*/
data = data % 100;
PutLCD((data / 10) + 0x30);
PutLCD((data % 10) + 0x30);
PutLCD(0xDF);
PutLCD('C');


}

void main (void)
{
unsigned int valor,temp;

TRISD = 0;
    TRISC = 0;

// *** Configuração do conversor A/D

OpenADC ( ADC_FOSC_16 &        // FOSC = 8MHz. Tad = 16/10M = 2.0 µS
              ADC_RIGHT_JUST &               // Resultado Justificado para direita
              ADC_2_TAD,                            // Configuração do tempo de aquisição automático.
              ADC_CH0 &                              // Seleciona o canal 0 (AN0)
              ADC_INT_OFF &                      // Desabilita Interrupção
              ADC_VREFPLUS_VDD &        // Vref+ = VCC
              ADC_VREFMINUS_VSS,        // Vref- = GND
              14);          // Habilita somente o canal AN0 como entrada analógica



OpenLCD(); // inicializa LCD



for(;;){

ConvertADC(); // inicia conversão
while(BusyADC());        // espera conversão terminar
valor = ReadADC();        // lê resultado

valor = valor * 500;                 // converte para temperatura.
temp = valor/1023;


  GotoXYLCD(2,1);        // apresenta no display
PrintLCD(MSG1);
GotoXYLCD(6,2);
PrintLCD4(temp);




}
}

Circuito no Proteus.



Este projeto foi desenvolvido no Kit Easy 18F da Hi-Z Vale, assista o vídeo

.





Adquira o módulo de expansão sensores analógicos!






sábado, 19 de novembro de 2011

Driver para Motor DC com PWM

Pessoal vamos aprender como controlar um motor DC 12V utilizando um driver de potência e o microcontrolador PIC18F.

Projeto:  Controlar a velocidade de um motor DC utilizando o PWM do PIC18F4520

Descrição: O projeto controla a velocidade de um motor DC através do hardware PWM do PIC, e sua rotação, fazendo girar no sentido horário e anti-horário.

Vantagem: Utilizando o driver L298N você economiza tempo de projeto, diminui os ricos de funcionamento e ainda diminui o tamanho de sua placa.

Resumo do driver.
data sheet do driver

O L298 é um circuito integrado capaz de acoplar sinal de nível TTL em um driver para acionamento de cargas indutivas, relês, solenoides e motores de passo. Possui duas entradas individuais de habilitação capazes de habilitar individualmente cada saída.


Esquema do circuito no proteus










Código Fonte: O código fonte foi escrito na linguagem C, para o compilador Mikro C.
Segue o código.



/*********************************************************************
              PROJETO DRIVER MOTOR D.C HI-Z Vale

Autor: Rodrigo Mira
                e-mail: hizvale@hizvale.com.br
                www.hizvale.com.br

       Motor D.C
**********************************************************************/


sbit LCD_RS at RE1_bit;
sbit LCD_EN at RE0_bit;
sbit LCD_D4 at RD4_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D7 at RD7_bit;

sbit LCD_RS_Direction at TRISE1_bit;
sbit LCD_EN_Direction at TRISE0_bit;
sbit LCD_D4_Direction at TRISD4_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D7_Direction at TRISD7_bit;


sbit ENA  at RC3_bit;
sbit ENB  at RC4_bit;

sbit INT_0  at RB0_bit;
sbit INT_1  at RB1_bit;
sbit INT_2  at RB2_bit;

#define INT0  PORTBbits.RB0
#define INT1  PORTBbits.RB1
#define INT2  PORTBbits.RB2

char txt1[] = "MOTOR:";
char txt2[] = "Duty Cycle";

unsigned char selectMotor = 1,speed = 20,aux;



void main() {

  PWM1_Init(500);                    // inicializa módulo PWM1 para 500Hz
  PWM2_Init(500);                    // inicializa módulo PWM2 para 500Hz
  
  PWM1_Start();                       // inicia PWM1
  PWM2_Start();                       // inicia PWM2

  
  Lcd_Init();                              // inicializa LCD

  Lcd_Cmd(_LCD_CLEAR);               // limpa display
  Lcd_Cmd(_LCD_CURSOR_OFF);          // desliga cursor

  
   TRISC = 0;                     // configura PORTC como saída
 TRISE = 0;                     // configura PORTE como saída
 TRISD = 0;                    // configura PORTD como saída
 TRISB = 0x0F;             // configura os quatro 4 primeiros bits do PORTB como entradas
 ADCON1 = 0x0F;        // desliga conversor A/D
 
    speed = 20;   // duty cycle

for(;;){


    if(INT_0 == 0){
   while(INT_0 == 0);

   if (speed < 235){
       speed +=20;
   }

    }

    if(INT_1 == 0){

   while(INT_1 == 0);

   if (speed > 20){
       speed -=20;
   }

    }

    if(INT_2 == 0){

   while(INT_2 == 0);

  if(selectMotor == 1)selectMotor = 2;
  else if(selectMotor == 2)selectMotor = 1;

    }
    





    switch(selectMotor){

 case 1:
 
      ENA = 1;
      ENB = 0;
                     Lcd_Out(2,1,txt2);                 // Write text in first row
                     aux = speed / 100;
                     Lcd_Chr(2,12,aux + 48);
                     aux = speed % 100;
                     aux = aux / 10;
                     Lcd_Chr(2,13,aux + 48);
                     aux = aux % 10;
                     Lcd_Chr(2,14,aux + 48);
                     
                     
                     Lcd_Out(1,1,txt1);                 // Write text in first row
                     Lcd_Chr(1,8, selectMotor + 48);
                     
                     PWM1_Set_Duty(speed);
                     PWM2_Set_Duty(0);


 break;
 case 2:

   ENA = 0;
                    ENB = 1;

                     Lcd_Out(2,1,txt2);                 // Write text in first row
                     aux = speed / 100;
                     Lcd_Chr(2,12,aux + 48);
                     aux = speed % 100;
                     aux = aux / 10;
                     Lcd_Chr(2,13,aux + 48);
                     aux = aux % 10;
                     Lcd_Chr(2,14,aux + 48);
                     
                     Lcd_Out(1,1,txt1);                 // Write text in first row
                     Lcd_Chr(1,8, selectMotor + 48);
                     PWM2_Set_Duty(speed);
                     PWM1_Set_Duty(0);

 break;



    }







}




}


Utilizando o Comparador Analógico do PIC18

Pessoal vamos aprender como utilizar o comparador analógico do PIC18F4XXX, junto com a aplicação para acionamento de uma carga.

Projeto:  Ligar e desligar uma lâmpada quando anoitecer e amanhecer automaticamente.

Descrição: O projeto  liga e desliga uma lâmpada automaticamente através de um sensor de luminosidade (LDR). Quando anoitece o sensor detecta a falta de luz solar e aciona a lâmpada, quando amanhece o sensor detecta a presença de luz solar e desliga a lâmpada.

Vantagem: Economizar energia de ambientes abertos, como garagens postes e até simulação de tráfego de pessoas dentro de uma casa.

Resumo de funcionamento de um comparador analógico.



Quando a tensão na porta não inversora é maior que a tensão na porta inversora a saída do comparador é a tensão +V, quando a tensão na porta inversora é maior que a tensão na porta não inversora a saída do comparador é a tensão -V.

Como a tensão do comparador interno do microcontrolador é a tensão de alimentação, sendo assim a tensão -V é igual a GND e a tensão +V é igual a VCC.




O microcontrolador que utilizaremos é o PIC18F4520, o comparador analógico ou "AMPOP" pode ser utilizado em diversas configurações, a configuração de trabalho neste microcontrolador é a comparador analógico.



Na figura acima podemos identificar dois comparadores, que exitem neste microcontrolador podendo formar diversas configurações de trabalho, a configuração que iremos utilizar é a de dois comparadores independentes.

Note que os pinos RA0,RA3 e RA1,RA2 formam as entradas, analisando o comparador 1 (C1) quando a tensão no pino RA3 for maior que a tensão no pino RA0 a saída será 5V, assim podemos acionar um driver para ligar uma lâmpada.

O circuito abaixo mostra a configuração de hardware para o projeto:




Código Fonte: O código fonte foi escrito na linguagem C, para o compilador C18 da microchip.
Segue o código.



/*********************************************************************
              PROJETO CORUJA ELETRÔNICA Hi-Z Vale

Autor: Rodrigo Mira
                e-mail: hizvale@hizvale.com.br
                www.hizvale.com.br

       Comparador Analógico
**********************************************************************/

#include <P18F4520.h> // biblioteca do PIC

#include <ancomp.h> // biblioteca do comparador analógico


        #pragma config OSC     = HS  
        #pragma config FCMEN    = OFF
        #pragma config IESO     = OFF
        #pragma config PWRT     = OFF
        #pragma config BORV     = 3
        #pragma config WDT      = OFF
        #pragma config WDTPS    = 32768
        #pragma config MCLRE    = ON
        #pragma config LPT1OSC  = OFF
        #pragma config PBADEN   = OFF
        #pragma config STVREN   = ON
        #pragma config LVP      = OFF
        #pragma config XINST    = OFF       // Extended Instruction Set
        #pragma config CP0      = OFF
        #pragma config CP1      = OFF
        #pragma config CPB      = OFF
        #pragma config WRT0     = OFF
        #pragma config WRT1     = OFF
        #pragma config WRTB     = ON       // Boot Block Write Protection
        #pragma config WRTC     = OFF
        #pragma config EBTR0    = OFF
        #pragma config EBTR1    = OFF


void main (void)
{
 
   ADCON1 = 0x0F; // desliga conversosr A/D
   TRISD = 0x00;       // configura PORTD como saída
   TRISA = 0xFF;      // configura os PORTA como entrada  

/**************************************************************
  Configuração do Comparador
 A função abaixo configura o comparador analógico
 com as saída 1 e 2 invertidas, 2 comparadores independentes
 e interrupção desabilitada.

 Open_ancomp(COMP_1_2_OP_INV&
            COMP_1_2_INDP&
            COMP_INT_DIS );
         
 Para maiores informações abra o arquivo PIC18 Peripheral Libraries
 no caminho C:/MCC18/doc/periph-lib/ANCOMP.htm          
 **************************************************************/
Open_ancomp(COMP_OP_INV_NONE&
            COMP_1_2_INDP&
            COMP_INT_DIS);

for(;;){

if(CMCONbits.C1OUT == 1){ // testa o bit que sinaliza a saida do comparador 1

PORTDbits.RD0 = 1;
       
}
else PORTDbits.RD0 = 0;


}
}

Utilize o kit Easy 18F da Hi-Z Vale para esta aplicação!