Postagem em destaque

Controle PID de Potência em Corrente Alternada - Arduino e TRIAC - Parte I

Este post é o primeiro de uma série de seis que escrevi tratando de controle de potência e PID (controle proporcional, integral e derivativo...

domingo, 6 de março de 2016

Detectando pulsos com o Arduino

Dia desses apareceu no Automação no Parque um velho conhecido, o Bruno, um aluno que trouxe o seu TCC tempos atrás e que foi um dos projetos mais legais que a gente já fez. Foi um controle de potência de chuveiro, que deu origem aos posts mais acessados desse blog, a série sobre Controle de Potência por Ângulo de Fase.

Dessa vez ele trouxe um problema, senão tão difícil,  bem interessante. Ele está fazendo estágio num desses vários centros de pesquisa do governo que tem em SJC (me esqueci qual) e por lá rolou o seguinte problema:

- Os caras tem um equipamento que precisa coletar pulsos de um pouco mais de 2V e de 50µs de duração. Existe por lá um equipamento caro que detecta esse pulso, mas eles querem tentar substituir por algo mais em conta.

A pergunta: será que o Arduino "auguenta"???

Como o equipamento não poderia vir até nós, tínhamos que tentar gerar um sinal semelhante para testar. Prá isso, nada melhor que outro Arduino.

























Circuito "simplão", com um Arduino para gerar os pulsos e outro para detectá-los. O Arduino da esquerda gera os pulsos, o da direita detecta. O potenciômetro ajusta a tensão do pulso, para que possamos fazê-la semelhante ao que o Bruno precisa.

Para monitorar os pulsos, usamos um osciloscópio para monitorar o comportamento da bagaça:

Os pulsos vistos aqui foram os que fizemos inicialmente, de 100µs a cada ms. O potenciômetro foi usado para ajustar a tensão, também medida pelo osciloscópio e ajustada para 2V.









Os pulsos foram gerados pelo seguinte código:

#define P_OUT 7

void setup()
{
  pinMode(P_OUT,OUTPUT);
}

void loop()
{
  digitalWrite(P_OUT,LOW);
  delayMicroseconds(1000);
  digitalWrite(P_OUT,HIGH);
  delayMicroseconds(100);
}

Já na detecção foi usado o seguinte código:

#define P_IN 8

void setup()
{
  pinMode(P_IN,INPUT);
  Serial.begin(115200);
}

long t = 0;
int i = 0;

void loop()
{
  t=pulseIn(P_IN,HIGH);
  if(t==0)
    return;
  Serial.print(t-7);
  Serial.print(' ');
  i++;
  if(i > 20)
  {
    Serial.println();
    i=0;
  }
}

O comando pulseIn do Arduino é chave no processo. Ele espera, na porta P_IN, que um pulso HIGH aconteça. Um pulso HIGH significa que o sinal do Arduino saiu de LOW (0V), foi prá HIGH (mais sobre isso abaixo) e prá LOW de novo. A função retorna a duração, em µs, do pulso detectado.

A função possui um terceiro parâmetro, opcional, que recebe o tempo de espera, quer dizer, quanto tempo a função espera pelo pulso. O default é 1s. Mais informações aqui.

E qual é exatamente o valor HIGH, quer dizer, qual o valor mínimo de tensão que o Arduino detectaria? E qual a mínima largura do pulso, ou seja, quanto tempo o pino tem que ficar HIGH para que o Arduino o detecte? Esse foi o objetivo do nosso experimento, a própria documentação do Arduino fala que tem que ser assim, empiricamente.

O programa de detecção imprime a duração de cada pulso detectado. O valor da variável t é subtraído de 7 porque, depois de vários experimentos, determinamos que  chama da função retorna sempre 7µs a mais a cada valor medido. Talvez seja esse o tempo consumido pela própria função, sei lá eu.

A gente conseguiu baixar a largura do pulso até 5µs, e a tensão até 2,1V. Menos do que isso o Arduino Mega (detector) não conseguia perceber o pulso.


Ao lado, pulso de 5µs.

Acho que depois vale a pena fazer um estudo melhor disso, ver se existem outras implementações do pulseIn na internet, ver se o valor da tensão tem alguma correlação com a largura do pulso (quer dizer, se por exemplo o pulso fosse de 5V, será que ele detectaria um pulso de menos de 5µs de duração?) etc.

De toda forma, atingimos com uma certa folga (pelo menos na largura do pulso) o objetivo buscado pelo Bruno. Ele vai seguir com o projeto e depois (espero eu!) nos dará retorno sobre o que aconteceu.

É isso.

Abaixo, filme do troço funcionando. Dá prá ver os dois Arduinos, o circuito com o potenciômetro, a tela do osciloscópio e os resultados no notebook.




E abaixo, funcionando com pulsos de 5µs a cada segundo. Repare que é bem difícil de perceber o pulso na tela do oscilocópio.

É isso.