Pequeña duda de electronica.

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??

Foto:

Gracias por adelantado :slight_smile:

Usa esto

Solo me preocupa la FCEM en bornes del IN4148, Revisa para asegurarte que no se queme.

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:

void loop() {
  if (digitalRead(interruptor) == LOW) {
    contador++;
    delay(10);
  }
}

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

Aseguras que midiendo asi no pierdes un pulso?

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 :smiley: 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.

Me disculpo si he causado algún mal entendido... :frowning:

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.

Gracias por la contestacion de todos :slight_smile: . Usare un optoacoplador para este caso. Se puede cerrar el hilo.

No cierres nada porque seguirás consultando.

surbyte:
No cierres nada porque seguirás consultando.

Yo también estoy de acuerdo...