Drehzahlmesser auslesen Motorrad

Moin Marco,

Zuerst mal eine Frage: was ist ein Schaltblitz?

Ich habe letztes Jahr mit einem UNO bei meinem Motorrad (XJ900S) die Drehzahl ausgelesen und die Bordspannung zusammen mit der Drehzahl und einem Timestamp auf SD-Karte geschrieben, da ich Probleme mit der Batterie hatte (das ist aber ein anderes Thema). Für die Drehzahl habe ich das Digitalsignal von der Zündbox (welches gleichzeitig auf den Drehzahlmesser geht) benutzt.
Das Signal geht zuerst über einen 10k-Widerstand auf die Basis einer einzelnen NPN Transistorstufe (Emitter gegen Masse und der Kollektor an Pin2 des Arduinos). Liefert das DZM-Signal HIGH, so steuert der Transistor durch und zieht über den aktivierten PullUp-Widerstand des Pin2 diesen auf nahezu Massepotenzial.
Das ist eigentlich ganz einfach. Du solltest die Tips weiter oben beachten, damit der Arduino nicht durch Spannungsspitzen beschädigt oder zerstört wird.
Der Code könnte in etwa so aussehen (also: da muss natürlich Dein eigener Code noch hinzu, hier habe ich nur die Ermittlung und Ausgabe der Drehzahl beschrieben sowie die Interrupt-Service-Routine).
Und JA, Du musst einen speziellen Pin verwenden: einen, der einen Interrupt auslösen kann.

// Deklarationen
byte DZM_InputPin = 2;
volatile unsigned long RPM_T2, RPM_Count;
unsigned long RPM , RPM_T1;

//****************************************************************************
void setup() {

  pinMode(DZM_InputPin, INPUT);
  digitalWrite(DZM_InputPin, HIGH);    // PullUp-Widerstand des DZM-Inputs aktivieren

  RPM_T1 = 0;
  RPM_T2 = 0;
  RPM_Count = 0;

  attachInterrupt(0, RPM_Meter, FALLING);    // Interrupt0 wird bei fallender Flanke auf Pin2
                                                                    // ausgelöst
}

//****************************************************************************
void showRPM() {

char RPMStr[5];

  lcd.clear();
  lcd.setCursor(10, 1);

  if (RPM_T2 > RPM_T1) {
    RPM = (unsigned)(long)(60000*RPM_Count / (RPM_T2 - RPM_T1)); 
    RPM_T1 = RPM_T2;
    RPM_Count = 0;
  }
  else {
    RPM = 0;
  }
  sprintf(RPMStr, "%4u", RPM); 
  lcd.print(RPMStr);
}

//****************************************************************************
void RPM_Meter () {

  RPM_Count++;
  RPM_T2 = millis();
   
}

//****************************************************************************

void loop () {

// innerhalb der loop wird z.B.  jede Sekunde showRPM (siehe oben) aufgerufen:
showRPM();
}