Raspberry 4 Lüftersteuerung PWM

Antworten
Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Raspberry 4 Lüftersteuerung PWM

Beitrag von theo »

Hallo

Wie ich in einem anderen Thread schon erwähnt hatte, bin ich nun doch noch stolzer Besitzer eines Raspberry Pi 4 mit 8GB RAM geworden.
Der läuft ganz ordentlich. Ich habe 'bullseye' 64bit drauf und das ist ja von Haus aus schon etwas höher getaktet (1,8 GHz).
Das System habe ich auf einer Samsung T5 portable SSD, welche mit "gnome-disk-utility" in den Standardeinstellungen gemessen, ca 300 MB/s in beide Richtungen schafft.
Viel mehr geht wahrscheinlich gar nicht.

Mir ist aber aufgefallen, dass der Raspi dadurch etwas schneller warm wird, als mein 1GB Modell mit "buster".
Da ich auch noch einen Lüfter mitbekommen habe, benutze ich den jetzt.
Im Raspi Config kann man ja einstellen, bei welcher Temperatur der starten soll.

Da der Lüfter aber das Feature "Fan speed control: Pulse width modulation control via user-selectable GPIO pin" hat, überlege ich mir, ob es nicht schöner wäre, den statt nur ein-/auszuschalten mit variablen Geschwindigkeiten leiser laufen zu lassen.

Ein Python Script, welches dies ermöglichen soll, habe ich leider aufgrund merkwürdiger Abhängigkeiten nicht zum Laufen gebracht.

Nun zu meiner Frage, bevor ich dem selber auf den Grund gehe: Kann man so eine Steuerung mit Lazarus programmieren, ohne Kopfschmerzen zu bekommen?
Hat jemand Erfahrungen damit oder sogar einen funktionierenden Code?

Danke.

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Raspberry 4 Lüftersteuerung PWM

Beitrag von theo »

Habe mal Quick and Dirty mit Hilfe externer Programme hinbekommen, was ich erreichen wollte.
Wenn jemand etwas Schöneres und Pascaligeres hat, immer her damit! :wink:

Code: Alles auswählen

//sudo pigpiod

procedure TForm1.Timer1Timer(Sender: TObject);
const GPIO='18';
var
  S, Val : ansistring;
  temp:integer;
begin
  if RunCommand('/usr/bin/vcgencmd',['measure_temp'],S) then
     begin
       S:=Copy(StringReplace(S,'''C','',[]),6,5);
       temp:=Round(StrToFloat(S));
       Caption:=inttostr(temp);
       if temp>50 then
          begin
            val:='255';
            if temp<80 then Val:='192';
            if temp<70 then Val:='128';
            if temp<60 then Val:='64';
            RunCommand('/usr/bin/pigs',['p',GPIO,Val],s)
          end else
            RunCommand('/usr/bin/pigs',['p',GPIO,'0'],s)
     end;
end;

Benutzeravatar
h-elsner
Lazarusforum e. V.
Beiträge: 259
Registriert: Di 24. Jul 2012, 15:42
OS, Lazarus, FPC: LINUX Mint21.1, Win10, Lazarus 2.2.4, FPC3.2.2
CPU-Target: X86-64; arm 32bit
Wohnort: Illertissen
Kontaktdaten:

Re: Raspberry 4 Lüftersteuerung PWM

Beitrag von h-elsner »

Ich habe für die Servosteuerung die beiden HW-PWM ports benutzt. Das ganze Projekt ist hier:
https://github.com/h-elsner/SR24_decode

Unter doc findet sich auch die Anleitung, wie man die Ports aktiviert. Kann bei deinem Betriebssystem anders aussehen. Wenn du willst, kann ich mal versuchen, das zusammenzufassen, damit du nicht alles selber heraussuchen musst. Dafür brauche ich aber etwas Zeit - heute Nachmittag findet sich ein Slot...

Gruß HE

PS: Was ist "pigs"? Kenne ich noch gar nicht.

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Raspberry 4 Lüftersteuerung PWM

Beitrag von theo »

Hallo HE

Gerne, wenn du das für mich Relevante herausfriemlen kannst.

Ich hab ein 64-bit Raspberry Pi OS (Bullseye) drauf.
https://www.raspberrypi.com/software/op ... -os-64-bit

pigpio bietet Shell Kommandos um GPIOs zu steuern
https://www.elektronik-kompendium.de/si ... 202121.htm

Wahrscheinlich könnte man die Lib auch direkt einbinden.
http://abyz.me.uk/rpi/pigpio/cif.html

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Raspberry 4 Lüftersteuerung PWM

Beitrag von theo »

Ich habe mal den libpigpio Header nach Pascal konvertiert.
Es gibt in dem Zip eine Demo App, die auf GPIO 18 den Lüfter abhängig von der Temperatur des Raspi steuert.
Der pigpiod muss/darf dabei nicht laufen und das Prog sollte als sudo ausgeführt werden oder automatisch beim Systemstart.
https://www.theo.ch/lazarus/pigpio_demo.zip

Von der ganzen Headerkonvertierung habe ich nur den Teil getestet, den ich brauchte.

P.S. Ist keine Doktorarbeit, sondern nur das Resultat von heute Vormittag.

Benutzeravatar
h-elsner
Lazarusforum e. V.
Beiträge: 259
Registriert: Di 24. Jul 2012, 15:42
OS, Lazarus, FPC: LINUX Mint21.1, Win10, Lazarus 2.2.4, FPC3.2.2
CPU-Target: X86-64; arm 32bit
Wohnort: Illertissen
Kontaktdaten:

Re: Raspberry 4 Lüftersteuerung PWM

Beitrag von h-elsner »

So, jetzt habe ich mir mein Zeug nochmal angeschaut. Das wirklich Relevante ist die Datei "SR24_ctrl.pas" und die steht natürlich unter Common: https://github.com/h-elsner/common_units

Das ist sicherlich nicht der Weisheit letzter Schluss, aber das, was für meine Anforderung, nämlich mit dem ZigBee RC-Sender irgendetwas anderes zu steuern als meinen Kopter, völlig ausreicht.

Ich hatte mich dafür entschieden, das sysfs Interface zu nutzen, weil ich nichts passendes gefunden hatte, was direkt auf die GPIO Register zugreift. WiringPi wollte ich nicht benutzen und pigpio hatte ich noch nicht auf dem Schirm. Auf jeden Fall bin ich so unabhängig von allen anderen Programmen.

Ich habe alles unter Rasbian auf einem Raspi 3 entwickelt und laufen tut es auf einem Raspi Zero im Fernsteuerauto.

Vorbereitung:
Dein user sollte in folgenden Gruppen sein: i2c, gpio (und eventuell dialout, aber ich glaube das brauche nur für die UART).
Zum Freischalten der beiden vordefinierte PWM-Kanäle muss man

Code: Alles auswählen

    dtoverlay=pwm-2chan,pin=18,func=2,pin2=13,func2=4
 
in die /boot/config.txt schreiben.

Die PWM-Kanäle sind dann auf:
GPIO18 (pin12) PWM0
GPIO13 (pin33) PWM1

auf /sys/class/pwm/ sollte dann pwmchip0 und pwmchip1 zu sehen sein.

Eigentlich kann man beim Booten einen oder beide PWM-Kanäle gleich aktivieren. Hier PWM0:

Code: Alles auswählen

  cd /sys/class/pwm/pwmchip0/
  echo 0 > export 
  cd pwm0
  echo 10000 > period    (z.B. 100kHz)
  echo 5000 > duty_cycle (Puls/Pause --> 1:1)
  echo 1 > enable
Dann braucht man dann nur noch abhängig von der Temperatur den duty_cycle setzen:

Code: Alles auswählen


uses
  {$IFDEF UNIX}
    baseunix,
  {$EndIf}
    sysutils;

const
  pathPWM='/sys/class/pwm/pwmchip0/';                    {Path to HW PWM in file system}
  PWMchan0='pwm0/';
  PWMchan1='pwm1/';
  fSysStart='export';                                    {Activate GPIO pin in file system}
  fSysStop='unexport';                                   {Deactivate GPIO pin in file system}
  fperiod='period';                                      {in ns --> 1/f in Ghz}
  fCycle='duty_cycle';                                   {in ns must be lower than period}
  fRevers='polarity';

  waitfs=100;                                            {Wait for file system to create GPIO system files}

type
  SysData=string[16];                                    {16 is maximum length to send a string}


function WriteSysFile(filename: string; const value: SysData): boolean;
{$IFDEF UNIX}
var
  f: cint;
{$EndIf}

begin
  result:=false;
  {$IFDEF UNIX}
    f:=fpOpen(filename, o_wronly);                       {Open file to write a string}
    if f>0 then begin
      try
        if length(value)=fpWrite(f, value[1], length(value)) then
          result:=true;
      finally
        fpClose(f);
      end;
    end;
  {$EndIf}
end;

procedure SetPWMCycle(const PWMnr: byte; cycle: uint64);  {Set duty cycle in ns}
var
  scycle: SysData;

begin
  scycle:=IntToStr(cycle);
  case PWMnr of
    0: WriteSysFile(pathPWM+PWMchan0+fcycle, scycle);   {Für PWM0}
    1: WriteSysFile(pathPWM+PWMchan1+fcycle, scycle);     {Für PWM1 wenn nötig}
  end;
end;

Natürlich kann man das Aktivieren auch in deinem Programm machen. "SR24_ctrl.pas" bringt alles mit.

Gruß HE

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Raspberry 4 Lüftersteuerung PWM

Beitrag von theo »

Danke erst einmal.
Ich schaue mir das später genauer an.

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Raspberry 4 Lüftersteuerung PWM

Beitrag von theo »

Hi
h-elsner hat geschrieben:
Di 31. Mai 2022, 14:16
Zum Freischalten der beiden vordefinierte PWM-Kanäle muss man

Code: Alles auswählen

    dtoverlay=pwm-2chan,pin=18,func=2,pin2=13,func2=4
 
in die /boot/config.txt schreiben.

Die PWM-Kanäle sind dann auf:
GPIO18 (pin12) PWM0
GPIO13 (pin33) PWM1
Kannst du mir sagen, warum man das machen muss?
Bei der Verwendung von libpigpio steht nichts von PWM im config.txt und es funktioniert trotzdem.

EDIT: Ich nehme an, der Unterschied ist SW vs HW PWM?

Benutzeravatar
h-elsner
Lazarusforum e. V.
Beiträge: 259
Registriert: Di 24. Jul 2012, 15:42
OS, Lazarus, FPC: LINUX Mint21.1, Win10, Lazarus 2.2.4, FPC3.2.2
CPU-Target: X86-64; arm 32bit
Wohnort: Illertissen
Kontaktdaten:

Re: Raspberry 4 Lüftersteuerung PWM

Beitrag von h-elsner »

Ja, genauso habe ich es verstanden. Das PWM-Signal wird von der HW erzeugt, ohne dass ein Dämon laufen muss. Du musst nur die Taktfrequenz einstellen und die Pulsbreite senden, wenn sie sich ändert. Einmal eingestellt generiert die GPIO die Pulse selber.

Man muss nicht unbedingt alle beide, sondern kann auch nur einen Kanal einschalten:
dtoverlay=pwm,pin=18,func=2
für PWM0 an GPIO18.

Mehr dazu hier:
https://github.com/raspberrypi/firmware ... ays/README

Gruß HE

Edit:
Einen Teil dieser Overlay-Geschichte kann man auch bequemer mit raspi-config einstellen, z.B. I²C, aber eben nicht alles.

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Raspberry 4 Lüftersteuerung PWM

Beitrag von theo »

h-elsner hat geschrieben:
Mi 1. Jun 2022, 21:49
Man muss nicht unbedingt alle beide, sondern kann auch nur einen Kanal einschalten:
dtoverlay=pwm,pin=18,func=2
für PWM0 an GPIO18.
Hmm, ich habe das mal in /boot/config.txt eingetragen.
Beim Neustart hat sich dann der Lüfter während des Startens ausgeschaltet und als der Desktop da war, ging weder Maus noch Tastatur.
Habe dann den Stecker gezogen und auf einem anderen Computer /boot/config.txt wieder zurückgesetzt.
Irgendwie doch nicht so einfach?

Benutzeravatar
h-elsner
Lazarusforum e. V.
Beiträge: 259
Registriert: Di 24. Jul 2012, 15:42
OS, Lazarus, FPC: LINUX Mint21.1, Win10, Lazarus 2.2.4, FPC3.2.2
CPU-Target: X86-64; arm 32bit
Wohnort: Illertissen
Kontaktdaten:

Re: Raspberry 4 Lüftersteuerung PWM

Beitrag von h-elsner »

Also ich habe das schon auf mehreren Raspberry PI ausprobiert und es ging immer. Allerdings waren das alles P2, Pi3, Pi Zero und Pi Zero W. Also alles 32bit Dinger mit dem gleichen Chipsatz. Ob sich da bei neueren Pi's etwas geändert hat, weiß ich nicht.
Auf Anhieb hab ich aber nichts gegenteiliges Gefunden. Inspiriert war ich von diesem Beitrag:
https://www.raspberry-pi-geek.de/ausgab ... modulation

In einem Anflug von Begeisterung für HW-PWM habe ich heute mal einen Recheck-Generator gebastelt, welcher auf PWM0/GPIO18 die Pulse ausgibt.
PiPulse.zip
(8.26 KiB) 97-mal heruntergeladen
In die ZIP-Datei ist auch meine boot/config.txt zum Vergleich. Eventuell beisst sich pigpio mit den Overlay-Einstellungen oder hat da schon etwas eingetragen.

Gruß HE

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Raspberry 4 Lüftersteuerung PWM

Beitrag von theo »

h-elsner hat geschrieben:
Mi 1. Jun 2022, 22:52
Also ich habe das schon auf mehreren Raspberry PI ausprobiert und es ging immer. Allerdings waren das alles P2, Pi3, Pi Zero und Pi Zero W. Also alles 32bit Dinger mit dem gleichen Chipsatz. Ob sich da bei neueren Pi's etwas geändert hat, weiß ich nicht.
Anscheinend gibt es gewisse Probleme mit dem RPi 4b Rev. 1.4. Das ist die Version meines 8GB RPi..
https://forums.raspberrypi.com/viewtopic.php?t=329394
https://github.com/joan2937/pigpio/issues/517

Ich habe das nicht weiter verfolgt, da mein Problem mit dem Lüfter eigentlich gelöst ist.

Antworten