Mudanças entre as edições de "MCO018703 2020 1 AULA08"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
 
(23 revisões intermediárias pelo mesmo usuário não estão sendo mostradas)
Linha 1: Linha 1:
=Comunicação Serial=
+
=Objetivos=
  
Apesar do Arduino ser gravado via porta USB, a comunicação se dá como serial padrão (USART). O ATmega328 permite comunicação serial no padrão UART TTL (5 V), que está disponível nos pinos digitais 0 (RX) e 1 (TX). Um chip FTDI FT232RL na placa encaminha esta comunicação serial através da USB e os drivers FTDI (incluído no software do Arduino) fornecem uma porta virtual para o software no computador.
+
*Saber o que é PWM;
 +
*Saber utilizar as portas analógicas do Arduino;
 +
*Conhecer o sensor NTC;
 +
*Conhecer o sensor LDR.
  
O software Arduino inclui um '''Monitor Serial''' que permite que dados simples de texto sejam enviados e recebidos à placa Arduino.
+
=PWM no Arduino=
  
Os LEDs RX e TX da placa piscam quando os dados estão sendo transferidos ao computador pelo chip FTDI e há conexão USB (mas não quando há comunicação serial pelos pinos 0 e 1).
+
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.  
  
A biblioteca SoftwareSerial permite comunicação serial por quaisquer dos pinos digitais do Uno. O ATmega328 também oferece suporte aos padrões de comunicação  I2C (TWI) e SPI. Inclui uma biblioteca Wire para simplificar o uso do barramento I2C. Para usar a comunicação SPI, veja o manual do ATmega328. Assim, no Arduino existe uma parte do hardware especifica para a conversão Serial/USB.
+
;Mas o que é PWM?
  
Disso resulta a criação de uma porta COM virtual no computador para a comunicação com o Arduino.
+
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.
  
[[imagem:Fig020_MCO18703.png|500px|center]]
 
  
  
Como a comunicação é a serial padrão, é fácil trocar informações entre o computador e o Arduino.
+
[[imagem:Fig044_MCO018703.jpg|400px|center]]
 +
<center>
 +
<sub>Fonte: http://arduino.cc/en/Tutorial/PWM</sub>
 +
</center>
  
Existe uma ferramenta própria na IDE do Arduino para a comunicação serial.
+
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:
  
[[imagem:Fig021_MCO18703.png|500px|center]]
+
 +
<math>
 +
Vout = \frac{duty\,cycle}{100}.Vcc\,
 +
</math>
 +
  
A biblioteca ''Serial()'' do [http://wiring.org.co/reference/Serial.html Wiring] tem todas as funções necessárias para se implementar comunicação serial entre o Arduino e o PC.
+
Onde:
  
A porta serial te permite ler e escrever facilmente dados de e para dispositivos externos.
+
: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.
  
Isto permite a duas máquinas se comunicarem através de portas seriais de 8 pinos, dos PCs, ou emulads através de um adaptador serial.
+
  
Velocidades típicas de comunicação são: 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600 e 115200 BPS.
+
PWM pode ser usada para diversas aplicações, como por exemplo:
  
Apenas uma aplicação pode utilizar a porta serial, a cada vez.
+
:controle de velocidade de motores;
  
 +
:variação da luminosidade de leds;
  
As funções mais utilizadas são:
+
:geração de sinais analógicos;
  
* ''begin()'' Abre a porta serial para leitura ou escrita.
+
:geração de sinais de áudio.
* ''read()'' Retorna um número entre 0 e 255 para o próximo byte que está esperando no buffer. Retorna -1 se não há nenhum byte, embora isto possa ser evitado pelo uso da função ''available()'', que informa se há dado disponível
 
* ''write()'' Escreve um byte na porta serial.
 
* ''print()'' Escreve dados (int, float, byte, char, char[], números nas bases (DEC, BIN, OCT or HEX) ou textos na porta serial.
 
* ''println()'' O mesmo que a função ''print()'', exceto que acrescenta uma linha nova ao final da chamada.
 
* ''available()'' Retorna o número de bytes disponíveis.
 
* ''peek()'' Investiga o próximo byte de dados no buffer da porta serial. Não o recupera do buffer. Retorna -1 se não há dado disponível.
 
* ''flush()'' Descarrega o buffer da porta serial.
 
* ''end()'' Fecha a porta serial.
 
  
 +
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:
  
==EXEMPLO 1: Enviando texto para Monitor Serial==
+
[[imagem:Fig045_MCO018703.jpg|300px|center]]
  
<syntaxhighlight lang=vhdl>
+
;Exemplo 1:
  void setup(){
 
  Serial.begin(9600);
 
//Inicia a comunicação serial a 9600 bauds
 
  }
 
  
   void loop(){
+
<syntaxhighlight lang=c>
  Serial.println("Aprendendo a programar no arduino");   
+
void setup() {
// Envia a string "Aprendendo a programar no arduino"     
+
   // put your setup code here, to run once:
//para a console
+
    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);
 +
}
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 +
;Exemplo 2:
  
Agora acesse o Monitor Serial, no menu do Arduino.
+
<syntaxhighlight lang=c>
 +
/* 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);     
 +
}
 +
</syntaxhighlight>
  
O resultado é uma sucessão de impressões da string “Aprendendo a programar no arduino”.
+
=Portas Analógicas=
  
Vimos que iniciamos a comunicação serial através do comando serial.begin(9600) que colocamos dentro do setup(){} .
+
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 valor de 9600 pode variar dependendo da sua aplicação veja mais sobre velocidade da porta serial nesse post:
+
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.
[[http://www.tech-faq.com/difference-between-bit-rate-and-baud-rate.html Baud Rates]]
 
  
O comando ''Serial.print(“string aqui”)'' que faz com que a informação seja impressa no serial monitor.  
+
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:
  
Adiante veremos outros exemplos do uso do Serial.print, mas por ora quero que reparem que todo comando que não constrói um bloco (não tem “chaves” como o setup e o loop), ou então que não e uma diretiva de pré-processador (#include, #define que veremos adiante tambem)  termina com ponto e vírgula, isso indica o fim do comando.
+
<math>
 +
resolucao=\frac{V_{ref}}{2^n}\,
 +
</math>
  
==EXEMPLO 2: Acionando o LED do Arduino, via Monitor Serial==
+
onde:
  
No segundo teste, vamos acionar, acender e apagar, o led do pino 13 através de comandos de teclado do PC, na interface '''Serial Monitor''', do Arduino.
+
:Vref - tensão de referência do conversor A/D;
  
A programação também é simples e bem interessante:  
+
:n - número de bits do conversor.
  
  
<syntaxhighlight lang=c>
+
==Conversor A/D do Arduino==
#define LED 13
 
byte estebyte = 35;
 
void setup() {
 
    pinMode(LED, OUTPUT);
 
    Serial.begin(9600);
 
}
 
void loop() {
 
  Serial.println(" Como enviar valores formatados: ");
 
  Serial.println("Formato ASCII do valor: ");
 
  Serial.write(estebyte);
 
  Serial.println(".");
 
  Serial.println("Formato DECIMAL:");
 
  Serial.print(estebyte, DEC);
 
  Serial.println(".");
 
  Serial.println("Formato HEXADECIMAL:");
 
  Serial.print(estebyte, HEX);
 
  Serial.println(".");
 
  Serial.println("Formato BINÁRIO:");
 
  Serial.print(estebyte, BIN);
 
  Serial.println(".");
 
  Serial.println("");
 
  Serial.println("Agora, digite 0 no Monitor para apagar o LED e 1, para acender!");
 
  while(true)
 
  { if(Serial.available() > 0)
 
  { estebyte = Serial.read();
 
    if(estebyte == '1') // Digitou 1 no Monitor Serial
 
    { digitalWrite(LED, HIGH);
 
      Serial.println(" LED ACESO!");
 
    }
 
    if(estebyte == '0') // Digitou 0 no Monitor Serial
 
      { digitalWrite(LED, LOW);
 
      Serial.println(" LED APAGADO!");
 
      }//end if
 
    }//end if
 
  }//end while
 
}//end loop
 
</syntaxhighlight>
 
  
==EXEMPLO 3: Enviando estado de chave para Monitor Serial==
 
  
Neste teste, o estado de uma chave externa será lido e enviado pro Monitor Serial.
+
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.  
  
1) Montagem:
+
:'''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.
  
[[imagem:Fig022_MCO18703.png|500px|center]]
+
A placa Arduino UNO possui 6 canais de conversor analógico digital. Essas entradas são nomeadas de A0 a A5:
  
2) Código:
+
: A0 (pino 14),
 +
: A1 (pino 15),
 +
: A2 (pino 16),
 +
: A3 (pino 17),
 +
: A4 (pino 18) e
 +
: A5 (pino 19).
  
<syntaxhighlight lang=c>
+
Não é necessário definir-se na função ''setup( )'' se as portas serão usadas como entrada, ou saída.
int pushButton=2;
 
  
void setup()
 
{
 
  Serial.begin(9600);
 
  pinMode(pushButton, INPUT);
 
}
 
  
void loop()
+
==Funções para Entradas Analógicas==
{
 
  int buttonState=digitalRead(pushButton);
 
  
  Serial.println(buttonState);
+
  delay(1);
 
}
 
</syntaxhighlight>
 
  
3) No protoshield do laboratório:
+
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)
  
[[imagem:Fig023_MCO18703.jpg|400px|center]]
 
  
4) Quando pressiona a chave, efeito no Monitor Serial:
+
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.
  
[[imagem:Fig024_MCO18703.png|500px|center]]
+
Os tipos possíveis parâmetros de configurações (tipo) são:
  
==EXEMPLO 4: Acionando leds externos a partir do Monitor Serial ==
+
:   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;
  
Nosso primeiro teste de uso do Monitor Serial vai ser um circuito e programação que acionam dois leds, conforme a montagem abaixo:
+
:    INTERNAL: referência interna de 1,1V no Atmega168 e Atmega328, e 2,56 V no ATmega8;
  
[[imagem:Fig025_MCO18703.png|400px|center]]
+
:   INTERNAL1V1: referência de 1,1V, apenas no Arduino Mega;
  
Agora, abra a IDE do Arduino e escreva/compile/carregue a seguinte programação:
+
:    INTERNAL2V56: referência interna de 5,6 V, apenas no Arduino Mega;
  
<syntaxhighlight lang=c>
+
:    EXTERNAL: referência de tensão aplicada no pino AREF (valor entre 0 e 5V).
  
char c;
+
void setup()
 
{
 
    pinMode(2,OUTPUT);
 
    pinMode(3,OUTPUT);
 
    Serial.begin(9600);
 
}
 
  
void loop()
+
;int analogRead(pino)
{
 
    if (Serial.available()>0)
 
    {
 
      c = Serial.read() - '0';
 
      Serial.flush();
 
      digitalWrite(c,!digitalRead(c));
 
    }
 
}
 
</syntaxhighlight>
 
  
 +
  
Conecte o Arduino no PC, selecione a versão do seu Arduino (UNO, Duemilanove) e porta (COMx, ttyUSBx, ttyACMx) e clique em UPLOAD. Abra o Serial Monitor e selecione 9600 no ''baud''.
+
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.
 
 
Ao digitar o número 2 no Serial Monitor, irá acender o LED conectado na porta digital 2 do Arduino, e ao digitar novamente o número 2, o LED apagará. Agora se digitar o número 3, irá acender o LED da porta digital 3 e se digitar novamente o número 3, o LED apagará.
 
 
 
E é isso!
 
 
 
=Portas Analógicas=
 
 
 
É possível ler grandezas analógicas com o Arduino, além de valores digitais.
 
 
 
Para isto, existem 6 Portas analógicas para ENTRADA de dados:
 
* 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.  
 
 
 
A função de leitura das portas analógicas é a ''analogRead( PORTA )''
 
 
 
  O microcontrolador do Arduino dispõe de um Conversor Analógico-Digital (ADC) de 10 bits, o que significa capacidade de quantificar 1024 patamares de valor: 0 a 1023.
 
 
 
Ou seja, as tensões analógicas de entrada, que devem variar de 0 a 5 V, são quantificadas como:
 
:* 0 - correspondente ao valor de 0 V (GND)
 
:* 1 - correspondente ao valor de 1x(5 V - 0 V)/1024 = 0,0048828125 V
 
:* 2 - correspondente ao valor de 2x(5 V - 0 V)/1024 = 0,009765625 V
 
:* 3 - correspondente ao valor de 3x(5 V - 0 V)/1024 = 0,0146484375 V
 
:* ...
 
:* 1023 - correspondente ao valor de 5 V (VCC)
 
  
 +
 +
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).   
 
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]]
 
[[image:Fig026_MCO18703.jpg|500px|center]]
 
<center>
 
<center>
<b>ADC de 10 bits - 1024 patamares de quantificação.</b>
+
<sub>ADC de 10 bits - 1024 patamares de quantificação.</sub>
 
</center>
 
</center>
  
 +
==Lendo dados de um potenciômetro==
  
==EXEMPLO 1: Lendo dados de um potenciômetro==
+
;EXEMPLO 1:  
  
1) Esquemático:
+
;Esquemático:
  
 
[[image:Fig027_MCO18703.jpg|400px|center]]
 
[[image:Fig027_MCO18703.jpg|400px|center]]
Linha 238: Linha 194:
 
Para ler os valores diretamente em Volts:
 
Para ler os valores diretamente em Volts:
  
2) Código fonte:
+
;Código fonte:
  
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
Linha 245: Linha 201:
 
   Serial.begin(9600);
 
   Serial.begin(9600);
 
}
 
}
 
+
 
void loop()
 
void loop()
 
{  
 
{  
     float valt;
+
     float valor;
 
     int val = analogRead(0);
 
     int val = analogRead(0);
 
+
     valt = (val*5.0)/1023;
+
     valor = (val*5.0)/1023;
 
+
     Serial.println(valt);
+
     Serial.println(valor);
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
  
==EXEMPLO 2: Lendo dados do potenciômetro para temporizar o LED==
+
==Lendo dados do potenciômetro para temporizar o LED==
 +
 
 +
;EXEMPLO 2:
 +
 
 +
;Esquemático:
  
1) Esquemático:
 
  
 
[[image:Fig028_MCO18703.jpg|400px|center]]
 
[[image:Fig028_MCO18703.jpg|400px|center]]
  
2) Código fonte:
+
 
 +
;Código fonte:
  
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
Linha 285: Linha 245:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
==EXEMPLO 3: Lendo um NTC e utilizando a equação de Steinhart-Hart ==
+
=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>
 +
 
  
1) Esquemático:
+
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.
  
[[image:Fig029_MCO18703.jpg|500px|center]]
 
  
2) Código fonte (5V):
+
 
 +
;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:
 +
 
 +
[[image:Fig048_MCO18703.jpg|300px|center]]
 +
 
 +
 
 +
;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>
 +
 
 +
 
 +
;Código fonte (Equação ''Steinhart-Hart''):
  
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
Linha 324: Linha 351:
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
 +
=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.
 +
 +
 +
[[Imagem:Fig034_MCO018703.png|center|200px]]
 +
<center>
 +
Figura - LDR Sensor de luminosidade. [6]
 +
</center>
 +
 +
 +
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:
 +
 +
[[Imagem:Fig035_MCO018703.png|center|200px]]
 +
<center>
 +
Figura - Circuito elétrico do divisor de tensão do LDR e resistor de 10kΩ.
 +
</center>
 +
 +
;Esquemático:
 +
 +
[[image:Fig049_MCO18703.jpg|300px|center]]
 +
 +
 +
;Código fonte:
 +
 +
 +
<syntaxhighlight lang=c>
 +
const int sensor=A0;
 +
 +
void setup()
 +
{
 +
    Serial.begin(9600);
 +
}
 +
 +
void loop()
 +
{
 +
  int valor=analogRead(sensor);
 +
  Serial.println(valor);
 +
}
 +
</syntaxhighlight>
 +
 +
;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://wiki.ifsc.edu.br/mediawiki/index.php/AULA_4_-_Microcontroladores_-_T%C3%A9cnico
+
[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/
 +
 
  
[2] https://wiki.ifsc.edu.br/mediawiki/index.php/AULA_5_-_Microcontroladores_-_T%C3%A9cnico
 
  
  

Edição atual tal como às 17h23min de 15 de setembro de 2020

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