sexta-feira, 26 de agosto de 2016

Explicação - Teclados


Sempre que for necessário coletar informações em campo, no chão de fábrica, ou mesmo passar “orientações” a um pequeno robô, podemos utilizar um teclado.  Para enviar informações, ou instruções, utilizamos uma tecla ou um conjunto delas.



Quando temos uma ou poucas teclas a ideia inicial é termos uma I/O para cada tecla. Essa solução esbarra em 2 problemas
  • Hardware: exige muitas I/Os
  • Software: exige um consumo excessivo de software para leitura de teclas. Esse problema pode ser contornado pelo acionamento da leitura das teclas a uma interrupção externa.


   

Teclados matriciais.



Uma forma interessante foi associar as teclas em forma de matriz. 
Essa solução diminui sensivelmente o número de I/Os utilizadas a medida que cresce o número de teclas. As mais populares utilizam grupos de 12 ou 16 teclas:
   
 


No diagrama abaixo temos um exemplo de implementação de um teclado matricial de 12 teclas.

Em termos de hardware temos uma redução de I/Os, sendo maior quanto o número de teclas (matriz maior). Para 12 teclas em forma de matriz temos 7 I/Os, sendo 4 linhas e 3 colunas.
Essa redução provoca um crescimento de software, pois a rotina de leitura.
O acionamento rotina de leitura pode ser associada a interrupção externa que exige uma I/O adicional (interrupção externa).
A rotina de leitura consiste em ativar uma das colunas (1) e deixar as outras desativadas (0). Desta forma inicia-se a varredura das linhas e identificar qual linha está ativada (1), desta maneira, pode-se identificar qual tecla foi pressionada. Na sequência deve-se repetir o processo para cada coluna. Ao final do processo é possível identificar a tecla pressionada.
Essa rotina torna-se extensa, mesmo que o número de teclas seja reduzido e acaba tornando o software extenso. Para o caso de teclas pressionadas simultaneamente a rotina trona-se ainda mais complexa.



   

Conversor A/D

Utilizando um conversor A/D o número de I/Os diminui a uma única entrada analógica, se o periférico existir no microcontrolador.
Um exemplo de solução é apresentada no livro “Micontroladores PIC18 – Aprenda e Programe em Linguagem C” de Alberto Noboru Miyadaira, página 281.



Dessa forma cada tecla pressionada produz uma tensão diferente na saída do circuito. A identificação passa apenas pela identificação da faixa de valores convertidos. Essa faixa deve ser criada pela tolerância dos componentes envolvidos. A escala de valores absolutos pode ser obtida a partir de uma simples simulação do circuito.
A questão de duas ou mais teclas pressionadas simultaneamente produz novos valores de tensão e por consequência novos valores obtidos no A/D, ou seja, basta adicionar novas faixas de pesquisa de acordo com as combinações desejadas.
A questão de isolação da rotina de leitura também é resolvida por uma interrupção externa.




   

quarta-feira, 17 de agosto de 2016

Módulo LCD 16x2

Módulo LCD 16x2


Para ligarmos um display LCD 16×2 ao PIC, precisamos antes de mais nada entender um pouco sobre a forma como esse tipo de display trabalha. Um dos tipos mais comuns de controlador utilizados em displays LCD é o HD44780, que pode ser ligado ao microcontrolador usando-se 4 ou 8 fios, e que vai determinar a velocidade de comunicação entre eles.

Não podemos simplesmente enviar dados à um LCD sem uma sequência lógica. Antes de utilizá-lo, é necessário o envio de comandos que preparam o display para receber caracteres. Vamos tomar como exemplo o display LCD 16×2 com controlador HD44780.
Esse tipo de display tem 16 pinos: 3 pinos de alimentação, 3 de controle, 8 de dados e 2 para acionar o backlight (ou luz de fundo), que você pode ver em detalhes na imagem abaixo:



  • Os pinos de controle do display LCD 16×2 são o RS, o R/W e o E.
  • O pino RS tem a função de mostrar ao display que tipo de dados estamos transmitindo. Em nível baixo (0), os dados são tratados como comandos, e em nível alto (1), os dados são tratados como caracteres. 
  • O pino R/W (Read/Write) é utilizado para determinar se estamos lendo ou transmitindo dados para o display. 

Já o pino ENABLE é utilizado para determinar o início da transferência de dados entre o microcontrolador e o display.
Os pinos de dados D0 a D7 formam o barramento de dados. O mais comum é utilizarmos apenas 4 pinos para comunicação com o microcontrolador, mas nada impede que em aplicações mais elaboradas sejam utilizados todos os 8 pinos. Essa é uma das funções do envio de comandos que preparam o display, pois é nesse momento que determinamos se vamos usar 4 ou 8 pinos para comunicação. Partindo do problema da aula anterior (Display de 7 segmentos – Leitura do nibble presenta na porta B), imagine que se queira ler o byte inteiro presente na porta B e colocar o seu valor escrito em 2 displays de 7 segmentos.

  

Biblioteca do LCD

Existem várias bibliotecas que simplificam a utilização deste periférico. Utilizamos a biblioteca mostrada no livro “Micontroladores PIC18 – Aprenda e Programe em Linguagem C” de Alberto Noboru Miyadaira. Esta biblioteca possui as seguintes funções:
  • lcd_inicia (conf_1, conf_2, conf_3) Inicia o lcd, os parâmetros
    • conf_1:
      • 0x20 – Comunicação em 4 bits, display de 1 linha, matriz 8 x 5
      • 0x24 – Comunicação em 4 bits, display de 1 linha, matriz 10 x 5
      • 0x28 – Comunicação em 4 bits, display de 2 ou mais linhas, matriz 8 x 5
      • 0x2C – Comunicação em 4 bits, display de 2 ou mais linhas, matriz 10 x 5
      • 0x30 – Comunicação em 8 bits, display de 1 linha, matriz 8 x 5
      • 0x34 – Comunicação em 8 bits, display de 1 linha, matriz 10 x 5
      • 0x38 – Comunicação em 8 bits, display de 2 ou mais linhas, matriz 8 x 5
      • 0x3C – Comunicação em 8 bits, display de 2 ou mais linhas, matriz 10 x 5
    • conf_2:
      • 0x3C – Desliga o cursor
      • 0X08 – Desliga o display
      • 0x02 – Desloca o cursor para linha 1 coluna 1
      • 0x14 – Desloca o cursor para direita sem deslocar a mensagem
      • 0x10 – Desloca o cursor para esquerda, sem deslocar a mensagem
      • 0x0F – Liga o cursor com alternância
      • 0x0E – Liga o display e o cursor
      • 0x0D – Liga o display e o cursor piscante
      • 0x01 – Limpa a tela do display e desloca para linha 1, coluna1
    • conf_3:
      • 0x04 – Desloca o cursor para esquerda quando um caractere é inserido, mas não desloca a mensagem
      • 0x06 – Desloca o cursor para direita quando um caractere é inserido mas não desloca a mensagem
      • 0x05 – Desloca o cursor e a mensagem para esquerda quando um caractere é inserido
      • 0x07 – Desloca o cursor e a mensagem para direita quando um caractere é inserido
  • lcd_limpa_tela () Limpa a tela do display LCD
  • lcd_posicao (linha, coluna) Coloca o cursor em uma determinada posição do display LCD
  • imprime_string_lcd (s_caracteres) Envia uma string localizada na memória de programa para o display LCD, onde s_caracteres = ponteiro para a string
  • imprime_buffer_lcd (s_caracteres, tamanho_buffer) Envia uma matriz de dados para o display LCD, onde s_caracteres = ponteiro para o buffer e tamanho_buffer = quantidade de dados que serão enviados
  • lcd_LD_cursor (config) Liga/Desliga o cursor/display
    • 0 – Desliga o cursor
    • 1 – Desliga o display
    • 2 – Liga o cursor com alternância
    • 3 – Liga o display e o cursor
    • 4 – Liga o display e o cursor piscante
  • lcd_cursor_home() Coloca o cursor na linha e coluna 1 do display
  • lcd_desloca_cursor (direita-esquerda) Descola o cursor para a direita  ou esquerda
    • 0 – Direita
    • 1 – Esquerda
  • lcd_desloca_mensagem(direita_esquerda) Desloca a mensagem para direita ou esquerda
    • 0 – Direita
    • 1 – Esquerda
  • lcd_escreve_dado(dado) Escreve um caractere ou símbolo no display
  • lcd_le_dado () Retorna o caractere presente na posição do cursor
  • lcd_status() Retorna o valor do status + contador de endereço

  

Ligação do display LCD no PIC

A biblioteca prevê uma ligação utilizando o a porta D, porém nada impede a edição do arquivo para modificação dos pinos ou mesmo da porta.
Utilizando uma comunicação de 4 bits temos o uso de 7 pinos:
        PIC              LCD
        RD0 (19)     RS (04)
         RD1 (20)     RW (05)
         RD7 (30)     E (6)
         RD6 (29)     D4 (11)
         RD5 (28)     D5 (12)
         RD4 (27)     D6 (13)
         RD2 (21)     D7 (14)


  

Programa de exemplo uso do LCD



/*
 * File:   IS2_LCD_0_Exemplo.c
 * Author: Pilger-Win7
 *
 * Created on 15 de Março de 2018, 10:36
 *
 * LCD 2 x 16
 * 0 - Exemplo
 * 
 * Objeto: Mostrar o LCD em funcionamento
 *
 */

#define _XTAL_FREQ 48000000

#include <xc.h>
#include "c:\h\Config_PIC18F4550.h"
#include "c:\h\biblioteca_lcd_2x162_48M_XC.h"

void delay_ms(int i) {
    for (int x = 0; x < i; x++) {
        __delay_ms(1);
    }
}

void delay_1s(unsigned char tempo) {
    for (int i = 0; i < tempo; i++) { // Gera um delay de múltiplos de 1s
        delay_ms(1000); // Gera um delay de 1s
    }
}

void main(void) {
    ADCON1 = 0x0F; // configura os pinos dos ports A a E como IO
    TRISD = 0x00; // define o port D como saída
    LATD = 0; // "zera" a porta D
    lcd_inicia(0x28, 0x0f, 0x06); // Inicializa o LCD
    lcd_posicao(1, 5); // coloca o cursor na linha 1, coluna 5
    imprime_string_lcd(" PIC18F4550 "); // escreve texto no LCD
    delay_1s(4); // conta 4s
    while (1) {
        lcd_posicao(2, 1); // coloca o cursor na linha 2, coluna 1
        imprime_string_lcd(" Teste do LCD "); // escreve texto no LCD
        delay_1s(4); // conta 4s
        lcd_posicao(2, 1); // coloca o cursor na linha 2, coluna 1
        imprime_string_lcd(" LCD escrito  "); // escreve texto no LCD
        delay_1s(4); // conta 4s
    }
}



  

Atividades

Atividade 1:

Escrever um programa em Linguagem C para o PIC18F4550, para controlar um LED por um botão e mostrar no display o status do hardware botão solto ou pressionado, e LED ligado ou desligado.

Atividade 2:

Utilizando o programa do semáforo “cruzamento” (aula 4) pede-se construir/modificar o programa para informar no módulo LCD 2 x 16 o estado de cada semáforo.


  

Montagem da placa


Este post é uma sugestão para facilitar a montagem da placa, para usuários que não familiaridade com componentes ou montagem.



Máscara de componentes da placa


Coloque os componentes no lado onde aparece a máscara de componentes.




  

Componentes para montagem da placa



  

Componentes baixos

Comece pelos componentes mais baixos (com menos altura) para facilitar a soldagem.




  • U1 - Soquete de 40 pinos - Verifique a posição (ranhura para esquerda, ver na figura acima). Solde os pinos 1, 20, 21 e 40 (4 cantos). Após solde alternadamente um de cada lado do soquete para distribuir o calor e evitar danos ao componente.


  • X1 - cristal de 20MHz - não tem polaridade ou sentido.

  • R1 e R2 - resistores de 10KΩ (11KΩ). Cuidado para não confundir R2, pois está ao lado dos resistores R3 e R4 que tem outro valor.

  • R3, R4 e R5 - resistores de 300Ω (270Ω a 330Ω).

  • D1 - Diodo 1N4007. Atente para o posicionamento dos terminais Anodo e Katodo, veja que na máscara de componetes o lado do katodo é indicado.

  • S1 e S2 - (Reset e Bootloader) Chaves tactil de 4 terminais, ela só entra em um sentido.

  • RV1 - Potenciômetro, ele só entra em uma posição.

  • LD1 e LD2 - Leds, o catodo (terminal K "-", lado do "chanfro") é posicionado a esquerda na figura da máscara.
  •  LD3 - Led, o catodo (terminal K "-", lado do "chanfro") é posicionado para borda da placa.

  • C3 e C4 - Capacitores de 15pF, são os menores, não tem polaridade. O modelo mais comum é o de cerâmica, e neste valor o seu tamanho é bastante reduzido.


  • C6 e C7 - Capacitores de 100nF, não tem polaridade. Existem várias construções (cerâmica ou poliester) e em cada uma delas apresentadas em diversos formatos ou cores.
 
     

   


  • Modelo provável de capacitor de 100nF:


  

Componentes altos


Conector USB

  • CN1 - Conector  USB fêmea tipo B. Possui 4 pontos de conexão em que deve-se ter cuidado na solda devido a sua proximidade. Possui também, 2 pontos de sustentação, os quais devem ser bem soldados para garantir a sustentação mecânica.
 

Conectores para acesso aos pinos


  • Conectores dos PORTs e alimentação para protoboard:
    • CN4 - (PORT C) - 7 pinos
    • CN6 - (PORT E) - 4 pinos
    • CN7 - (PORT A) - 7 pinos
    • CN8 - (PORT B) - 8 pinos
    • CN10 - (PORT D) - 9 pinos
    • PROTO - Alimentação da protoboard - 2 pinos
Para esses conectores temos barras de 40 pinos, elas devem der "cortadas" usando um alicate de corte em cima do pino subsequente, ou seja, se quisermos um conector de 7 pinos, devemos cortar sob o 8º pino. O pino sob o qual houve o corte será perdido. Não se preocupe, pois ao final vai sobrar material. Você pode melhorar o acabamento do ponto d corte com uma lima, lixa ou estilete.


Conector para o módulo LCD


  • LCD - Tudo depende do módulo LCD que você vai utilizar, normalmente nos módulos de LCD temos a pinagem de 1..a..16 como mostrado na imagem abaixo:

Neste caso solde um conector com apenas 14 pinos (utilize a barra de 40 pinos citada anteriormente), deixando 2 ilhas ao lado do conector CN1 (USB)  na maneira mostrada na imagem abaixo:





Se seu módulo de LCD tiver outra pinagem estude a conexão de acordo com o seu módulo.


Outros componentes altos


  • C1 - Capacitor eletrolítico 10µF. Este capacitor tem a função de filtro para o regulador, então seu valor pode ser maior que 10µF. A tensão de trabalho deve ser no mínimo de 5V, podendo ser maior. Atente para a polaridade do capacitor. No componente é marcado o terminal menos (-) e na placa o terminal mais (+).


  • CN9 - Conector modelo P4 fêmea para entrada de energia externa maior que 8V DC. Solde os terminais com boa carga de solda para fixação mecânica.





  • Jumper J6 - Escolha da alimentação Externa (1-2) ou via USB (2-3). É utilizado uma barra de pinos baixa de 3 pinos em barra com um mini jumper para troca de estado.


 



  • Jumper J1, J2, J3, J4 e J5. Pode-se usar uma chave H-H mostrada abaixo ou o conjunto de 3 pinos em barra com um mini jumper usado em J6. Funcionamento dos jumpers J1 a J5:
    • Posição 1-2: Bootloader - Comunicação para envio do programa HEX para o microcontrolador.
    • Posição 2-3: Execução - Programa HEX carregado em execução.



  • U2 - Regulador de tensão 7805, siga o layout da mascara para posicionamento do componente


 

  • C5 - Capacitor 470nF. Não tem polaridade, existem vários modelos, os modelos mais prováveis aparecem abaixo:


 



   

Montagem do módulo LCD

Tudo depende do módulo LCD que você vai utilizar. Vamos mostrar para os módulos de LCD com pinagem de 1 a  16. Se o seu módulo tiver outra sequencia, verifique a pinagem e o que cada pino significa antes de realizar a soldagem.

Módulo LCD 2 x 16 com pinagem de 1 a 16







Utilize uma barra de pinos longa com pinos de 20mm, isso afasta o risco de contato elétrico do módulo LCD com componentes da placa.




  • Solde 14 pinos dos pinos de 1 a 14 do módulo de LCD
  • Ligação do backlight (luz de fundo)
    • Faça uma ligação com fio entre os pinos 1 e 16 (GND)
    • Faca uma ligação com fio entre os pinos 2 e 15 (VCC)


Montagem dos pinos soldados ao módulo e ligação do backlight com fios:

 




Módulo conectado a placa






   


Placa montada em funcionamento como módulo de LCD