Mudanças entre as edições de "MCO018703 2020 2 AULA09"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
(Criou página com '=Apresentação= O objetivo das próximas aulas é o de exercitar a capacidade de vocês trabalharem em equipe na resolução de problemas utilizando o Arduíno. Vamos propor...')
 
 
(Uma revisão intermediária pelo mesmo usuário não está sendo mostrada)
Linha 1: Linha 1:
=Apresentação=
+
=Objetivos=
  
O objetivo das próximas aulas é o de exercitar a capacidade de vocês trabalharem em equipe na resolução de problemas utilizando o Arduíno. Vamos propor alguns experimentos para vocês "melhorarem" e executarem em sala de aula. Abaixo, apresento algumas tecnologias disponíveis em nosso almoxarifado para que vocês pesquisem e utilizem nas soluções dos problemas. Caso uma equipe conseguir terminar o seu trabalho numa aula, poderá executar testar outra tecnologia.
+
*Saber o que é PWM;
 +
*Saber utilizar as portas analógicas do Arduino;
 +
*Conhecer o sensor NTC;
 +
*Conhecer o sensor LDR.
  
 +
=PWM no Arduino=
  
Prof. Douglas A.
+
Na aula anterior falamos que os Pinos Digitais são usados para detecção ou transmissão de controles digitais, normalmente associados aos sinais HIGH ou LOW (1 ou 0). Mas alguns pinos podem também gerar um sinal analógico com a função '''analogWrite()''' utilizando a técnica de modulação chamada PWM.  
  
=Display LCD 16x2=
+
;Mas o que é PWM?
  
 +
PWM, do inglês ''Pulse Width Modulation'', é uma técnica utilizada por sistemas digitais para variação do valor médio de uma forma de onda periódica. A técnica consiste em manter a frequência de uma onda quadrada fixa e variar o tempo que o sinal fica em nível lógico alto. Esse tempo é chamado de ''duty cycle'', ou seja, o ciclo ativo da forma de onda. A figura abaixo mostra o gráfico onde são exibidas algum exemplos de modulações PWM.
  
A shield LCD 16x2 com keypad (teclado) pode ser utilizada para selecionar uma opção em um menu, digitar uma senha ou até mesmo controlar os passos de um robô. As aplicações são as mais diversas. Na Figura abaixo vemos a Shield LCD 16x2 com 5 botões customizáveis.
 
  
[[imagem:Fig030_MCO18703.png|450px|center]]
 
  
Possui um display LCD 16x2 com backlight azul, e 5 botões, além de um botão de reset do Arduino. O ajuste do contraste é feito pelo parafuso do trimpot. Além disso, a placa possui furos para soldagem de barras de pinos, para, por exemplo, colocar um sensor de temperatura.
+
[[imagem:Fig044_MCO018703.jpg|400px|center]]
 +
<center>
 +
<sub>Fonte: http://arduino.cc/en/Tutorial/PWM</sub>
 +
</center>
 +
 
 +
Analisando as formas de onda nota-se que a frequência da forma de onda tem o mesmo valor e varia-se o ''duty cycle''' da forma de onda. Quando o ''duty cicle'' está em 0% o valor médio da saída encontra-se em 0 V e consequentemente para um ''duty cycle'' de 100% a saída assume seu valor máximo, que no caso é 5V. Para um ''duty cycle'' de 50% a saída assumirá 50% do valor da tensão, 2,5 V e assim sucessivamente para cada variação no ''duty cycle''. Portanto, para calcular o valor médio da tensão de saída de um sinal PWM pode-se utilizar a seguinte equação:
 +
 
 +
 +
<math>
 +
Vout = \frac{duty\,cycle}{100}.Vcc\,
 +
</math>
 +
 +
 
 +
Onde:
 +
 
 +
:Vout - tensão de saída em V;
 +
:''duty cycle'' - valor do ciclo ativo do PWM em %;
 +
:Vcc - tensão de alimentação em V.
 +
 
 +
 +
 
 +
PWM pode ser usada para diversas aplicações, como por exemplo:
 +
 
 +
:controle de velocidade de motores;
 +
 
 +
:variação da luminosidade de leds;
  
Esta shield utiliza alguns pinos diferentes dos que usamos normalmente nos projetos para ligar um LCD. Nesta shield teremos que usar a seguinte sequência ao inicializar a biblioteca LiquidCrystal:
+
:geração de sinais analógicos;
<pre>
 
LiquidCrystal lcd(8,9,4,5,6,7); // RS,E,D4,D5,D6,D7
 
</pre>
 
  
A tabela abaixo mostra a relação entre os pinos do Arduino e os sinais do display:
+
:geração de sinais de áudio.
  
<center>
+
O Arduino Uno assim como o Diecimila possui 6 pinos PWM (3,5,6,9,10,11). Sendo que a função '''analogWrite()''', escreve um valor de PWM em um pino digital somente se possuir a função PWM. Após a chamada dessa função, o pino passa a operar com uma onda quadrada de frequência fixa e com ''duty cycle'' conforme valor passado pela função. A frequência dessa onda, na maioria dos pinos é em torno de 490 Hz, porém, os pinos 5 e 6 da Arduino UNO operam em 980 Hz. Para utilizar a função '''analogWrite()''', deve-se configurar o pino correspondente como saída digital. É interessante notar que essas saídas não são conversores digital-analógico como o nome sugere, e estes pinos não estão relacionados às entradas analógicas.
{| class="wikitable"
+
 
! style="text-align: center; background-color:#D2691E;" | Pino
+
==Exemplo de Códigos==
! style="text-align: center; background-color:#D2691E;" | Sinal do Display
 
|-
 
| style="text-align: center;" | 4
 
| style="text-align: center;" | DB4
 
|-
 
| style="text-align: center;" | 5
 
| style="text-align: center;" | DB5
 
|-
 
| style="text-align: center;" | 6
 
| style="text-align: center;" | DB6
 
|-
 
| style="text-align: center;" | 7
 
| style="text-align: center;" | DB7
 
|-
 
| style="text-align: center;" | 8
 
| style="text-align: center;" | RS
 
|-
 
| style="text-align: center;" | 9
 
| style="text-align: center;" | Enable
 
|}
 
</center>
 
  
Os botões da shield usam uma única porta analógica, A0. A Figura abaixo mostra uma associação de resistores para determinar qual botão foi pressionado:
+
Abaixo vemos o circuito com exemplo de um programa em Arduino que aumenta e diminui gradativamente o brilho de um LED
 +
conectado no pino PWM 3 do Arduino.
  
[[imagem:Fig031_MCO18703.png|400px|center]]
+
;Esquemático:
  
;Nota: Não podemos utilizar essas portas descritas para outras funções enquanto estivermos utilizando essa shield. O pino 10 também é utilizado pela placa para uma função específica, no caso o backlight, e não deve ser utilizado nos programas.
+
[[imagem:Fig045_MCO018703.jpg|300px|center]]
  
Para o programa de teste abaixo, é necessário o uso da biblioteca LiquidCrystal, e para determinar qual botão foi pressionado, faremos a leitura da porta analógica A0:
+
;Exemplo 1:
  
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
#include <LiquidCrystal.h> 
+
void setup() {
 
+
  // put your setup code here, to run once:
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); 
+
    pinMode(3,OUTPUT);
 
+
}
void setup()  
+
 
{
+
void loop() {
lcd.begin(16, 2); 
+
  // put your main code here, to run repeatedly:
lcd.setCursor(0,0); 
+
  analogWrite (3, 64); // 25%
lcd.print("Bem vindo!"); 
+
  delay(1000);
lcd.setCursor(0,1);
+
  analogWrite (3, 127); // 50%
lcd.print("Tecle: "); 
+
   delay(1000);
}
+
   analogWrite (3, 191); // 75%
 
+
   delay(1000);
void loop()
+
   analogWrite (3, 255);   // 100%
{
+
   delay(1000);
int botao; 
 
botao = analogRead (0); //Leitura do valor da porta analógica A0
 
lcd.setCursor(8,1);
 
if (botao < 100)
 
   lcd.print ("Direita ");
 
 
else if (botao < 200) { 
 
   lcd.print ("Cima    ");
 
 
else if (botao < 400){ 
 
   lcd.print ("Baixo  ");
 
 
else if (botao < 600){ 
 
   lcd.print ("Esquerda");
 
 
else if (botao < 800){ 
 
   lcd.print ("Select  ");
 
 
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
  
;Desafio: Tente incluir uma animação no display!
+
;Exemplo 2:
  
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
//Rolagem para a esquerda
+
/* Esse programa escrito em C do Arduino aumenta e diminui gradativamente o brilho de um LED
  for (int posicao = 0; posicao < 3; posicao++)
+
conectado no pino PWM 3 do Arduino. */
  {
+
int i=0; // declaração da variável global inteira i iniciada com 0
    lcd.scrollDisplayLeft();
+
void ledOn( ); // declaração da função criada ledOn do tipo void
    delay(300);
+
void setup( )
  }
+
{
 
+
  pinMode(3,OUTPUT); // aqui 2 parâmetros são passados à função pinMode( )
  //Rolagem para a direita
+
}
  for (int posicao = 0; posicao < 6; posicao++)
+
void loop( )
  {
+
{
    lcd.scrollDisplayRight();
+
  for (i=0; i <= 255; i++) ledOn( ); // aumenta o brilho do led
    delay(300);
+
  for (i=255; i >= 0; i--) ledOn( ); // diminui o brilho do led
  }
+
}
 +
void ledOn( ) // função que acende o led
 +
{
 +
  analogWrite (3, i); // o nº do pino e o valor de i são passados à função analogWrite( )
 +
  delay (10);    
 +
}
 
</syntaxhighlight>
 
</syntaxhighlight>
  
=Sensor LM35=
+
=Portas Analógicas=
 +
 
 +
As entradas digitais só podem assumir dois estados, HIGH e LOW, ou seja, 0 V ou 5 V. Dessa forma só é possível ler apenas dois estados. Por exemplo, verificar se uma porta está aberta ou fechada, identificar se um botão está pressionado ou solto. Com as entradas digitais você aplica em lógica discreta para controle de seus projetos, porém em muitas situações a variação das grandezas envolvidas acontece de forma analógica. Ou seja, variam continuamente em relação ao tempo e podem assumir infinitos valores dentro de uma faixa. Como exemplo a temperatura, luminosidade, pressão e umidade são grandezas que variam dessa forma.
 +
 
 +
O microcontrolador Arduino trabalha internamente com dados digitais, portanto é necessário traduzir um sinal analógico para um valor digital. A técnica utilizada para leitura de um sinal analógico pelo Arduino é a conversão analógica digital. Essa técnica consiste em converter o sinal analógico para um valor digital, dessa forma se pode quantificar o sinal presente no pino. Esse processo é feito pelo conversor Analógico digital, ADC ou conversor A/D.
 +
 
 +
Um conversor A/D quantifica o valor analógico conforme a quantidade de bits da sua resolução. A resolução de um conversor A/D é dada pela seguinte equação:
 +
 
 +
<math>
 +
resolucao=\frac{V_{ref}}{2^n}\,
 +
</math>
 +
 
 +
onde:
 +
 
 +
:Vref - tensão de referência do conversor A/D;
 +
 
 +
:n - número de bits do conversor.
 +
 
 +
 
 +
==Conversor A/D do Arduino==
 +
 
 +
 
 +
O conversor A/D do microcontrolador ATmega328 possui 10 bits de resolução, a sua tensão de entrada pode variar de 0 V até o valor de VCC.
 +
 
 +
:'''Resolução  = 5 V/1024 = 4,88 mV'''
 +
 
 +
Esse é o valor de degrau para uma conversão em 10 bits com referência em 5 V.
 +
 
 +
A placa Arduino UNO possui 6 canais de conversor analógico digital. Essas entradas são nomeadas de A0 a A5:
  
O Sensor de Temperatura LM35 é um sensor de precisão, que apresenta uma saída de tensão linear relativa à temperatura em que ele se encontrar no momento em que for alimentado por uma tensão de 4-20Vdc e GND, tendo em sua saída um sinal de 10mV para cada Grau Celsius de temperatura, sendo assim, apresenta uma boa vantagem com relação aos demais sensores de temperatura.
+
: A0 (pino 14),  
 +
: A1 (pino 15),  
 +
: A2 (pino 16),  
 +
: A3 (pino 17),  
 +
: A4 (pino 18) e
 +
: A5 (pino 19).  
  
[[imagem:Fig032_MCO18703.png|200px|center]]
+
Não é necessário definir-se na função ''setup( )'' se as portas serão usadas como entrada, ou saída.  
  
O LM35 não necessita de qualquer calibração externa, valores temperatura com variações de 0,25ºC ou até mesmo 0,75ºC dentro da faixa de temperatura de –55ºC à 150ºC. Este sensor tem saída com baixa impedância, tensão linear e calibração inerente precisa, fazendo com que o interfaceamento de leitura seja especificamente simples e o custo do sistema como um todo seja significantemente baixo.
 
  
Consumo: este sensor drena apenas 60μA, sendo assim seu auto-aquecimento é de aproximadamente 0.1ºC ao ar livre.
+
==Funções para Entradas Analógicas==
  
 +
 +
 +
A plataforma Arduino possui duas funções para trabalhar com entradas analógicas, que configuram os registradores do conversor A/D, assim como selecionam o canal conforme o pino passado como parâmetro.
 +
 +
;analogReference(tipo)
 +
 +
 +
Configura a referência de tensão para a conversão analógica/digital, usando esse valor como o máximo para a entrada analógica.
 +
 +
Os tipos possíveis parâmetros de configurações (tipo) são:
 +
 +
:    DEFAULT: a tensão padrão para conversão é a tensão de alimentação da placa. 5 V para placas alimentadas com 5 V  e 3,3 V  para placas alimentadas com 3,3 V;
 +
 +
:    INTERNAL: referência interna de 1,1V no Atmega168 e Atmega328, e 2,56 V no ATmega8;
 +
 +
:    INTERNAL1V1: referência de 1,1V, apenas no Arduino Mega;
 +
 +
:    INTERNAL2V56: referência interna de 5,6 V, apenas no Arduino Mega;
 +
 +
:    EXTERNAL: referência de tensão aplicada no pino AREF (valor entre 0 e 5V).
 +
 +
 +
 +
;int analogRead(pino)
 +
 +
 +
 +
Lê o valor presente em um pino configurado como entrada analógica. Internamente o Arduino possui um conversor A/D de 10 bits. Dessa forma o valor retornado por esta função estará na faixa de 0 a 1023 conforme o valor presente no pino.
 +
 +
 +
O tempo para leitura pela função analogRead() é por volta de 100us, dessa forma a máxima frequência de leitura que se pode ter é de 10kHz.
 +
 +
 +
O programador deve saber como interpretar o número digital da conversão. Desta forma, podem ser lidos os mais variados sensores, desde que eles gerem um sinal de tensão de até 5V (limite permitido). 
 +
 +
[[image:Fig026_MCO18703.jpg|500px|center]]
 
<center>
 
<center>
{| class="wikitable"
+
<sub>ADC de 10 bits - 1024 patamares de quantificação.</sub>
! colspan="2" style="font-weight:bold;background-color:#D2691E;" | Dados técnicos:
 
|-
 
| Descrição do fabricante
 
| LM35
 
|-
 
| Tensão de Alimentação
 
| 4 - 30VDC
 
|-
 
| Escala de medição
 
| °C - (Celsius)
 
|-
 
| Fator de escala
 
| 10mV / °C
 
|-
 
| Range de resposta
 
| -55°C à 150°C
 
|-
 
| Precisão
 
| 0,5°C
 
|-
 
| Consumo de corrente máximo
 
| 60uA
 
|-
 
| Datasheet
 
| [http://www.alldatasheet.com/datasheet-pdf/pdf/517588/TI1/LM35.html LM-35]
 
|}
 
 
</center>
 
</center>
  
;Exemplo 1: O código abaixo mostra o valor de temperatura lido no monitor serial.
+
==Lendo dados de um potenciômetro==
 +
 
 +
;EXEMPLO 1:  
 +
 
 +
;Esquemático:
 +
 
 +
[[image:Fig027_MCO18703.jpg|400px|center]]
 +
 
 +
Para ler os valores diretamente em Volts:
 +
 
 +
;Código fonte:
  
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
void setup() {
+
void setup()
  // put your setup code here, to run once:
+
{  
  Serial.begin(9600);
+
  Serial.begin(9600);
 
}
 
}
 
+
void loop() {
+
void loop()
  // put your main code here, to run repeatedly:
+
{  
  int valor=analogRead(A0);
+
    float valor;
  float temp=(5.0*valor*100)/1024;
+
    int val = analogRead(0);
  Serial.println(temp);
+
  delay(1000);
+
    valor = (val*5.0)/1023;
 +
 +
    Serial.println(valor);
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 +
==Lendo dados do potenciômetro para temporizar o LED==
  
;Exemplo 2: O código abaixo faz a média de 8 leituras e depois envia pela serial juntamente maior valor e menor valor lido:
+
;EXEMPLO 2:  
 +
 
 +
;Esquemático:
  
<syntaxhighlight lang=c>
 
// Pino analogico para ligacao do LM35
 
int pin = 0;
 
  
// Variaveis que armazenam a temperatura em Celsius e Fahrenheit
+
[[image:Fig028_MCO18703.jpg|400px|center]]
int tempc = 0,tempf=0;
 
  
// Array para precisão na medição
 
int samples[8];
 
  
// Variáveis que guardam a temperatura máxima e mínima
+
;Código fonte:
int maxtemp = -100,mintemp = 100;  
 
  
int i;
+
<syntaxhighlight lang=c>
 +
const int led=6;
  
 
void setup()
 
void setup()
 
{
 
{
  Serial.begin(9600); // Inicializa comunicação serial
+
  pinMode(led, OUTPUT);
 +
  Serial.begin(9600);
 
}
 
}
  
 
void loop()
 
void loop()
 
{
 
{
  // Loop que faz a leitura da temperatura 8 vezes
+
  int val=analogRead(0);
  for(i = 0;i<=7;i++)
+
  Serial.println(val);
  {
+
  digitalWrite(led, HIGH);
    samples[i] = ( 5.0 * analogRead(pin) * 100.0) / 1024.0;
+
  delay(val);
    //A cada leitura, incrementa o valor da variavel tempc
+
  digitalWrite(led, LOW);
    tempc = tempc + samples[i];  
+
  delay(val);
    delay(100);
+
}
  }
+
</syntaxhighlight>
 +
 
 +
=Termistor NTC=
 +
 
 +
Termistor é um tipo de componente eletrônico que tem sua resistência elétrica alterada termicamente, ou seja, apresentam um valor de resistência para cada temperatura absoluta. A Figura abaixo mostra a foto de um termistor.
 +
 
 +
 
 +
 
 +
[[image:Fig046_MCO18703.jpg|200px|center]]
 +
<center>
 +
<sub>Fonte: [3]</sub>
 +
</center>
 +
 
 +
 
 +
 
 +
Os Termistores comumente são utilizados para controlar ou alterar a temperatura em dispositivos eletrônicos. Há duas categorias de termistores: PTC, que aumenta sensivelmente sua resistência elétrica com o aumento da temperatura e o NTC, que diminui sensivelmente a resistência elétrica com o aumento da temperatura. Vale ressaltar que Termistores não são polarizados. A Figura abaixo mostra a curva característica de resposta de NTC de 10k omhs.
 +
 
 +
 
 +
 
 +
[[image:Fig047_MCO18703.jpg|center]]
 +
<center>
 +
<sub>Fonte: [4]</sub>
 +
</center>
 +
 
 +
 
 +
Em destaque no gráfico, encontra-se o valor da resistência de 10k quando a temperaturo é de 25°C. Quando a temperatura cai a resistência aumenta e quando a temperatura sobe a resistência cai.
 +
 
 +
 
 +
 
 +
;Especificações e características:
 +
 
 +
:– Tensão de operação: 3,3 ou 5V
 +
:– Faixa de medição: -55°C a 125° Celsius
 +
:– Precisão: ±1%
 +
:– Dissipação típica constante: 2mW/° Celsius
 +
 
 +
;Aplicações:
 +
 
 +
Projetos com finalidade de medir temperatura ambiente utilizando Arduino ou outras plataformas microcontroladas.
 +
 
 +
 
 +
 
 +
 
  
// Divide a variavel tempc por 8, para obter precisão na medição
 
tempc = tempc/8.0;
 
  
//Converte a temperatura em Fahrenheit e armazena na variável tempf
+
;Lendo um NTC:
tempf = (tempc * 9)/ 5 + 32;  
 
  
//Armazena a temperatura máxima na variável maxtemp
+
Utilizar o Termistor NTC 10k em conjunto com resistor de 10k no Arduino e medir a temperatura ambiente. O valor da temperatura será exibido no monitor serial do ambiente de programação do Arduino.
if(tempc > maxtemp) {maxtemp = tempc;}
 
  
//Armazena a temperatura minima na variavel mintemp
 
if(tempc < mintemp) {mintemp = tempc;}
 
  
 +
;Esquemático:
  
//As linhas abaixo escrevem o valor da temperatura na saída serial
+
[[image:Fig048_MCO18703.jpg|300px|center]]
    Serial.print(tempc,DEC);
 
    Serial.print(" Celsius, ");
 
    Serial.print(tempf,DEC);
 
    Serial.print(" fahrenheit -> ");
 
    Serial.print(maxtemp,DEC);
 
    Serial.print(" Max, ");
 
    Serial.print(mintemp,DEC);
 
    Serial.println(" Min");
 
  
delay(100);
 
  
tempc=0;
+
;Código fonte (utilizando biblioteca do Arduino):
  
 +
<syntaxhighlight lang=c>
 +
#include <Thermistor.h>
 +
 +
Thermistor temp(0);
 +
 +
void setup() {
 +
    Serial.begin(9600);
 +
}
 +
void loop() {
 +
    int temperature = temp.getTemp();
 +
    Serial.print("Temperatura: ");
 +
    Serial.print(temperature);
 +
    Serial.println("°C");
 +
    delay(1000);
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
  
;Desafio: Tente mostrar a temperatura no Display de cristal líquido.
 
  
=Display de 7 segmentos=
+
;Código fonte (Equação ''Steinhart-Hart''):
 +
 
 +
<syntaxhighlight lang=c>
 +
#include <math.h>
  
O display de 7 segmentos, possui 7 segmentos que podem ser agrupados de modo a formar números e letras.
+
const int sensor = A0;
  
 +
double tempCelsius(int valorNTC)
 +
{
 +
  double temp;
  
 +
  temp = log(((10240000/valorNTC)-10000)); // para NTC de 10k
 +
  temp = 1/(0.001129148+(0.000234125+(0.0000000876741*temp*temp))*temp);
  
[[Imagem:7-segments_Indicator.gif|center]]
+
  temp=temp-273.15; // Coonverte Kelvin para Cesius
 +
 
 +
  return temp;
 +
}
  
 +
void setup()
 +
{
 +
    Serial.begin(9600);
 +
}
  
 +
void loop()
 +
{
 +
  int valor=analogRead(sensor);
 +
  double c=tempCelsius(valor);
 +
  Serial.println(valor);
 +
  Serial.println(c);
 +
  delay(250);
 +
}
 +
</syntaxhighlight>
  
Para mostrar o número 1, basta ativar os segmentos b e c. Para mostrar o número 3, os segmentos a, b, c, d e g.
+
=Sensor LDR=
  
A ligação ao Arduino pode utilizar os pinos de 2 a 9, mais o GND,  na seguinte sequencia:
+
Um LDR (Resistor Dependente da Luz) é um tipo especial de resistor que apresenta uma mudança em sua característica de resistência elétrica quando submetido à ação da luz. Também chamados de fotorresistores, apresentam um valor de resistência elevada em um ambiente escuro, e quando expostos à luz, têm a condutividade aumentada. Ou seja, oferecem baixa resistência elétrica quando iluminados. A Figura abaixo mostra um LDR de 5mm.
  
 +
 +
[[Imagem:Fig034_MCO018703.png|center|200px]]
 
<center>
 
<center>
{| class="wikitable"
+
Figura - LDR Sensor de luminosidade. [6]
! style="text-align: center; font-weight:bold;background-color:#D2691E;" | Pino
 
Arduíno
 
! style="text-align: center; font-weight:bold;background-color:#D2691E;" | Segmento
 
Display
 
|-
 
| style="text-align: center;" | 2
 
| style="text-align: center;" | a
 
|-
 
| style="text-align: center;" | 3
 
| style="text-align: center;" | b
 
|-
 
| style="text-align: center;" | 4
 
| style="text-align: center;" | c
 
|-
 
| style="text-align: center;" | 5
 
| style="text-align: center;" | d
 
|-
 
| style="text-align: center;" | 6
 
| style="text-align: center;" | e
 
|-
 
| style="text-align: center;" | 7
 
| style="text-align: center;" | f
 
|-
 
| style="text-align: center;" | 8
 
| style="text-align: center;" | g
 
|-
 
| style="text-align: center;" | 9
 
| style="text-align: center;" | h
 
|-
 
| style="text-align: center;" | GND
 
| style="text-align: center;" | Central
 
|}
 
 
</center>
 
</center>
  
  
Um ponto importante é a utilização dos resistores de 220 ohms para cada pino. Caso opte por utilizar apenas um resistor conectado a VCC, deve-se levar em consideração que luminosidade dos leds pode ficar diferente para os algarismos com mais ou menos leds acessos. Lembre-se que é necessário limitar a corrente, evitando queimar o componente.
+
Os LDRs são fabricados com materiais de alta resistência, como por exemplo o Sulfeto de Cádmio (CdS) ou o Sulfeto de Chumbo (PbS). Esses materiais possuem poucos elétrons livres quando colocados em ambiente escuro, e liberam elétrons quando há incidência de luz sobre eles, aumentando sua condutividade. Chamamos a esse efeito de Fotocondutividade.
  
 +
Quando cessa a incidência de luz sobre o componente, os elétrons retornam à camada de valência e a resistência do material volta a aumentar.
  
[[Imagem:fig89_DIG222802.png|center|300px]]
+
No geral, os LDRs possuem resistências entre 1 MΩ e 10 MΩ no quando em ambiente escuro, e resistências que podem chegar a menos de 100 Ω quando iluminados.
  
 +
Alguns LDRs são projetados para responder em luz infravermelha (como os de Sulfto de Chumbo - PbS) ou ainda em luz ultravioleta. Abaixo é mostrado o circuito básico do divisor de tensão para ser lido pelo pino A0 do Arduíno. Abaixo vemos o circuito elétrico do LDR de 10kΩ em série com um resistor de 10kΩ.
  
Abaixo pode-se ver como ficaria as ligações '''considerando catodo comum, ou seja, se você está trabalhando com display anodo comum, você deverá ligar em VCC (5V):
+
;Circuito elétrico:
  
[[Imagem:Fig033_MCO018703.png|center|500px]]
+
[[Imagem:Fig035_MCO018703.png|center|200px]]
 +
<center>
 +
Figura - Circuito elétrico do divisor de tensão do LDR e resistor de 10kΩ.
 +
</center>
  
Abaixo segue o código fonte do contador hexadecimal crescente:
+
;Esquemático:
  
<syntaxhighlight lang=c>
+
[[image:Fig049_MCO18703.jpg|300px|center]]
// Programa : Contador crescente 0 a F
 
// Modificacoes e comentarios : Arduino e Cia
 
// Baseado no programa:
 
// Arduino 7 segment display example software
 
// http://www.hacktronics.com/Tutorials/arduino-and-7-segment-led.html
 
// License: http://www.opensource.org/licenses/mit-license.php (Go crazy)
 
// Define a ordem de ligação dos segmentos, dos digitos 0 a F
 
// Este padrão é para display de catodo comum
 
// Para display de anodo comum, modifique os valores de 0 para 1 e
 
// de 1 para 0
 
// 1 = LED ligado, 0 = LED desligado, nessa ordem :
 
//                  Arduino pinos: 2,3,4,5,6,7,8
 
  
byte seven_seg_digits[16][7] = { { 1,1,1,1,1,1,0 },  // = Digito 0
 
                                { 0,1,1,0,0,0,0 },  // = Digito 1
 
                                { 1,1,0,1,1,0,1 },  // = Digito 2
 
                                { 1,1,1,1,0,0,1 },  // = Digito 3
 
                                { 0,1,1,0,0,1,1 },  // = Digito 4
 
                                { 1,0,1,1,0,1,1 },  // = Digito 5
 
                                { 1,0,1,1,1,1,1 },  // = Digito 6
 
                                { 1,1,1,0,0,0,0 },  // = Digito 7
 
                                { 1,1,1,1,1,1,1 },  // = Digito 8
 
                                { 1,1,1,0,0,1,1 },  // = Digito 9
 
                                { 1,1,1,0,1,1,1 },  // = Digito A
 
                                { 0,0,1,1,1,1,1 },  // = Digito B
 
                                { 1,0,0,1,1,1,0 },  // = Digito C
 
                                { 0,1,1,1,1,0,1 },  // = Digito D
 
                                { 1,0,0,1,1,1,1 },  // = Digito E
 
                                { 1,0,0,0,1,1,1 }  // = Digito F
 
                                };
 
  
 +
;Código fonte:
  
void setup()
 
 
  pinMode(2, OUTPUT); //Pino 2 do Arduino ligado ao segmento A 
 
  pinMode(3, OUTPUT); //Pino 3 do Arduino ligado ao segmento B
 
  pinMode(4, OUTPUT); //Pino 4 do Arduino ligado ao segmento C
 
  pinMode(5, OUTPUT); //Pino 5 do Arduino ligado ao segmento D
 
  pinMode(6, OUTPUT); //Pino 6 do Arduino ligado ao segmento E
 
  pinMode(7, OUTPUT); //Pino 7 do Arduino ligado ao segmento F
 
  pinMode(8, OUTPUT); //Pino 8 do Arduino ligado ao segmento G
 
  pinMode(9, OUTPUT); //Pino 9 do Arduino ligado ao segmento PONTO
 
  writePonto(0);  // Inicia com o ponto desligado
 
}
 
  
void writePonto(byte dot)  //Funcao que aciona o ponto no display
+
<syntaxhighlight lang=c>
+
const int sensor=A0;
  digitalWrite(9, dot);
 
}
 
  
void sevenSegWrite(byte digit) //Funcao que aciona o display
+
void setup()
 
{
 
{
  byte pin = 2;
+
     Serial.begin(9600);
 
 
  //Percorre o array ligando os segmentos correspondentes ao digito
 
  for (byte segCount = 0; segCount < 7; ++segCount) 
 
  {
 
    digitalWrite(pin, seven_seg_digits[digit][segCount]); // Catado comum: digitalWrite(pin, !seven_seg_digits[digit][segCount]);
 
    ++pin;
 
  }
 
    writePonto(1);  //Liga o ponto
 
    delay(100);  //Aguarda 100 milisegundos
 
     writePonto(0); //Desliga o ponto
 
 
}
 
}
 
+
void loop()  
+
void loop()
 
{
 
{
  //Contador de 0 a 15, ligando os segmentos correspondentes
+
  int valor=analogRead(sensor);
  //0 a 9 = liga os segmentos correspondentes aos numeros
+
  Serial.println(valor);
  //10 a 15 = Forma as letras A,B,C,D,E,F
 
  for (byte count = 0; count < 16; count++)
 
  {
 
    delay(500);
 
    sevenSegWrite(count);
 
  }
 
  delay(4000);
 
 
}
 
}
 
 
</syntaxhighlight>
 
</syntaxhighlight>
  
;Desafio: Fazer uma animação com o display.
+
;Desafio: Alterar o circuito, também o código fonte de modo a adicionar um LED ao circuito para simular a acendimento das luzes quando o valor lido do LDR indicar que está escuro suficiente.
  
 
=Referências=
 
=Referências=
  
[1] https://www.arduinoecia.com.br/2013/08/arduino-shield-lcd-16x2-com-keypad.html
+
[1] https://www.embarcados.com.br/pwm-do-arduino/
 +
 
 +
[2] https://www.embarcados.com.br/arduino-entradas-analogicas/
 +
 
 +
[3] http://blogmasterwalkershop.com.br/arduino/como-usar-com-arduino-termistor-ntc-10k-sensor-de-temperatura/
 +
 
 +
[4] http://squids.com.br/arduino/index.php/projetos-arduino/projetos-squids/basico/153-projeto-41-usando-o-sensor-de-temperatura-termistor-ntc-10k-com-lcd
  
[2] [https://wiki.sj.ifsc.edu.br/images/8/83/AP1_MCO18703_2017-2.pdf  Avaliação 2017-2]
+
[5] https://www.filipeflop.com/produto/sensor-de-luminosidade-ldr-5mm/
  
 +
[6] https://portal.vidadesilicio.com.br/sensor-de-luz-com-ldr/
  
  

Edição atual tal como às 15h39min de 9 de fevereiro de 2021

Objetivos

  • Saber o que é PWM;
  • Saber utilizar as portas analógicas do Arduino;
  • Conhecer o sensor NTC;
  • Conhecer o sensor LDR.

PWM no Arduino

Na aula anterior falamos que os Pinos Digitais são usados para detecção ou transmissão de controles digitais, normalmente associados aos sinais HIGH ou LOW (1 ou 0). Mas alguns pinos podem também gerar um sinal analógico com a função analogWrite() utilizando a técnica de modulação chamada PWM.

Mas o que é PWM?

PWM, do inglês Pulse Width Modulation, é uma técnica utilizada por sistemas digitais para variação do valor médio de uma forma de onda periódica. A técnica consiste em manter a frequência de uma onda quadrada fixa e variar o tempo que o sinal fica em nível lógico alto. Esse tempo é chamado de duty cycle, ou seja, o ciclo ativo da forma de onda. A figura abaixo mostra o gráfico onde são exibidas algum exemplos de modulações PWM.


Fig044 MCO018703.jpg

Fonte: http://arduino.cc/en/Tutorial/PWM

Analisando as formas de onda nota-se que a frequência da forma de onda tem o mesmo valor e varia-se o duty cycle' da forma de onda. Quando o duty cicle está em 0% o valor médio da saída encontra-se em 0 V e consequentemente para um duty cycle de 100% a saída assume seu valor máximo, que no caso é 5V. Para um duty cycle de 50% a saída assumirá 50% do valor da tensão, 2,5 V e assim sucessivamente para cada variação no duty cycle. Portanto, para calcular o valor médio da tensão de saída de um sinal PWM pode-se utilizar a seguinte equação:



Onde:

Vout - tensão de saída em V;
duty cycle - valor do ciclo ativo do PWM em %;
Vcc - tensão de alimentação em V.


PWM pode ser usada para diversas aplicações, como por exemplo:

controle de velocidade de motores;
variação da luminosidade de leds;
geração de sinais analógicos;
geração de sinais de áudio.

O Arduino Uno assim como o Diecimila possui 6 pinos PWM (3,5,6,9,10,11). Sendo que a função analogWrite(), escreve um valor de PWM em um pino digital somente se possuir a função PWM. Após a chamada dessa função, o pino passa a operar com uma onda quadrada de frequência fixa e com duty cycle conforme valor passado pela função. A frequência dessa onda, na maioria dos pinos é em torno de 490 Hz, porém, os pinos 5 e 6 da Arduino UNO operam em 980 Hz. Para utilizar a função analogWrite(), deve-se configurar o pino correspondente como saída digital. É interessante notar que essas saídas não são conversores digital-analógico como o nome sugere, e estes pinos não estão relacionados às entradas analógicas.

Exemplo de Códigos

Abaixo vemos o circuito com exemplo de um programa em Arduino que aumenta e diminui gradativamente o brilho de um LED conectado no pino PWM 3 do Arduino.

Esquemático
Fig045 MCO018703.jpg
Exemplo 1
void setup() {
  // put your setup code here, to run once:
    pinMode(3,OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  analogWrite (3, 64); // 25%
  delay(1000);
  analogWrite (3, 127); // 50%
  delay(1000);
  analogWrite (3, 191); // 75%
  delay(1000);
  analogWrite (3, 255);   // 100%
  delay(1000);
}
Exemplo 2
/* Esse programa escrito em C do Arduino aumenta e diminui gradativamente o brilho de um LED 
conectado no pino PWM 3 do Arduino. */
int i=0;  // declaração da variável global inteira i iniciada com 0
void ledOn( );  // declaração da função criada ledOn do tipo void
void setup( )  
{
   pinMode(3,OUTPUT); // aqui 2 parâmetros são passados à função pinMode( )
}
void loop( ) 
{
   for (i=0; i <= 255; i++) ledOn( ); // aumenta o brilho do led
   for (i=255; i >= 0; i--) ledOn( ); // diminui o brilho do led
}
void ledOn( ) // função que acende o led
{  
   analogWrite (3, i); // o nº do pino e o valor de i são passados à função analogWrite( )
   delay (10);      
}

Portas Analógicas

As entradas digitais só podem assumir dois estados, HIGH e LOW, ou seja, 0 V ou 5 V. Dessa forma só é possível ler apenas dois estados. Por exemplo, verificar se uma porta está aberta ou fechada, identificar se um botão está pressionado ou solto. Com as entradas digitais você aplica em lógica discreta para controle de seus projetos, porém em muitas situações a variação das grandezas envolvidas acontece de forma analógica. Ou seja, variam continuamente em relação ao tempo e podem assumir infinitos valores dentro de uma faixa. Como exemplo a temperatura, luminosidade, pressão e umidade são grandezas que variam dessa forma.

O microcontrolador Arduino trabalha internamente com dados digitais, portanto é necessário traduzir um sinal analógico para um valor digital. A técnica utilizada para leitura de um sinal analógico pelo Arduino é a conversão analógica digital. Essa técnica consiste em converter o sinal analógico para um valor digital, dessa forma se pode quantificar o sinal presente no pino. Esse processo é feito pelo conversor Analógico digital, ADC ou conversor A/D.

Um conversor A/D quantifica o valor analógico conforme a quantidade de bits da sua resolução. A resolução de um conversor A/D é dada pela seguinte equação:

onde:

Vref - tensão de referência do conversor A/D;
n - número de bits do conversor.


Conversor A/D do Arduino

O conversor A/D do microcontrolador ATmega328 possui 10 bits de resolução, a sua tensão de entrada pode variar de 0 V até o valor de VCC.

Resolução = 5 V/1024 = 4,88 mV

Esse é o valor de degrau para uma conversão em 10 bits com referência em 5 V.

A placa Arduino UNO possui 6 canais de conversor analógico digital. Essas entradas são nomeadas de A0 a A5:

A0 (pino 14),
A1 (pino 15),
A2 (pino 16),
A3 (pino 17),
A4 (pino 18) e
A5 (pino 19).

Não é necessário definir-se na função setup( ) se as portas serão usadas como entrada, ou saída.


Funções para Entradas Analógicas

A plataforma Arduino possui duas funções para trabalhar com entradas analógicas, que configuram os registradores do conversor A/D, assim como selecionam o canal conforme o pino passado como parâmetro.

analogReference(tipo)


Configura a referência de tensão para a conversão analógica/digital, usando esse valor como o máximo para a entrada analógica.

Os tipos possíveis parâmetros de configurações (tipo) são:

DEFAULT: a tensão padrão para conversão é a tensão de alimentação da placa. 5 V para placas alimentadas com 5 V e 3,3 V para placas alimentadas com 3,3 V;
INTERNAL: referência interna de 1,1V no Atmega168 e Atmega328, e 2,56 V no ATmega8;
INTERNAL1V1: referência de 1,1V, apenas no Arduino Mega;
INTERNAL2V56: referência interna de 5,6 V, apenas no Arduino Mega;
EXTERNAL: referência de tensão aplicada no pino AREF (valor entre 0 e 5V).


int analogRead(pino)


Lê o valor presente em um pino configurado como entrada analógica. Internamente o Arduino possui um conversor A/D de 10 bits. Dessa forma o valor retornado por esta função estará na faixa de 0 a 1023 conforme o valor presente no pino.


O tempo para leitura pela função analogRead() é por volta de 100us, dessa forma a máxima frequência de leitura que se pode ter é de 10kHz.


O programador deve saber como interpretar o número digital da conversão. Desta forma, podem ser lidos os mais variados sensores, desde que eles gerem um sinal de tensão de até 5V (limite permitido).

Fig026 MCO18703.jpg

ADC de 10 bits - 1024 patamares de quantificação.

Lendo dados de um potenciômetro

EXEMPLO 1
Esquemático
Fig027 MCO18703.jpg

Para ler os valores diretamente em Volts:

Código fonte
void setup()
{ 
   Serial.begin(9600);
}
 
void loop()
{ 
    float valor;
    int val = analogRead(0);
 
    valor = (val*5.0)/1023;
 
    Serial.println(valor);
}

Lendo dados do potenciômetro para temporizar o LED

EXEMPLO 2
Esquemático


Fig028 MCO18703.jpg


Código fonte
const int led=6;

void setup()
{
   pinMode(led, OUTPUT);
   Serial.begin(9600);
}

void loop()
{
   int val=analogRead(0);
   Serial.println(val);
   digitalWrite(led, HIGH);
   delay(val);
   digitalWrite(led, LOW);
   delay(val);
}

Termistor NTC

Termistor é um tipo de componente eletrônico que tem sua resistência elétrica alterada termicamente, ou seja, apresentam um valor de resistência para cada temperatura absoluta. A Figura abaixo mostra a foto de um termistor.


Fig046 MCO18703.jpg

Fonte: [3]


Os Termistores comumente são utilizados para controlar ou alterar a temperatura em dispositivos eletrônicos. Há duas categorias de termistores: PTC, que aumenta sensivelmente sua resistência elétrica com o aumento da temperatura e o NTC, que diminui sensivelmente a resistência elétrica com o aumento da temperatura. Vale ressaltar que Termistores não são polarizados. A Figura abaixo mostra a curva característica de resposta de NTC de 10k omhs.


Fig047 MCO18703.jpg

Fonte: [4]


Em destaque no gráfico, encontra-se o valor da resistência de 10k quando a temperaturo é de 25°C. Quando a temperatura cai a resistência aumenta e quando a temperatura sobe a resistência cai.


Especificações e características
– Tensão de operação: 3,3 ou 5V
– Faixa de medição: -55°C a 125° Celsius
– Precisão: ±1%
– Dissipação típica constante: 2mW/° Celsius
Aplicações

Projetos com finalidade de medir temperatura ambiente utilizando Arduino ou outras plataformas microcontroladas.




Lendo um NTC

Utilizar o Termistor NTC 10k em conjunto com resistor de 10k no Arduino e medir a temperatura ambiente. O valor da temperatura será exibido no monitor serial do ambiente de programação do Arduino.


Esquemático
Fig048 MCO18703.jpg


Código fonte (utilizando biblioteca do Arduino)
#include <Thermistor.h>

Thermistor temp(0); 

void setup() {
    Serial.begin(9600);
}
void loop() {
    int temperature = temp.getTemp();
    Serial.print("Temperatura: ");
    Serial.print(temperature);
    Serial.println("°C");
    delay(1000);
}


Código fonte (Equação Steinhart-Hart)
#include <math.h>

const int sensor = A0;

double tempCelsius(int valorNTC)
{
   double temp;

   temp = log(((10240000/valorNTC)-10000)); // para NTC de 10k
   temp = 1/(0.001129148+(0.000234125+(0.0000000876741*temp*temp))*temp);

   temp=temp-273.15; // Coonverte Kelvin para Cesius
   
   return temp;
}

void setup()
{
    Serial.begin(9600);
}

void loop()
{
   int valor=analogRead(sensor);
   double c=tempCelsius(valor);
   Serial.println(valor);
   Serial.println(c);
   delay(250);
}

Sensor LDR

Um LDR (Resistor Dependente da Luz) é um tipo especial de resistor que apresenta uma mudança em sua característica de resistência elétrica quando submetido à ação da luz. Também chamados de fotorresistores, apresentam um valor de resistência elevada em um ambiente escuro, e quando expostos à luz, têm a condutividade aumentada. Ou seja, oferecem baixa resistência elétrica quando iluminados. A Figura abaixo mostra um LDR de 5mm.


Fig034 MCO018703.png

Figura - LDR Sensor de luminosidade. [6]


Os LDRs são fabricados com materiais de alta resistência, como por exemplo o Sulfeto de Cádmio (CdS) ou o Sulfeto de Chumbo (PbS). Esses materiais possuem poucos elétrons livres quando colocados em ambiente escuro, e liberam elétrons quando há incidência de luz sobre eles, aumentando sua condutividade. Chamamos a esse efeito de Fotocondutividade.

Quando cessa a incidência de luz sobre o componente, os elétrons retornam à camada de valência e a resistência do material volta a aumentar.

No geral, os LDRs possuem resistências entre 1 MΩ e 10 MΩ no quando em ambiente escuro, e resistências que podem chegar a menos de 100 Ω quando iluminados.

Alguns LDRs são projetados para responder em luz infravermelha (como os de Sulfto de Chumbo - PbS) ou ainda em luz ultravioleta. Abaixo é mostrado o circuito básico do divisor de tensão para ser lido pelo pino A0 do Arduíno. Abaixo vemos o circuito elétrico do LDR de 10kΩ em série com um resistor de 10kΩ.

Circuito elétrico
Fig035 MCO018703.png

Figura - Circuito elétrico do divisor de tensão do LDR e resistor de 10kΩ.

Esquemático
Fig049 MCO18703.jpg


Código fonte


const int sensor=A0;

void setup()
{
    Serial.begin(9600);
}
 
void loop()
{
   int valor=analogRead(sensor);
   Serial.println(valor);
}
Desafio
Alterar o circuito, também o código fonte de modo a adicionar um LED ao circuito para simular a acendimento das luzes quando o valor lido do LDR indicar que está escuro suficiente.

Referências

[1] https://www.embarcados.com.br/pwm-do-arduino/

[2] https://www.embarcados.com.br/arduino-entradas-analogicas/

[3] http://blogmasterwalkershop.com.br/arduino/como-usar-com-arduino-termistor-ntc-10k-sensor-de-temperatura/

[4] http://squids.com.br/arduino/index.php/projetos-arduino/projetos-squids/basico/153-projeto-41-usando-o-sensor-de-temperatura-termistor-ntc-10k-com-lcd

[5] https://www.filipeflop.com/produto/sensor-de-luminosidade-ldr-5mm/

[6] https://portal.vidadesilicio.com.br/sensor-de-luz-com-ldr/



Icone voltar.png Icone menu.png Icone prox.png