Arduino Forum

International => Deutsch => Topic started by: TelosNox on May 28, 2015, 01:49 pm

Title: Projektvorstellung: Kettenölung und Griffheizung die 2.
Post by: TelosNox on May 28, 2015, 01:49 pm
UPDATE: Ein Nachfolgerprojekt ist gerade am Entstehen. Diesmal mit Schaltplänen und noch größerem Umfang. Es findet auch ein Wechsel vom Arduino auf den NodeMcu statt (Code bleibt weiterhin Arduino).
Nachfolgeprojekt auf GIT (https://github.com/TelosNox/noxmatic)


Vor langer langer Zeit habe ich hier mal mein Projekt vorgestellt. Es geht darum am Motorrad die Kette automatisiert wegstreckenabhängig zu ölen und die Heizgriffe automatisch abhängig von der Außentemperatur zu regeln.
Die aktuellen Zustände sollen an einem Display ablesbar sein und irgendwie muss man das Ding dann auch noch Parametrieren.

Meine vorherige Lösung war ein Arduino UNO mit einem DOGM163 (also Textlcd) und einem DS18B20 für die Temperaturmessung. Dazu zwei Logiklevel Mosfets zur Ansteuerung der Griffe und der Pumpe.
Zwei Taster am Display dienten dazu per Menüführung die Einstellungen zu machen.

Das Ergebnis war jetzt einige Jahre (ich glaube 4) in meinem Motorrad verbaut und hat ordentlich funktioniert.

Warum jetzt nochmal von vorn?

1. Das Display ist ungeschickt. Die Ziffern sind zu klein und die Informationen in reiner Textform nicht immer sinnvoll. Außerdem geht mir so langsam die Oberfläche kaputt und es wird schlecht lesbar. Das will ich jetzt anders machen.
2. Die Taster am Display sind sinnlos. Das braucht man nicht und die Einstellerei geht mit anderen Mitteln deutlich besser.
3. Es sind einige Funktionen integriert, die nicht wirklich Sinn machen (z.B. progressive Kettenölung)
4. Es fehlen Funktionen, die Sinn machen würden (z.B. verzögerte Kettenölung abhängig von der Geschwindigkeit)
5. - und das ist der Hauptgrund - will ich das Projekt diesmal so realisieren, dass es auch einfach nachgebaut werden kann.


Features:
- Automatische Ölung der Kette durch Pumpe gemäß einstellbarer Wegstrecke
- Verzögernug der Ölung, bis das passende Geschwindigkeitsfenster erreicht ist. (je schneller man fährt, desto schneller ist die Kette und umso mehr wird vom frischen Öl sofort abgeschleudert. Daher versuche ich einen Zeitpunkt zum ölen zu finden, wenn die Kette langsam genug ist. Natürlich wird nach einer gewissen Zeit unabhänig von der Geschwindigkeit geölt)
- Automatische Aktivierung und Regelung der Heizgriffe abhängig von der Außentemperatur. Die Regelung erfolgt linear.
- Anzeige der Zustandsinformationen in einem Display (Außentemperatur, anliegende Heizleistung, aktuelle Geschwindigkeit, aktuelle Wegstrecke und Anzeige des Notlaufmodus, wenn das Tachosignal fehlt)
- Einstellung der Parameter über Bluetooth (Android App, aber auch über andere serielle Übertragung möglich)

Nötige Hardware:
- Arduino Nano (china clone)
- DS18B20
- Dog s102
- HC-06 Bluetooth Adapter
- 2x IRF 3708 (als Treiber)
- 4,7k Widerstand (Pullup für den Dallas)
- BAT42 (Tachosignal)
- 1n Kondensator (ebenfalls Tacho)

Spannungsschutz
- Zener Diode 5W, 15V
- 47mü Drossel
- 10mü Kondensator

Dazu noch bischen Kabelkram zum verdrahten.

Preislich sollte sich das Ganze in Grenzen halten.
Arduino ca. 8€, DS als wasserdicht 4€, das OLED 10-11€, Bluetooth 7-8€. Der Rest ist Kleinkrust.
Man sollte also mit knapp über 35€ für die Steuerung ansich hinkommen. Fehlt halt dann noch Gehäusekram (Display und Controller) und dann halt Griffe sowie Pumpe.

Warum hab ich mich für das OLED entschieden?
Ganz einfach: Es gibt keine anderen kleine I2C fähigen Displays. Ich hab noch ein DOGS102 zur Hand. Das muss man aber 1. beschalten (3 Kondensatoren), 2. Steuersignale wandeln (es will 3,3V) und 3. mit ganzen 7 Adern anbinden anstatt mit nur 4. Die ganze Kabelarbeit ist sowieso schon fummelig genug.
Außerdem ist 128x64 denke ich ein ganz gängiges format (findet man viele Displays), so dass man ohne große Codeänderung auch ein anderes Display verwenden könnte (das Layout würde passen).

Im Endeffekt soll man den Controller modular verwenden können. Wer kein Display will/braucht, schließt halt einfach keins an. Wer nur die Heizung will, lässt halt den Öler weg, wer nur ölen will, lässt halt die Heizung weg.
Updates und Änderungen sind jederzeit einfach zu machen, sofern man den Arduino nicht festlötet. Abziehen, an den PC hängen, hochladen und fertig.

Leider hab ich gestern mein Display geschrottet (ohne dritte Hand an so nem Miniding löten ist halt einfach nix) und jetzt muss ich warten, bis das Neue da ist. Daher gibts jetzt auch noch keine Bilder, wie die Sache nachher aussehen wird. Das kommt dann ein wenig später.

Hier ein paar Bilderchen

Fliegender Aufbau der Schaltung mit Potis zum simulieren der Temperatur und der Geschwindigkeit
(http://forum.arduino.cc/index.php?action=dlattach;topic=326073.0;attach=127865)

So sieht das Display im Gehäuse aus, wenn es noch nicht vergossen ist
(http://forum.arduino.cc/index.php?action=dlattach;topic=326073.0;attach=127867)

Und hier das fertig vergossene Display. Hat leider nicht 100%ig geklappt, ich hätte die Kaltglasur erst noch andicken lassen müssen. So war sie zu dünn und es ist ein wenig unten durchgelaufen. Dadurch ist sie eingesackt.
Die Beleuchtung ist übrigens weiss, ich hab sie aber per Widerstand gedimmt und dann wird sie leicht bläulich. Die Kamera macht daraus ein kräftiges Blau es ist aber in der Realität deutlich weniger blau, als es hier aussieht
(http://forum.arduino.cc/index.php?action=dlattach;topic=326073.0;attach=127869)

Kurz zum Inhalt der Anzeige:
Ganz groß die Außentemperatur. Das ist für mich auf Dauer die interessanteste Information. Unten die Geschwindigkeit und der zurückgelegte Weg bis zur nächsten Ölung als Balken (voller Balken = Ölen).
Rechts dann die aktuelle Einstellung der Griffheizung als Pfeil auf der Skala sowie unten als Zahl (wenn sie Aus ist, dann steht da auch einfach "aus").

Oben oder links hätte ich noch Platz für Symbole, falls ich da was bräuchte. Aktuell seh ich da keinen Bedarf. Allerdings könnte man noch einen Regensensor integrieren, dann kann man da anzeigen, wenn Regen erkannt wurde und der Modus aktiv ist. Oder z.B. den Füllstand vom Öltank anzeigen. Das müsste man dann aber erstmal anlernen und es würde dann halt bei jedem Pumpvorgang ins EEPROM geschrieben (es sei denn ich mach ne Zündungserkennung mit Nachlauf, so dass erst beim Abstellen der Zündung gespeichert wird - wäre aber zu kompliziert).


Die neue Steuerung ist jetzt verbaut. Nach dem Einschalten zeigt sie für 30sec die aktuelle Einstellung an:
(http://forum.arduino.cc/index.php?action=dlattach;topic=326073.0;attach=130347)

Danach wechselt sie in den Betriebsmodus. Leider ist der Kontrast des Displays nicht so besonders. Wenn die Sonne richtig scheint, dann erkennt man nur sehr schwer was. Das war mir aber auch vorher schon klar.
(http://forum.arduino.cc/index.php?action=dlattach;topic=326073.0;attach=130349)

Und hier dann der "Rest" unter der Sitzbank. Der Arduino passt samt der Beschaltung (2 MosFets, Diode, Kondensator, OneWire Widerstand, Bluetooth Dongle und dem Anschluss fürs Display in das relativ kleine Gehäuse - die alte Variante mit Arduino Uno war deutlich größer). Pumpe und Öltank sind in der Seitenverkleidung versteckt, Strom kommt über ein Relais samt eigener Sicherung. Der Temperatursensor ist vorne unter der Lufthutze versteckt (vor Sonne geschützt und bekommt trotzdem gut Luft).
Was hier noch fehlt ist der Netzfilter. Der kann sogar klein ausfallen, da er keine Leistung abkönnen muss. Die Mosfets schalten ja auf Masse durch und Pumpe sowie Heizgriffe hängen direkt an der Versorgung (da muss man ja nix filtern).
(http://forum.arduino.cc/index.php?action=dlattach;topic=326073.0;attach=130351)

Was Vibrationen angeht: Das Gehäuse ist nochmal in Schaumstoff eingepackt. Ich habs nur rausgeholt, damit man sieht, wie ich das gelöst habe.
Das Display ist auch ein anderes. Zuvor hatte ich 0,96", das neue ist jetzt 1,3" und das ist deutlich angenehmer zu lesen. Leider hats beim Bearbeiten des Gehäuses diesmal nicht so gut geklappt und ich hab Macken reingemacht. Die Glasur hab ich vorher ein wenig anziehen lassen, war aber nicht lang genug, es ist wieder ein wenig eingesackt. Also nächstesmal noch länger warten.


Das OLED Display mit I2C hatte leider Probleme mit der Datenübertragung. Es hat sich öfter mal aufgehängt und nicht mehr aktualisert. Bei der Fehlersuche hab ich dann leider alles gegrillt (aus Dummheit falsch angeschlossen).
Ergo alles nochmal neu mit dem noch vorhandenen 2. Arduino aufgebaut und das andere Display verwendet (das DOGS102).
(http://forum.arduino.cc/index.php?action=dlattach;topic=326073.0;attach=130785)

Hier gibts die Sourcen (für Eclipse IDE) samt kurzer readme:
Sources (https://drive.google.com/file/d/0B2z_T1NpM6sccmF6Yzg2NENmT2s/view?usp=sharing)
Title: Re: Projektvorstellung: Kettenölung und Griffheizung die 2.
Post by: Eisebaer on May 28, 2015, 03:30 pm
hi,

Quote
Das Display ist ungeschickt. Die Ziffern sind zu klein
jaja, auch biker werden älter... 8)

viel spaß mit dem projekt und

gruß stefan
Title: Re: Projektvorstellung: Kettenölung und Griffheizung die 2.
Post by: TelosNox on May 28, 2015, 04:01 pm
Nee hat mit dem Alter nix zu tun. Liegt am schlechten Kontrast bei Sonnenlicht. Große Ziffern kann man dann noch relativ gut erkennen aber kleine Ziffern leider nicht.

Davon abgesehen: Mit ner tollen Grafik kommts halt auch cooler.
Wobei ich zugeben muss. Das OLED Display ist bei direkter Sonne auch nicht mehr ablesbar. Aber ich hab kein anderes kleines FSTN pos. Display gefunden, das auch I2C kann. Die ganzen anderen Displays der DOG Serie sind leider zu groß oder Textdisplays oder sie können kein I2C.
Title: Re: Projektvorstellung: Kettenölung und Griffheizung die 2.
Post by: combie on May 28, 2015, 04:28 pm
doch, doch, es interessiert mich schon, welche Pumpe du da verwendest.....
 :o
Title: Re: Projektvorstellung: Kettenölung und Griffheizung die 2.
Post by: TelosNox on May 28, 2015, 04:42 pm
Ich selber hab ne Webasto 9012868C DP30. Die hab ich damals gebraucht aber voll funktionstüchtig für 25€ erstanden.

Alternative ist eine Dellorto PLE 6 (kostet um die 35€ zzgl Versand). Die hat allerdings ne deutlich geringere Fördermenge, man muss also die Wegstrecke reduzieren und man braucht unterschiedliche Schlauchdicken bzw. muss sich nen Adapter bauen (bei der Webasto sind beide Anschlüsse gleich).
Die hab ich mit einem Rehoiler bei meinem Vater im Motorrad verbaut aber bisher haben wir noch nicht das richtige Setting gefunden, damit die Kette passend geschmiert ist (wir sind aber mit der Konfiguration auch noch nicht so viel gefahren).

Letzte mir bekannte taugliche Pumpe ist die Pumpe vom McCoi, die bekommt man auch einzeln. Die ist mit 46,50€ aber schon richtig teuer im Vergleich.

Wichtig bei der Pumpe ist halt, dass es eine Dosierpumpe ist, weil die Steuerung auch davon ausgeht. Somit gibt es auch keine vorgegebene Einschaltzeit oder sowas. Es wird einfach für eine ausreichend lange Zeit eingeschaltet (das ist der Pumpstoß) und dann wieder ausgeschalten. Eine Dauerpumpe würde nicht funktionieren.
Title: Re: Projektvorstellung: Kettenölung und Griffheizung die 2.
Post by: combie on May 28, 2015, 05:02 pm
Ja, Standheizungspumpen hatte ich auch auf dem Schirm.
Aber neu sind die wirklich irre teuer. 70€ ist da schon billig.
Werde mal schauen, was der Schrotti meines Vertrauens, so in der Wühlkiste hat.

Der ursprünglicher Plan war, eine simple Ganganzeige zu bauen.
Denn mein Wintermotorrad und das Sommermotorrad unterscheiden sich beim "Schaltgefühl".
Die Umstellung dauert lange. Ich suche dauernd den letzten Gang, obwohl schon drin.

Tachosignal und Zündimpuls sollten reichen um eine "Letzter Gang ist drin" LED zum leuchten zu bringen.
Ein ATTiny war auf dem Plan.

Aufgepeppt mit einem Kettenöler reizt das noch mehr. Ein Pro Mini (noch ein paar auf Lager) sollte das dann bequem alles abhandeln können.

Ich werde diesen Thread also aufmerksam verfolgen.


Title: Re: Projektvorstellung: Kettenölung und Griffheizung die 2.
Post by: Eisebaer on May 28, 2015, 05:05 pm
hi,

wegen der lesbarkeit:
wäre da nicht ein e-paper das richtige? einen kindle kann man auch in der sonne lesen...

http://www.ebay.de/itm/4-5-E-paper-Shield-for-Arduino-pcDuino-/271786713018?pt=LH_DefaultDomain_0&hash=item3f47c01fba (http://www.ebay.de/itm/4-5-E-paper-Shield-for-Arduino-pcDuino-/271786713018?pt=LH_DefaultDomain_0&hash=item3f47c01fba)

scheint per SPI angesprochen zu werden.

gruß stefan
Title: Re: Projektvorstellung: Kettenölung und Griffheizung die 2.
Post by: TelosNox on May 28, 2015, 06:10 pm
E-paper ist viel zu groß und zu teuer (die andern Displays liegen um die 10€).

Ein Shield ist nicht praktikabel, da der Arduino selbst irgendwo versteckt angebaut wird (Heckverkleidung oder sowas). Das Display ist ne extra Komponente, daher ja der Wunsch nach I2C.

Den ganzen Arduino irgendwo Sichtbar zu verbauen hatte ich auch schon überlegt aber das wird 1. relativ groß und 2. hat man da eine Unmenge von Kabeln.

Versorgung Masse
Versorgung 12V
Pumpe +
Pumpe Masse
Heizgriff +
Heizgriff Masse
Dallas Data (es sei denn man baut den mit ins Gehäuse aber dann ist er nicht aus der Sonne raus)
Dallas Masse
Tachosignal
Ggf. Versorgung für Tachosignal falls man nen Hallsensor oder Reed machen muss (ist in meinem Fall leider so)

Das würde alles aus dem Kasten rauschauen mit hübschen bunten Drähtchen (es sei dann man nimmt ein Hauptkabel und versteckt dann irgendwo nochmal ne Kabelbox, dann wird das Kabel aber dick).

Daher die Taktik mit getrenntem Display, das mit seinen 4 Adern schlank irgendwo vorne bei den Armaturen angebracht wird. Der Rest alles hinten versteckt.
Title: Re: Projektvorstellung: Kettenölung und Griffheizung die 2.
Post by: TelosNox on May 31, 2015, 10:19 pm
Anfangspost aktualisiert, gibt jetzt ein paar Bilder vom Display
Title: Re: Projektvorstellung: Kettenölung und Griffheizung die 2.
Post by: sschultewolter on May 31, 2015, 10:42 pm
Keine Berechtigung, lade die Bilder am besten hier hoch
Title: Re: Projektvorstellung: Kettenölung und Griffheizung die 2.
Post by: TelosNox on Jun 01, 2015, 07:20 am
Danke für die Info, ich habs korrigiert. Leider gingen die Bilder jetzt nicht direkt in den Post (gingen sie ja vorher aber auch nur bei mir).
Title: Re: Projektvorstellung: Kettenölung und Griffheizung die 2.
Post by: combie on Jun 01, 2015, 08:50 am
Danke für die Info, ich habs korrigiert. Leider gingen die Bilder jetzt nicht direkt in den Post (gingen sie ja vorher aber auch nur bei mir).
Attachment anhängen (schon gemacht)
Post speichern (auch erledigt)

Post bearbeiten
Dann die Linkadresse des Attachments nehmen und img Tags drum rum basteln.
Post speichern.

*bilder wieder entfernt*
Title: Re: Projektvorstellung: Kettenölung und Griffheizung die 2.
Post by: TelosNox on Jun 01, 2015, 09:20 am
Danke dir, hätt ich mir auch denken können. Ich dachte nur, dass das nicht geht, weil die Attachment links nicht direkt auf die Bilder gehen, sondern auf ein php. Aber das Board kann das wohl erkennen und rendert das dann korrekt.

Bilder sind jetzt oben direkt eingefügt und kommentiert
Title: Re: Projektvorstellung: Kettenölung und Griffheizung die 2.
Post by: combie on Jun 01, 2015, 09:45 am
Bilder sind jetzt oben direkt eingefügt und kommentiert
gut!
Dann entferne ich sie aus meinem Posting wieder....
Title: Re: Projektvorstellung: Kettenölung und Griffheizung die 2.
Post by: TelosNox on Jun 13, 2015, 12:40 am
Die Platine ist jetzt verlötet. Ich hab alles auf ein Standard Lochraster gebastelt und den Arduino somit festgelötet. Ich hätte auch Steckleisten nehmen können, dann wäre es aber zu hoch geworden und hätte nicht mehr in mein Gehäuse gepackt.

Anschlüsse für Display und das BT-Modul sind steckbar. Vor allem das BT-Modul ist wichtig, damit man es abziehen kann und somit ein Upload über USB wieder möglich ist (das geht ja sonst nicht).

(http://forum.arduino.cc/index.php?action=dlattach;topic=326073.0;attach=129198)

Das Display ist mit einem Drehmel ausgeschnitten und geschliffen. Leider hab ichs nicht so besonders sauber hinbekommen und auch Macken reingemacht.
Damit es dicht wird, ist es vorne mit Kaltglasur vergossen. Auch da gibts leider kleine Probleme. Die Glasur sah glatt und blasenfrei aus, war sie aber nicht. Ich hätte sie durchpinseln müssen. Nächstesmal weiß ichs (ich muss erstmal sehen, obs in der Praxis stört, man sieht halt die Bläschen beim genauen Hinsehen).
Das Display ist ein 1,3" OLED Display mit I2C. Gabs bei Ebay für 11€ (mit entsprechender Wartezeit weil China). Als Contoller ist ein SH1106 drauf. Man kann aber alles verwenden, was 128x64px hat und von U8Glib unterstützt wird (muss lediglich der Konstruktor ausgetauscht werden).


Jetzt muss ich noch die Funktionalität zum Entlüften/Testen der Pumpe und allgemein zum Übertragen der Einstellungen per Bluetooth integrieren. Naja und die App dazu schreiben.
Title: Re: Projektvorstellung: Kettenölung und Griffheizung die 2.
Post by: TelosNox on Jun 23, 2015, 08:28 pm
Startposting ist editiert mit Bildern vom fertigen Einbau und noch ein paar Infos.
Title: Re: Projektvorstellung: Kettenölung und Griffheizung die 2.
Post by: TelosNox on Jun 28, 2015, 07:16 pm
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.
Title: Re: Projektvorstellung: Kettenölung und Griffheizung die 2.
Post by: Schraubi on Mar 29, 2017, 09:44 pm
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
Title: Re: Projektvorstellung: Kettenölung und Griffheizung die 2.
Post by: TelosNox on Apr 24, 2017, 11:35 am
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.
Title: Re: Projektvorstellung: Kettenölung und Griffheizung die 2.
Post by: TelosNox on Apr 24, 2017, 11:46 am
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 (https://github.com/TelosNox/noxmatic)
Title: Re: Projektvorstellung: Kettenölung und Griffheizung die 2.
Post by: TelosNox on May 31, 2017, 09:06 am
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.
Title: Re: Projektvorstellung: Kettenölung und Griffheizung die 2.
Post by: meister_q on Jun 13, 2017, 07:52 pm
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 :)
Title: Re: Projektvorstellung: Kettenölung und Griffheizung die 2.
Post by: TelosNox on Jun 20, 2017, 03:56 pm
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.
Title: Re: Projektvorstellung: Kettenölung und Griffheizung die 2.
Post by: meister_q on Jun 20, 2017, 09:56 pm
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?
Title: Re: Projektvorstellung: Kettenölung und Griffheizung die 2.
Post by: TelosNox on Jun 21, 2017, 07:44 am
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.
Title: Re: Projektvorstellung: Kettenölung und Griffheizung die 2.
Post by: meister_q on Jun 21, 2017, 09:06 am
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.
Title: Re: Projektvorstellung: Kettenölung und Griffheizung die 2.
Post by: TelosNox on Jun 21, 2017, 09:32 am
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.
Title: Re: Projektvorstellung: Kettenölung und Griffheizung die 2.
Post by: meister_q on Jun 21, 2017, 12:24 pm
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
}
Title: Re: Projektvorstellung: Kettenölung und Griffheizung die 2.
Post by: TelosNox on Jun 21, 2017, 12:39 pm
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.
Title: Re: Projektvorstellung: Kettenölung und Griffheizung die 2.
Post by: meister_q on Jun 21, 2017, 01:15 pm
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.
Title: Re: Projektvorstellung: Kettenölung und Griffheizung die 2.
Post by: TelosNox on Jun 21, 2017, 01:28 pm
Klingt korrekt und sollte so funktionieren.
Ob da irgendwelche Störstrahlung ist, solltest du testen können: Kabel so wie bisher führen, aber nicht am Tachosignal, sondern an dort verfügbarer Masse anschließen.
Wenns dann nicht mehr zappelt: Kein Stahlungsproblem.

Wenns dann immer noch zappelt: Kabel nicht mehr am Motor lang legen, sondern direkt an Masse an der Batterie (weit weg von Störquellen). Wenns dann immer noch zappelt: Kein Stahlungsproblem, dann ist da irgendwas anderes faul. Wenns nicht mehr zappelt, dann könnte es Stahlung sein.
Title: Re: Projektvorstellung: Kettenölung und Griffheizung die 2.
Post by: meister_q on Jun 21, 2017, 01:54 pm
So.

Ich habe nun den Aufbau auf einen Arduino Mega geändert, dann hab ich jetzt

Code: [Select]

digitalPinToInterrupt(3)


anstelle von "1" verwendet.

habe zusätzlich eine weitere Diode für die Masseleitung verwendet, habe die Leitungen woanders hingelegt, da es sich ja noch um Krokoklemmen handelt. (Vom Tacho vorne, über den Tank, zum Handschuhfach hinten). Masse vom Motorrad zu GND Arduino ist lediglich eine 15cm Krokoklemmenleitung.

Gab keine veränderung.

Dann hab ich wie von dir geschrieben anstatt das Tachosignal zu benutzen, bin ich auf Masse (in dem Fall jetzt hab ich einfach die Krokoklemme auf den ABS-Ring an der Felge geklemmt. Oder glaubst du, die Masse vom Kombiinstrument ist anders? Ne oder? Masse am KFZ ist doch gleich Masse!

Dann hab ich den Motor gestartet, wie gehabt, er zählt Impulse hoch.

Defintiv EMV Problem?

Nächster Schritt: Ich hab eine Geschirmte 3x0.75mm² Leitung hier liegen. Werde ich gleich verdrahten, und den Schirm auf Masse vom Motorrad legen, und erneut testen.
Title: Re: Projektvorstellung: Kettenölung und Griffheizung die 2.
Post by: meister_q on Jun 21, 2017, 02:30 pm
Update:

Mit geschirmter Leitung ebenfalls das Problem (Vielleicht weil Arduino und Krokoklemmen nicht geschirmt?).

Zapfe ich das Signal garnicht ab, und gehe direkt vom Minus der Batterie auf den Interruptpin, starte das Motorrad, dann zählt er dennoch Impulse.

Also EMV auch an der Batterie stark genug. Wie sollte es sonst Impulse zählen?

Das einzige was ich noch nicht getestet habe, ist den Arduino in ein Metallgehäuse inklusive aller Kabel zu legen, damit komplett alles geschirmt ist.

Bin echt ratlos. Das kann doch nicht sein.

Was für eine CBF600 hast du damals getestet? PC38 oder PC43?



Weiteres Update:

Eben nochmal alles Verkabelt, ein LCD dran gepackt, Stromversorgung des Arduinos via DCDC Wandler von der Motorrad Batterie.

Nach dem Starten, siehe da, es funktioniert!

Die LCD-Anzeige funktioniert zwar nicht richtig, aber die Geschwindigkeitsanzeige auf dem LCD verändert sich auch je nach Drehzahl des Hinterrades.

Muss die Tachoimpulse anpassen, da es mir bei Tacho ca. 10kmh nur 6,5kmh angezeigt hat (Tachotoleranz?).

Soweit muss es jetzt gehen.

Hoffentlich kommt noch ne antwort. :D

Title: Re: Projektvorstellung: Kettenölung und Griffheizung die 2.
Post by: TelosNox on Jun 22, 2017, 08:13 am
Ich hatte eine PC43.

Interessant, dass es funktioniert, wenn du direkt an der Batterie hängst. Scheinbar funktioniert das mit der gemeinsamen Masse dann doch nicht so ganz sauber.
Freut mich jedenfalls, dass es endlich wieder vorwärts geht (sowas frustet total, wenn man so komische Fehler hat, ich kenne das leider selbst auch zu genüge).

Der Tacho eilt ja sowieso vor. Du musst bei einer höheren Geschwindigkeit schauen. Bei der MT09 hab ich 100 auf dem Display, wenn ich 107 auf dem Tacho habe. Das Display geht aber genau, das bestätigt mir das GPS.
Wenn ich das noch richtig im Kopf hab, dann sind 72 Ticks bei der CBF600 korrekt. Die CB1300 hat 60 Ticks und die MT09 hat 40.

Du kannst natürlich noch Rundungsfehler oder Fehler durch Zeitverschleppung haben. Das ist der Grund, warum ich mir die Millis der Radticks merke. Somit muss ich zur Geschwindigkeitsberechnung nicht ein festes Intervall zum rechnen nehmen, sondern rechne einfach mit den Millis der Radticks als Zeitintervall. Seit ich das so mache, zappelt die Anzeige nicht mehr, wenn man konstante Geschwindigkeit fährt.

Sowieso würde ich nicht den Tacho als Referenz nehmen. Schnapp dir ein Navi und vergleiche damit.

Btw: wenn du magst darfst du einfach Code bei mir klauen. Schau dir einfach meinen DistanceCalculator an (https://github.com/TelosNox/noxmatic/blob/master/Arduino/sketches/noxmatic/DistanceCalculator.h). Der berechnet Geschwindigkeit und gefahrene Strecke. Das eigentliche Kettenölungsmodul funktioniert dann direkt mit gefahrenen Streckenintervallen und ist unabhängig davon, wie die Strecke zustande kommt (so kann man z.B. recht einfach von Tachosignal auf GPS wechseln).
Title: Re: Projektvorstellung: Kettenölung und Griffheizung die 2.
Post by: meister_q on Jun 22, 2017, 09:39 am
Ja, scheinbar.

72 Impulse hab ich ja auch eingestellt, dann passt das sicherlich schon, weil 6,5kmh auf Display zu 10kmh auf Tacho passt ganz gut. Die CBF hat ne enorme abweichung finde ich. Wenn ich 100 fahre, sind es laut Navi/GPS nur ca 95kmh, bei 200 nur 190.

In meiner Funktion, die die Geschwindigkeit ermittelt, werden auch die Intervalle zwischen den Impulsen gemessen. So hat es bisher per Hand auf dem Hauptständer ganz gut funktioniert.

Den Distance Calculator hab ich mir schon angeschaut. Ich rechne die Entfernung aber über die Impulse, da 72 Impulse bei mir ja 0.01896km sind, je mehr Ticks, desto mehr gefahrene km. Inwieweit sich das auswirkt, wenn die long Variable wieder auf 0 Springt, keine ahnung. Muss ich einfach mal testen.
Title: Re: Projektvorstellung: Kettenölung und Griffheizung die 2.
Post by: TelosNox on Jun 22, 2017, 09:51 am
Wenn du die Ölerdistanz über die Ticks machen willst, dann ist es am einfachsten, wenn du dir ausrechnest wieviele Ticks für die gewünschte Distanz nötig sind und ziehst dann einfach nur noch die Ticks ab (direkt im Interrupt), bis du bei 0 bist. Dann ölen und die benötigten Ticks wieder auf den errechneten Wert setzen.
Hier ist meine alte Variante vor der Umstellung auf Distanz:
https://github.com/TelosNox/noxmatic/blob/2483f2dfb8fabab545b03dea85e88796f8203e4d/Arduino/sketches/noxmatic/ChainOiler.h (https://github.com/TelosNox/noxmatic/blob/2483f2dfb8fabab545b03dea85e88796f8203e4d/Arduino/sketches/noxmatic/ChainOiler.h)

So hab ich das früher gemacht, aber dann ist man halt an das Ticksystem gebunden (ist in deinem Fall wahrscheinlich wurscht). Ich wollte meine Software halt so schreiben, dass sie modular ist und man das dann einfach erweitern bzw. anpassen kann. Schön wäre, wenn nicht jeder das Rad neu erfindet, sondern ein OpenSource Projekt der Community ensteht, das gemeinsam verbessert und erweitert wird.

Ich verstehe aber auch, dass man Bock hat, es selbst mal zu machen und eigene Ansätze zu probieren.

Am wichtigsten ist, dass man Spaß an der Sache hat.
Title: Re: Projektvorstellung: Kettenölung und Griffheizung die 2.
Post by: meister_q on Jun 22, 2017, 12:07 pm
Genau, das hatte ich vor.

Nun, du hast allerdings recht, vielleicht überlege ich es mir noch. Mal sehen, wichtig ist mir erstmal, dass es funktioniert.

Hab es eben nochmal getestet, bei 10kmh Tacho, hat er mir 62kmh auf dem LCD gezeigt, schien so, als ob zu viele Impulse eingestellt waren.

Vielleicht stimmt bei meiner Geschwindigkeitskalkulation ja was auch nicht.

Code: [Select]

    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;   


So rechne ich die Impulse in eine Drehzahl um. "rpmcount" wird via Interrupt hochgezählt.

Am ende resultiert daraus eine Geschwindigkeit. Die errechne ich folgendermaßen:

Code: [Select]

  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


Radumdrehungsimpulse sind in dem Fall 72.

Also ich Teile die Drehzahl des Sensors/Rades durch die Impulse die das Rad pro Umdrehung macht, dann multipliziere ich sie mit dem abrollumfang (in km), und rechne dann mit * 60 zu Kilometer pro Stunde um.

Logisch überlegt ist das die Richtige lösung.

Vertue ich mich irgendwo beim "rpm" errechnen?
Title: Re: Projektvorstellung: Kettenölung und Griffheizung die 2.
Post by: TelosNox on Jun 22, 2017, 12:36 pm
Warum 30 * 1000?

Deine berechneten rpm sind gar nicht die rpm. Das sind die TpM (Ticks pro Minute). Für RpM müsstest du noch durch die Impulszahl pro Umdrehung teilen.

Mit zeit - timeold hast du das delta in millisekunden.
Wenn du jetzt die gezählten ticks durch diese Zeit teilst, dann hast du die Ticks pro Millisekunde.
* 1000, dann hast du Ticks pro Sekunde und * 60 wären dann TpM.

Um also wirklich RPM auszurechnen brauchst du:
rpm = rpmcount / (zeit-timeold) * 1000 * 60 / radumdrehungsimpulse;

Geschwindigkeit ist dann RpM * abrollumfang * 60

Einen Haken hat deine Geschichte aber: zeit ist nicht der Zeitpunkt des Ticks, sondern der Zeitpunkt der Berechnung. Das kann deutlich später sein, als der letzte berücksichtigte Tick.

Zweiter Haken: Du rechnest hier mit Ganzzahlen. 30*1000/zeitdelta wird automatisch zur Ganzzahl. Alles hinterm Komma fliegt weg.
Du musst vorher casten.

Faktor 2 als Fehler wäre plausibel (du hast da 30 statt 60 stehen). Allerdings müsste deine angezeigte Geschwindigkeit dann zu niedrig sein. Sie ist aber um Faktor 6 zu hoch.

Deinen Abrollumfang hast du also Kommazahl angegeben.
Code: [Select]
#define abrollumfang 0.01896
Mach das lieber nicht. Schreib lieber
Code: [Select]
const float abrollumfang =  1896 /1000  / 1000;

Denn dann passiert es dir nicht, dass du das Komma verschiebst.
0.01896 = 18,96 Meter !!!!
Und jetzt erklärt sich Faktor 6. Das Komma macht Faktor 10 und die 30 machen daraus Faktor 5. Mit Rundungsfehlern und Abweichungen kommen wir dann bei der festgestellten 6 raus.  ;)
Title: Re: Projektvorstellung: Kettenölung und Griffheizung die 2.
Post by: meister_q on Jun 22, 2017, 03:36 pm
Ayay... ein fetter Logikfehler...

Hab den Code mal abgeändert. Testen geht nicht, es fing gerade an zu Regnen, und ich war eben 3 Stunden fahren bei 35°C...

So und die Streckenmessung ist ja radimpulse * abrollumfang / radumdrehungsimpulse, oder?

Also gesammtimpulse * ((1896 / 1000) / 1000) / 72.

Zum ersten Haken: Wie soll ich das Lösen?

Zum zweiten Haken: Also alle Variablen in floats umwandeln, dann müsste es ja genauer sein.

Wieso aber das Zeitproblem? Ich messe doch die Zeit zwischen den Ticks, also je kürzer die Zeit dazwischen, desto schneller wird es doch?
Title: Re: Projektvorstellung: Kettenölung und Griffheizung die 2.
Post by: TelosNox on Jun 22, 2017, 03:47 pm
gesamtimpulse / 72 = radumdrehungen.

Strecke = radumdrehungen * radumfang.

Deine Formel müsste also stimmen und die Klammern kannst du weglassen.
Ich würde den Radumfang allerdings beim Start 1x berechnen und dann aus der Variablen wiederverwenden. Jedes mal neu rechnen ist unnötig.

Haken 1:
Dein Tick kommt dann rein, wenn der Interrupt feuert. Deine Streckenberechnung findet aber im Loop statt.

Stell dir vor dein Tick kommt bei 124ms. Der Loop rechnet aktuell noch irgendwas anderes und kommt dann bei 186ms dazu, die Geschwindigkeit zu berechnen. Dann nimmst du 186ms als Zeit und nicht die 124ms, als der Tick tatsächlich kam.

Wenn dann musst du im Interrupt den Zeitpunkt des Ticks speichern (so mache ich das auch).

Haken 2:
Der Wert, auf dessen Basis gerechnet wird, muss ein Float sein.

Beispiel:
int a = 7;
float b = 3;
float c = a / b;

c ist unerwarteter weise 2 und nicht 2,3333.
Das kommt daher, dass a eine Ganzzahl ist und somit bei jeder Operation, die auf a ausgeführt wird wieder eine Ganzzahl rauskommt.
Ändern wird das:

float a = 7;
int b = 3;
float c = a / b;

jetzt kommt für c wie erwartet 2,3333 raus. Weil a jetzt ein float ist und somit das rechenergebnis automatisch auch ein float sein wird.

Es wird immer von links nach rechts und nach den Rechengesetzten gerechnet. Und das dann Schritt für Schritt. Das Zwischenergebnis ist dann von dem Typ, den der erste Operand hatte.

Caste deine gesammtimpulse nach float und lass die Klammer weg. Das sollte schon genügen.
Title: Re: Projektvorstellung: Kettenölung und Griffheizung die 2.
Post by: Serenifly on Jun 22, 2017, 04:06 pm
Quote
c ist unerwarteter weise 2 und nicht 2,3333.
Nein. Es reicht wenn eine der Zahlen Float ist. Es ist egal welche. Solche Probleme hast du erst wenn du mehr als zwei Operanden hast und von links nach rechts gerechnet wird.


Das ist übrigens auch falsch:
Code: [Select]

const float abrollumfang =  1896 /1000  / 1000;

Korrekt:
Code: [Select]

const float abrollumfang =  1896.0 /1000  / 1000;

Hier wäre es z.B. falsch nur am Ende 1000.0 zu schreiben, weil 1896 / 1000 im noch als Integer berechnet werden würde
Title: Re: Projektvorstellung: Kettenölung und Griffheizung die 2.
Post by: meister_q on Jun 22, 2017, 04:18 pm
Ganz einfach:

Ich hab die #defines weg gemacht, hab alles gegen floats ausgetauscht, und alle ersten definitionen der floats mit .0 belegt.

Somit sollten jetzt ja alle Rechnungen nur noch mit floats erfolgen.

Ebenso hab ich

const float abrollumfang =  1896.0 / 1000.0  / 1000.0;

gemacht.
Title: Re: Projektvorstellung: Kettenölung und Griffheizung die 2.
Post by: TelosNox on Jun 22, 2017, 04:23 pm
Danke für die Korrektur. Ich hatte das Verhalten immer bei mehreren Operanden festgestellt, daher dachte ich,
dass der erste Operand schon Gleitkomma sein muss. Dann war bei mir wohl die Gleitkommazahl immer hinten.

Ich persönlich vermeide Gleitkommazahlen sowieso, sofern es möglich ist. Den Radumfang hab ich bei mir z.B. in mm gespeichert und ich rechne auch immer wenn möglich in Ganzzahlen. Als Geschwindigkeit will ich am Ende doch eh ne Ganzzahl haben. Warum also nicht auch mit Ganzzahlen rechnen? Man muss nur drauf achten, dass man zuerst die Multiplikationen macht und hinterher erst 1x dividiert (Dividend vorher auch ausmultiplizieren).

Ob das von der Performance her besser ist, als mit Gleitkomma weiß ich nicht, aber die Genauigkeit ist auf jeden Fall höher. Man muss halt drauf achten, dass man mit long arbeitet, sonst kommt es zu überläufen.
Title: Re: Projektvorstellung: Kettenölung und Griffheizung die 2.
Post by: Serenifly on Jun 22, 2017, 04:24 pm
Alles float zu machen geht natürlich, aber es hilft bei sowas wirklich zu verstehen was abläuft und wie Datentypen miteinander interagieren.
Title: Re: Projektvorstellung: Kettenölung und Griffheizung die 2.
Post by: meister_q on Jun 22, 2017, 04:47 pm
Aber da ja eh sogut wie nichts anderes auf dem Arduino läuft, ist es ja performancetechnisch egal ob alles float ist.

Der Mega den ich gerade benutze, ist mit den paar Funktionen total unterfordert.

Ich teste das ganze morgen (oder demnächst, hab am Wochenende keine zeit)... oder mit viel lust und laune heute abend noch. Dann berichte ich weiter!