Como gerar um sinal analógico com o Arduino 11

Saiba como obter um sinal analógico com o Arduino que pode ser aplicado em instrumentação ou controle industrial. Com este sinal é possível controlar a velocidade de rotação de um motor que utilize Inversor de Frequência, por exemplo.

Demonstração de Funcionamento 0 a 5Vcc | Fonte: Autoral

Introdução

Existem padronizações de sinais para trabalhar com sensores e atuadores. Quando queremos alguma proporcionalidade, os sinais 0 a 5Vdc ou 0 a 10Vdc atendem muito bem as nossas necessidades. 

É muito comum encontrar esse tipo de sinal em instrumentação eletroeletrônica. Quando ligamos um potenciômetro na entrada analógica do Arduino, estamos enviando uma referência analógica para nosso microcontrolador. 

E o que fazer quando queremos que nosso Arduino controle um atuador como válvula proporcional ou inversor de frequência? 

Este post, através de 02 projetos, ensinará o que é necessário de eletrônica e programação para fazer a interface entre o sinal PWM que o Arduino fornece e um atuador que precisa de referência analógica.

Introdutório sobre o PWM

A saída que o Arduino oferece quando utilizamos a função analogWrite() não é literalmente analógica. São períodos ligados e períodos desligados em uma frequência fixa. Na maioria dos pinos, inclusive o que estaremos utilizando, a frequência é de 490Hz

PWM 50% Duty Cycle | Fonte: Autoral

Quando medimos com um multímetro, temos a tensão média de VCC (5V no caso do Arduino) sobre o pino utilizado. Por exemplo, um sinal PWM igual ao demonstrado acima com 50% de Duty Cycle (ciclo de trabalho) terá uma tensão média de 2,5V, mas não será uma tensão analógica de 2,5V. Nossa intenção aqui é obter sinais analógicos e para isso devemos acompanhar os próximos passos.

Com dúvidas sobre o que é um sinal PWM? Sugiro que leia o artigo aqui do blog sobre Controle de Velocidade com PWM e entenda um pouco mais sobre a sigla que significa Pulse Width Modulation (Modulação em Largura de Pulso).

Código

O código desta programação é muito simples. Ele lê o valor de referência analógica do pino A0 e aciona proporcionalmente a saída PWM 3. Só lembrando que a resolução da entrada analógica é 10 bits, valores variando entre 0 a 1023. Já a saída PWM tem resolução de 8 bits, valores variando entre 0 a 255. Por esse motivo temos uma conversão utilizando a função map().

/* Programa para Artigo MakerHero:
 * Como obter um sinal analógico com o Arduino  
 * Autor: Eduardo Castro
 * Arduino IDE: "1.8.12"
 * Placa: "Arduino UNO"
*/
// ======================================================================
// --- Variáveis ---
unsigned int potenciometro;
unsigned int pwm;
// ======================================================================
// --- void setup ---
void setup() 
{
   pinMode(3,OUTPUT);   // declara pino 3 como saída
}
// ======================================================================
// --- void loop ---
void loop()
{
   potenciometro = analogRead(A0); // atribui valor da entrada A0 à variavel potenciometro
   pwm = map(potenciometro,0,1023,0,255); // atribui valor de potenciometro já remapeando de 0 a 255
   analogWrite(3,pwm); // saída 3 com valor da variável pwm
}
// ======================================================================
// --- FIM ---

Material necessário para nosso primeiro projeto

O objetivo deste primeiro projeto é obter uma tensão analógica que varia de 0 a 5Vcc utilizando o pino 3 do Arduino Uno.

Para reproduzir o projeto, você precisará de:

Projeto 1 | Montagem do Circuito

O circuito eletrônico não requer tantos componentes, mas seu princípio de funcionamento é muito interessante e envolve conceitos de eletrônica analógica.

Esquemático montado no fritzing | Fonte: Autoral

O Arduino deve ser alimentado por uma fonte externa de no mínimo 7Vcc para também fornecer essa tensão ao amplificador operacional. Contudo, recomendo que utilize uma de  12Vcc, que será também aproveitada em nosso segundo projeto neste mesmo post.

Temos também um potenciômetro gerando uma referência de 0 a 5Vcc para o nosso Arduino.

Primeiramente nosso sinal PWM do pino 3 do Arduino entra em um filtro passa baixas. Para quem desconhece, esse filtro tem a função de deixar passar somente ondas com frequências inferiores à frequência de corte que o projetista estipular. O cálculo para determinar a frequência de corte é:

Frequência de Corte = 1 / 2𝝿.R.C

Para efeitos práticos e funcionais, utilizaremos o resistor de 100kΩ e o capacitor de 1uF, desta forma, teremos uma frequência de corte na ordem aproximada de 1,59Hz. O que passar do valor estipulado será “drenado” GND pelo capacitor.

Ao medir com um osciloscópio na saída do filtro já teremos uma tensão analógica. Porém, desejamos inserir uma carga que pode ser desconhecida, concorda? Sabemos que será um atuador que receberá nosso sinal, contudo, desconhecemos a impedância do circuito.

Para solucionar tal questão, utilizamos o amplificador operacional LM358 na configuração buffer. Assim, o valor de tensão na saída do nosso filtro entra no amplificador operacional e não precisaremos nos preocupar com casamento de impedâncias. Então, consideramos a que saída final do circuito após todas as etapas é o pino 1 do amplificador operacional LM358.

Pinagem do LM358 | Fonte: ON Semiconductor

Temos também 02 capacitores de 100nF nas linhas de alimentação 5Vcc e outro capacitor na mesma ordem na linha de alimentação 12Vcc fazendo a função de desacoplamento. Esses capacitores tem a função de estabilizar as tensões de alimentação do nosso circuito. 

Projeto montado para gerar sinal analógico com Arduino
Montagem em Bancada| Fonte: Autoral

Material necessário para nosso segundo projeto

O objetivo deste segundo projeto é obter uma tensão analógica, mas que desta vez variando de 0 a 10Vcc utilizando o pino 3 do Arduino Uno. 

Para reproduzir o projeto, você precisará de:

Projeto 2 | Montagem do Circuito

O princípio de funcionamento do segundo projeto é muito parecido com o anterior. Ainda temos o filtro passa baixa, mas agora a sua saída é interligada com a entrada do amplificador na configuração não inversor.

A fonte de alimentação deve ser 12Vcc para que nosso projeto tenha os resultados esperados. Caso esse requisito não seja cumprido, nosso amplificador operacional pode não conseguir amplificar o sinal de entrada como o desejado.

Desta forma é possível obter ganho em sua saída. Resumidamente, teremos uma multiplicação na amplitude do nosso sinal.

Amplificador Operacional na configuração Não Inversor com ganho variável | Fonte: Autoral

O cálculo para determinarmos o ganho do amplificador é:

Ganho = 1+(RF/R1)

Nesta configuração e com os valores estabelecidos conforme esquemático, nosso ganho será entre 1,47 e 2,47. Como queremos uma saída de 0 a 10Vcc, devemos ajustar nosso trimpot de maneira que Rf (resistência 4k7 + resistência variável) seja 10k, desta forma, nosso ganho será 2. Portanto Vin (tensão de entrada) será multiplicado por 2.

Esquemático do gerador do sinal analógico com Arduino
Esquemático montado no fritzing | Fonte: Autoral

O resultado de tudo isso é que nossa saída do circuito quando medida no pino 1 do LM358 será de 0 a 10Vcc dependendo do valor de referência do potenciômetro.

Sinal analógico gerado com Arduino
Demonstração de Funcionamento 0 a 10Vcc | Fonte: Autoral

Note que o sinal no canal 2 do osciloscópio (em verde) é o sinal PWM da saída 3 do Arduino Uno. O canal 1, em amarelo, capta a saída do nosso circuito, pino 1 do LM358. Atente-se à escala dos canais, desta forma será notada a variação da tensão linearmente  e proporcionalmente partido de 0 e atingindo à grandeza de 10 Vcc.

Conclusão

Talvez esteja pensando: Se o circuito eletrônico já possui um potenciômetro, porque não utilizá-lo diretamente como referência de tensão?

O programa e o resistor variável estão aqui a título de demonstração, você pode implementar a quantidade de sensores e sinais o quanto preferir em sua lógica de programação, tudo dependerá da necessidade da aplicação. Contudo, o circuito de saída utilizando filtro passa baixa e amplificador operacional certamente será um trunfo em seu projeto, podendo servir de ferramenta para a resolução de desafios eletroeletrônicos.

Gostou de aprender sobre sinal analógico com Arduino? Deixe seu comentário.

Realizou os ensaios dos projetos? Compartilhe a experiência. Sua participação é muito importante para o Universo Maker.

Faça seu comentário

Acesse sua conta e participe

11 Comentários

  1. Ola Boa noite !
    Estou mudando o painel de instrumentos do meu carro ,eu preciso converter o sinal analógico do sensor de temperatura para sinal digital que vai para o painel de instrumentos .
    Eu coloquei um arduino nano o sinal analógico na porta a0 e o saida digital na porta d3 .
    Eu nao estou conseguindo elabora o comando para passar para o arduino

  2. Olá Eduardo, que bacana seu tutorial! Vai me ajudar muito! Você tem alguma publicação científica a respeito desse tema em seu nome? Gostaria de referencia-lo em minha dissertação 🙂

    1. Olá Marcel, fico muito feliz que você tenha gostado e ter sido útil para você.
      Sobre publicação científica sobre o tema, vou ficar te devendo. Mas me deu uma ótima ideia, obrigado.
      🙂

      Eduardo de Castro Quintino
  3. Oi Eduardo bom dia tem como me ajudar em um variador de corrente de 4 a 20mA ?

    1. Olá Mauricio.
      Quais são suas dúvidas com relação a um variador de corrente 4 a 20mA?

      Eduardo de Castro Quintino
  4. Podes esclarecer como escolher a frequência de corte que será melhor para a saída desejada?

    1. Olá,
      Excelente pergunta Janaina.
      A resposta depende muito da sua aplicação, mas para essa do artigo, precisa considerar o quanto de atraso no sinal e a amplitude de variação na saída (“ruído”) está disposta a deixar que o seu circuito tenha, envolve o que chamo de “custo x benefício”.

      Por exemplo, quando calculamos a fc (frequência de corte) estamos considerando o ponto inicial da atenuação a -3db, ou seja, a partir de 1,59Hz o filtro estará agindo.

      Na prática será o seguinte:
      – Frequência de corte mais baixa: menor amplitude o ruído de saída – mais atraso no sinal;
      – Frequência de corte mais alta: maior amplitude o ruído de saída – menos atraso no sinal.

  5. Muito 1000 esta aplicação. Se pudessem fazer também um projeto para sinal analógico de 4 a 20 mA ou 0 a 20mA seria 10. Afinal quando fazemos aplicações industriais não temos tempo de desenvolver circuitos em laboratório. Pois tudo é para ontem.

    1. Olá José. Obrigado pelo feedback.
      É uma ideia interessante gerar sinais de corrente para controle industrial.

      1. Parabéns professor.
        Tenho a mesma necessidade. IOT é muito AC 220 mono e trifasico e tempou ou nenhuma abordagem a exemplo de controle de velocidade de motores, uma camada intermediaria entre os variadores de frequencia, indo muito além do DC maker, que inclusive não oferece risco de choque elétrico, outro desafio no mundo IOT não residencial.

        1. Olá.
          Obrigado pela mensagem. No que eu puder, estarei sempre contribuindo com a comunidade com aplicações reais e funcionais.
          Grande abraço.