Hallo!
Mein aktuelles Projekt ist ein automatisches Kettenölsystem für mein Motorrad, doch ich bin gestern beim Einbau auf ein Problem gestoßen, bei dem ich nicht weiter weiß. Aber der Reihe nach:
Funktionsweise:
Ein Magnet am Hinterrad schließt pro Umdrehung einmal einen Reedkontakt. Das Schließen des Kontaktes wird von einem Arduino Nano per Interrupt registriert, die Schaltung ist identisch zu der im Beispiel DigitalReadSerial (5V vor dem Schalter, Pin mit 10kOhm mit GND verbunden). Anhand des Umfangs des Rades und der Anzahl der registrierten Pulse wird die gefahrene Strecke berechnet und dann in einem eingestellten Intervall ein Tropfen Öl auf das Kettenrad gepumpt.
Die Spannung kommt direkt von der Batterie (natürlich abgesichert), und die ganze Sache wird mit einem Relais am Rücklicht (=zusammen mit der Zündung) angeschaltet.
Soweit die Theorie. Bei nicht laufendem Motor funktioniert alles tadellos.
Nun das Problem:
Bei laufendem Motor wird vom Interrupt jede Umdrehung des Motors registriert (im Leerlauf ca. 1500 1/min).
Ich dachte zuerst, das (ungeschirmte) Kabel vom Reedkontakt zum Arduino würde, da es an einer Stelle neben den Zündkabeln verläuft, von diesen beeinflusst. Versorge ich den Arduino allerdings nur per USB mit Strom (statt von der Batterie), tritt das Problem nicht auf.
Meine zweite Idee: die Ladespannung der Batterie ist vielleicht nur B2-gleichgerichtet, somit entsteht pro Umdrehung eine Spannungsspitze, die evtl den Arduino beeinflusst. Leider hab ich gerade kein Oszilloskop zur Hand, sonst hätte ich mir das auch mal genauer anschauen können. Würde ein korrekt dimensionierter RC-Tiefpass hier vielleicht helfen?
Hier der auf das wesentliche gekürzte Code dazu:
Spielereien wie die Ausgabe der Daten per Bluetooth und die Speicherung der gefahrenen Kilometer hab ich hier der Übersichtlichkeit halber weggelassen.
int tachopin = 2;
int pumppin = 5;
int umfang = 200; // Radumfang in cm
int oelabst = 5; // Abstand zwischen Ölvorgängen in km
int pumpzeit = 45;
volatile int pulszaehler = 0;
volatile unsigned long last_micros = 0;
void pumpen ()
{
digitalWrite(pumppin, HIGH);
delay(pumpzeit);
digitalWrite(pumppin, LOW);
}
void puls()
{
if( (micros()-last_micros) >= 33)
{
pulszaehler++;
Serial.println(pulszaehler);
last_micros = micros();
}
}
void setup()
{
pinMode(pumppin, OUTPUT);
attachInterrupt(digitalPinToInterrupt(tachopin), puls, RISING);
Serial.begin(9600);
}
void loop()
{
if ( pulszaehler >= ((oelabst*100000)/umfang) )
{
pumpen();
pulszaehler = 0;
}
}
Ich hoffe auf ein paar Ideen oder im besten Fall auf fundiertes Wissen, was mir hilft mein Problem zu lösen ![]()
Gruß
David
