Accionar led con sensor VR y arduino uno

Acudo a su conocimiento con un problema... miren mi idea es la siguiente... necesito explicar el funcionamiento basico de la ecu de un vehiculo... para ello tengo un distribuidor con un sensor VR y una rueda de 4 dientes... necesito que el arduino lea cada uno de los dientes y en cada diente haga alumbrar un led... aparentemente sencillo pero la verdad no voy muy bien en esto del arduino... no se si se puede usasr una lectura analogica del voltaje para saber que el diente paso por ai y luego usar IF para decir que cuando el voltaje suba o baje (no entiendo bien que deberia pasar) encienda el led por digamos 5ms... porfavor guienme en esto, les estare demasiado agradesido...

Saludos

PDT: soy nuevo en esto y aun no se mucho del lenguaje de programacion

Bien, te diré lo que le digo a todos los que llegan como tu sin conocimientos y con pretenciones de lo que quieren hacer.
Esto es un foro de ayuda. Si muestras código te respondemos la duda pero si no muestras nada, entonces estas pidiendo que te hagamos el trabajo y eso se paga, acá y en la China.
Asi que lo mejor es que vayas a una tienda y te compres un libro de Arduino o bien vayas a Documentación y sigas las clases de 1 a 7 y de 8 en adelante.
Todo bien explicado para que te introduzcas..
Sino Google y busca en youtube arduino cursos y esta plagado.

El sensor VR es un sensor magnético que espero trabaje en 5 voltios porque sino vas a freir las entradas de tu arduino.

Este tipo de sensor envía una onda senoidal la cual va en función del paso de los dientes del engranaje del cigueñal para saber las RPM, posición angular, etc.

Que me corrijan mis compañeros pero creo que puedes usar un comparador para poder transformar esa señal senoidal en una onda cuadrada y meterle esta onda cuadrada al pin 0, 1 o 2 de tu arduino UNO y usar la función attachInterrupt.

Asumiendo, que se logra obtener una señal de onda cuadrada el código seria mas o menos así.

unsigned int contador = 0;

void setup() {
  Serial.begin(9600);
  attachInterrupt(0, contar, FALLING);
  Serial.println("Midiendo RPM del cigueñal...");
  Serial.println("");
  
}

void loop() {
   
delay(1000);
Serial.print("Velocidad: ");
Serial.print(contador/4); 
Serial.println(" rpm"); 
contador = 0;
}

void contar(){
contador ++;  
}

Este código lo que hace es que cada vez que entra un flanco decreciente al pin 0, se ejecuta la función contar y cada segundo mide las RPM. Se divide entre 4 porque son 4 dientes que tiene la rueda según tu información.

Para saber la posición angular segun vaya pasando cada diente sería un código distinto, otra manera de buscar ese angulo 90°, 180°, 270° y 0°.

Como muy bien lo comenta el moderador del foro surbyte, debes tu proponer algo, empezar por algo, leer, leer y leer bastante, ver videos de youtube para que te vayas familiarizando con arduino y veras que se te hará todo mas fácil. Te brindé este pequeño código para que veas a donde vas y para que tengas algo por donde empezar.

Queda de tu parte investigar y aprender mas sobre el tema.

Estamos a tu orden.

Saludos

surbyte... no estoy pidiendo el codigo ni que me elaboren algo... simplemente algunas ideas acerca de las funciones que podria usar...

carlosjq gracias por la idea... eso se aplica bastante bien a lo que quiero... mi idea era que el disparo se realize en rising no en falling... las frecuencias que manejare son de alrededor de 200Hz asi que creo q es bastante bajo... para la conversion de onda senoidal a cuadrada utilize el circuito incorporado en la megasquirt... mi pregunta ahora es la siguiente... que funcion podria utilizar para accionar el led en cada rising o falling edge???

por sierto para contar las rpm en el ciguenal seria contador/2 porque cada giro del ciguenal representa medio giro del distribuidor (ubicado en los ejes de lebas) gracias por sus rapidas respuestas y perdon si me di a entender mal, no espero que me den un codigo para copiar porque tambien pretendo aprender, lo que quiero es q me den alguna idea sobre que funciones puedo utilizar, asi podre investigar las funciones que me aconsejen y al final elaborar un codigo ya funcional para compartirlo con ustedes que al final de seguro a alguien mas le servira...

Saludos y gracias :slight_smile:

Bueno me disculpo entonces. Que es para ti un sensor VR?

un sensor de reluctancia variable... un sensor que produce un campo magnetico que se ve afectado por el paso de objetos metalicos... basicamente es un transductor...

usa digitalWrite hermano cada vez que desees encender un led. El problema es que lo deseas encender cuando detecte el paso de un diente pero la pregunta es: Cuando lo quieres apagar? cuando deje de detectar el diente? o transcurrido cierto tiempo?

De ser así que deseas apagarlo cuando el diente termine de pasar debes activar otra función de attachInterrupt pero en FALLING.

Con respecto a lo que te comento surbyte pienso que tiene razón, el problema es que hay muchas personas que llegan acá al foro a ponernos a trabajar para ellos haciéndoles sus tareas y pues como tu llegaste así sin postear ningún código o por lo menos diciendo: "..Mi gente acá tengo este pequeño código pero no me funciona, en que la estoy embarrando..."

Vamos, es cuestión de ser curioso hermano, me asombra que me hagas la observación de FALLING y RISING cuando algo tan simple como encender un led con digitalWrite no se te ocurrió.

Te pregunto algo: Que te parece si cada vez que detecte un diente llamemos a la función encender() con attachInterrupt y esa función lo que hace es un digitalWrite para encender un led y luego otra función llamada apagar() con otro attachInterrupt para apagarlo? Te parece logico eso? alguna idea?

Lo que busco con esto es que actives tu curiosidad y trabajes un poco en un codigo tuyo que aca te ayudamos a depurar errores.

Saludos

Atento a tus comentarios.

me parece genial la idea... lo del digitalwrite se me ocurrio pero lo que me falla para serles sincero es la sintaxis de los codigos... elaborare un pequeno DFD para luego hacer mi codigo y se los comento haber que tal... muchas gracias y ya luego les comento como va avanzando esto... gracias y disculpen si aveces cosas un poco obvias...

Saludos y gracias...

Edit: en temas de sintaxis mi codigo para encender el led en rising seria algo como

If (contar, FALLING)
{digitalwrite(LED, HIGH)
}

disculpen los errores pero como les digo recien me estoy adecuando a este lenguaje de programacion ya luego lo corrijo...

Edit2:
Estube pensando un poco en la simplicidad del proyecto y se me ocurrio algo:
el sensor vr me entrega una onda senoidal, la cual teoricamente convierto a cuadrada con un 4N25 (Digo teoricamente puesto que no cuento con un osciloscopio).
Si ya tengo una onda cuadrada y no necesito calculo de rpm ni frecuencia no seria mas facil usar una funcion digitalRead??? mi void loop seria algo como:

digitalRead(pulsoent);
if(pulsoent, High);
{
digitalWrite(LED,High);
delay(5);
}

se me ocurrio debido a que este sistema lo puedo utilizar para disparar una bobina, pero si en un momento quisiera incorporar un disparo de inyectores no me bastaria con que habran y cierren en el tiempo que pasa el diente... y hasta donde entiendo las funciones de interrupcion no admiten delay... corrijanme si me equivoco porfavor y comentenme si creen posible que la funcion digitalRead me lea hasta 50Hz realizando las correspondientes 50 activaciones del led... gracias de antemano