quinta-feira, 14 de março de 2019

Módulo Ethernet

   


Tutoriais:


Arduino CC - Ethernet library
Arduino BR - Colocando o Arduino na rede com o ENC28J60 Ethernet Shield

FilipeFlop - Comunicação pela rede com o Módulo Ethernet ENC28J60


YouTube




Montagem de um dos Tutoriais


Resultado do navegador



   


Teclados A/D

Introdução


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.




   

Atividade 1

Identificando valores de conversão para cada tecla (divisor de tensão)


               Implemente um sketch para ler a entrada analógica e apresentar o valor no LCD (ou monitor serial).

 

1. Elabore o hardware no simulador.

2. Preencha a tabela abaixo baseado nos dados obtidos do simulador.


3. Elabore o hardware físico.


4. Preencha a tabela abaixo baseado nos dados do obtidos no hardware físico.


5. Compare os valores obtidos no simulador e no hardware físico e explique por que as diferenças.




   

Atividade 2

Inserção de tensões de referências no conversor A/D


Utilizando o maior valor de tensão obtido em “Teclados - Atividade 1” calibre uma tensão referência positiva (Aref) “um pouco acima” do maior valor de tensão obtido.




Dicas de implementação

1. Utilize o sketch da Atividade 1 como base 
2. Inclua o tensão de referencia externa do conversor A/D (SETUP)


Preencha a tabela abaixo baseado nos dados do obtidos no hardware físico.



Descreva o que aconteceu mudou em relação a atividade anterior (Teclados - Atividade 1)



   

Atividade 3


Identificando teclas por faixa de valores do A/D



Com base no programa desenvolvido em “Teclados – Atividade 2” (Inserção de tensões de referências no conversor A/D), implemente o software para identificar as teclas e mostrar no LCD.


Dicas de implementação


I - Dividindo a faixa de valores do conversor

1. Supondo que foi obtido os valores mínimos e máximos (exemplo hipotético) para cada tecla na Atividade 2:

  • Tecla 1: 800 - 850
  • Tecla 2: 400 - 430
  • Tecla 3: 230 - 270
  • Tecla 4: 50 - 58

2. Posicione os valores em uma reta considerando o menor e maior valores possíveis do conversor A/D (0 e 1023)


3. Calcule a distância entre o menor valor da Tecla 3 (230) e o maior valor da Tecla 4 (58)


4. Divida o espaço encontrado (172) em 2 partes iguais (86)

 5. Encontre o ponto médio entre a Tecla 4 e a Tecla 3 (144)


 6. Repita o processo para encontrar os pontos médios entre a Tecla 3 e Tecla 2, e o ponto médio entre a Tecla 2 e a Tecla 1


7. Arbitre valores entre 0 e o menor valor a Tecla 4 (15), e entre o maior valor da Tecla 1 e 1023 (1000), de forma que esses valores não atinjam o mínimo (0) e o máximo (1023)



II - Identificando as teclas

Com base nos valores inicias e finais de cada faixa, implemente testes (if) que testem se o valor está dentro de cada faixa e indique no LCD qual foi a tecla pressionada.
  • if (valor_convertido > 15 && valor_convertido<144) “imprime_no_lcd (“Tecla 4”);
  • if (valor_convertido > 144 && valor_convertido<335) “imprime_no_lcd(“Tecla 3”);
  • if (valor_convertido > 335 && valor_convertido<615) “imprime_no_lcd(“Tecla 2”);
  • if (valor_convertido > 615 && valor_convertido<1000) “imprime_no_lcd(“Tecla 1”);



   

Atividade 4

Identificando teclas por ranges com o teclado por A/D com interrupção.





1. Carregue o programa da Atividade 2 do teclado.

2. Monte o hardware acima

3. Ajuste  Aref um pouco acima da maior tecla.

4. Pressione cada tecla e anote os valores convertidos mínimo e máximo.

5. Criar a nova tabela de ranges (explicado na Atividade 3).

5. Utilize o programa da Atividade 03 como base para criar a Atividade 4:

  • Introduza uma função de interrupção que ao ser acionada selecione uma variável como verdadeira (state = TRUE;).
  • Coloque  ação do loop (leitura do conversor A/D e identificação de tecla dentro de uma condição if
    • if (state == TRUE) {
      • delay (100);
      • leitura A/D
      • Identificação de tecla
      • state = LOW;
    • }
6. Teste o programa no simulador. Lembre que os valores de hardware são diferentes de simulação, onde os componentes possuem características ideias. 

7. Apresente o programa com o hardware.


   

Atividade 5

Teclado matricial com 16 teclas por conversor A/D e interrupção


Abaixo o hardware para a montagem do teclado com 16 teclas.



1. Carregue o programa da Atividade 2 do teclado.

2. Monte o hardware acima

3. Ajuste  Aref um pouco acima da maior tecla.

4. Pressione cada tecla e anote os valores convertidos mínimo e máximo.

5. Criar a nova tabela de ranges (explicado na Atividade 3). 

6. Utilize como base o programa da atividade 04 e faça a identificação de cada tecla por interrupção.


   
Descrição da pinagem do teclado de membrana








   





   



Interrupção - Millis - Timer





Interrupções externas

Atividades:


1) Semáforo com tempo pedestre
  Cruzamento com 2 tempos (2 sentidos) com 3 estados (Verde/Amarelo/Vermelho)
  Identificação de pedestre com 2 estados (Verde/Vermelho)
  Botão de pedestre para solicitar a execução do ciclo pedestre
Dica: Use uma variável como flag (0/1) para controlar a execução co clico pedestre. Sete a variável dentro da função de interrupção

2) Contador binário
Use 2 interrupções externas para as seguintes ações:
  Incrementar
  Decrementar

3) Contador binário com 3 botões
Use uma única interrupção para ler 3 botões digitais.
A interligação é realizada com 3 diodos gerando uma porta NOR nas 3 entradas digitais
Funções sugeridas
  Zerar
  Incrementar
  Decrementar




Millis
















Timer








YouTube













Atividade millis e Timer

Monitoramento de velocidade de um motor DC


O projeto deve conter:

   -  Arduino UNO ou superior

   -  Modulo LCD16 x 2

   -  Motor DC

   -  Saída PWM para controle da velocidade do motor

   -  Potenciômetro para controle do nível de PWM

   -  Sensor de infravermelho (conjunto emissor receptor) para identificação de "voltas"

   -  Entrada de Interrupção externa para contagem de "voltas"

   -  Controle de tempo automático (milles ou Timer) para verificação de velocidade e autalização do LCD


Tempo de execução: 2 aulas

Apresentação: Montagem em hardware com os itens descritos no projeto


terça-feira, 6 de novembro de 2018

Menu para controle de tempo



Construir um sketch para piscar um led com um tempo determinado
O sketch deve conter 3 botões que permitam:

  • OK - entrar e sair do menu
  • INC - Aumenta o tempo de on/off da rotina para piscar o led
  • DEC - Diminui o  tempo de on/off da rotina para piscar o led

Funcionamento do sketch:

  • Ao iniciar o programa pisca o led
  • Se o botão OK for pressionado o programa para de piscar o led e entra em um menu para aumentar ou diminuir o tempo de on/off da rotina para piscar o led




  • Montar a simulação
  • Montar o hardware para apresentação da atividade



  


Exemplo - Menu

O exemplo mostrado no sketch abaixo pisca um led. 
Ao pressionar o botão OK o programa para de piscar o led e entra no menu
Dentro do menu ao pressionar o botão OK o programa sai do menu volta piscar o led


Fluxograma de funcionamento do skecth




Diagrama de ligação do exemplo



Código do sketch de exemplo do menu
  



/*
 *   Nome: menuTempo_0_0_0.ino
 *
 *  Menu de controle do tempo de piscar o led
 *
 *
 * Mostra no LCD o controle de tempo de piscar um LED
 *
 * O circuito:
 *  botão de pressão OK conectado ao pino 8 de GND
 *  Led indicativo conectado ao pino 11
 *  LCD 16 x 2 I2C – SDA/A4 SCL/A5
 *
 * Versão:
 * 0.0.0 -> Lê as entradas digitais A e B imprime o valor no LCD
 *          Botão - IDE ARDUINO - Exemplos\02.Digital\Button
 *          Criado em 2005 by DojoDave <http://www.0j0.org>
 *          Modificado em 30/08/2011 por Tom Igoe
 *          This example code is in the public domain.
 *          https://www.arduino.cc/en/Tutorial/BuiltInExamples/Button
 *          Arduino Pilger - LCD I2C https://pilger-arduino.blogspot.com/2018/11/blog-post_80.html
 *
 * Data: 19/10/2021
 * Luiz Oscar Ruschel Pilger
 */


// Inclui o código de biblioteca:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

// apelidos
#define endereco 0x27 // endereços mais comum 0x27 para o CI Philips PCF8574T
//#define endereco 0x3F // endereços mais comum 0x3F para o CI Philips PCF8574AT
#define colunas 16
#define linhas 2
// entradas
#define btOk 8
// saidas
#define led 11

// criar a intância lcd
LiquidCrystal_I2C lcd(endereco, colunas, linhas); // Criando uma estrutura com o nome "lcd" nos parâmetros indicados

// variáveis globais
byte tempo = 1; // varivale para indicar o tempo em s
bool menu = 0;  // variável para indicar dentro (1) ou fora do menu (0)

void delayS (int segundos) {
  for (int i = 0; i < 100 * segundos; i++) {
    if (digitalRead(btOk) == 0) {   // testa o botão ok
      while (digitalRead(btOk) == 0); // espera soltar o botão ok
      menu = 1;                      // seta a variável menu para 1 para ter acesso ao menu
    }
    delay (10);
  }
}

void setup() {
  // GPIOs - inicializa os pinos digital OK E LED
  pinMode(btOk, INPUT_PULLUP);  // iniciliaza o pino 8 como entrada com resistor de pull up ativado
  pinMode(led, OUTPUT);  // iniciliaza o pino 11 como saída
  // LCD
  lcd.init();                 // Inicializando o LCD
  lcd.backlight();            // Ligando o BackLight do LCD
}

void loop() {
  atualizaLcd();
  piscaLed();
  // abre o menu
  while (menu == 1) {
    controleMenu();
  }
}

void atualizaLcd(void){
  lcd.setCursor(0, 0);    // posiciona na primeira coluna (0) e primeira linha (0)
  lcd.print("Led Pisca T=");           // imprime texto
  lcd.print(tempo, DEC);         // imprime a variável x no formato decimal
  lcd.print("s  ");                  // imprime texto
}

void piscaLed(void) {
  // pisca o led com o tempo especificado
  digitalWrite(led, HIGH);
  delayS(tempo);
  digitalWrite(led, LOW);
  delayS(tempo);
}

void controleMenu (void) {
  lcd.setCursor(0, 0);    // posiciona na primeira coluna (0) e primeira linha (0)
  lcd.print("Dentro Menu    ");           // imprime texto
  if (digitalRead(btOk) == 0) {   // testa o botão ok
    while (digitalRead(btOk) == 0); // espera soltar o botão ok
    menu = 0;                      // seta a variável menu para 0 para sair do menu
  }
}