Moin,
bin momentan daran, den Tachoimpuls von meinem Motorrad auszulesen.
Dazu hab ich folgendes getahn:
Schaltplanauszug aus Reparaturanleitung Honda CBF 600 Band 5284, 2010.
Bild1
Bild2
Copyright liegt bei bucheli verlag.
ich habe die Leitung (P/Bu SP-Pulse am Kombiinstrument. Siehe Bild1) meiner Honda CBF600SA PC43 erstmal mit einem Multimeter gegen Masse gemessen (Von Bild1 auf Bild2 Die P/Bu Leitung ist durchgehend), da in diversen Foren und bei diversen Motorrädern der Tachoimpuls ein wechselndes 0V und 5V Signal ist. Bei drehung des Hinterrades mit aktivierter Zündung wechselt das Multimeter auch zwischen 0V und 5V.
Das selbe hab ich an der Leitung TA-Pulse versucht, erfolglos. Also kann es ja nur das Tachosignal sein.
Kurzerhand später einen Code geschrieben, der mittels HIGH Interruptflanke (mit 100kOhm auf GND gezogen) die Impulse zählt.
// Motorrad Computer
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
// Defines
#define abrollumfang 0.01896 // Radumfang 189.6cm -> In km angegeben
#define radumdrehungsimpulse 72 // Pulse pro Radumdrehung
#define teilerWiderstand 100000.0 // Widerstand in Ohm des NTCs
// Pins definieren
#define oeltempGeber A0
// Öltemperatur
byte oelTemp = 0; // Variable für Öltemperatur in °C
byte old_oelTemp = 0; // Variable für "Alte" Öltemperatur in °C
// Radimpulse
unsigned long radimpulse = 0; // 3798 pro km
volatile byte rpmcount = 0;
unsigned int rpm = 0;
unsigned long timeold = 0;
// Fahrstrecke
float strecke = 0.0;
float berechnungsfaktor = 0.0;
// Geschwindigkeit
float v = 0;
// Zeitvariablen
unsigned long zeit = 0;
unsigned long previousMillis = 0;
const long interval = 500;
unsigned long previousMillis2 = 0;
const long interval2 = 1000;
void setup()
{
Serial.begin(9600); // Seriellen Monitor öffnen (Baudrate 9600)
lcd.begin(); // LCD Starten
lcd.backlight(); // LCD backlight aktivieren
lcd.clear(); // LCD Säubern
attachInterrupt(1, rpm_fun, HIGH); // Aktiviert Interrupt an Interruptpin 1 (Digitalpin 3) mit HIGH Flanke, führt Funktion "rpm_fun" aus
}
void loop()
{
unsigned long currentMillis2 = millis();
if (currentMillis2 - previousMillis2 >= interval2)
{
previousMillis2 = currentMillis2;
radimpulseZaehlen(); // Funktion rpm berechnen
}
oeltemp(); // Funktion Öltemperatur lesen
kilometer(); // Funktion Strecke messen
lcdprint1(); // Funktion LCD Ausgabe
}
void rpm_fun() // Funktion Interrupt
{
rpmcount++; // Zählt Variable rpmcount um 1 hoch
radimpulse++; // Zählt Variable radimpulse um 1 hoch
}
void radimpulseZaehlen()
{
detachInterrupt(1); // Deaktiviert Interrupt an Interruptpin 1 (Digitalpin 3)
zeit = millis(); // Nimmt die Zeit in "zeit" auf
rpm = 30 * 1000 / (zeit - timeold) * rpmcount; // Errechnet aus der Zeit und Impulse pro Zeit die rpm
timeold = millis(); // Nimmt die Zeit in "timeold" auf
rpmcount = 0; // Setzt rpmcount auf 0
attachInterrupt(1, rpm_fun, HIGH); // Aktiviert Interrupt an Interruptpin 1 (Digitalpin 3) mit HIGH Flanke
Serial.print("RPM: ");
Serial.println(rpm);
v = rpm / radumdrehungsimpulse; // Rechnet Umdrehungen pro Minute durch Impulse pro Radumdrehung
v = v * abrollumfang; // Multipliziert mit Abrollumfang
v = v * 60; // Multipliziert mit 60 zu km/h
Serial.print("V: ");
Serial.print(v);
Serial.println("km/h");
}
Mit einem Button funktioniert dies auch sehr gut.
Zurück zum Motorrad:
Drehe ich das Rad, erkennt es der Arduino und addiert jeweils die Pulse hinzu. Geht gut.
Starte ich jetzt den Motor, fängt der Arduino an mir den Zähler voll zu knallen, als ob sich das Rad permanent dreht.
Könnte man ja denken, es Handelt sich dabei um die Motordrehzahlimpulse, wie aber soll es mir Impulse mit nur aktivierter Zündung ohne laufenden Motor anzeigen, wenn der Gang nicht eingelegt ist?.
Kann also nicht die Drehzahl sein, spinnt die Anzeige, weil der Interrupt einfach zu "feinfühlig" trotz 100kOhm Pulldown ist, sodass es Störungen aufnimmt von der Masse vom Motorrad?
Ich also alles abgeklemmt, sind ja 0V und 5V Signale: Also Breadboard her, LED, Widerstand, 2 Jumper dran, angeklemmt, Rad gedreht: LED blinkt wenn ich das Rad drehe.
Ich will also den Motor starten und gucken ob sie dann immer noch blinkt, Batterie zu schwach zum starten, mist. (Lange standzeit, heute viel Zündung angehabt, Motor lief nur einmal kurz).
"Theoretisch" funktioniert das Prinzip ja, Kabel ist "vermutlich" richtig nach den Erkenntnissen von heute.
Abgespeckter Crosspost von mir im Honda-Board
Wirklich sehr interessante Frage am Ende im McCoi Forum
Vielen dank schonmal an alle die diesen Post lesen. Und noch größerer Dank an alle die mir helfen können, oder es versuchen!