Pages: [1]   Go Down
Author Topic: ayuda codigo cuentarrevoluciones  (Read 2695 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 31
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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!!
Logged

0
Offline Offline
Edison Member
*
Karma: 16
Posts: 1579
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola,

Mira a ver si esto te ayuda => http://real2electronics.blogspot.com/2009/09/shift-lights-con-arduino.html
La salida de rpm, se muestra al usuario mediante unos leds, pero puedes adaptarlo a tus necesidades.


Salu2    smiley-wink



Igor R.
Logged


0
Offline Offline
Newbie
*
Karma: 0
Posts: 31
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Offline Offline
Newbie
*
Karma: 0
Posts: 31
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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);
Logged

Offline Offline
Edison Member
*
Karma: 23
Posts: 1375
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

0
Offline Offline
Edison Member
*
Karma: 16
Posts: 1579
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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: http://www.arduino.cc/playground/Main/ReadingRPM


Salu2   smiley-wink



Igor R.
« Last Edit: January 08, 2011, 06:14:19 am by igorreal » Logged


0
Offline Offline
Newbie
*
Karma: 0
Posts: 31
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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!!
Logged

0
Offline Offline
Edison Member
*
Karma: 16
Posts: 1579
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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... smiley-wink
Ya te aviso,que como tu tienes 1 pulso por vuelta, es diferente la operacion que tienes que hacer.... smiley-grin
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.


  smiley
« Last Edit: January 12, 2011, 03:55:52 am by igorreal » Logged


0
Offline Offline
Newbie
*
Karma: 0
Posts: 31
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  :'(...

Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 31
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

alguna pista mas???
Logged

0
Offline Offline
Edison Member
*
Karma: 16
Posts: 1579
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

« Last Edit: January 14, 2011, 06:33:12 am by igorreal » Logged


Pages: [1]   Go Up
Jump to: