LusoRobótica - Robótica em Português

Sistemas específicos => Arduino / AVR => Tópico iniciado por: almamater em 30 de Abril de 2011, 15:34

Título: Fan RPM counter
Enviado por: almamater em 30 de Abril de 2011, 15:34
Com arduino conseguimos facilmente contar as voltas de uma ventoinha..:

(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg534.imageshack.us%2Fimg534%2F1595%2Frpmcounter.th.png&hash=0a78538baf69c3487c046738ebd40d841e450f66) (http://img534.imageshack.us/i/rpmcounter.png/)

Como o Arduino não tem muitos pinos 'interrupt (http://www.arduino.cc/en/Reference/AttachInterrupt)' só podemos utilizar no máximo 2 ventoinhas (pelo que percebi)!

Alguém sabe se é possível utilizar mais? de outra forma c/ outra configuração/esquema?
Título: Re: Fan RPM counter
Enviado por: senso em 30 de Abril de 2011, 17:08
Praticamente todos os pinos do Atmega328p têm a função de pin-change interrupt, pesquisa sobre isso no datasheet.
Basicamente é uma interrupção que é gerada assim que houver uma mudança de estado em qualquer um dos pinos do porto, depois entra na ISR e vez quem é que mudou de estado lendo o valor dos pinos e comparando com o antigo valor e assim incrementas a variavel devida, ou então, experimenta o pulse-in.
Título: Re: Fan RPM counter
Enviado por: almamater em 01 de Maio de 2011, 11:54
A explicação do PulseIn na página http://www.arduino.cc/en/Reference/PulseIn (http://www.arduino.cc/en/Reference/PulseIn) parece adaptar-se ao que se pretende..

Fazendo o mesmo esquema do projecto "Reading Fan RPM" http://www.arduino.cc/playground/Main/ReadingRPM (http://www.arduino.cc/playground/Main/ReadingRPM) (imagem do 1º post) para qualquer um dos pinos digitais será que resulta com o código do PulseIn?
 Não sei se o sinal enviado através do fio amarelo da Fan pode ser tratado/reconhecido dessa forma..

Título: Re: Fan RPM counter
Enviado por: GnGz em 01 de Maio de 2011, 18:23
A explicação do PulseIn na página http://www.arduino.cc/en/Reference/PulseIn (http://www.arduino.cc/en/Reference/PulseIn) parece adaptar-se ao que se pretende..

Fazendo o mesmo esquema do projecto "Reading Fan RPM" http://www.arduino.cc/playground/Main/ReadingRPM (http://www.arduino.cc/playground/Main/ReadingRPM) (imagem do 1º post) para qualquer um dos pinos digitais será que resulta com o código do PulseIn?
 Não sei se o sinal enviado através do fio amarelo da Fan pode ser tratado/reconhecido dessa forma..

Já agora podemos, controlar a fan por pwm sem que queime o arduino?
Título: Re: Fan RPM counter
Enviado por: CBX em 01 de Maio de 2011, 18:35
com um transístor podes, directamente não, a não ser aquelas com 4 pinos, mas não sei qual a tensão com que aquilo funciona...
Título: Re: Fan RPM counter
Enviado por: almamater em 03 de Maio de 2011, 11:15
Secalhar posso ligar o fio amarelo da Fan a um pino digital do Arduino e utilizar algo como isto

Código: [Seleccione]
int sensor=5;
int val=0;
int ledPin=12;

void setup(){
pinMode(sensor,INPUT);
pinMode(ledPin,OUTPUT);
}

void loop(){
val=digitalRead(sensor);
if(val){
digitalWrite(ledPin,HIGH);
else
digitalWrite(ledPin,LOW);
}

Mesmo que não se consiga calcular a velocidade ao menos para saber se está parada ou a rodar
Título: Re: Fan RPM counter
Enviado por: senso em 03 de Maio de 2011, 17:42
Mas a ventoinha dá-te uma onda quadrada, esse código vai estar sempre a ler HIGH's e LOW's, se usares a função pulsein ela dá-te a frequência dessa onda, se tens a frequência tens a rotação da ventoinha, para que complicar o que é simples?
Título: Re: Fan RPM counter
Enviado por: almamater em 03 de Maio de 2011, 22:39
Código: [Seleccione]
int pin = 7;
unsigned long duration;

void setup()
{
  Serial.begin(9600); // Inicializa a comunicação serial
  pinMode(pin, INPUT);
}

void loop()
{
  duration = pulseIn(pin, HIGH);
  Serial.println(duration);
}
;D


Assim retorna um valor de ~3600, através do outro método (interrupts) a fan devolve umas  4200 RPM..  tenho de fazer um cálculo qualquer agora, por default o PulseIn é 1 segundo, baixando de 1 segundo ele retorna sempre 0.. mas ao menos já se sabe se a Fan está parada ou nao
Título: Re: Fan RPM counter
Enviado por: senso em 03 de Maio de 2011, 23:02
Experimenta trocar para low por exemplo.
O pulsein retorna micro-segundos, converte para Hz e depois para rpm, deve dar igual
Título: Re: Fan RPM counter
Enviado por: almamater em 04 de Maio de 2011, 16:09
Experimenta trocar para low por exemplo.
O pulsein retorna micro-segundos, converte para Hz e depois para rpm, deve dar igual

Só li agora, testei mudar para LOW duration = pulseIn(pin, LOW); e aumentou um pouco para ~3690..   quanto às conversões vou então aprender como se faz (google  ;D)
Título: Re: Fan RPM counter
Enviado por: almamater em 17 de Maio de 2011, 11:00
Descobri que existem chips específicos para projectos de speedometers etc, como o LM2907 (http://www.national.com/ds/LM/LM2907.pdf)

Nos exemplos de aplicações têm isto:

(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg4.imageshack.us%2Fimg4%2F3295%2Flm2907.th.png&hash=8ab6464bf29b6db035461a5804a2134f02067193) (http://imageshack.us/photo/my-images/4/lm2907.png/)

Em vez daqueles 2 fios no "Magnetic Pickup" secalhar dá para adaptar à Fan.. não há muita informação sobre circuitos com este chip, mas parece ser fixe 
Título: Re: Fan RPM counter
Enviado por: senso em 17 de Maio de 2011, 16:40
Isso converte frequência em voltagem, mas assim vais precisar de um monte de chips desses, continuo a dizer, pin change interrupt ou mesmo o pulseIn serve perfeitamente para isso.
Título: Re: Fan RPM counter
Enviado por: andre_f_carvalho em 17 de Maio de 2011, 19:11
Descobri que existem chips específicos para projectos de speedometers etc, como o LM2907 (http://www.national.com/ds/LM/LM2907.pdf)

Nos exemplos de aplicações têm isto:

(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg4.imageshack.us%2Fimg4%2F3295%2Flm2907.th.png&hash=8ab6464bf29b6db035461a5804a2134f02067193) (http://imageshack.us/photo/my-images/4/lm2907.png/)

Em vez daqueles 2 fios no "Magnetic Pickup" secalhar dá para adaptar à Fan.. não há muita informação sobre circuitos com este chip, mas parece ser fixe

daria para utilizar este esquema ligado directamente aos platinados de um carro e dp ler com um pic a 5v?
Título: Re: Fan RPM counter
Enviado por: senso em 17 de Maio de 2011, 19:20
Não porque os platinados estão depois da bobine normalmente isso quer dizer que andam lá mais de 5kV garantidamente e alguns casos até mais de 10kV.
Título: Re: Fan RPM counter
Enviado por: almamater em 17 de Maio de 2011, 21:32
eu só referi esta forma frequencia-> voltagem pq parece ser mais simples o cálculo das rpm e o chip tomava conta da situação.. mas foi uma ideia  :P
Título: Re: Fan RPM counter
Enviado por: almamater em 22 de Outubro de 2011, 10:07
ena..   :D voltando a este tópico

Tenho uma situação, colocando apenas o código para obter o valor pulsein funciona bem:

Código: [Seleccione]
void loop()  {
  Serial.println("-----FAN1");

  duration = pulseIn(pin1, HIGH);
  duration2=(duration*2);
  duration2=(1/duration2);
  duration2=(duration2*1000);
  duration2=(duration2*1000);
   duration=(duration2*60/2);

  Serial.println(duration);
}

Se colocar código associado a outras coisas já se atrofia todo.. exemplo:

Código: [Seleccione]
void loop()  {
  Serial.println("-----FAN1");

  duration = pulseIn(pin1, HIGH);
  duration2=(duration*2);
  duration2=(1/duration2);
  duration2=(duration2*1000);
  duration2=(duration2*1000);
  duration=(duration2*60/2);

  Serial.println(duration);

//Temperatura:
sensors.requestTemperatures();
Serial.print("Temperature for Device 1 is: ");
temperature=(sensors.getTempCByIndex(0));
Serial.println(temperature);
Serial.print("Temperature for Device 2 is: ");
temperature=(sensors.getTempCByIndex(1));
Serial.println(temperature);
}

Fico com valores de 18032 em vez de 3050  :o

Para obter os valores correctos de RPM tenho de executar o código pilsein sozinho?


Título: Re: Fan RPM counter
Enviado por: senso em 22 de Outubro de 2011, 16:39
Que tipo de variavel é esse duration?
É que estás a dividir por 1/duration, a seguir multiplicas por 1 milhão, e etc..
Título: Re: Fan RPM counter
Enviado por: almamater em 22 de Outubro de 2011, 18:12
lol foi a maneira de chegar +/- aos valores reais  ;D

unsigned long duration;
float duration2;
Título: Re: Fan RPM counter
Enviado por: almamater em 26 de Outubro de 2011, 01:12
Possa... é muito complicado obter valores certos, usando simplesmente este código:

Código: [Seleccione]
int pin = 7;
unsigned long duration;

void setup()
{
  Serial.begin(9600); // Inicializa a comunicação serial
  pinMode(pin, INPUT);
}

void loop()
{
  duration = pulseIn(pin, HIGH);
  Serial.println(duration);
}

Tenho valores completamente diferentes consoante as ventoinhas, com uma bastante potente de 80mm tenho 3600 de resultado, com uma ventoinha de 120mm já tenho
15084.

Pensei que fosse por ser de 120mm, mas testei uma outra de 80mm e tenho os mesmo valores ~14033..

Usando o attachInterrupt os valores batem sempre certo independentemente do tipo de ventoinha.. tem a ver com o tipo de hall effect sensor ?