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







Conhecimentos de informática


  

Gerenciamento de arquivos e pastas

IFRN - Informática Básica - Manipulação de Arquivos e Pastas no Windows 7

TRELLO - Desktop Zero: como organizar arquivos e pastas

Júlio Batistti Livros e Concursos - Organização de Dados


segunda-feira, 13 de agosto de 2018

Leitura de um número por entrada digital


Quando lemos entradas digitais lemos apenas bits. 
Para lermos números é necessário combinar os bits lidos de forma compor um número.

Lembrando a composição de um número binário



Abaixo uma função que faz a leitura de 4 bits 

  

#define bt_in0 8
#define bt_in1 9
#define bt_in2 10
#define bt_in3 11



byte le_byte (void){
  byte b0, b1, b2, b3;
  byte numero;
  b0 = digitalRead (bt_in0);
  b1 = digitalRead (bt_in1);
  b2 = digitalRead (bt_in2);
  b3 = digitalRead (bt_in3);
  numero = b3*8 + b2*4 + b1*2 + b0;
  return numero;
}
    
  

Entendendo a função

byte le_byte (void)


  • byte -  no início da declaração da função prevê que ao final da função ela retornará um valor do tipo byte
  • le_byte - nome escolhido para a função
  • void - prevê a que a função não recebe nenhum parâmetro

===============================

byte b0, b1, b2, b3;

byte numero;


  • Declara variáveis do tipo byte

===============================

  b0 = digitalRead (bt_in0);
  b1 = digitalRead (bt_in1);
  b2 = digitalRead (bt_in2);

  b3 = digitalRead (bt_in3);


  • Lê o valor digital em cada pino e armazena em uma variável

===============================

numero = b3*8 + b2*4 + b1*2 + b0;


  • Calula o número compondo o valor binário

===============================

return numero;


  • Devolve o numero lido lido nos pinos digitais
  

Usando a função

byte contador=0;              // cria uma variável do tipo byte (0 a 255) e inicilaiza com valor 0

contador = le_byte();
  
  

Atividades

1 - Crie um skecth para ler 4 bits e mostrar o numero lido em 4 leds. 


Dica: Para mostrar o número lido utilze a função "escreve_byte" utilizada na atividade contador binário

2 - Crie um novo skecth utilizando o anterior para:
ler um número com 6 bits
mostrar os 6 bits lidos em leds

3 - Crie um novo skecth para:
  • Ler um numero de 8 bits
  • Possuir 4 leds para indicar que
    • O número é igual a 100
    • O número é menor que 50
    • O número está entre  25 e 125
    • O número é maior que 200
  


  

/*
 * Leitura de um número por entrada digital
 * Atividade 1
 * 
 * Adicional -> Inclusão do módulo LCD I2C
 */

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

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


//apelidos para as saídas
#define led0 0
#define led1 1
#define led2 2
#define led3 3
//apelido para as entradas
#define entrada0 8
#define entrada1 9
#define entrada2 10
#define entrada3 11

//variavel para trabalhar
int valor;

// função para transformar um número em saídas em formato binário
void escreve_byte (byte x){
  if ( x & 0b00000001) digitalWrite(led0, HIGH); else digitalWrite (led0, LOW);
  if ( x & 0b00000010) digitalWrite(led1, HIGH); else digitalWrite (led1, LOW);
  if ( x & 0b00000100) digitalWrite(led2, HIGH); else digitalWrite (led2, LOW);
  if ( x & 0b00001000) digitalWrite(led3, HIGH); else digitalWrite (led3, LOW);
}

// função para transformar entradas binárias em um valor numérico
byte le_byte (void){
  byte b0, b1, b2, b3;
  byte numero;
  b0 = digitalRead (entrada0);
  b1 = digitalRead (entrada1);
  b2 = digitalRead (entrada2);
  b3 = digitalRead (entrada3);
  numero = b3*8 + b2*4 + b1*2 + b0;
  return numero;
}

void setup() {
  // configurações de entradas e saídas digitais
  pinMode (led0, OUTPUT);
  pinMode (led1, OUTPUT);
  pinMode (led2, OUTPUT);
  pinMode (led3, OUTPUT);
  pinMode (entrada0, INPUT_PULLUP);
  pinMode (entrada1, INPUT_PULLUP);
  pinMode (entrada2, INPUT_PULLUP);
  pinMode (entrada3, INPUT_PULLUP);
  // comandos do lcd
  lcd.init();                 // Inicializando o LCD
  lcd.backlight();            // Ligando o BackLight do LCD
}

void loop() {
  // put your main code here, to run repeatedly:
  valor = le_byte();
  escreve_byte(valor);

  // imprime o numero em binário
  lcd.setCursor (0,0);
  lcd.print("Bin=");
  lcd.print(valor,BIN);
  lcd.print("       "); 
  //imprime o numero em Hexadecimal
  lcd.setCursor (0,1);
  lcd.print("Hex=");
  lcd.print(valor,HEX);
  lcd.print(" ");
  // imprime o numero em decimal
  lcd.setCursor (8,1);
  lcd.print("Dec=");
  lcd.print(valor,DEC);
  lcd.print("  ");
}



Lista de material básico


Material específico:


  • Placa Arduino UNO R3 com cabo USB padrão A/B
  • Módulo LCD 16 x 2



  • 4 Botões
  • 3 Leds difuso cor amarelo
  • 3 Leds difuso cor verde
  • 3 Leds difuso cor vermelho
  • 10 resistores de 300 Ω
  • 10 resistores de 1 KΩ
  • 10 resistores de 10 KΩ


  


Material comum

  • Protoboard
  • Fios para ligação
  • Multímetro
  • Alicates de bico, ponta e corte
  • Pinça
  • Ferro de solda, base, solda sugador


  

Microcontroladores - AVR ATMEGA328P - ARUINO

  

Microprocessador e Microcontrolador




  
  

AVR - ATmega328/P



  
  
O que é Arduino










  

  

A IDE do ARDUINO


No Site oficial do Arduino - arduino.cc é possível obter a interface IDE (Integrated Development Environment), que é o ambiente para programação do sistema ARDUINO.

Na guia SOFTWARE/DOWNLOADS, é disponibilizado

Editor WEB - você pode criar seu SKETCH (o seu projeto) em uma interface online.

Download the Arduino IDE

  • Versão de instalação Windows XP ou superior
  • Versão ZIP para situações sem permissão de instação
  • Windows APP (Win 8.1 ou 10)
  • Versão MAC
  • versão LINUX - 32/64/ARM

  

Driver para conexão USB


O Arduino não possui porta USB, porém a conexão USB é mais presente nos computadores.

As placas Arduinos utilizam então um chip que converte a USART (RS232) em USB.
Quando se instala a interface IDE ele automaticamente instala esses drivers.
Em algumas placas "clones" o chip utilizado não é o mesmo, o mais comum é o O CH340 / CH341 é um chip USB serial chinês que vem substituindo com sucesso os tradicionais chips da Silabs (CP2101, CP2104) e Prolific (PL2303).

Driver do fabricante chines



  







  


Conectando a placa Arduino UNO



Na primeira conexão com o computador, o sistema reconhecerá o "novo hardware" e criará uma porta serial de comunicação. 
É importante saber em qual porta a placa está configurada. 
No "Gerenciador de Dispositivos", nas portas "COM e LPT"

Se o SO (Windows) não reconhecer corretamente, não se desespere, não é a sua placa que está com defeito. 
Existem muitas placas clones e algumas utilizam um chip para comunicação USB diferente da placa original. 
Já vi alguns casos conde reconhece um dispositivo USB2.0 sem o driver. 



De acordo com esse dado é necessário configurar a IDE. 
No meu exemplo o sistema escolheu a porta COM4.

Com a interface IDE aberta, selecione a placa utilizada


Selecione a porta COM utilizada pela placa. No exemplo COM4


O sistema está pronto para comunicar transferir os programas
  





Cabeçalho - Identificação de projetos


No inicio de cada projeto é interessante incluir um cabeçalho com informações sobre o o projeto.

O cabeçalho pode ser construído com comentário de bloco que é iniciado por /* e finalizado por */
Informações importantes:


/*

* Nome do projeto
* Autor do projeto

* Descrição resumida do projeto
* Data de criação

* Fonte de dados, ou projeto utilizado como base

* I/Os utilizados
*
* Alterações realizadas identificadas com data
*/



  

Exemplo de cabeçalho para Atividade 1 - BLINK


/*
  Blink_atv1
  
  Liga um LED por um segundo e depois desliga-se por um segundo, repetidamente.

  A maioria dos Arduinos tem um LED on-board que você pode controlar. Sobre a UNO, MEGA e ZERO
  Ele está ligado ao pino digital 13, no MKR1000 no pino 6. LED_BUILTIN cuida
  Do uso o pino do diodo emissor de luz correto o que quer que é a placa usada.
  Se você quiser saber em que pino o LED on-board está conectado no seu modelo Arduino, verifique
  As Especificações Técnicas da sua placa em https://www.arduino.cc/en/Main/Products
  
  Este código de exemplo está no domínio público.

  modified 8 May 2014 - by Scott Fitzgerald
  
  modified 2 Sep 2016 - by Arturo Guadalupi

  ======================================
  28/11/2016 - Luiz Oscar Ruschel Pilger
  
  Atividade 1 - Novo sketch baseado no exemplo blink e modifique o tempo de "on" para 2 segundos
  I/O: 13 - OUT - LED_BUITIN
  Modificação: Tempo de ON 1s => 2s

*/


  

Comandos básicos de programação

Circuitar - Programação para Arduino - Primeiros Passos

Do bit Ao Byte - Programar em C/C++ para microcontroladoras PIC e Arduino


  

if - if else


arduino.cc - if/else


Multilógica-Shop - if/else


DEVMEDIA - if/else Operador ternário




  

Operadores


UFSC - CURSO DE C


UFPR - 6 Operadores Lógicos




  

for

arduino.cc - for



  



Módulo III - Microcontroladores 1




  

Material


  
  

SEQUENCIAMENTO


  

Projeto