segunda-feira, 17 de setembro de 2018

Trabalho extra I


Atividade 1


Implementar um sketch com:

  • 2 Leds
  • 2 Botões


Funcionamento:

  • Botão-1 pressionado Led-1 Ligado
  • Botão-1 solto Led-1 Desligado
  • Botão-2 pressionado Led-2 Ligado
  • Botão-2 solto Led-2 Desligado


  


  

Atividade 2


Implementar um sketch com:

  • 3 Leds
  • 3 Botões


Funcionamento:

  • Botão-1 pressionado Led-1 Ligado
  • Botão-1 solto Led-1 Desligado
  • Botão-2 pressionado Led-2 Ligado
  • Botão-2 solto Led-2 Desligado
  • Botão-3 pressionado Led-3 Ligado
  • Botão-3 solto Led-3 Desligado


  


  

Atividade 3


Implementar um sketch com:

  • 1 Led
  • 2 Botões


Funcionamento:

  • Botão-1 pressionado Led Ligado
  • Botão-2 pressionado Led Desligado


  


  

Atividade 4


Implementar um sketch com:

  • 1 Led
  • 1 Botão


Funcionamento:

  • Botão-1 pressionado Led troca de estado
    • 0 -> 1
    • 1 -> 0


  


  

Atividade 5

Implementar um sketch com:

  • 1 Led
  • 1 Botão


Funcionamento

  • Botão-1 ao ser pressionado o Led pisca 10 vezes


  


  

Biblioteca LiquidCrystal - Práticas


A função LiquidCrystal inicializa o modo de comunicação com o módulo de LCD

A sua sintaxe prevê a utilização ou não do pino R/W e a comunicação em 4 ou 8 bits.
Isso é definido no memento de sua chamada dependo do número de parâmetros, pela sua sintaxe


LiquidCrystal(rs, enable, d4, d5, d6, d7) 
LiquidCrystal(rs, rw, enable, d4, d5, d6, d7) 
LiquidCrystal(rs, enable, d0, d1, d2, d3, d4, d5, d6, d7) 
LiquidCrystal(rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7)


  
  



Atividade 1 - Modificando I/Os LCD

Utilizando o exemplo "HelloWorld" refaça a ligação para utilizar o pino R/W e a comunicação em 4 bits utilizando a ligação entre o módulo LCD e o Arduino de acordo com a tabela abaixo



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

  
  



Atividade 2 - Status do botão e led no LCD

Usando a mesma ligação entre o LCD e o Arduino desenvolvida na atividade 1, implemente um sketch que contenha

  • 1 botão
  • 1 led
  • Módulo de LCD


O seu funcionamento deverá obedecer a seguinte lógica

  • Botão Solto
    • Led desligado
    • Indicação na primeira linha do LCD o estado do botão - SOLTO
    • Indicação na segunda linha do LCD o estado do led - DESLIGADO
  • Botão pressionado
    • Led ligado
    • Indicação na primeira linha do LCD o estado do botão - PRESSIONADO
    • Indicação na segunda linha do LCD o estado do led - LIGADO


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

  
  



Atividade 3 - Semáforo de cruzamento com  status LCD


  • Usando a mesma ligação entre o LCD e o Arduino desenvolvida na atividade 1, e utilizando como base o sketch do semáforo de cruzamento de duas vias (Semáforo - Atividade 2), adicione o módulo de LCD para indicar o estado de cada semáforo.
  • Utilize a criatividade para indicar no LCD o estado dos dois semáforos.


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

  • Desafio extra: Monte para mostrar o cruzamento de 3 tempos

  
  



Atividade 4 - Contador binário no LCD


  • Usando a mesma ligação entre o LCD e o Arduino desenvolvida na atividade 1 e utilizando como base o sketch do contador binário com 4 botões:
    • Reset
    • Incrementa
    • Decrementa
    • Set
  • Utilize o módulo de LCD ao invés dos 8 leds para indicar o valor do contador.
  • Mostrar no LCD o valor do contador nos formatos:
    • Decimal
    • Binário
    • Hexadecimal


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

  
  


Atividade 5 - 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: LCD_pr_Atv05_exemplo
  Menu de controle
  Biblioteca: LiquidCrystal

  Componentes:
  Módulo de LCD (Ver ligação abaixo)

  Usando a mesma ligação entre o LCD e o Arduino desenvolvida na atividade 1 e utilizando
  como base o sketch do contador binário com 4 botões(teste de botões)
    Menu/OK
    LED - para indicar uma atividade no loop principal
          Led piscante de acordo com um tempo
  Criar uma estrutura que permita entrar em um menu e sair dele
  Interface de saída - Módulo de LCD indicar o led em estado piscante ou as opções de Menu (troca
  de tempo.


  O circuito:
      Display LCD    -> Arduino

   Pino 1 - VSS     -> Pino GND
   Pino 2 - VDD     -> Pino +5V
   Pino 3 - VO      -> Central do Potenciômetro
   Pino 4 - RS      -> Pino digital 1
   Pino 5 - R/W     -> Pino digital 2
   Pino 6 - Enable  -> Pino digital 3
   Pino 7,8,9,10    -> Não conectado
   Pino 11 dados D4 -> Pino digital 4
   Pino 12 dados D5 -> Pino digital 5
   Pino 13 dados D6 -> Pino digital 6
   Pino 14 dados D7 -> Pino digital 7
   Pino 15 - Anodo  -> Pino +5V
   Pino 16 - Katodo -> Pino GND

   Potenciômetro
   Extremidade 1 -> Pino +5V
   Central       -> Pino 3 - VO do LCD
   Extremidade 2 -> Pino GND

   Led       Pino 11
   Botão ok  pino 8

  Baseado no exemplos button HelloWorld
  Baseado no sketch Contador Binário 5
  This example code is in the public domain.

  17/09/2018 - Tradução do cabeçalho e reordenamento das ligações do LCD e Arduino UNO
  por Luiz Oscar Pilger
  17/09/2018 - Modificação da pinagem Arduino (1 a 7) das ligações do LCD e Arduino UNO
  por Luiz Oscar Pilger
  17/09/2018 - Adição do controle do botão OK entrar e sair do menu e o lED
*/

// Inclui o código da biblioteca:
#include <LiquidCrystal.h>

// Associação entre os pinos do LCD e do Arduino
#define rs 1
#define rw 2
#define en 3
#define d4 4
#define d5 5
#define d6 6
#define d7 7
#define bt_ok 8
#define led 11
// Iniciliza a biblioteca com a associação para a interface LCD
LiquidCrystal lcd(rs, rw, en, d4, d5, d6, d7);
// variáveis de controle
byte tempo = 1; // varivale para indicar o tempo em s
bool menu = 0;

void delay_s (int segundos) {
  for (int i = 0; i < 100 * segundos; i++) {
    if (digitalRead(bt_ok) == 0) {   // testa o botão ok
      while (digitalRead(bt_ok) == 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() {
  // inicializa os pinos digital OK INC DEC E LED
  pinMode(bt_ok, 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.begin(16, 2);           // Incializa o LCD com o número de Colunas(16) e Linhas(2):
}

void loop() {
  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
  // pisca o led com o tempo especificado
  digitalWrite(led, HIGH);
  delay_s(tempo);
  digitalWrite(led, LOW);
  delay_s(tempo);
  // abre o menu
  while (menu == 1) {
    lcd.setCursor(0, 0);    // posiciona na primeira coluna (0) e primeira linha (0)
    lcd.print("Dentro Menu    ");           // imprime texto
    if (digitalRead(bt_ok) == 0) {   // testa o botão ok
      while (digitalRead(bt_ok) == 0); // espera soltar o botão ok
      menu = 0;                      // seta a variável menu para 0 para sair do menu
    }
  }
}


  



Biblioteca LiquidCrystal - Exemplos

A IDE do Arduino possui a biblioteca LiquidCrystal


A biblioteca LiquidCrystal permite uma grande quantidades de módulos diferentes em termos de números de linhas x caracteres. Ela possui diversas funções que podem ser exploradas uma a uma



Abra a IDE do Arduino e carregue o exemplo "HelloWorld"


Compile e faça a ligação com o módulo LCD16x2.
Neste exemplo aprendemos:
  • Ligar o LCD e inicializar o lcd
  • Aprendemos a escrever um texto
  • Aprendemos a escrever um valor numérico no módulo.




  


Atividade 1


  • Construa um novo Sketch baseado no exemplo "HelooWorld".
    • Arquivo\Exemplos\LiquidCrystal\HelloWorld
  • Salve o sketch com um nome de sua escolha
  • Modifique o cabeçalho e comentários para português de acordo com o seu entendimento
  • Monte no simulador e verifique o funcionamento
  • Monte no hardware e apresente o funcionamento
  • Explique o funcionamento das funções:
    • lcd.begin(cols, rows)
    • lcd.print(data) - lcd.print(data, BASE)
    • lcd.setCursor(col, row)



    Esquema de ligação entre o Arduino e o módulo LCD 


    Esquema de ligação do simulador



    Sugestão de montagem para ligação do Arduino e o módulo de LCD



    Resultado do skecth "Hello World" no módulo LCD



  



Atividade 2


Construa um novo Sketch baseado na atividade 1 (exemplo "HelooWorld")
  • O esquema de ligação entre o LCD e o Arduino é o mesmo utilizado na Atividade 1
  • modifique de forma que seja apresentado no LCD:
    • Na 1ª linha com o seu nome.
    • Na 2ª linha posicione o número para que seja mostrado a partir da coluna 9.
  • Monte no simulador e verifique o funcionamento
  • Monte no hardware e apresente o funcionamento




  



Atividade 3

  • O esquema de ligação entre o LCD e o Arduino é o mesmo utilizado na Atividade 1
  • Construa um novo Sketch baseado no exemplo "Autoscroll":
    • Arquivo\Exemplos\LiquidCrystal\Autoscroll
  • Modifique o cabeçalho e comentários para português segundo seu entendimento.
  • Monte no simulador e verifique o funcionamento
  • Monte no hardware e apresente o funcionamento
  • Explique o funcionamento das funções:
    • lcd.autoscroll()
    • lcd.noAutoscroll()
    • lcd.clear()


  

Atividade 4

  • O esquema de ligação entre o LCD e o Arduino é o mesmo utilizado na Atividade 1
  • Construa um novo Sketch baseado no exemplo "Scroll":
    • Arquivo\Exemplos\LiquidCrystal\Scroll
  • Modifique o cabeçalho e comentários para português segundo seu entendimento.
  • Monte no simulador e verifique o funcionamento
  • Monte no hardware e apresente o funcionamento
  • Explique o funcionamento das funções:
    • lcd.scrollDisplayLeft()
    • lcd.scrollDisplayRight()
  

Atividade 5

  • O esquema de ligação entre o LCD e o Arduino é o mesmo utilizado na Atividade 1
  • Construa um novo Sketch baseado no exemplo "TextDirection":
    • Arquivo\Exemplos\LiquidCrystal\TextDirection
  • Modifique o cabeçalho e comentários para português segundo seu entendimento.
  • Monte no simulador e verifique o funcionamento
  • Monte no hardware e apresente o funcionamento
  • Explique o funcionamento das funções:
    • lcd.rightToLeft()
    • lcd.leftToRight()

  

Atividade complementar (opcional)

  • Construa um novo Sketch baseado no exemplos :
    • Blink - Arquivo\Exemplos\LiquidCrystal\Blink
  • Display - Arquivo\Exemplos\LiquidCrystal\Display
  • Modifique o cabeçalho e comentários para português segundo seu entendimento.
  • Monte no simulador e verifique o funcionamento
  • Monte no hardware e apresente o funcionamento
  • Explique o funcionamento das funções:
    • lcd.Blink()
    • lcd.noBlink()
    • lcd.Display()
    • lcd.noDisplay()

  

Módulo LCD 16x2

Para ligarmos um display LCD 16×2 a um Arduino, 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 im//agem 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. 
  • O pino E - 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. 

sábado, 25 de agosto de 2018

Conversor A/D - Explicação e exemplo


Material de referência sobre conversão A/D e o Arduino UNO



Como Conversores Analógico_Digital Funcionam - Clube do Hardware



Arduino.cc - Tutoriais - Analog Read Serial

Arduino UNO - Sensor de temperatura interno
  

Exemplo de leitura analógica





/* 
 * convAd_1_0_0.ino
 *  
 * Conversor A/D - Exemplo
 * Leitura de Pino de entrada analógica (A0) e apresentação no LCD
 *  
 * Conexões com o Arduino UNO
 * LCD I2C – SDA/A4 SCL/A5
 * Potenciômetro - Extremos Vcc e GND - Central/variável A0
 *  
 * Versão: 
 * 0.0.0 -> Uso do exemplo de ligação do LCD por I2C 
 *          https://pilger-arduino.blogspot.com/2018/11/blog-post_80.html
 *          https://www.robocore.net/tutoriais/primeiros-passos-com-modulo-i2c.html
 * 1.0.0 -> Inclusão Pino A0
 *          Exemplo/01.Basics/AnalogReadSerial
 *          https://www.arduino.cc/en/Tutorial/BuiltInExamples/AnalogReadSerial
 * 
 * Data: 20/04/2021
 * Autor: Luiz Oscar Ruschel Pilger
 */

// inclusão de bibliotecas
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

// apelidos
#define pinoAnalogico A0

// variáveis globais
int valorAnalogico;

LiquidCrystal_I2C lcd(0x27,16,2);  // Criando um LCD de 16x2 no endereço I2C 0x27 PCF8574T
//LiquidCrystal_I2C lcd(0x3F,16,2);  // Criando um LCD de 16x2 no endereço I2C 0x3F PCF8574AT

//função setup executa 1 vez no início
void setup(){
  lcd.init(); // Inicializando o LCD
  lcd.backlight(); // Ligando o BackLight do LCD
  lcd.print("Coversor A/D"); // Exibindo no LCD texto
  lcd.setCursor(0,1); // posiciona o cluros no início da 2ª linha
  lcd.print("Valor = "); // imprime o texto
}

// função loop com código principal
void loop(){
  leituraAnalogica();
  atualizaLcd();
}

void leituraAnalogica (void){
  valorAnalogico=analogRead(pinoAnalogico); // Lê o conversor A/D
  delay(1); // atraso para estabilizar o conversor
}

void atualizaLcd (void){
  lcd.setCursor(9,1); // posiciona o cursor
  lcd.print(valorAnalogico); // imprime o valor analógico
  lcd.print("   "); // imprime 3 espaços para "apagar" numeros de 4 dígitos
}




Instabilidade do Conversor A/D


Em um sketch no simulador o código acima é "estável" (as leituras não variam)
Na prática é possível observar que os valores lidos (valor_convertido) variam bastante.

Como solução temos 2 sugestões que ajudam a "diminuir" essa instabilidade.

1) Colocar um capacitor em paralelo a entrada do conversor A/D.

Dentro do conversor A/D existe um capacitor que armazena uma tensão para ser convertida.
Um capacitor na entrada, acaba ficando "em paralelo" com este capacitor interno, e como capacitâncias em paralelo são somadas, isso faz com que o capacitor que forneça o valor a ser convertido tenha maior carga acumulada.






2) Fazer várias leituras (10 por exemplo) e tirar uma média dos valores

Com isso o código de leitura do conversor:

  valorAnalogico=analogRead(pinoAnalogico); // Lê o conversor A/D
  delay(1); // atraso para estabilizar o conversor


 Pode ser substituído por:

  valorAnalogico=0; // zera a variável
  for(int i=0; i<leituras; i++){ // laço com repetição de "leituras"
    valorAnalogico = valorAnalogico + analogRead(pinoAnalogico); // Acumula a nova leitura do Conv.A/D
    delay(1); // atraso para estabilizar o conversor
  }
  valorAnalogico = valorAnalogico/leituras; // faz a média de leituras



Lembrando que nesse código é usado um apelido "leituras" que deve ser criado

#define leituras 10