Mudanças entre as edições de "MCO018703 2018 2 AULA08"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
Linha 65: Linha 65:
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
 +
=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 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>
 +
<b>ADC de 10 bits - 1024 patamares de quantificação.</b>
 +
</center>
 +
 +
 +
==EXEMPLO 1: Lendo dados de um potenciômetro==
 +
 +
1) Esquemático:
 +
 +
[[image:Fig027_MCO18703.jpg|400px|center]]
 +
 +
Para ler os valores diretamente em Volts:
 +
 +
2) Código fonte:
 +
 +
<syntaxhighlight lang=c>
 +
void setup()
 +
{
 +
  Serial.begin(9600);
 +
}
 +
 +
void loop()
 +
{
 +
    float valt;
 +
    int val = analogRead(0);
 +
 
 +
    valt = (val*5.0)/1023;
 +
 +
    Serial.println(valt);
 +
}
 +
</syntaxhighlight>
 +
 +
==EXEMPLO 2: Lendo dados do potenciômetro para temporizar o LED==
 +
 +
1) Esquemático:
 +
 +
[[image:Fig028_MCO18703.jpg|400px|center]]
 +
 +
2) Código fonte:
 +
 +
<syntaxhighlight lang=c>
 +
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);
 +
}
 +
</syntaxhighlight>
 +
 +
==EXEMPLO 3: Lendo um NTC e utilizando a equação de Steinhart-Hart ==
 +
 +
1) Esquemático:
 +
 +
[[image:Fig029_MCO18703.jpg|500px|center]]
 +
 +
2) Código fonte (5V):
 +
 +
<syntaxhighlight lang=c>
 +
#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);
 +
}
 +
</syntaxhighlight>
 +
 +
  
 
=Referências=
 
=Referências=

Edição das 14h13min de 25 de setembro de 2018

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 (0 ou 1). 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. Abaixo vemos um exemplo de programa em Arduino que muda a intensidade do brilho de um LED utilizando PWM.

Fig003 MCO18703.jpg


/* Esse programa escrito em C do Arduino aumenta e diminui gradativamente o brilho de um LED 
conectado no pino PWM 10 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(13,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 (13, i); // o nº do pino e o valor de i são passados à função analogWrite( )
   delay (10);      
}

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 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.


EXEMPLO 1: Lendo dados de um potenciômetro

1) Esquemático:

Fig027 MCO18703.jpg

Para ler os valores diretamente em Volts:

2) Código fonte:

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

void loop()
{ 
    float valt;
    int val = analogRead(0);
  
    valt = (val*5.0)/1023;

    Serial.println(valt);
}

EXEMPLO 2: Lendo dados do potenciômetro para temporizar o LED

1) Esquemático:

Fig028 MCO18703.jpg

2) 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);
}

EXEMPLO 3: Lendo um NTC e utilizando a equação de Steinhart-Hart

1) Esquemático:

Fig029 MCO18703.jpg

2) Código fonte (5V):

#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);
}


Referências

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


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