Elektronische Zündung mit Arduino

  • Hallo,


    ich wollte hier mal mein Projekt "Elektronische Zündung mit Arduino" vorstellen. Kurz zur Vorgeschichte:


    Ich habe mir vor knapp einem Jahr eine zerlegte Honda CB 250 K4 gekauft, die nun im Keller steht und restauriert wird (was aber noch längere Zeit dauern wird). Unabhängig davon hatte ich mir vor einem Jahr mal ein Arduino-Entwicklerset gekauft (für die, die mit dem Wort "Arduino" nichts anfangen können: Es handelt sich dabei um einen programmierbaren Microcontroller, mir dem man messen, steuern, regeln usw. kann). Bis vor kurzem hatte ich (außer einigen Spielereien) damit aber noch nichts sinnvolles gemacht. Das änderte sich mit der Honda, da kam mir die Idee, den Arduino für eine elektronische Zündung zu verwenden.
    Im Internet hatte ich dazu in einigen Foren ein paar Ansätze gefunden, aber keine "fertige Lösung". Also habe ich mich daran gemacht, das selbst zu entwickeln (ich weiß, es gibt so was fertig zu kaufen, mich hat aber das Selbermachen gereizt). Da ich meine Brötchen mit Programmieren verdiene, war das für mich auch kein komplettes Neuland (obwohl ich dennoch einiges dabei gelernt habe).


    Das erste Zwischenergebnis möchte ich hier mal kurz beschreiben. Wenn jemand Interesse hat, bei dem Projekt mitzumachen, stelle ich gerne den Arduino-Quellcode zur Verfügung.


    Das fertige Projekt wird aus drei Teilen bestehen
    1. Der Arduino-Steuereinheit
    2. Einer "Zündelektronik", die die Signale der Steuereinheit so umwandelt, dass die Zündkerze auch zündet.
    3. Ein Signalgeber mit einem Hall-Sensor (Magnetfeldsensor), der an die Nockenwelle angeschlossen wird und Informationen an die Steuereinheit überträgt, aus denen dann Umdrehungszahl, Zündzeitpunkt usw. berechnet werden.


    Arduino-Steuereinheit
    =====================
    Die Einheit besteht aus einem Arduino UNO und einem LCD Shield (für die Anzeige von Daten). Hier mal ein Bild des Prototyps:


    arduino_rpm.jpg


    Bitte nicht am Kabelsalat stören, die meisten Kabel sind nur für die Verbindung zu einem Soundkarten-Oszilloskop (für Testzwecke) notwendig. In der Praxis werden nur 5 Anschlüsse benötigt: Plus, Masse, Einhang vom Hall-Sensor, 2 Ausgänge zu den beiden Zündspulen.


    Das LCD-Shield hat auch einige Taster. Über zwei davon (hoch und runter) kann eine von 9 einprogrammierten Zündkurven mit verschiedenen Charakteristiken ausgewählt werden. Die gewählte Zündkurve wird dann auf dem LCD angezeigt. Jede Zündkurve ist intern durch 4 Datenpaare (Umdrehung und Frühzündungswinkel) definiert. Daraus berechnet das Programm dann eine Tabelle, aus der dann in Abhängigkeit von der Umdrehungszahl (genauer gesagt der Umdrehungszeit) eine "Wartezeit" (nach dem "Feuern" des Hall-Sensors am unteren Totpunkt) berechnet wird. Danach wird die betreffende Zündspule "geladen" und anschließend (über die Zündelektronik) die betreffende Kerze gezündet.


    Über den SELECT-Schalter des LCD-Shields wird in einen KOnfigurationsmodus geschaltet, um den Hallgeber korrekt am unteren Totpunkt des ersten Zylinders einstellen zu können.


    Die Programmierung der Steuereinheit ist fertig, mit HIlfe eines Soundkarten-Oszilloskopes habe ich geprüft, dass die Berechnungen im Programm auch stimmen. Der "proof of concept" ist somit erbracht.


    Grundsätzlich könnte man das auch mit einem kleineren Arduino-Typ (z.B. Nano) umsetzen, dann muss aber eine andere Lösung für die Anzeige her (und entsprechende Änderungen im Code). Auch eine Anpassung für einen Einzylindermotor sollte problemlos möglich sein. Eine Verwendung mit einem Vierzylinder-Motor ist sicher auch möglich, dürfte aber einige größere Änderungen im Code notwendig machen.


    Zündelektronik
    ===============
    Hierzu hab ich einen fertigen Bausatz gefunden (http://www.velleman.eu/product…ountry=es&lang=de&id=8946). Diese Transistorzündung (es werden zwei Bausätze benötigt) wird zwar normalerweise in Verbindung mit mechanischen Unterbrecherkontakten verwendet, in meinem Projekt soll sie aber durch das vom Arduino erzeugte Ausgangssignal angesteuet werden.


    Signalgeber
    =============
    Als Signalgeber soll ein auch im Automobilbereich verwendeter Hallsensor verwendet werden (http://hallsensors.de/Hall-Vane.htm), bei dem kein rotierender Magnet benötigt wird. Als Signalgeber stelle ich mir eine halbmondförmige Scheibe aus magentischem Material (Eisenblech) vor, die auf die Nockenwelle montiert wird. Wenn der erste Zylinder im unteren Totpunkt steht, gleitet der Halbmond über den Sensor, so dass das Magnetfeld abgeschirmt wird, was als "falling edge" vom Arduino gemessen wird. Wenn dann der zweite Zylinder den unteren Totpunkt erreicht (nach einer halben Umdrehung der Nockenwelle), steigt das Magnetfeld wieder ("rising edge"), da die Abschirmung des Magnetfeldes durch die Halbmondscheibe wegfällt. So kann man genau zwischen erstem und zweiten Zylinder unterscheiden.


    Ich würde mich freuen, wenn mich jemand bei diesem Punkt unterstützen könnte. Ich verfüge nämlich nicht über die notwendigen feinmechanischen Möglichkeiten und Fähigkeiten.


    Wer also Interesse hat, kann sich gerne bei mir per PM melden.

    Grüße

    Emil


    Der Worte sind genug gewechselt, Laßt mich auch endlich Taten sehn! Indes ihr Komplimente drechselt, Kann etwas Nützliches geschehn.

    (Johann Wolfgang von Goethe: Faust: Eine Tragödie)

  • Hallo,
    ich will das jetzt nicht zerpflücken, ist schon spät.


    Zitat

    halbmondförmige Scheibe


    eher nicht.
    Schau dir einen Geber für Speed/Strecke an. Hallgeber (5V U_B) mit „Kronenmutter” … das funktioniert seit 20 Jahren. No bastle, älles fertich

    Zitat

    unteren Totpunkt steht


    …nimm den oberen.


    Zitat

    nach einer halben Umdrehung der Nockenwelle


    … i.d.R. Viertel bei der 250K, ist kein Gleichläufer wie die 125K (deshalb 2 Unterbrecher)


    Zitat

    Jede Zündkurve…


    … jede? Die K hat nur eine, da Last nicht eingeht (keine Unterdruckdose), Temperatur sowieso nicht, also kein Kennfeld.
    ich wette, dass ab 3T … 4T U/Min aufwärts der Zündwinkel konstant bleibt, mehr hat das Fliehkraftgelumpe auch nicht gekonnt, und es hat gereicht.
    (Wenn du mehr willst, brauchst du einen Motorprüfstand)
    Das Teil wird also nicht kompliziert. Aus dem Ärmel schüttle ich das jetzt aber auch nicht…:wink:


    Zitat

    Zündelektronik


    MOSFET reicht, soll ja nur der Primärspulenstrom unterbrochen werden.


    An sich kann das mit einem grafischen Display eine lustige Geschichte werden. Drehzahlmesser + Schaltblitz. :D


    Wünsch Dir viel Erfolg!

  • :o


    An sich 'ne schöne Idee - wenn meine Moppeds Unterbrecherzündung hätten, würde ich mir wahrscheinlich auch um sowas Gedanken machen.


    Ob man dafür den UT oder OT als Auslöser nimmt, ist egal - die Elektronik kann immer nur mit mehr oder weniger Verzögerung nach dem Signal "funken", gibt also nur unterschiedliche Kurven für die Verzögerungszeit.


    Verschiedene Zündkurven mögen für den Prüfstand oder den Rennbetrieb was bringen - eine Kurve für den Alltagsbetrieb sollte reichen. Die Verstellmechanik ist auf eine "robuste" Kurve entwickelt, damit die unvermeidlichen Ungenauigkeiten nicht so schnell in Störungen resultieren, aber viel wird bei dem Motörchen über 'ne optimierte "Alltagskurve" nicht zu holen sein.



    Damit sich der Aufwand (über ersparte regelmäßige Frickelei beim Einstellen der Kontakte) lohnt, muss man schon viel fahren - aber interessant ist es allemal.
    Da viele Vierzylinder auch nur mit zwei Zündspulen arbeiten, ist der Aufwand, das vom Gegenläufer-Twin auf 'nen Vierzylinder umzusetzen, dann eher gering.






    :wavey:

    [SIGPIC][/SIGPIC]
    Meine Maschinen sind alt genug, um selbst zu entscheiden, das macht es manchmal etwas anstrengend, mit ihnen unterwegs zu sein.
    Wenn meine Fähigkeiten nachlassen und ich meine CM 400T nicht mehr fahren kann, dann hole ich mir 'n Motorrad - und wenn's damit nicht mehr geht, 'n Lanz Bulldog.

  • …Ob man dafür den UT oder OT als Auslöser nimmt, ist egal - die Elektronik kann immer nur mit mehr oder weniger Verzögerung nach dem Signal "funken", gibt also nur unterschiedliche Kurven für die Verzögerungszeit.…


    Grundsätzlich falsch! aber sowas von falsch… ich sehe das so:
    OT und Takte zwischen den Durchläufen zählen, beim nächsten Umlauf korrigieren.
    Geber wird auf die feste „dynamische” Marke justiert (und der liegt nun mal beim OT und nicht beim UT) und Arduino korrigiert nur im niedrigen Drehzahlbereich - also da, wo man eh' nicht fährt.
    Nimmt man den UT als Referenz… und „rechnet”… wird das richtig garstig, der Arduino ist für schnelle Regelungsprobleme das, was der C64 für die Simulation von El ninjo war…


    Für die „Kurve” (die in echt eine Rampe ist) reicht es, mit funktionierender mechanischer Zündverstellung und Strobo+Gradscheibe eine Tabelle anzulegen.


    Klar kann man mit variabler Vorzündung regelungstechnisch viel machen. Siehst du am PKW über die OBD-SS. Dazu muss man aber ein tiefes Wissen über Verbrennungsabläufe haben und einen kleinen Motorprüfstand mit Bremse aufbauen.


    Aber „nur” die Kontakte und Fliehkraft ersetzen sollte gehen. Selbst bei der Enge am Wellenlager.

  • :crazy:


    Grundsätzlich falsch! aber sowas von falsch…


    Wenn man UT als dynamische Marke nimmt und in der Steuerung die richtigen Verzögerungszeiten (logischerweise Drehzahlabhängig) für den nächsten OT hinterlegt, ist da überhaupt nix dran falsch :booty:



    Man kann natürlich ebensogut OT als dynamische Marke und entsprechend größere Verzögerungszeiten für "vor dem nächsten Ot" nehmen - ist genauso(wenig) falsch. Regeln muss der Arduino nur bei Drehzahlveränderung - und die ist (gemessen an den Möglichkeiten des Prozessors) immer noch recht langsam ...






    :wavey:

    [SIGPIC][/SIGPIC]
    Meine Maschinen sind alt genug, um selbst zu entscheiden, das macht es manchmal etwas anstrengend, mit ihnen unterwegs zu sein.
    Wenn meine Fähigkeiten nachlassen und ich meine CM 400T nicht mehr fahren kann, dann hole ich mir 'n Motorrad - und wenn's damit nicht mehr geht, 'n Lanz Bulldog.

  • Nonsens.
    Korrigiert wird für jeden (JEDEN!!!) Zündvorgang ausserhalb des „konstanten” Fensters der „Gebrauchsdrehzahl”.


    Zitat

    …Verzögerungszeiten…


    blablabla…


    ich bin hier raus.

  • Das Display als Shield ist ziemlich ungünstig. Da taugt es höchstens zum debuggen bzw. einstellen, aber nicht im aktiven Betrieb (sonst müsste ja der komplette Arduino an den Lenker oder sowas und da will man ihn gar nicht haben).
    Einstellungen mache ich mittlerweile nicht mehr im Gerät selbst, sondern immer über serielle Schnittstelle. Die kann man im ersten Schritt dann direkt am PC über Putty füttern und später dann z.B. auf Bluetooth wechseln und sich sogar ne App dafür schreiben.


    Ich würde dir raten am Arduino UNO (den wirst du denke ich haben) zu entwickeln und wenn alles soweit passt, einen billigen China Nano zu kaufen und den dann zu verwenden. Braucht deutlich weniger Platz und kostet auch nicht viel, falls man ihn kaputt macht. Platz brauchst du für die Außenbeschaltung noch genug, da braucht die Platine mit dem IC nicht auch noch unnötig groß sein.


    Falls du ein Display am Motorrad haben willst (um da zur Laufzeit Informationen zu sehen), dann kannst du ja mal hier schauen, wie das bei mir aussieht und was ich für Erfahrungen gemacht habe: http://forum.arduino.cc/index.php?topic=326073.5


  • :goodp:


    Mit einem single IST-Wert/Positionserfassung bleibt doch nichts anderes über als ab dann die Zeit bis zum Zünden abzuwarten.
    Wenn es UT ist liegt man nächer dran als bei OT, ne ganze halbe Umdrehung :spin:


    Aber der Kontroller muss natürlich immer für die letzten beiden UTs die verstrichene Zeit ermitteln um auf die Drehzahl zu kommen.
    Bei 3000U/min sind das lächerliche 50Hz = 20ms, bei 9000U/min entsprechend ca. 6,66ms.
    An sich aber simpel .... dann inne Tabelle geschaut und zack weis er wann er den Funken fliegen lassen muß. :D


    TelosNox
    cooler link :topX:
    Das mit dem Display hat was :sup1:


    Ich hab direkt einen ATTiny verbaut :D

    Immer gut drauf bleiben!
    Gruß - Kolle
    Ohne Navi wär ich schon da :D______________ Adblock+ :topX:

    2 Mal editiert, zuletzt von Kolle ()

  • :o


    Bei 3000U/min sind das lächerliche 50Hz = 20ms, bei 9000U/min entsprechend ca. 6,66ms.


    Wenn man an der Nockenwelle "angreift", hat man nur halbe Drehzahl und doppelt soviel Zeit (beim Gegenläufer muss man ja doch mit 2 Sensoren und 2 "Funkengebern" arbeiten - oder man braucht auf beiden Zylindern gleichzeitig Funken immer an OT und UT).


    Trotzdem sehe ich da den kritischen Punkt - 5° mehr oder weniger Frühzündung sind knapp 0,2 ms Zeitunterschied, da müsste man die Kennlinien schon im Mikrosekunden-Bereich programmieren können. Kann der Arduino so genaue Timings?



    kleine Korrektur: lässt sich natürlich auch mit einem Sensor und extra Verzögerung für den zweiten Zylinder machen - nur etwas mehr Rechenarbeit.






    :wavey:

    [SIGPIC][/SIGPIC]
    Meine Maschinen sind alt genug, um selbst zu entscheiden, das macht es manchmal etwas anstrengend, mit ihnen unterwegs zu sein.
    Wenn meine Fähigkeiten nachlassen und ich meine CM 400T nicht mehr fahren kann, dann hole ich mir 'n Motorrad - und wenn's damit nicht mehr geht, 'n Lanz Bulldog.

    2 Mal editiert, zuletzt von olaf-frankfurt ()

  • … i.d.R. Viertel bei der 250K, ist kein Gleichläufer wie die 125K (deshalb 2 Unterbrecher)


    OK sehe ich ein. Dass die CB250 ein Gegenläufer ist, war mir übrigens schon klar (ein bisschen habe ich mich damit ja schon beschäftigt), nur hat es bei mir wohl intellektuell nicht ganz gereicht, dazu auch die korrekte Geometerie der Steuerscheibe abzuleiten. Hab ich jetzt aber verstanden. Das Motto heiß also "Steuerscheibe mit Viertelsegmenten", da gibt es zwei Möglichkeiten:


    "BWM-Propeller"
    Vorteil: Pro Umdrehung der Nockenwelle bekomme ich vier Signale (je zwei vom 1. und je zwei vom 2. Zylinder), damit kann man die monentane Umdrehungszeit genauer berechnen.
    Nachteil: Pro Umdrehung der Nockenwelle bekomme ich vier Signale (je zwei vom 1. und je zwei vom 2. Zylinder), ich weiß dann nicht, welches das "richtige" ist, d.h. die jeweilige Zündkerze zündet dann einmal zu viel, was aber vermutl. nicht so schlimm ist, da es dann ja eh nichts zu zünden gibt.


    Viertel- oder Dreiviertelscheibe (ist vom Prinzip äquivalent)
    Vorteil: Keine "Geisterzündung"
    Nachteil: Im Programmcode muss das speziell berücksichtigt werden (sollte aber kein Problem sein), Berechnung der momentanen Umdrehungszeit nicht so genau wie bei obiger Lösung.




    … jede? Die K hat nur eine, da Last nicht eingeht (keine Unterdruckdose), Temperatur sowieso nicht, also kein Kennfeld.
    ich wette, dass ab 3T … 4T U/Min aufwärts der Zündwinkel konstant bleibt, mehr hat das Fliehkraftgelumpe auch nicht gekonnt, und es hat gereicht.
    (Wenn du mehr willst, brauchst du einen Motorprüfstand)
    Das Teil wird also nicht kompliziert. Aus dem Ärmel schüttle ich das jetzt aber auch nicht…:wink:


    Ich geb zu, dass ist reine Spielerei. Ich hab die Kurven aber im Internet gefunden und da es nicht schwer war, die in das Programm einzubauen, hab ich es halt gemacht.

    Grüße

    Emil


    Der Worte sind genug gewechselt, Laßt mich auch endlich Taten sehn! Indes ihr Komplimente drechselt, Kann etwas Nützliches geschehn.

    (Johann Wolfgang von Goethe: Faust: Eine Tragödie)

  • Der Arduino hat 16MHz und kann Mikrosekunden. Der code muss halt passen und darf nicht zu viel Zeit verschwenden. Aber ich denke so ein Timing sollte er hinbekommen.

  • Das Display als Shield ist ziemlich ungünstig. Da taugt es höchstens zum debuggen bzw. einstellen, aber nicht im aktiven Betrieb (sonst müsste ja der komplette Arduino an den Lenker oder sowas und da will man ihn gar nicht haben).


    Genau das habe ich auch vor. Der UNO lag hier halt rum und das LCD Shield war billig zu bekommen. Die 6 Tasten auf dem Shield brauche ich eigentlich auch nicht, selbst wenn ich das mit der Zündkurvenauswahl beibehalte, würde eine Taste reichen (man muss die dann halt mehrmals drücken, um durch die einzelnen Kurven zu iterieren).

    Grüße

    Emil


    Der Worte sind genug gewechselt, Laßt mich auch endlich Taten sehn! Indes ihr Komplimente drechselt, Kann etwas Nützliches geschehn.

    (Johann Wolfgang von Goethe: Faust: Eine Tragödie)

  • Der Arduino hat 16MHz und kann Mikrosekunden. Der code muss halt passen und darf nicht zu viel Zeit verschwenden. Aber ich denke so ein Timing sollte er hinbekommen.


    Genau, alles wird in Mikrosekunden gemessen, alle Berechnungen beruhen auf Integer-Arithmetik.

    Grüße

    Emil


    Der Worte sind genug gewechselt, Laßt mich auch endlich Taten sehn! Indes ihr Komplimente drechselt, Kann etwas Nützliches geschehn.

    (Johann Wolfgang von Goethe: Faust: Eine Tragödie)

  • Das ist jetzt schon ein bisschen abgehangen… bin nicht immer im netz.
    Erst denken, dann posten.
    Tele: der ganze Klamauk vom Uno(US) bzw ???(it.) übern Leo zu den Mikros/Nanos… geht alles zu ca 5 bis 8€ über die Theke. Abh deutschem Versender. Preis ist schnuppe! Aufpassen bei der Stromversorgung, grosse Unterschiede, nicht jeder Typ hält die Bordspannung der K aus.
    Kolle: überschlaf das nochmal. 1. Versuch Bauchlandung. Lass dich bitte mal aufschauen, was die K so drehzahlmässig will… :-)
    Ich schrub nicht umsonst: Geber auf „Gebrauchsdrehzahl” einstellen -> zündet zeitgleich mit Geberpuls / Verschiebung bei Leerlauf wird errechnet.
    Gründe gibt's mehrere. So, wie das mechanisch gelöst ist (Eingriff bei steigender Drehzahl) halte ich es hier für nicht gut. Weil, wenn nicht korrigiert wird, gibt's falschen Zzp bei Vollast und das ist weniger edel.
    Da könnte jetzt Ricardo mit seinen Theorien über zerschossene KW und Pleuel ansetzen.
    ein oder zwei Geber: logisch 2, hat man bei den 80er Jahre Hondas auch… modernes Gerät hat nur einen, aber in den ECUs sind auch keine Bastel-Controler drin. Willst du das mit einem Geber, brauchst du Rechenzeit und da kommt der Arduino an seine Grenzen.
    Nockenwellengeber schalten mit nem Passstift. Das ist bei den Platzverhältnissen in der K vermutlich der einzige Weg.
    Ich würde versuchen, den Verstellmechanismus rauszuhauen und (jetzt ist Platz) eine kleine „Hilfswelle” mit 2 Stiften (90° versetzt) verschrauben.


    timing:
    https://www.arduino.cc/en/Reference/HomePage
    -> millis()
    -> micros()
    Daraus generiert man nen Takt in beliebiger Länge. Indexieren mit Drehzahl, Werte für „später” (!!!) aus dem Array.
    Hat sicher noch paar Ecken, aber die Richtung sollte stimmen…
    ;-)