Керування вентилятором Waveshare для Raspberry Pi 5



Raspberry Pi часто використовується у проектах, які працюють цілодобово. У такому режимі питання охолодження стає критичним. Один із найпоширеніших варіантів – PoE HAT з вбудованим вентилятором. На перший погляд може здатися, що достатньо під’єднати HAT і все запрацює автоматично. Але на практиці іноді виникають нюанси, як це сталося і в мене.

Я купив Waveshare PoE M.2 HAT+. Підключив його згідно інструкції, проте звернув увагу на те, що вентилятор працював постійно на максимальних обертах. Звісно така поведінка неочікувана і я почав шукати причину щоб усунути її.

Параметрами ядра

Вентилятор PoE HAT не працює “напряму” від напруги. Він керується параметрами ядра та спеціальним драйвером, який реагує на температуру процесора і змінює оберти. Ці параметри налаштовуються в файлі конфігурації распбері пай /boot/firmware/config.txt

В цей файл необхідно додати наступний блок налаштувань :

# Fan settings
dtparam=cooling_fan=on
dtparam=fan_temp0=55000,fan_temp0_hyst=2000,fan_temp0_speed=80
dtparam=fan_temp1=60000,fan_temp1_hyst=2000,fan_temp1_speed=140
dtparam=fan_temp2=65000,fan_temp2_hyst=2000,fan_temp2_speed=200
dtparam=fan_temp3=70000,fan_temp3_hyst=2000,fan_temp3_speed=255

Опишу цей блок детальніше на прикладі першого рядка:

  • dtparam=cooling_fan=on – вмикає драйвер апаратного вентилятора на Raspberry Pi 5.
  • fan_temp0=55000 – поріг у мілі-градусах °C (55 000 = 55 °C). При досягненні цієї температури вентилятор увімкнеться.
  • fan_temp0_hyst=2000 – гістерезис (2 °C). Це означає, що вентилятор вимкнеться лише тоді, коли температура опуститься нижче 53 °C.
  • fan_temp0_speed=80 – швидкість обертів при цьому порозі. Значення в діапазоні 0–255 (де 255 = максимальні оберти). 80 ≈ низька швидкість, фактично «тихе охолодження».

Після застосування цих змін, я перезавантажив Raspberry Pi, проте зміни не відбулися, вентилятор продовжував працювати на максимальних обертах. Я був змушений шукати інші причини вирішення проблеми – постійні максимальні оберти вентилятора.

Діагностика несправності

Оскільки внесені параметри не вплинули на поведінку роботи вентилятора, то я вирішив подивитися всі можливі параметри які могли б теоретично відповідати за температуру та оберти вентилятора. Для цього я послідовно запустив три команди.

cat /sys/class/hwmon/*/fan1_input
13863

Показує кількість імпульсів за секунду вентилятора. fan1_input – стандартний сенсор у Linux hardware monitoring (hwmon). Зазвичай тут значення коливаються залежно від PWM-сигналу (тобто від того, яку швидкість встановлено через fan_tempX_speed або target_pwm).

/vcgencmd measure_temp
temp=27.9'C

Утиліта vcgencmd читає температуру CPU (через firmware GPU). Означає, що ядро ARM зараз має температуру 27,9 °C. Це «офіційний» спосіб подивитися температуру Raspberry Pi, і саме ці дані використовує система охолодження.

cat /sys/class/hwmon/hwmon0/temp1_input
27050

Той самий сенсор CPU, але доступний через інтерфейс Linux hwmon. temp1_input подає температуру в міліградусах Цельсія. 27050 = 27 050 м°C = 27,05 °C. Це більш «сирий» спосіб доступу до температури, який використовують утиліти типу sensors або monitoring-системи (Zabbix, Prometheus, lm-sensors).

Оскільки кожен параметр видав мені дані, то це значить, що сенсори активні та працюють. Я почав шукати проблему в апаратній частині. Спершу я вимкнув і від’єднав живлення Raspberry Pi, від’єднав шлейф PCI Express та від’єднав повністю плату PoE HAT. Я побачив, що в конекторі для вентилятора распбері пай одна ніжка погнута, і це стало великою проблемою, адже сам роз’єм дуже маленький, і навіть масштаб розмірів голки здається доволі великим. Щоб ви розуміли масштаб мініатюри, я це фото зробив на макро об’єктив.

Як видно на фотографії, контакт було притиснуто до низу і трошки деформовано. Я голкою зміг його підняти тільки у вертикальне положення, проте сам контакт залишився погнутим. Для того, щоб він коректно зайшов в конектор, я змушений був голкою розширити для нього отвір. Після під’єднання, распбері пай запустилася, і вентилятор почав отримувати сигнали щодо кількості обертів в залежності від температури.

Наразі виконавши команду перевірки кількість імпульсів вентилятора cat /sys/class/hwmon/*/fan1_input я отримав значення 3447 що втричі менше за попереднє значення. Таким чином я поборов проблему, і тепер мій вентилятор керується коректно в залежності від температури процесора.

Головний висновок такий: для стабільної та тихої роботи PoE HAT на Raspberry Pi необхідно не лише правильно налаштувати параметри в config.txt, а й переконатися в цілісності конектора та пінів. Мій приклад наочно показує що цим нехтувати не треба, а якщо вже і сталася проблема, то її вирішити не просто, адже елементи конектора настільки маленькі, що їх фізично вирівняти буде або неможливо, або дуже важко і для цього голка або пінцет будуть доволі великими інструментами.