CPU-Cooler via Script ein- und ausschalten

  • Hallo zusammen,


    durch die exorbitante Hitze und eines wirklich heißen Raspberry-Alugehäuse hatte ich die Idee, ungenutzte CPU-Cooler zur aktiven Kühlung zu nutzen.

    Mein Raspberry Pi 3 Model B V2 ist meine VOIP-Telefonanlage mit FreePBX und läuft ergo Tag und Nacht.


    Das Anschließen des Coolers an die Pins 4 und 6 der GPIO-Steckerleiste ist kein Hexenwerk, der Cooler läuft und die externe Festplatte ebenfalls. Jetzt hat der CPU-Cooler vier Anschlüsse rot und schwarz, die an Pin 4 und Pin 6 der Stromversorgung dienen. Das blaue Kabel dient dem PWM und das Gelbe dem Tacho.


    Ich möchte jetzt zumindest erreichen, dass bei Erreichen einer bestimmten CPU-Temperatur, die sich ja auslesen lässt, der Cooler einschaltet und dementsprechend bei Unterschreitung der Temperatur wieder abschaltet.
    Zunächst welche der beiden Kabel müsste ich dazu an welchen GPIO-Pin stecken? Müsste ich bestimmte Kernelmodule zusätzlich beim Start laden? Und gäbe es Howtos die die Ansteuerung via Python oder Bash annähern demonstrieren?

    Vielen Dank für die Feedbacks

    NakuroJ

  • Hallo NakuroJ,


    wegen Bash möchte und wegen Python kann ich Dir nicht weiterhelfen.


    Ich habe letztes Jahr für meinen NVIDIA Jetson Nano eine Kühlung programmiert, die Deiner Idee zunächst recht nahe kommt.


    Du solltest aber noch bedenken, das die Festlegung einer Temperatur, ober halb der der Ventialtor angeschmissen wird und unterhalb der der Ventilato ausgeschaltt wird sehr wenig Sinn macht. Der Ventilator würde in recht kurzen abständen immer wieder (wahrscheinlich auf voller Leistung bzw. max. PWM-Stufe rotieren.


    Ich habe den Ansatz gewählt, wodurch eine Hystere abgebildet wird.


    In einer Endlosschleife werden folgende Abfragen wiederholt

    1. Nach Überschreiten einer höheren Temperatur (bei mir 38 °C) wird der PWM-Wert um 5 Einheiten erhöht
    2. Nach Unterschreiten einer tiefren Temperatur (beim 36 °C) wird der PWM-Wert um 5 Einheiten verringert
    3. Innerhalb der beiden Temperaturen bleibt der PWM-Wert wie er ist


    Dass führt dazu, dass bei Überschreiten der höheren Temperatur der Ventilator von Schleifendurchlauf zu Schleifendurchlauf immer schneller rotiert, d.h. zunehmend besser kühlt, bis ein Kühleffekt einsetzt und die Temperatur sinkt.

    Bei Unterschrieten der kleineren Temperatur passiert das Gegenteil. Im Extremfall kann der Ventilator auch stehen bleiben.


    Befindet sich die Temperatur dazwischen (Hsysterese-Zone) ändert sich der PWM-Status nicht.


    Auf diese Weise regelt sich das System eigenständig. Bei normalen Temperaturen pegelt sich der PWM-Wert auf mittlere Größen und die Temperatur auf exakt die mittlere Temperatur ohne nennswerte Schwankungen ein.

    Bei heißen Temperaturen ist der PWM-Wert im oberen Bereich und die Temperatur knapp unterhalb der höheren Temperatur, weil einfach nicht möglich ist, mit Lufttemperaturen um die 35 °C eine CPU-Temperatur unter 36 °C zu erreichen.


    Ich kann Dir, wenn ich den Jetson Nano nachher mal anschmeiße, einen Screenshot und die zentrale Zeile der PWM-Steuerung schicken. Ja, es ist eine einzige Code-Zeile, die die Regelung übernimmt.


    Wenn Du neuierig bist, dann suche mal meine Beiträge hier im Forum mit dem Stichwort "Hysterese". Da habe ich diese und ähnliche Zeilen gepostet und erläutert. Wie gesagt, ist weder Bash noch Python.


    Beste Güße


    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    • Icon-Tutorials (IDE: Geany) - GPIO-Library - µController-Programmierung in Icon! - ser. Devices - kein Support per PM / Konversation

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Vielen Dank für die zwei Antworten. Da ich die Verkabelung mit dem PWM-Kabel bereits erwähnt hatte, ist das auch mein primäres Ziel. Wäre jedoch die zentrale Frage nach den GPIO-PINs respektive Kernel-Modulen. Also, wo werden die beiden anderen Kabel angeschlossen. Vorher brauche mir über die Programmierung noch keine Gedanken machen.


    NakuroJ

  • Hallo NakuroJ,


    hier noch ein Screenshot meiner Umsetzung für den Jetson Nano:



    Hier ist dann eine Phase dargestellt, in der nach Einschalten des Lüfters die untere Grenze unterschritten wurde und der PWM-Wert laufend herunter gesetzt wird.


    Die zentrale Zeile meines Programms ist diese hier:

    Code
    cooler((thermals["AO-therm"] - LOWT < 0.0) | (thermals["AO-therm"] - HIGHT + 1 > 1.0)) | WAttrib("label=Jetson-Fan control: Hysterese-Zone...")

    Hier wird eine Funktion namens cooler() aufgerufen.

    Das übergebene Argument ist hochgradig spannend. Der Ausdruck (thermals["AO-therm"] - LOWT < 0.0) | (thermals["AO-therm"] - HIGHT + 1 > 1.0) ist es Wert, näher beleuchtet zu werden.


    thermals["A0-therm"] ist einfach der Inhalt des Text-Ausgabefeldes, in das die Temperatur ausgegeben wird, die letztlich zur Steuerung des Lüfters herangezogen wird. Dies ist die höchste Temperatur in den Ausgabefeldern. Von daher ist dies eine sinnvolle Information zur Steuerung des Lüfters.

    LOWT ist die untere Temperaturgrenze - hier 36 °C.

    Die Differenz dieser beiden Temperaturen wird gebildet und geprüft, ob diese kleiner als 0 ist.


    In der hier eingesetzten Programmiersprache Icon gibt es eine Besonderheit. Jeder Ausdruck kann scheitern oder Erfolg haben. Wenn ein Ausdruck scheitert, dann kann man Alternativen anbieten. Dies ist hier der Fall.


    Die Differenz kann kleiner als 0 sein, was einen Erfolg darstellt - das Ergebnis des Ausdrucks ist dann der Wert hinter dem Vergleichszeichen; hier wird als 0.0 zurückgegeben.

    Oder die Differenz kann größer als 0 sein, was einen Misserfolg darstellt. In dem Fall ist der Ausdruck gescheitert und das Ergebnis ist nicht definiert (&null oder &fail, was identisch ist).

    Hier biete ich hinter dem Alternativ-Operator | eine Alternative an.


    Die Alternative (thermals["AO-therm"] - HIGHT + 1 > 1.0) ermittelt die Differenz zwischen der gemessenen Temperatur und der definierten Obergrenze HIGHT und addiert noch 1 dazu. Der erhaltene Wert wird mit 1 verglichen. Man ahnt es schon: Dieser Ausdruck liefert 1, wenn die gemessene Temperatur größer als die Obergrenze ist.



    Diese eine einzige Zeile enthält somit eine Fallunterscheidung:


    Temperatur(thermals["AO-therm"] - LOWT < 0.0)(thermals["AO-therm"] - HIGHT + 1 > 1.0)
    < LOWT0.0nicht berechnet
    >= LOWT&nullnicht relevant
    LOWT <= T <= HIGHT&null&null
    <= HIGHT&null&null
    > HIGHT&null1.0


    Somit bekommt die Funktion cooler() drei verschieden mögliche Argumentwerte übergeben:

    • 0.0 bewirkt, dass nicht weiter gekühlt zu werden braucht - als Konsequenz werden die PWM-Werte verringert.
    • &null bewirkt, dass die Funktion cooler() gar nicht aufgerufen wird. Das bedeutet, der Status (PWM-Wert) innerhalb der Hysterese bleibt unverändert.
    • 1.0 bewirkt, dass der PWM-Wert vergrößert wird

    Damit hat man eine recht einfache Regelung programmiert, die sich irgendwann auf einen recht konstanten PWM-Wert und Temperatur in der Mitte des Intervalls einpegeln wird (sofern die Lüfterleistung und die klimatischen Bedingungen dies erlauben).


    Vielleicht noch einen Einblick in die Funktion cooler():

    Falls das Optionsfeld FAN_OFF nicht aktiviert ist, wird der PWM-Wert um 5 verringert, falls das oben erläuterte Argument 0.0 ist oder um 5 erhöht, wenn das Argument 1.0 ist. Der berechnete PWM-Wert wird in der Kopfzeile des Programm-Fensters ausgegeben und der Rollbalken aktualisiert.

    Mit der Zeile beginnend mit system wird der PWM-Wert an den PWM-unterstützenden Pin geschickt.



    Zu Deinen letzten Fragen:

    In einem meiner Threads findest Du eine Übersicht bzw. Pin-Layout der GPIO-Pins. Wähle dort den einen PWM-unterstützenden Pin aus.

    Kernel-Module wirst Du definitiv keine nachladen müssen (außer wenn Du ein extrem exotisches Betriebssystem verwendet haben solltest).



    Beste Grüße


    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    • Icon-Tutorials (IDE: Geany) - GPIO-Library - µController-Programmierung in Icon! - ser. Devices - kein Support per PM / Konversation

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Edited 5 times, last by Andreas ().