Digitaler Drehzahlmesser fürs Motorrad

Hallo liebe Arduino Gemeinde!
Meine Name ist Simon ich bin 20 Jahre alt und beschäftige mich schon seit ein paar Jahren viel mit Motoren, Mechanik usw...
Auch einfache elektronische Projekte waren schon dabei.

Aktuell versuche ich mich im Arduino Programmieren, genauer gesagt will ich eine Drehzahlmesser für mein Motorrad (Honda crf) bauen.
Einen Arduino nano klon sowie ein kleines 1,3zoll Oled Display hab ich bereits, auch die Programmierung funktioniert soweit ganz gut.
Das Display zeigt schon verschiedene Texte, Bilder, Animationen an.

Mein aktuelles Problem besteht darin das Drehzahlsignal am Motorrad abzugreifen bzw. das Signal so aufzubereiten das ich damit am Arduino etwas anfangen kann.
Mein erster Gedanke war das Signal am Kurbelwellensensor abzunehmen, also mal fix das Oszi angeschlossen und gemessen was da so rauskommt (hoffe das mit dem Angehängten Bild funktioniert).

Die Spannung ist mit 14V bis weit über 25V (bei erhöhter Drehzahl) schon mal zu hoch für den Nano.

Würde mich sehr freuen wenn mir an dieser Stelle wer weiterhelfen könnte, was brauche ich alles um aus dem Signal, ein brauchbares für den Arduino zu machen ?

Gruß Simon

Hallo s1mon

Willkommen im weltbesten Arduino Forum.

Nehme Suchmaschine deiner Wahl und beschäftige diese mit dem Wort "Optocoupler.

Mit dem Optokoppler bekommst du eine saubere Trennung der Systeme und eine passende Signalformung für den Arduino realisiert.

Viel Erfolg.

Bist Du sicher, dass der Sensor die LED vom OK treiben kann?

@s1mon: Welcher Sensor ist da drin?

Gruß Tommy

Hallo,

Der Kurbelwellensensor müsste ein normaler Induktiv Sensor sein.

Wie Tommy angesprochen hat wäre natürlich sehr wichtig das das Signal vom Kurbelwellensensor nicht durch den Optokoppler usw.. verändert bzw. verfälscht wird da das Steuergerät das Signale braucht damit der Motor richtig läuft.

In das Thema Optokoppler lese ich mich auf alle Fälle einmal ein.

Als alternativ könnte ich mir auch denken das Drehzahlsignal von der Zündspule abzugreifen.

Was wider rum nicht so einfach ist, das Thema wurde schon öfters diskutiert, suche im Forum hilft, damit man das Rad nicht zu X Mall neu erfindet

Spannungsteiler? Nimm mal die höchste Spannung und etwas reserve und bau einen Spannungsteiler

Spannungsteiler berechnen

Es ist ein Motorrad, ist nicht so EMV verseucht wie Auto aber trotzt dem, passender Hochohmiger Pegelwandler wehre besser, ein Spannungsteiler könnte interne Elektronik stören, bin aber kein KFZ Fritze :wink:

da bin ich auch weit davon entfernt :joy: kommt bestimmt auch auf das alter des motorrades an....die älteren sind da bestimmt einfacher als die neuen

100% ist das so :wink:

1 Like

Also bei meiner 92er Africa Twin wäre das bestimmt total unproblematisch.......die hat aber einen Drehzahlmesser, von daher habe ich das Problem nicht :grimacing:

Habe jetzt mal etwas mehr in die Optokoppler Thematik usw. eingelesen.
Habe mir folgendes überlegt:
Das Signal des Induktiven Sensors mit einem Optokoppler galvanisch trennen, mit einer Diode Einweggleichrichten und dann eine Passende Z-Diode dimensionieren damit die Spannung nicht über 5V steigen kann.

Das Problem dabei --> damit der Optokoppler funktioniert werde ich einen Vorwiderstand benötigen, ich befürchte dabei das ich damit das Signal des Sensors minimal verändere und das Motorsteuergerät dann Probleme macht.

Was denkt ihr dazu?
Könnte mir bei der Auslegung des Optokopplers wer behilflich sein --> welchen Verwende ich da am besten?

Wicklung auf der Zündleitung?
Problem ist die sind meistens abgeschirmt kommt nicht viel raus, alten kleinen Trafo zerlegen die Spule drüber, messen was rauskommt.

Hallo,

Habe jetzt einige Zeit mit dem Nano rumprobiert.
Das Drehzahlsignal vom Kurbelwellensensor wird jetzt mit einer Diode gleichgerichtet und mit einem Wdst. auf die benötigte Spannung gebracht.

Das ganze funktioniert erstaunlich gut am Motorrad, zumindest bis zu einem gewissen Punkt.
Ab ca. 4000 U/min (ca. 2kHz) zeigt der Arduino falsche Werte an (sehr niedrige) hab darauf hin mit verschiedenen Wdst. rumprobiert jedoch ohne Erfolg daher denk ich das die steigende Spannung nicht das Problem sein kann.

Hat irgendwer eine Idee an was das liegen kann?

Hier der Code:

#include <U8g2lib.h>

#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif
//U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE);
U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

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

void setup() {
  u8g2.begin();
  pinMode(DZM_InputPin, INPUT_PULLUP);
  RPM_T1 = 0;
  RPM_T2 = 0;
  RPM_Count = 0;
  attachInterrupt(0, RPM_Meter, FALLING);    // Interrupt0 wird bei fallender Flanke auf Pin2

}

void loop() {
  char RPMStr[5];
  u8g2.clearBuffer();         // löschen des Interen Speicher
  u8g2.setFont(u8g2_font_courR24_tf); // auswahl der Schriftart
  if (RPM_T2 > RPM_T1+200) {
    RPM = (unsigned)(long)(60000 * RPM_Count / (RPM_T2 - RPM_T1));
    RPM = RPM/16;
    RPM_T1 = RPM_T2;
    RPM_Count = 0;
    //delay(150);
  }
  //else {
    //RPM = 0;
  //}
  
  sprintf(RPMStr, "%4u", RPM);

  u8g2.drawStr(25, 35, RPMStr);
  u8g2.sendBuffer();
}

void RPM_Meter () {

  RPM_Count++;
  RPM_T2 = millis();

}

Lg Simon

Kann mir keiner weiterhelfen?

Ich könnte mir vorstellen das der Microcontroller aufgrund des Oled Programms zu langsam wird..
Aber kann das sein bei nur 2Khz Eingangsfrequenz vom Sensor, der 328P taktet doch mit 16Mhz, also doch wieder eher unwahrscheinlich...

Liegt es vielleicht doch am Programm oder am Aufbau, ich bin ehrlich gesagt mit meinem technischen Verständnis schon etwas am Ende...

Lg

2kHz sind schon 'ne Hausnummer - da bin ich unsicher.

Dieser cast kommt mir komisch vor.
Alle Variablen sind unsigned long, bis auf die konstante 60000.
Ich würde das eher so aufschreiben:

RPM = 60000UL * RPM_Count / (RPM_T2 - RPM_T1);

RPM ist als unsigned long definiert. Also wird auch 60000 * RPM in unsigned long gerechnet.

Die Schreibweise (unsigned)(long) ist allerdings merkwürdig. Dadurch wird das unsigned long - Ergebnis erst auf (long) gecastet, das dann auf (unsigned), was aber (unsigned int) bedeutet. :wink:

void setup() {
  Serial.begin(115200);
  unsigned long RPM = 1000;
  Serial.println( 60000*RPM);
  Serial.println( (unsigned) (60000*RPM));
}

Hallo,

Danke für die Tipps :grinning:
Drehzahlmesser funktioniert jetzt einwandfrei!

LG Simon

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.