Pages: [1]   Go Down
Author Topic: Projekt: Automatische Temperatursteuerung für Heizgriffe + Kettenöler  (Read 2471 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 0
Posts: 62
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo zusammen,

ich wollte hier mal kurz mein Projekt vorstellen, an dem ich gerade arbeite.

Entstehen soll eine automatische Temperatursteuerung für die Heizgriffe meines Motorrads sowie eine Steuerung für den Kettenöler.
Der Kettenöler ansich ist simpel. Das Tachosignal wird mit einem Pulldown über Interrupt gezählt und in gefahrene Strecke umgerechnet. Ist die voreingestellte Sollstrecke erreicht, wird geölt und die gefahrene Strecke wird zurückgesetzt.
Die Sollstrecke kann verändert und gespeichert werden (so kann man die Ölmenge einstellen). Zusätzlich will ich eine Geschwindigkeitsabhängige anpassung umsetzen. Wenn die Sollstrecke erstmal erreicht ist, werden die millis gespeichert. Beim nächsten erreichen der Sollstrecke wird aus den Millis die gefahrene Geschwindigkeit ermittelt. Ab einer bestimmten Mindestgeschwindigkeit wird die Sollstrecke dann über einen quadratischen Koeffizienten, der sich aus der Geschwindigkeit ergibt, verringert (je höher die Geschwindigkeit, desto öfter wird geölt).
Quadratisch deshalb, weil die Fliehkraft quadratisch mit der Geschwindigkeit steigt und somit auch die Menge des abgeschleuderten Öls quadratisch ansteigt.

Zum Kettenöler existiert bisher nur das Konzept in meinem Kopf. Umgesetzt ist da noch nichts, weil eigentlich schon alles klar ist.

Die Temperatursteuerung soll bei Unterschreitung eines StartTemperaturwerts mit einer definierten Leistung einschalten. Danach steigt die Leistung mit fallender Temperatur weiter an, bis ein EndTemperaturwert erreicht ist. Ab hier bleibt die Leistung gleich (eingestelltes Dauermaximum). Um den Leistungsanstieg noch beeinflussen zu können, kann optional ein Referenzpunkt gespeichert werden. So stellt man bei einer definierten Temperatur die Wohlfühleistung ein und die Steuerung regelt dann zwischen Start - Referenzpunkt und zwischen Referenzpunkt und Ende jeweils linear.

UserInterface wird ein 2 Tasten Menu mit LCD. Das LCD fehlt mir noch, daher geht aktuell einfach alles über Serial auf die Console.

Außerhalb des Setups soll auf der Anzeige dann einfach die aktuelle Temperatur, die Leistung der Griffe und die aktuell ermittelte Sollstrecke für die Ölung angezeigt werden.

Natürlich will ich meinen Code auch sharen. Hier ein paar Auszüge aus dem aktuellen Sketch:

Funktion zur Erkennung eines Tastendrucks (hier der HOCH Taster). Bei kurzzeitigem Druck wird die Funktion buttonUpShort ausgelöst. Bei längerem Druck von 2sec wird buttonUpLong ausgelöst. Eine explizite Entprellung hab ich nicht eingebaut, bisher wars aber auch nicht nötig.

void checkButtonUp() {
 static int buttonState = HIGH;
 static unsigned long buttonMillis = 0;
 int button = digitalRead(buttonUp);
 if (button != buttonState) {
     if (button == HIGH && buttonMillis != 0) {
         buttonUpShort();
         buttonMillis = 0;
     } else {
         buttonMillis = millis();
     }
     buttonState = button;
 } else {
     if (button == LOW) {
         if (buttonMillis != 0 && millis() > buttonMillis + 2000) {
             buttonUpLong();
             buttonMillis = 0;
         }
     }
 }
}


Geglättetes auslesen der Temperatur. Ich verwende aktuell einen einfachen Widerstandssensor und begnüge mich mit der gemessenen Spannung. Wird noch durch einen digitalen Sensor ausgetauscht mit tatsächlichem Temperaturwert. Wahrscheinlich kann dann die Glättung entfallen.

int getActualTemp() {
 static int temps[] = { 0, 0, 0, 0, 0 };
 static int tempIdx = 0;
 static int temp = 0;

 int val = analogRead(A0);
 temp -= temps[tempIdx];
 temp += temp;
 temps[tempIdx] = val;
 tempIdx++;
 if (tempIdx == 5) {
     tempIdx = 0;
 }
}



Errechnen der aktuell nötigen Heizleistung: startTemp, startHeater, mTemp, mHeater, endTemp und endHeater sind die zuvor erwähnten Temperaturpunkte mit zugeordneter Leistung. actualHeater ist der resultierende Wert für die Heizung, der dann später auf den PWM Pin geschrieben werden muss.

void processHeat(){
 static long lastMillis = 0;
 if (millis() > lastMillis + 5000) {
     lastMillis = millis();
     
    if (!setupModeActive){
      int lowTemp = startTemp;
      int lowHeat = startHeat;
      int highTemp = endTemp;
      int highHeat = endHeat;

      if (actualTemp < startTemp) {
        if (mTemp != 0){
          if (mTemp > actualTemp){
            highTemp = mTemp;
            highHeat = mHeat;
          } else {
            lowTemp = mTemp;
            lowHeat = mHeat;
          }
        }
        actualHeater = map(actualTemp, lowTemp, highTemp, lowHeat, highHeat);
      } else {
        actualHeater = 0;
      }
    }
 }
}


Die Funktionsweise des Menus (das noch nicht fertig ist) kann ich leider nicht so einfach veröffentlichen, weil da im sketch alles drunter und drüber geht. Ich habe einfach ein Flag, das mir sagt ob ich mich im SetupModus befinde. Dazu nochmal ein Flag, das mir sagt, ob sich das Setup im Editmodus befindet. Dazu noch einen int, der den entsprechenden Menupunkt repräsentiert. Drückt man den UP-Taster lang, dann wechselt man in den SetupModus. Durch kurzes UP und DOWN kann man nun durch die Menupunkte navigieren (selector++ , selector--). Ist man im SetupModus und drück DOWN lang, gelangt man in den Editmodus. Jetzt kann man mit UP und DOWN die Werte verändern. Mit einem langen DOWN speichert man die Änderungen ab. Mit einem langen UP könnte man innerhalb des Menus im Editmodus nochmal zwischen 2 Werten wechseln (z.B. Temperatur und Leistung). Das habe ich aber akutell nicht umgesetzt, da ich die Temperatur einfach über die aktuelle Temperatur setze. In der Praxis wird es ja so sein, dass man fährt und während der Fahrt merkt, dass man bei der aktuellen Temperatur mehr bzw. weniger Power braucht. Also stellt man die Power ein und speichert mit der aktuellen Temperatur ab.

Soweit dieses. Jetzt muss ich erstmal noch an der Menuführung feilen und ein Display finden (mein Problem ist, dass mir die üblichen Displays aus dem Handel zu groß sind). Davon abgesehn muss ich das dann auch noch irgendwie Wasserdicht bekommen. Die Steuerung für den Kettenöler mache ich mal nebenbei.
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 62
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Vielleicht interessiert es ja jemanden, was bisher aus meinem Projekt geworden ist.

Der Arduino ist fertig beschalten mit einem DOGM163 + Hintergrundbeleuchtung, 2 Tastern (Pulldown mit internem Pullup), einem DS1820 Temperatursensor + 5k Pullupwiderstand, einem Buz11 zur Ansteuerung der Pumpe, einem IRL540N zur Ansteuerung der Heizgriffe (da hier bei maximaler Leistung lange Strom fließt war der Buz11 zu unsicher, weil er nicht unbedingt voll durchschaltet), einer Dioden/Kondensator Kombination für das Tachosignal und einem 120 Ohm Widerstand am Resetpin, weil sonst der Arduino nicht immer zuverlässig startet.
Alles ist als eigenes kleines Shield auf den Arduino gesteckt. So kann der Arduino bei Bedarf leicht rausgenommen werden.
Das Display steckt zusammen mit 2 Tastern in einem kleinen Gehäuse. Die Taster sind hinter 2 Bohrungen, die mit Silikon abgedichtet sind gesetzt. Auf das Silikon muss ich noch 2 Knöpfe setzen, da fehlt mir bisher noch was passendes.
Das Display selbst sitzt hinter einem Fenster, das einfach in das Gehäuse reingeschnitzt wurde (mit Seitenschneider ausgeschnitten und dann gefeilt). Damit es wasserdicht wird, wurde es mit Kaltglasur vergossen.

Hier 2 Bilder, wie das ganze aussieht (anklicken zum vergrößern):



Die weiße Klemme ist für den Anschluss der 12V Geräte (Pumpe und Griffe). Die Schwarze klemme ist für Temperatursensor + Tachosignal. Das rote und das gelbe Kabel, die aus dem Bild laufen sind die Stromversorgung. Das schwarze Kabel geht zum Display. Es hat 8 Adern. Davon werden 2 für 5V und Masse, 2 für die Taster und 4 für die Ansteuerung des Displays über SPI gebraucht.

Die Software ist mittlerweile auch fast fertig. Die Temperatur wird gemessen, die Heizstufe wird automatisch ermittelt, das Menu funktioniert, die Geschwindigkeit wird errechnet und die automatische Ölung mit Geschwindigkeitsprogression funktioniert ebenfalls.
Was noch fehlt ist die manuelle PWM, um die Heizstufe auch auf die Griffe zu bringen. Weiter will ich noch einen Regenmodus einbauen, der die Temperatur zur Ermittlung der Heizleistung anpasst (gefühlte Temperatur) und für eine häufigere Ölung sorgt (da das Öl vom Wasser von der Kette gewaschen wird). Gegebenenfalls erweitere ich die automatische Heizleistung auch noch mit einer Geschwindigkeitsprogression, denn mit steigender Windgeschwindigkeit wird die gefühlte Temperatur geringer.
Als kleine Spielerei bastel ich mir auch noch einen Modus, mit dem ich Messungen vornehmen kann (Beschleunigung von 0-100 z.B.).
« Last Edit: June 08, 2011, 05:01:04 pm by TelosNox » Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 16
Exact timing rocks!
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Mir gefällt dein Projekt, hab mir für die Zukunft etwas ähnliches vorgenommen.
Was mir auffällt: Wie gehst du mit den Temperaturunterschieden zwischen linkem und rechten Griff um? Meine Hauptmotivation für eine solche Regelung wäre nämlich, mir bei passender Temperatur am linken Griff nicht schon rechts die Finger zu verbrennen. Ich kenne deine Maschine nicht, aber an meiner SV isoliert der Gasgriff doch ganz gut gegen den Lenker, wohingegen links kein Tape dagegen helfen konnte, dass vermutlich ein großer Teil der Heizleistung zu warmem Stahl statt warmen Fingern führt.
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 62
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bisher geh ich mit dem Temperaturunterschied überhaupt nicht um. Unter dem linken Griff hab ich einfach eine Schicht Isolierband (die nach deiner Aussage wohl nix nutzt).
Die Griffe sind halt leider erst seit diesem Frühjahr dran, daher waren die noch nicht ernsthaft in Betrieb. Ich muss erstmal erproben, ob ich einen Temperaturunterschied merke.
Sollte das der Fall sein, werde ich einen zweiten IRL540N anbauen und beide Griffe einzeln ansteuern. Ich gehe mal davon aus, dass der Temperaturunterschied linear sein dürfte. Also würde es reichen die Heizleistung eines Griffs immer um x% zu reduzieren (das kann man ja dann auch wieder im Eeprom speichern).

Vielleicht macht es ja auch noch einen Unterschied, was für Heizgriffe (ich hab die von Daytona) man hat und ob der Lenker aus Stahl oder Alu ist. Meiner ist aus Alu und wird denke ich daher nicht so viel Heizleistung absorbieren, wie einer aus Stahl.

Btw war ursprünglich meine Idee die Temperatur der Griffe zu messen und so die Heizleistung anzupassen. Allerdings sind die Temperatursensoren immer zu groß. Man müßte den Lenker anbohren und den Sensor von innen zum Griff durchlegen. Das wollte ich dann doch nicht machen und erstmal mit Außentemperatur probieren.
Mit der Methode könnte man aber sowieso nur links messen am rechten Griff hat man da schon wieder ein Problem und müßte den Sensor irgendwie in die Gashülse reinfräsen oder was aus dem Griff rausschleifen/feilen (und hoffen, dass man keine Heizdrähte erwischt).
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 16
Exact timing rocks!
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich selbst habe Panzertape und Malerkrepp, einzeln und in Kombination probiert. Hat beides kaum was gebracht, lag aber sicher auch daran, dass sich zwischen Lenker und stramm sitzendem Griff nur eine sehr dünne Schicht bringen lässt. Über das Problem die Sensoren zu platzieren, hatte ich noch garnicht nachgedacht. Je nachdem wie die Armaturen auf dem Lenker befestigt sind, hat der aber auch schon die ein oder andere Bohrung. Ich habe auch die von Daytona und musste allein um den rechten Heizgriff zu montieren einiges am Gasgriff nachbearbeiten. Wäre aber sicher, wie du schon geschrieben hast mit recht großem Aufwand verbunden zwei Sensoren sinnvoll zu platzieren.

Wo ich gerade nochmal drüber nachdenke, erscheint mir deine Lösung über eine Messung der Außentemperatur und evtl. eine Einzelregelung mit linearer Anpassung rechts/links am sinnvollsten. Sofern da für dich überhaupt Handlungsbedarf besteht, anderes Lenkermaterial und ein anders gestalteter Gasgriff können da ja viel Unterschied machen.

Auf jeden Fall ein schönes Projekt, mindestens eine Idee hab ich hiermit schon offiziell abgeschaut.  smiley-wink
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 62
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Wenn ich meinen Code mal einigermaßen erprobt hab, werde ich den auch noch veröffentlichen. Aber das dauert noch ein wenig, das Ding muss ja erstmal ans Moped.
Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 143
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hast du dir schon gedanken über die Spannungsversorung am Motorrad gemacht ?
Ich hab da schon einen ATmega gekillt smiley-wink Erst denkt man es ist alles super aber so nach 2 Monaten ist die Kiste auf einmal hin ..
Also mein "ein 7808 reicht doch" stimmt nur bedingt smiley-wink
Gr8ß JKW
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 62
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Eigentlich sollte der Arduino doch mit den 13V vom Boardnetz zurechtkommen. Ich hab ihn bisher einfach direkt drangehängt. Ich wollte noch ein wenig die Spannung glätten, aber das wars dann auch.
Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 143
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

wenn es immer 13V wären,dann wäre meiner wahrscheinlich auch noch ganz smiley-wink

ne im Ernst, das wird eher nicht auf ewig halten.
Du kannst es natürlich erstmal so machen, aber wenns kaputt geht denk an mich smiley-wink


http://img683.imageshack.us/i/bildschirmfoto3k.png/

Gruß JKW
« Last Edit: June 11, 2011, 03:01:14 pm by jkw » Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 62
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich will den Arduino ja nicht killen.

Ich brauche also ne Zener gegen Masse, ne Drossel und ein paar Kapazitäten.
Was ist denn das Ding hinter D44?
D44 wird wohl drin sein, um negative Spannungen wegzunehmen, richtig?

Muss man das so aufwändig beschalten oder reicht euch einfach ne Spule + Kondensator + 2 Dioden? Ich hab in der Hinsicht leider absolut keinen Plan.
Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 143
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Also ich hab die Diode vorne gegen Verpolung (D44), dann ne Sicherung, falls ich in meiner Schaltung nen Kurzschluss baue,
die Zener(D45) für Überspannung ab 30V, dann zum Glätten den Kondensator, die BLM und die große Drossel für Hochfrequente und Niederfrequente Transienten.

Aus Spaß an der Freude hab ich da mal richtig üble Signal drauf gegeben, mit 1kV Spitzen und war überrascht wie wenig davon ankommt am Ende.
Dürfen halt nur keine ewig langen Flanken sein, aber das sollte es auf dem Motorrad ohnehin nicht geben.

Die große Spule und die Zener Diode sind wohl die wichtigesten Komponenten, Kondensatoren sind immer gut ( so resettet meine Schaltung übrigends beim Anlassen auch nicht mehr ),
Verpolung ist eher gegen die eigene Dummheit, man weiß ja nie smiley-wink

Gruß JKW
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 62
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Gut, dann werde ich mir die Zener und die Drossel besorgen. Kondensatoren hab ich noch ein paar vorrätig.
Reicht eine normale 0,5W Diode oder braucht die mehr?
Spule sollte 47uH haben, richtig?
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 62
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Nochmal kurze Info für Orang:

Ich hatte die Griffheizung gestern erstmalig testweise in Betrieb. Mir ist aufgefallen, dass sich der linke Griff subjektiv teilweise kälter anfühlt. Allerdings ist mir dann aufgefallen, dass man links andauernd die Hand vom Griff nimmt und rechts dauerhaft dran bleibt. Hat lässt man über längere Zeit die Hände an den Griffen, sind die in etwa gleich warm (bei einer Heizleistung um die 40%).

Also entweder liegts am Unterschied Stahl- zu Alulenker oder es ist rein subjektiv. Isoliert hab ich ja auch nur mit einer Lage Isolierband.
Logged

Pages: [1]   Go Up
Jump to: