Go Down

Topic: Projektvorstellung: Kettenölung und Griffheizung die 2. (Read 11115 times) previous topic - next topic

TelosNox

Startposting ist editiert mit Bildern vom fertigen Einbau und noch ein paar Infos.

TelosNox

Nachdem I2C Probleme gemacht hat und ich bei der Fehlersuche leider alles gegrillt habe (selber doof), musste wieder das ursprünglich angedachte DOGS102 in den Ring.
Der Eingangspost ist erweitert (zum letzten Mal, mehr Zeichen sind nicht mehr erlaubt) und ein Bild vom fertigen Display hängt auch mit dran.

Schraubi

Hallo Telos Nox

Ich finde eine Tolles Projekt das Du hier vorgestellt hast.
Ich bin auch dabei eine Steuerung dieser Art zu realisieren, weil meine alte PWM Steuerung auf Basis NE555 zwar stabil arbeitet aber schon etwas umständlich in der Bedienung ist. unterm Fahren an einem Poti drehen das Platz bedingt in der Verschalung sitzt... na ja.

Was vieleicht hilfreich wäre für mich , der Treilbereich Temperaturfühler und umsetzung in PWM

Würde mich freuen über eine wenig Starthilfe.

Für den Displayschutz. Früher habe ich mit Frontscheiben für Displays dahingehend lebst genamcht in dem ich Plaexiglas aufbereitet habe ( machanisch ) und dann an der seite die mit dem Display in kontakt kommt das Sichtfenster präzise abgeklebt habe und mit Lack besprüht. nach trocknen das Klebeband ab und schon hat man eine schöne Blende  nach Maß. Schützt das Display und kann ersetzt werden wenn zerkrazt! ;-)

LG

Martin

TelosNox

Hallo Martin,

da ich hier im Forum nicht mehr so oft unterwegs bin, wäre eine PM nicht schlecht gewesen. Jetzt ist schon fast 1 Monat vergangen.

Du solltest eigentlich alles, was du brauchst direkt übernehmen können https://github.com/TelosNox/noxmatic/blob/master/Arduino/sketches/noxmatic/Heater.cpp (den Header mitnehmen nicht vergessen)

Einfach Konstruktor rufen, Init im Setup machen und dann im Loop Process rufen.
Speicherung der Konfiguration musst du dir halt noch was überlegen.

TelosNox

Aktuell ist der Kettenheizöler der 3. Generation in Arbeit. Die Platform wechselt auf den NodeMCU (weil dank WLAN einfacher zu konfigurieren und mit 3,3v wird es am Display deutlich einfacher).
Es wird wieder Kettenölung und Griffheizung mit Display geben. Zusätzlich ist geplant, dass GPS und Gyro für die Wegstreckenberechnung einsetzbar sind (somit kein Tachosignal mehr nötig). Eventuell kommt dann auch eine Schräglagenmessung mit rein. Da muss man aber erstmal rausfinden, ob sich das sinnvoll berechnen lässt.
Die Heizgriffe werden jetzt getrennt angesteuert. Somit kann man Heizverluste am linken Griff dann ausgleichen.

Noch ist das Projekt in den Kinderschuhen, die veröffentlichten Sourcen sind vorbereitet und kompileren für den NodeMCU. Konfiguration fehlt noch komplett und ob alles läuft ist aktuell noch unklar (ich warte grad auf bestellte Hardware...).

Ich mache das Projekt diesmal auch nicht alleine, sondern habe Unterstützung.

Prinzipiell sollte der Code auch auf dem Arduino laufen, sofern man die ESP spezifischen Teile rausnimmt und Pins dann passend anpasst. Ich versuche es so zu gestalten, dass die Spezifika extra liegen, um eine einfache Adaption zu ermöglichen.

Projekt auf GIT

TelosNox

Ich bin mittlerweile fertig mit Version 3.0.

- Kettenölung wie gewohnt mit Tachosignal, Geschwindigkeitsanzeige und Zielgeschwindigkeit
- Automatische Heizgriffsteuerung jetzt mit getrennt ansteuerbaren Griffen. Somit Ausgleich von Griffunterschieden möglich (Gashülse)
- Windchill wieder integriert: Die Griffe regeln unter 50km/h die Leistung um max. 50% runter (linear nach Geschwindigkeit)
- Konfiguration komplett über Wlan mit integriertem Webserver. Hotspot am Handy aktivieren, einschalten, Display zeigt die IP und dann einfach im Browser öffnen. Keine extra App nötig
- OTA Update möglich. Somit ist nur initial eine USB Verbindung nötig, danach kann jederzeit im eingebauten Zustand die Software aktualisiert werden

Das ganze Projekt ist OpenSource. Aktuell ist nur Sourcecode und Schaltplan online. Ich will noch ein Wiki schreiben, damit man weiß, was zu tun ist und wie man anschließen muss.

meister_q

Wie ist es bei dir bezüglich des Tachosignals?

Nutzt du geschirmte Leitungen um das Signal vom Geschwindigkeitssensor des Motorrads abzugreifen, oder nutzt du einen eigenen Hallsensor (ebenfalls geschirmt) ?

Ich steh gerade vor dem Problem, dass ich sobald ich den Motor starte, nur noch störungen bekomme, heisst:

Die Impulse zählen unendlich hoch, aber nur wenn der Motor läuft.

Habe schon in dem Thread:

https://forum.arduino.cc/index.php?topic=388859.15

gelesen, und die Hardware wie da aufgebaut (wie beim rehoiler), aber das war nutzlos.

Ich greife zur Zeit das Tachosignal vorne am Kombiinstrument mittels Nadel und Krokodilklemmen ab, die freischwebend zu meinem Arduino (der vor dem Motorrad auf dem Boden liegt) gehen, und von da auf den Interrupt gehen. In Reihe zur Impulsleitung ist eine Diode verbaut, paralell zu GND dahinter ein 1nF Keramikondensator.

Einen Tiefpass mit 1,5kOhm und 10nF habe ich ebenfalls schon getestet, kam kein erfolg.

Zum schluss bleibt mir nur noch die Lösung mittels geschirmter Leitung (Ist schon bestellt), oder aufgabe.

Hoffentlich liest der Threadersteller hier noch weiter :)

TelosNox

Meine Leitung ist ein einfacher Leitungsdraht ohne Schirmung oder sonst was. Das hat bereits in 3 unterschiedlichen Motorrädern funktioniert. Ich glaube nicht, dass es bei dir an der Leitung liegt.

Der Tachosensor funktioniert ja so, dass der Pin selbst HIGH ist und auf Massedurchgang reagiert. Eine induktive Störung bringt das Signal nicht auf Masse, daher sollte das kein Problem sein.

Wenn du eine eigene Software hast, dann check mal, auf was dein Pin reagiert. Auf HIGH zu horchen wäre falsch.

Ich nutze keinen eigenen Hallsensor, sondern das Tachosignal, das die ECU generiert.

Bei dir vermute ich, dass entweder der Pin falsch programmiert ist, oder dass deine aktuelle Verbindung durch Vibration einfach wackelt. Falls das Tachosignal aktuell auf Masse ist und dann die Verbindung wackelt, dann bekommst du deinen beschriebenen Effekt.

meister_q

Ok, im Mccoiforum wurde mir gesagt, dass die Hondas extrem EMV belastet sind, hast du deins an einer Honda getestet?

Mein Tachosignal wechselt, je nach Radposition von High auf Low auf High usw. Es kann z.b. auch permanent High oder Low sein, je nach radstellung.

Mein Interrupt erkennt Falling. Ich habe ja ebenfalls das Tachosignal abgegriffen was vom ECU kommt und vorne ans Instrument geht. Ich glaube nicht, dass das Vibrationen sind, da ich alles mit Krokodilklemmen befestigt habe, und selbst wenn ich an den Leitungen wackle wenn der Motor aus ist, zählt es nicht hoch. Nur wenn der Motor läuft.

Ich hab das Signal schon mit einem Stromdieb, sowie an anderer stelle mit einer Nadel und Krokodilklemme abgegriffen. Der Effekt bleibt weiterhin bestehen.

Kannst du deinen Codeschnipsel, der das Tachosignal via Interrupt erkennt, hier rein posten?

TelosNox

Hatte den Öler damals in der CBF600 und aktuell in einer MT09 und in einer CB1300. Ist also 2x Honda dabei ;-)

Code: [Select]

#define PIN_SPEED_SIGNAL D6

void setup() {
  attachInterrupt(digitalPinToInterrupt(PIN_SPEED_SIGNAL), speedSignalTrigger, FALLING);
}

void speedSignalTrigger() {
  distanceCalculator.processTick();
}


Sollte bei dir inhaltlich auch nicht anders aussehen (Achtung mein Code ist für den ESP8266, deine Syntax ist anders).

Was zeigt denn das Multimeter an, wenn du an deinem Tachosignal misst? Mit Motor aus müsste es ja dann sauber zwischen 0 und 5V toggeln (ich glaube Honda hatte da 5V). Stell das Motorrad dann mal so hin, dass die 5V anliegen und mach dann den Motor an. Wenn du dann immer noch diesen Effekt hast, dann kommt es nicht vom Wackeln deiner Leitung (wäre ja dann keine Masse zum hinwackeln vorhanden).
Man kann auch mal das Rad so drehen, dass das Tachosignal LOW ist und das Multimeter dran halten. Da sollte dann auch 0V stehen. Motor an und schauen, was er dann misst. Wenn da was zappelt, sollte das Multi vielleicht zucken.

Check auf jeden Fall mal, ob du auch den richtigen Pin als Trigger zugewiesen hast. Wenn da nämlich nix angeschlossen ist und die Versorgungsspannung schwankt (tut sie ja, sobald die LiMa läuft), dann könnte das vielleicht auch dazu führen, dass der Interrupt kommt.

meister_q

Danke für den Codeschnipsel.

Ich habe auch eine CBF600. Die PC43 (Die ab BJ 2008).

kannst du mir noch die Funktion in der Interruptfunktion zeigen?

Aber ja, bei mir sieht es mit dem Interrupt genau so aus. Ebenfalls nutze ich Falling.

Schließe ich das Multimeter von der Tacholeitung zu Masse an, drehe das Rad bei Motor aus und Zündung an, Wechselt das Multimeter zwischen 0V und 5V.

Den Tipp mit dem Hinstellen werde ich mal testen.

Ich nutze ja anstatt digitalPinToInterrupt(PIN_SPEED_SIGNAL), setze ich direkt "1" ein (glaube ich jedenfalls) Interrupt 1, an digitalpin 3. (sorry, bin die letzten Tage nur am Laptop, Code ist am PC zuhause wo ich nicht war).

Ist der Motor aus, und Zündung an und wenn ich eine LED zwischen dem Tachosignal und Masse schalte, und das Rad drehe, Leuchtet die LED, geht aus, leuchtet, etc... Also ein klares 5V Signal.

Starte ich den Motor mit LED oder Multimeter angeschlossen. Bleibt die LED in dem jeweiligen zustand und ändert diesen nur, wenn ich am Rad drehe. Also ein eindeutiges Tachosignal. Wenn der Arduino wieder dran hängt, dreht der Impulszähler wieder hoch. Merkwürdig. Meinen Interruptpin hab ich intern auf High gezogen. Also INPUT_PULLUP bei der Pindefinition. Wo ich am Interrupt noch "HIGH" erfasst habe, hatte ich den Pin3 mit 100kOhm auf Masse gezogen. Problem war weiterhin da.

Ebenfalls habe ich eine Diode auf den Arduino zeigend von der Impulsleitung zwischen geschaltet, und einen Tiefpassfilter hatte ich mit 1,5kOhm und 10nF geschaltet. Ebenfalls erfolglos.

Blieb für mich logisch nur noch EMV übrig.

Ich werde als nächstes den Arduino tauschen, nicht dass dieser schon irgendwelche ESD Schäden hat, ebenfalls verwernde ich auch mal einen anderen Interrupt Pin.

Die Funktionen der Schaltung hab ich ja schon alle getestet, indem ich die Leitungen mal abgezogen hab um die Funktion zu testen etc..

Bin da momentan ziemlich ratlos.

TelosNox

Mein Code ist auf GitHub komplett öffentlich zu finden (Link ist im ersten Post). Da findest du dann auch die Methode, die im Interrupt ausgeführt wird. Aber im Endeffekt wird nur hochgezählt und der merkt sich noch die Millis, wann das passiert ist.

Den Pin auf Masse ziehen bringt nix. Im Gegenteil, du willst ja LOW messen und nicht HIGH.

Funktioniert denn dein Interrupt, wenn du den Tachosignalanschluss einfach händisch erdest. Also Kabel dran und dann an Masse halten und wieder weg (ganz ohne Motorrad). So solltest du Interrupts bekommen.
Du kannst dir zum testen auch ein Tachosignal generieren. Einfach einen freien Output Pin auf PWM schalten und als Tachosignal anschließen.

Wie ist deine Diode drin? Ist die Kathode (der schwarze Ring) am Pin oder ist die Kathode auf Seite des Tachosignals?

Wie gesagt, EMV kann eigentlich nicht sein, wenn alles korrekt verdrahtet ist. Der PIN sieht nur Masse. Sämtliche positiven Spannungen sind durch die Diode abgeblockt. Wenn dann könnte höchstens eine negative induzierte Spannung da was ausrichten aber auch daran glaube ich nicht.

meister_q

Ok danke. Jo, daher sagte ich ja, ich habe dann den pinMode auf INPUT_PULLUP gestellt, und erfasse ja FALLING.

Komplett ohne Motorrad wenn ich den Interrupt auf Masse bzw GND lege, zählt er einen, bzw mit bounce hoch.

Ist bouncing durch vibrationen vielleicht mein problem? Eigentlich sollte das Signal vom Motorrad doch ohne bouncer kommen?

Code: [Select]

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, interruptType);                // 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");
}


Mein Code zum Impulse erfassen.

Dazu noch die defines

Code: [Select]

#define abrollumfang 0.01896              // Radumfang 189.6cm -> In km angegeben
#define radumdrehungsimpulse 72           // Pulse pro Radumdrehung
#define interruptType FALLING


Im setup hab ich

Code: [Select]

  attachInterrupt(1, rpm_fun, interruptType); // Aktiviert Interrupt an Interruptpin 1 (Digitalpin 3) mit HIGH Flanke, führt Funktion "rpm_fun" aus


Der rest ohne die defines jetzt

Code: [Select]

void setup()
{
  Serial.begin(9600);   // Seriellen Monitor öffnen (Baudrate 9600)

  lcd.begin();          // LCD Starten
  lcd.backlight();      // LCD backlight aktivieren
  lcd.clear();          // LCD Säubern

  pinMode(3, INPUT_PULLUP);

  attachInterrupt(1, rpm_fun, interruptType); // 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
}

TelosNox

Mit bounce meinst du sicherlich prellen. Nein ein Hallsensor prellt nicht und auch die Leitung dürfte nicht prellen.

Deine Diode müsste dann wohl auch richtig drin sein, sonst würde er bei GND nicht hochzählen.

Was passiert, wenn du den Arduino am Motorrad hast (Spannungsversorgung) und den Tachoanschluss vom Arduino fest auf Masse bzw. 5V legst und dann den Motor anmachst? Wenn er dann auch Impulse zählt, dann kommt das Problem von der Spannungsversorgung. Wenn dann nix passiert, dann kommt es irgendwie vom Tachosignal.

Um nochmal die Schaltung zu klären: Du hast direkt am Pin den 1nF gegen Masse und dahinter dann die Bat42 mit Kathode in Richtung Motorrad, richtig? Der Pin ist auf HIGH (mit Multimeter messen), wenn nichts angeschlossen ist.

meister_q

Ich komme vom Tachosignal über die Diode mit Kathode zum Motorrad zeigend auf mein Breadboard, nach der Kathode, also an der Anode gehe ich auf den 1nF Kondensator der auf GND geht, und ebenfalls von der Anode der Diode gehe ich auf digitalPin 3 (Interrupt 1) vom Arduino Mega. Dieser Pin ist mit

Code: [Select]

  pinMode(3, INPUT_PULLUP);


auf HIGH gezogen, da ich ja FALLING prüfe.

Ich habe meinen Arduino via Powerbank über USB versorgt, nicht über das Motorrad, den GND vom Arduino und die Masse vom Motorrad hab ich zusammengeschaltet.

Go Up