Generador de rpm

Buenas soy nuevo en arduino y no tuve exito en el foro en ingles! Perdonen si alguna palabra no le suena familiar es que mi español es de Puerto Rico.

Estoy tratando de hacer un equipo que me ayude a burlar el ecu(computadora/computador) de vehiculos para coregir el porciento de gasolina(combustible) que este envia a los injectores. todo los inputs 0-5v y outputs son analogos exepto un input que entiendo que es digital para poder leer rpm para no confundirlos empesare por partes. lo primero que necesito es que para propositos de diceño es un arduino que me genere RPM para hacer las pruebas de el proyecto principal , necesito que me genere lo siguiente. input 1 = output 250 rpm input 2 = output 500 rpm input 3 = output 1000 rpm input 4 = output 5000 rpm input 5 = output 9000 rpm

ayudenmen con esto

int my_250RPM;

int my_500RPM;

int my_1000RPM;

int my_5000RPM;

int my_9000RPM;

void setup()
{
  pinMode(1, INPUT);
  my_250RPM = digitalRead(1);

  pinMode(2, INPUT);
  my_500RPM = digitalRead(2);

  pinMode(3, INPUT);
  my_1000RPM = digitalRead(3);

  pinMode(4, INPUT);
  my_5000RPM = digitalRead(4);

  pinMode(5, INPUT);
  my_9000RPM = digitalRead(5);

  Serial.begin(9600);

  pinMode(7, INPUT);
  Serial.begin(9600);

}


void loop()
{
  Serial.print(analogRead(A0));
  Serial.print('\t');
  Serial.println(digitalRead(7));delay(250);
  if (my_250RPM == HIGH) {
    tone(3,4.16);

  }
  if (my_500RPM == HIGH) {
    tone(3,8.33);

  }
  if (my_1000RPM == HIGH) {
    tone(3,16.66);

  }
  if (my_5000RPM == HIGH) {
    tone(3,83.33);

  }
  if (my_9000RPM == HIGH) {
    tone(3,150);

  }

}

Hay alguna manera para generar rpm sin usar hz?

Claro, mira, las RPM son detectadas por un sensor magnético que envía una onda alterna de 5v a la ECU. Digo alterna porque el sensor es de tipo inductivo que posee una bobina y un imán permanente el cual es le encargado de detectar el paso de 4 ventanas o gabs de una rueda que gira con el cigueñal. Cada 90° la señal alterna llega a su máximo por lo tanto en un giro completo del cigueñal tendras 4 picos de ese voltaje y con este dato ya puede la ECU realizar sus cálculos entre los cuales están las RPM.

No estoy muy claro con la parte analógica del arduino pero creo que es posible recrear esa onda senoidal según las RPM que necesites. Por ejemplo 1000 RPM significa que el sensor ha enviado a la ECU en un minuto la cantidad de 4000 picos, es decir, debes recrear una onda senoidal de 4 Khz.

Les pregunto a mis compañeros del foro, puedo generar esa frecuencia con los pines analógicos del arduino?

Saludos

Bueno cada carro tiene diferentes picos en una rotacion por ejemplo tengo un hyundai q creo e es 60 picos y uno en blanco Pero la pregunta es basicamente que si hay una manera de leer o generar RPM sin tener que calcularlo con hz,khz,mhz. Yo consegui la conversion de rpm a hz aqui http://www.convertunits.com/from/RPM/to/hertz El rpm no es para modificarlo es paradeterminar cuando hacer el ajuste q proximamente les dare detalles tanpronto tenga el generador

Si se puede amigo, lo que te quiero decir es que eso depende de la rueda dentada que tenga cada vehículo para generar la onda senoidal. Si a lo que te refieres es a si tu puedes tener una cajita con 2 cables de salida que te den una señal de RPM pues la respuesta es SI, claro que se puede. El problema es que debes conocer el tipo de rueda dentada que tiene el vehículo ya que de ello depende las ondas senoidales que se le enviaran a la ECU. Hay vehículos que le faltan a su rueda dentada 1 o 2 dientes para indicarle a la ECU cuando el cigueñal ha dado o completado un giro o ciclo. Primero debes estar claro como es la rueda dentada ya que de allí partirán los cálculos para elaborar los tiempos en el arduino.

Pudieses probar inyectándole una onda cuadrada a la ECU a ver si te trabaja, te digo esto porque la onda cuadrada es mucho mas fácil de generar que la senoidal. Por ejemplo:

  for(int i=0; i < 80; i++){
  digitalWrite(pin,HIGH);
  delay(20);
  digitalWrite(pin,LOW);
  delay(20);
 }

En este caso, estoy simulando que cada diente de la rueda dentada se tarda en pasar 20 milisegundos y estoy asumiendo que la rueda tiene 80 dientes, en fin, por eso te dije que necesitas conocer como es la rueda. Otra cosa, coloque un tiempo de 20 milisegundos por simular algo ya que ese tiempo depende de la velocidad angular del cigueñal. En este caso, 20 milisegundos hace referencia a una frecuencia de 500 Hz. Faltaría agregarle al código la parte que detecta o simula la falta de 2 dientes en la rueda dentada.

Acá te dejo saber un link que me pareció muy útil en caso que desees generar una onda senoidal con arduino. Es fácil, es solo cuestión de colocarle un filtro pasa bajos a la salida del arduino.

Atento a tus comentarios

juntekind:

No te comprendo muy bien lo que quieres hecer y preguntar, pero en tu segunda pregunta te respondo,

Pero la pregunta es basicamente que si hay una manera de leer o generar RPM sin tener que calcularlo con hz,khz,mhz.

Para leer la señal de un sensor de cigueñal:

Primero tienes que ver si es analogica o digital

Si es digital no tenemos problemas y se coloca directamente a un pin y se lee el pin y ya podremos hacer con el lo que queramos.

Si es analogica:

Tenemos que saber si es mayor de 5v, si es asi se le coloca un trigger smith y se envia a un pin digital para leerlo.

Si es menor de 5 voltios, se puede colocar a un pin analogico y al leer el pin analogico podemos convertirlo en "digital" y ya podremos enviarlo a cualquierpin digital y procesarla.

Si es menor de 5 voltios, se puede colocar a un pin analogico y al leer el pin analogico podemos convertirlo en "digital" y ya podremos enviarlo a cualquierpin digital y procesarla.

Venías bien soldado pincho hasta que metiste la pata!!! Si es menor de 5V igualmente usaria un Smith Trigger para conformarla a 5V y darle la ganancia adecuada. Yo creo como dicen ambos, que faltan alguna precisiones. Delimitar la idea.

Para ello sería bueno que nos digas juntekid si esos datos de RPM que refieres serán inyectados a una ECU o que harás con ellos?

La conversión de RPM o Revoluciones por minuto 1 rev x minuto o cada 60 segundos es simple si 1 rev demora 60 seg tienes 1 ciclo/60 seg o 1/60 Hz Si fueran 600 RPM = 600 ciclos/60 seg = 10 Hz es muy fácil y no hace falta ir a ningún sitio.

Por cierto en este foro tenemos normas asi que leelas y luego edita tu post#2 y coloca el enlace usando tags.

Sigamos con la idea. SI tu generas algo digamos X Hz y lo multiplicas por 60 tendras el valor en RPM 1 Hz => 60 RPM 10 Hz => 600 RPM

Mejor que usar tone es usar una librería que usa un TIMER del Arduino y fija la frecuencia mucho mejor.

Hay alguna manera para generar rpm sin usar hz?

RPM y Hz son la misma cosa expresada de forma diferente. Asi que cuando generes RPM o ciclos por minutos, tambien tienes ciclos por segundo o acado cuando mides gramos no tienes una expresión en kilogramos?

hola casi-general surbyte, Lo he puesto asi porque seria mas facil el hardware y o tendria que colocar un operacional. A ver si dice exacto lo que quiere y le podremos ayudar.

EL amigo lo que desea es hacer un generador de señal de RPM, es decir, quiere enviar a una ECU la señal que enviaría un sensor de posicionamiento del cigueñal. Al menos eso es lo que yo le entiendo. Por eso me enfoque mas en generar esa onda senoidal o cuadrada pero el amigo no ha dicho cuantos dientes tiene la rueda del cigueñal y cuantos dientes son los que le faltan para indicar un giro completo.

me explico mejor,
NO quiero enviar una señal de RPM modificada a la ecu de el vehiculo, quiero enviar una señal a un rango especifico de RPM y TPS y modificar la señal de input y sumarle o restarle el valor q escoja de -50% a 50% cuando cumpla con las anteriores(RPM yTPS).
Para esto quiero hacer un generador de señal de rpm, una que pueda comparar con un tacometro de autos y compararlo con un serialprint y un generador de 5v variable q esa es facil y la se hacer con pwm y compararla con un multimetro.

Les explico exactamente que es lo que quiero.

tendre estas señales de entrada(input):

-RPM
-TPS 5v(throttle position sensor /sensor de mariposa)
-MAF 5v(mass air flow/sensor de flujo de aire)

y una señal de salida(output):

-corrMAF esta sera la señal de maf de entrada pero alterada

inteto que el arduino corrija de esta manera:

cuando el tps este entre 25% a 50%(ocea 255 a 520) y el RPM este entre 500 a 1000
quiero que el corrMAP(output) sea igual al valor de MAF + 15%(output es 0 a 255, 15% serian 38)
y sigo asi

si TPS = 25% a 50% y rpm= 1001 a 2000
output = MAF + -7(o el valor que escoja)
si TPS = 25% a 50% y rpm= 2001 a 3000
output = MAF + -10 (o el valor que escoja)
si TPS = 25% a 50% y rpm= 3001 a 4000
output = MAF + 13 (o el valor que escoja)

y sigo asi hasta hacer un mapa
TPS 0-5% y 0-799rpm,800-999rpm,1000-1999rpm,2000-2999,3000-3999rpm hasta llegar a 9000rpm
TPS 6-24% y 0-799rpm,800-999rpm,1000-1999rpm,2000-2999,3000-3999rpm hasta llegar a 9000rpm
TPS 25-49% y 0-799rpm,800-999rpm,1000-1999rpm,2000-2999,3000-3999rpm hasta llegar a 9000rpm
TPS 50-74% y 0-799rpm,800-999rpm,1000-1999rpm,2000-2999,3000-3999rpm hasta llegar a 9000rpm
TPS 75-100% y 0-799rpm,800-999rpm,1000-1999rpm,2000-2999,3000-3999rpm hasta llegar a 9000rpm
si tienen alguna duda me preguntan para tratar de explicar mejor.

Muy simple y no hay problema para nada de lo que dices. Existe en C de Arduino una función que se llama map y básicamente te permite con una entrada entre un min y maximo entregarte una salida entre lo que especificas. supongamos

si TPS = 25% a 50% y rpm= 1001 a 2000 output = MAF + -7(o el valor que escoja)

TPS es una variable que vale entre 25 y 50

int TPS;
int rpm;
int MAF;

rpm = map(TPS, 25, 50, 1001, 2002);
MAF = map(TPS, 25, 50,  -7, +7);

Aca tienes una parte de lo que esperas. cuando TPS valga 30, el resultado sera lineal en rpm y MAF

surbyte: Muy simple y no hay problema para nada de lo que dices. Todo eso que has escrito se traduce en exactamente lo que quieres.

pero necesito ayuda haciendo el codigo para los dos el projecto principal y el generador para comprobar que el projecto principal funciona correctamente

Lee de nuevo