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
-
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?
-
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.
-
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..
-
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?
-
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...
-
Secalhar posso ligar o fio amarelo da Fan a um pino digital do Arduino e utilizar algo como isto
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
-
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?
-
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
-
Experimenta trocar para low por exemplo.
O pulsein retorna micro-segundos, converte para Hz e depois para rpm, deve dar igual
-
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)
-
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
-
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.
-
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?
-
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.
-
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
-
ena.. :D voltando a este tópico
Tenho uma situação, colocando apenas o código para obter o valor pulsein funciona bem:
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:
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?
-
Que tipo de variavel é esse duration?
É que estás a dividir por 1/duration, a seguir multiplicas por 1 milhão, e etc..
-
lol foi a maneira de chegar +/- aos valores reais ;D
unsigned long duration;
float duration2;
-
Possa... é muito complicado obter valores certos, usando simplesmente este código:
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 ?