Raspberry 4 Lüftersteuerung PWM
Raspberry 4 Lüftersteuerung PWM
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.
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.
Re: Raspberry 4 Lüftersteuerung PWM
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!
Wenn jemand etwas Schöneres und Pascaligeres hat, immer her damit!

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;
- h-elsner
- Lazarusforum e. V.
- Beiträge: 281
- 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
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.
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.
Re: Raspberry 4 Lüftersteuerung PWM
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
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
Re: Raspberry 4 Lüftersteuerung PWM
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.
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.
- h-elsner
- Lazarusforum e. V.
- Beiträge: 281
- 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
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 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:
Dann braucht man dann nur noch abhängig von der Temperatur den duty_cycle setzen:
Natürlich kann man das Aktivieren auch in deinem Programm machen. "SR24_ctrl.pas" bringt alles mit.
Gruß HE
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
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
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;
Gruß HE
Re: Raspberry 4 Lüftersteuerung PWM
Danke erst einmal.
Ich schaue mir das später genauer an.
Ich schaue mir das später genauer an.
Re: Raspberry 4 Lüftersteuerung PWM
Hi
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?
Kannst du mir sagen, warum man das machen muss?h-elsner hat geschrieben: Di 31. Mai 2022, 14:16 Zum Freischalten der beiden vordefinierte PWM-Kanäle muss manin die /boot/config.txt schreiben.Code: Alles auswählen
dtoverlay=pwm-2chan,pin=18,func=2,pin2=13,func2=4
Die PWM-Kanäle sind dann auf:
GPIO18 (pin12) PWM0
GPIO13 (pin33) PWM1
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?
- h-elsner
- Lazarusforum e. V.
- Beiträge: 281
- 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
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.
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.
Re: Raspberry 4 Lüftersteuerung PWM
Hmm, ich habe das mal in /boot/config.txt eingetragen.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.
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?
- h-elsner
- Lazarusforum e. V.
- Beiträge: 281
- 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
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. 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
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. 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
Re: Raspberry 4 Lüftersteuerung PWM
Anscheinend gibt es gewisse Probleme mit dem RPi 4b Rev. 1.4. Das ist die Version meines 8GB RPi..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.
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.