quinta-feira, 29 de novembro de 2012

Lendo Teclado matricial com MikroC

fONTE: PK2LAB.BLOGSPOT.COM


Teclado Matricial


Dentre as várias maneiras de interagirmos com o hardware em uma IHM (Interface Homem Máquina) uma das formas mais comuns é através do pressionamento de chaves e botoeiras para que o programa possa então executar uma tarefa específica.
Hoje vamos interfacear um teclado matricial, como o encontrado em telefones celulares e calculadoras, onde temos várias chaves conectadas ao microcontrolador de maneira eficiente a fim de não despediçarmos pinos do hardware.
foto
Para efetuar a conexão de uma tecla ao microcontrolador, podemos citar a maneira mais simples que utiliza apenas uma tecla e um resistor de Pull-up ou Pull-down conforme o nível de tensão que desejarmos quando ocorrer o pressionamento da tecla.
Chave HI-LO_1
Porém nesta configuração precisamos um pino para cada tecla conectada ao microcontrolador, o que caracteriza o desperdício de hardware, porém isto pode ser resolvido  com  implementação de uma simples matriz, onde conseguimos maximizar a utilização dos pinos de forma eficiente.
No esquema abaixo podemos observar a utilização das linhas e colunas que formam a matriz.

Capturar

O número máximo de chaves para esta implementação pode ser obtida através da equação abaixo:
                 N°teclas = Colunas x Linhas
O funcionamento do teclado matricial consiste em energizar apenas uma única linha por vez e efetuar a leitura das colunas para verificar o pressionamento de alguma das teclas, quando detectado um nível alto em alguma das colunas durante o rastreamento se torna possível a identificação da tecla pressionada. Para que não haja erros de leituras durante este processo, se faz necessário o uso de resistores de pull-down para garantir um nível baixo nas colunas que não estão sendo ativas pelo pressionamento de tecla.
Função para escaneamento de teclado
Para efetuar a leitura do teclado matricial, vamos criar uma função que retornará o valor da tecla pressionada em hexadecimal ou o valor 0xFF caso nenhuma tecla tenha sido pressionada.No nosso exemplo utilizaremos um teclado matricial de [4x3] que foi adquirido através do sitewww.goodluckbuy.com.
Assim que a função é chamada, colocamos um nivel alto na primeira linha e efetuamos a leitura das quatro colunas, caso alguma coluna responda nivel alto, retornamos da função com o valor correspondente a matrizagem, vejamos como fica o código:

#define Coluna_1  PORTD.B0
#define Coluna_2  PORTD.B1
#define Coluna_3  PORTD.B2

#define Linha_1    PORTD.B6
#define Linha_2    PORTD.B5
#define Linha_3    PORTD.B4
#define Linha_4    PORTD.B3

char Le_Teclado()         // Função que efetua a leitura do teclado matricial
{
Coluna_1 = 1;
Coluna_2 = 0;
Coluna_3 = 0;
Delay_ms(1);
if(Linha_1) return 1;
if(Linha_2) return 4;
if(Linha_3) return 7;
if(Linha_4) return 10;

Coluna_1 = 0;
Coluna_2 = 1;
Coluna_3 = 0;
Delay_ms(1);
if(Linha_1) return 2;
if(Linha_2) return 5;
if(Linha_3) return 8;
if(Linha_4) return 0;

Coluna_1 = 0;
Coluna_2 = 0;
Coluna_3 = 1;
Delay_ms(1);
if(Linha_1) return 3;
if(Linha_2) return 6;
if(Linha_3) return 9;
if(Linha_4) return 11;

return 255;
}



Este código  mostra como efetuar uma leitura “simples” do teclado matricial, porém dependendo do hardware utilizado pode apresentar problemas de estabilidade efetuando leituras falsas ou deixando de apresentar um pressionamento.
MikroC PRO
O compilador MikroC PRO, possui internamente uma biblioteca própria para uso com teclados matriciais e que torna o processo de escaneamento uma tarefa simples. Podem ser utilizadas as configurações [4x1] , [4x2] , [4x3] ou [4x4].
Keypad_Init()
Efetua a inicialização do teclado matricial, esta função requer que seja declarado anteriormente uma variável chamada keypadPort que define o PORT onde será conectado o nosso hardware do teclado.
char keypadPort at PORTD;  
Keypad_Key_Press()
Efetua a leitura de uma tecla pressionada, retornando o valor da tecla (1 –16) ou 0 caso nenhuma tecla seja pressionada.
Keypad_Key_Click()
Efetua a leitura de uma tecla pressionada, retornando o valor da tecla (1 –16) ou 0 caso nenhuma tecla seja pressionada, porém é uma função com propriedades de bloqueio, ou seja, quando chamada, aguarda o pressionamento da tecla, bloqueando o processo do programa durante a espera do pressionamento da tecla.
Notem que esta biblioteca do MikroC PRO, embora nos ajude a interfacear o teclado não retorna o valor direto das teclas e sim a posição dela na matriz.
Vejamos como ficou o nosso código completo utilizando o compilador MikroC PRO.
/******************************************************************************
                            JL Audio – www.esquemas .org
Data: 04/2012
Autor: Jean Carlos
Projeto: Teclado Matricial
Microprocessador: PIC18F4550
Clock do processador: 48MHz
Estação de desenvolvimento: PK2Lab V 1.1
Compilador: MikroC PRO V 4.60.0.0
Versão atual: 1.0
Descrição:
                 Implementação de leitura de teclado matricial na
                 placa PK2Lab, através de biblioteca do MikroC PRO.
*******************************************************************************/
// Inicialização do teclado no PORTD
char keypadPort at PORTD;
// Configuração do LCD da placa PK2Lab V.1.1
sbit LCD_RS at RB2_bit;
sbit LCD_EN at RB3_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D7 at RB7_bit;
sbit LCD_RS_Direction at TRISB2_bit;
sbit LCD_EN_Direction at TRISB3_bit;
sbit LCD_D4_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D7_Direction at TRISB7_bit;
//******************************************************************************
// Variáveis Globais
char tecla, tecla_antiga = 0;
//******************************************************************************
// Rotinas Auxiliares
//******************************************************************************
//Rotina Principal
void main()
{
TRISA     = 0b00000000;
PORTA    = 0b00000000;
TRISB     = 0b00000000;
PORTB    = 0b00000000;
TRISC     = 0b00000000;
PORTC    = 0b00000000;
PORTD    = 0b00000000;
TRISE     = 0b00000000;
PORTE    = 0b00000000;
ADCON1  = 0X0F;          // Entradas digitais.

Keypad_Init();          // Inicializa o Teclado Matricial
Lcd_Init();
Lcd_Cmd(_Lcd_Cursor_Off);
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1,1,"***  PK2Lab  ***");
Lcd_Out(2,2,"Tecla Press:");
Delay_ms(100);
while(1)
{

tecla = Keypad_Key_Press();      // Efetua leitura do teclado

if(tecla != 0)
{
  switch (tecla)                          // Efetua conversão para impressão
      {
      case  1: tecla = 49; break; // 1
      case  2: tecla = 50; break; // 2
      case  3: tecla = 51; break; // 3
      case  4: tecla = 65; break; // A
      case  5: tecla = 52; break; // 4
      case  6: tecla = 53; break; // 5
      case  7: tecla = 54; break; // 6
      case  8: tecla = 66; break; // B
      case  9: tecla = 55; break; // 7
      case 10: tecla = 56; break; // 8
      case 11: tecla = 57; break; // 9
      case 12: tecla = 67; break; // C
      case 13: tecla = 42; break; // *
      case 14: tecla = 48; break; // 0
      case 15: tecla = 35; break; // #
      case 16: tecla = 68; break; // D
      }
  if(tecla != tecla_antiga)       // Atualiza a ultima tecla pressionada
    {
    tecla_antiga = tecla;
    }
  Lcd_Chr(2,15,tecla);            // Imprime a tecla pressionada no LCD
}
}//while(1)
}//main

sexta-feira, 26 de outubro de 2012

Velhos Tempos: limpeza e recondicionamento de um toca discos SONATA de 197e lá vai uns anos...


 Um grande amigo me pediu uma missão árdua. Deixar uma raridade como nova. Trata-se de um toca discos da marca SONATA, modelo SONANTE AM/FM de meados dos anos 70. É um toca discos mono, com radio AM e FM, com saída pra 2 alto falantes de 8 Ohms cada, alimentação direta 110/220V, saída de sinal para gravação e entrada auxiliar e também entrada para antena de 300 Ohms. Ela estava toda suja, desajeitada, o motor estava travado, e a base está toda empenada, sem agulha, ou seja, foi uma missão muito, muito difícil colocá-la pra tocar. O painel todo sujo, e sem som do toca discos. Efetuada a limpeza, ajuste do motor, percebi os fios que vem da agulha soltos e encontrando os pontos de conexão (com grande dificuldade) o sistema elétrico voltou a estar perfeito. Os transistores de potência na saída do amplificador são antigos, e equivalentes aos atuais TIP32. O serviço no prato foi o que deu mais dificuldade, por conta da base estar empenada. Foi necessário gastar um bom tempo ajustando pouco a pouco a posição ideal.
Então foi só colocar pra tocar e o próprio mecanismo foi se acertando aos poucos.
No final o serviço foi satisfatório apesar das variações que o disco ainda tem quando roda (observem no vídeo) e a qualidade de som é muito boa, com ótimos timbres e boa definição das frequências tanto graves quanto agudas.
Agora temos mais 2 belezas dessa pra fazer funcionar.
Vejam as fotos e comentem.
Motor e controle de velocidade do toca discos
Circuito Elétrico do SONATA



Depois de concluir o trabalho


Abraços.
Deus abençoe!
Petri Nogueira

quinta-feira, 25 de outubro de 2012

E começando por coisas simples...



A Eletrônica nos dias de hoje tornou coisa ultrapassada pra se trabalhar... hoje compramos produtos eletrônicos dos mais diversos, pelos preços mais bizarros, com funções quase que ilimitadas, que nos impressionam e encantam. O grande impasse para os admiradores de tecnologia e que se aventuram em "dar manutenção" na maioria dos equipamentos atuais esbarram em uma triste verdade: tudo é descartável.
Não vale mais a pena gastar tempo analisando placas com multímetro e osciloscópio, injetando sinais para análise; basta trocar um CI, trocar a fonte, trocar a placa e pronto, tudo volta a funcionar...
Mas por que tudo chegou a esse ponto? Talvez a explicação mais simples é aquela que diz que no nível que estamos, poucos componentes controlam diversas funções ao mesmo tempo, apenas 1 CI faz o trabalho que um circuito enorme deveria fazer a 30 anos atrás, e muito melhor.
Os exemplos não faltam... Equipamentos de áudio, de vídeo, robôs, controles, computadores (esses devem ser o melhor dos exemplos...).
Compare um circuito para produzir um sinal de áudio nos anos 70 e 80 com o que temos agora. O exemplo da esquerda é de um equipamento de áudio do final dos anos 70, o da direita é uma placa de câmera  CFTV dos tempos atuais, o da esquerda tem no total aprox. 30x20cm somando o tamanho total das placas e o da direita 3x3cm.


 


Não só o tamanho como a qualidade mudou. O grave problema está no tempo que duram... Nossos pais ainda conservam equipamentos eletrônicos de sua juventude, enquanto nós trocamos de celular, de TV, de “radinho MP3” às vezes mais de 2 vezes no ano.
Para os aventureiros com manutenção, o custo de laboratório para acompanhar a evolução é altíssimo, e as técnicas para manusear os componentes atuais são muito complexas. O ideal é estudar, se aprofundar e focar em tecnologias específicas: áudio, vídeo, robótica, segurança ou qualquer outro segmento.
Particularmente, serei sempre adepto do conhecimento de datasheets, de análise de circuitos, das ferramentas e equipamentos indispensáveis em bancada, de ganhar tempo perdendo tempo testando circuitos.
Nos cursos que ministro deixo sempre algumas idéias fundamentais para aqueles que estão nesse segmento:
1.      Atenção e cautela;
2.      Curiosidade;

E duas perguntas fundamentais:
1.      Para que serve?
2.      Como funciona?

O estudo da eletricidade é um mundo recheado de beleza e mistérios, nunca se aprende tudo e nunca
se sabe demais. Na eletrônica, quem são realmente os bons técnicos?
§  Aqueles que consertam muitas coisas em pouco tempo,
§  Ou aqueles capazes de olhar um simples pen-drive, que não vale a pena consertar e dizer: “vou te contar como funciona...”

Seja um ou outro, boa sorte! Somos adeptos de uma arte. E para todos os que trabalham com isso, em mecatrônica, eletromecânica, automação, e tantas outras áreas e segmentos da eletrônica, PARABÉNS! Estamos em contato com o futuro. Busquemos o conhecimento!
Sejam bem vindos e Deus abençoe a todos!
Paz e PENTECOSTES!