Hola, tengo una pequeña duda, estoy haciendo una mini centralita,ecu o como querais llamarla para el encendido de un coche antiguo, por platinos... Bien tengo todo el codigo probado fuera del coche es decir 5v y todo funciona correctamente. Ahora mi duda para contar los pulsos uso un Puerto GND hasta el pin 2 de arduino. Aquí fuera funciona bien, pero en el coche unire el gnd de arduino con la masa del coche y ahora para hacer contacto usaría la masa del coche y como sabeis el coche va a 12 v, ahora la pregunta... Si uso masa para la interrupcion no quemare el arduino??
Si pretendes que el pin lea un voltaje superior a los 5.5v, pues sí lo quemarías. En cambio, si el interruptor solo se conecta a tierra cuando está activado (y no a voltaje positivo), no debería quemarse. El optoacoplador sería una buena idea para evitar cualquier incidente, aunque no es del todo indispensable para tal efecto.
Supongo que el conteo ocurre como mínimo 5 veces por segundo, por esta razón, te recomiendo que la variable para guardar el conteo, sea de tipo unsigned long.
Además, al ser un interruptor mecánico, este puede "rebotar" mientras esté activado (con el optoacoplador esto no sucede); por lo tanto, sugiero que utilices un delay no muy corto para pueda compensar ese efecto, y no muy largo que lo haga perder la cuenta. Algo como esto:
Una última cosa: como el interruptor está conectado a tierra, entonces en pinMode no utilices "INPUT", sino "INPUT_PULLUP", así te ahorrarás una resistencia "pull-up" para ese pin.
PD: supongo que el conteo lo vas a utilizar para algo, porque si sólo lo guardas en en una variable, entonces el programa no tendría uso práctico alguno...
Quizas lo mas correcto sea usar un optoacoplador, no habia pensado en el rebote.. No puedo poner delay aunque sea minimo ya que tiene que ser rapido.. La funcion que tiene es variada, una vez con los pulsos cuento las rpm a partir de hay, con ello hago el tipico sistema de corte para proteger el motor, en cada pulso conmuto un mosfet para cargar la bobina y cuando no hay contacto suelta y produce la chispa.
Adjunto codigo..
const byte interruptPin = 2;
volatile unsigned long cont_rpm;
int corte = 1800;
int rpm_actuales;
void setup() {
Serial.begin(9600);
pinMode(5,OUTPUT);
pinMode(interruptPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(interruptPin), Carga, RISING);
digitalWrite(5,LOW);
}
void loop() {
static unsigned long rpm_ant;
static unsigned long t_anterior;
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);
}
void Carga(){
if (digitalRead(2) == LOW && rpm_actuales <= corte ){
digitalWrite(5,HIGH);
}else digitalWrite(5,LOW);
cont_rpm++;
}
Lucario, lo va a conectar a una bobina y tu le sugieres que da igual que si lee por LOW no pasa nada?
Qué ocurre si una FCEM (fuerza contra eletromotriz) ingresa al arduino, lo fríe!!! Conectase a una bobina siempre requiere tomar resguardos. Por eso sugerí un optoacoplador.
Otra cosa, le sugieres que lea pulsos como si fuera un pulsador?
if (digitalRead(interruptor) == LOW) {
contador++;
delay(10);
}
Encima con delay(10); que puede hacernos perder pulsos, pero tu intención era bloquear rebotes supongo.
Hagamos cuentas.
Veamos. a
120 RPM hablamos de 120 rev/min = 120 rev/60 seg = 2 Hz
1200 rpm ya son 20Hz y a 2400 RPM estamos a 40Hz => Período de 1/40Hz = 25mseg
surbyte:
Lucario, lo va a conectar a una bobina y tu le sugieres que da igual que si lee por LOW no pasa nada?
Qué ocurre si una FCEM (fuerza contra eletromotriz) ingresa al arduino, lo fríe!!! Conectase a una bobina siempre requiere tomar resguardos. Por eso sugerí un optoacoplador.
Tienes razón, gracias por corregirme Pensaba que el diagrama era un simple interruptor que se activaba con las rotaciones del motor. Entonces si no es solo eso, pues parece que optoacolpador es obligatorio.
Otra cosa, le sugieres que lea pulsos como si fuera un pulsador?
if (digitalRead(interruptor) == LOW) {
contador++;
delay(10);
}
Eso pensé en un principio; pero por lo que veo ahora, lo que necesitas es una especie de algoritmo que calcule las RPM del motor... verdad?
Encima con delay(10); que puede hacernos perder pulsos, pero tu intención era bloquear rebotes supongo.
Hagamos cuentas.
Veamos. a
120 RPM hablamos de 120 rev/min = 120 rev/60 seg = 2 Hz
1200 rpm ya son 20Hz y a 2400 RPM estamos a 40Hz => Período de 1/40Hz = 25mseg
Aseguras que midiendo asi no pierdes un pulso?
Bueno... era un valor de ejemplo. Los rebotes suelen durar menos de 10 milisegundos; sin embargo, como vas a usar un optoacoplador, el delay ya no será necesario.
Amigos la manera mas segura es conectando un optoacoplador como lo sugirio Surbyte. Señores, para esto están diseñados los opto. aislamiento y separación de corrientes. Se debe proteger el arduino.