ayuda codigo cuentarrevoluciones

hola a todos, a ver el tema es el siguiente ...hace tiempo que tengo el arduino pero trasteo poco con el y voy muy despactiooo, la cuestion es que para empezar queria intentar medir las revuliciones de un motor cualqiuera y e empezado haciendo un montaje sobre un ventilardor de pc,un brazo que sobresale del eje con una raya blanca ....y un CNY70 colocado debajo del brazo , como a 0,5 mm ..... bueno de esta manera parece fucionarece recojer un pulso por cada vuelta del brazo y encender un led cada vez que el brazo pasa por el CNY............ mi duda es ....con este montaje puedo hacer algo sencillito para empezar ha hacer un cuentaRPM ...lo e estado mirando pero la verdad es que me hago con el codigo, no se bien usar la funcion millis ...ni muchas otras por que no tengo ni P de programacion ..asi que si alguien me pudiera dar alguna pista sobre las formulas que debo utilizar para obtener las RPM y la forma de aplicarlas al codigo le estaria muy agradecido!

ESPERO QUE LOS REYES OS TRAIGAN MUCHOS CACHARRITOS PARA CHEMAR ESTE AÑO!!

Hola,

Mira a ver si esto te ayuda => Tinkering with Electronics...: Shift Lights con Arduino
La salida de rpm, se muestra al usuario mediante unos leds, pero puedes adaptarlo a tus necesidades.

Salu2 :wink:

Igor R.

ok! gracias Igor, ahora le echo un vistazo a ver si asi me aclaro un poco

hola, e probado mi montaje con la parte del codigo de Igor que me interesaba ....pero la verdad no termino de entender la formula que utiliza (uno que es mu cortito con las mates ..jeje..) que hace?recoje el numero de revoluciones que se producen en los 100 milis de delay y las divide entre esos 100 milis ?? entonces por que el 2* milis de la formula , por que 2? alguien me saca de mi ignorancia jeje? Aparte habla de que el recoje 4 pulsos por vuelta , yo solo 1.. y eso no veo en que parte del codigo se refleja ... GRacias!!

pinMode(2,INPUT);
attachInterrupt(0, rpm, RISING);
Serial.begin(9600);
}

void rpm()
{
cont_rpm++;

}

void loop()
{
static unsigned long rpm_ant;
static unsigned long t_anterior;
static float rpm_actuales;

rpm_ant=cont_rpm;
t_anterior=millis();

delay(100);

rpm_actuales=(cont_rpm-rpm_ant)/(2.0*(millis()-t_anterior)/60000);
Serial.println(rpm_actuales);

http://interface.khm.de/index.php/lab/experiments/arduino-frequency-counter-library/

Hola,

El link que ha puesto Chiva, es lo más "pro", que es usar un timer para medirlo, pero para empezar con algo fácil, usando interrupciones lo haces muy sencillo y con código Arduino (Wiring).

La cuenta que tienes que hacer es:
¿Cuantas revoluciones gira en un minuto? Es decir, cuantas vueltas da en un determinado tiempo?

Es importante declarar la variable que incrementas en la rutina de la interrupción como volatile: volatile unsigned long cont_rpm;

El "2" en las cuentas de mi montaje, como viene explicado en el texto, es porque estoy midiendo la velocidad en el arbol de levas, que va al doble de velocidad que el cigüeñal y tengo 4 pulsos por vuelta. Resumiendo, nada que ver para tu aplicación.

Para terminar, la operación a realizar, es tan sencilla como dividir en número de pulsos entre el tiempo en el cual se han producido. Como quieres tener rpm, pues el tiempo tiene que estar en minutos. Y como tienes 1 pulso cada vuelta, no tienes que hacer nada más....

En el Playground tienes otro ejemplo: Arduino Playground - ReadingRPM

Salu2 :wink:

Igor R.

bueno, he seguido probando y mas o menos he entendido el rollo jeje, pero como lo que queria, mas que otra cosa era escribir mi propio miniprogramita he probado a escribirlo con pulseIn ...tal que asi:

duracion = pulseIn (2,HIGH);
Rpm = (60000000/duracion);

asi deberia funcionar, con menos precision, pero mas o menos no??
bueno y el que caso es ese.... que "mas o menos" funciona , he probado a distintas velocidades y siempre Rpm es el doble de lo que deberia! justo el doble(con una diferencia de 10 Rpm +-) de lo que me da si mido con con el codigo del playground, eso es lo que no entiendo, por que el doble?alguna explicacion??

Muchas gracias y saludos a todos!!

A ver....Intenta contestarte tu mismo....

De donde viene la cuenta rpm = 30*1000/(millis() - timeold)*rpmcount;
millis son milisegundos
rpmcount son pulsos

Esto no es algo de programacion... :wink:
Ya te aviso,que como tu tienes 1 pulso por vuelta, es diferente la operacion que tienes que hacer.... :smiley:
Te deberia ayudar el comentario que hay en el codigo:"//Each rotation, this interrupt function is run twice"

Es decir, con lapiz y papel.... Problema: Como calculo las revoluciones por minuto de un objeto que gira y me da 1 pulso por cada vuelta.

:slight_smile:

pues la verdad sigo sin terminar de entender ...

rpm = 30*1000/(millis() - timeold)*rpmcount;

lo divide entre medio minuto (30*1000) por que rpmcount es el doble de al tener dos pulsos por vuelta???

a mi con saber cuanto tarda en dar una vuelta,osea con saber que tiempo tarda en dar una vuelta, y dividir un minuto entre lo que tarda en darla en valdria no??? ....... lo que hacia dividiendo 60000000/pulseIn ......

puffff que tonto me estoy empezando a sentir :'(...

alguna pista mas???

Como tiene 2 pulsos por vuelta, pues tiene que ser la mitad... Por eso a ti te sale el doble,ya que en tu montaje tienes un pulso por vuelta....Es decir, tienes que modificar el codigo para tener 60.
La operacion es tan facil como dividir vueltas entre tiempo.
Las vueltas las obtienes segun tu contador de pulsos, que en tu caso concreto tienes 1 pulso por cada vuelta.

La verdad,que no se explicarlo mejor..... :o