понедельник, 19 сентября 2016 г.

Контроль охлаждения для Raspberry Pi 3 с помощью PWM

    После недавнего приобретения Raspberry Pi, наконец, у меня стало появляться свободное время, и второе, что мне захотелось увидеть от данного девайса, это то, как оно может разгоняться.
Множество статистики в сети свидетельствует о том, что очень даже неплохо, но существует 2 важных фактора для успешного оверклокинга данного устройства без вероятности неблагоприятных последствий.
А именно:

  • Хорошее питание
  • Хорошее активное охлаждение
Ну, с питанием у меня все было нормально, а, вот, активного охлаждения не было.

Сказано - сделано:
Потратив некоторое время на поиски - нашел таки кулер нужного размера в 40мм, единственная проблема которого, на тот момент - питание от 12в.
Поскольку альтернативных вариантов я не нашел, а ждать, пока из Китая придет 5-вольтовый не хотелось, то я решил просто воспользоваться самодельным ИИП, который использовался 24 часа в сутки, и питал два монитора, настольную лампу на 50W и дидоный прожектор на 30W.
 Для проверки, подключил найденный кулер к блоку и понял, что просто так мы с ним не уживемся. На выдаваемых блоком 13в, шум вентилятора почти перекрывал колонки...
 Этот вариант меня определенно не устраивал, поскольку, даже несмотря на быструю профилактику, и некоторое снижение шума после нее (кулер оказался, к сожалению, на втулке, а не подшипнике, но уж что есть), этого было явно недостаточно для комфортной работы вблизи.

 Исправить эту проблему я решил, как, возможно, многим бы показалось, довольно сложным путем, но, и у этого есть логическое объяснение. Мне хотелось это сделать, параллельно используя функционал самой Raspberry, которого было более, чем достаточно.
 И помогла мне в этом библиотека WiringPi и реализованный в ней аппаратный ШИМ. Что такое ШИМ(PWM), как он работает и т.п., с легкостью можно узнать в сети, например тут.
 Также нам нужен, соответственно, Python, который я заранее поставил в arm образ LTSP-сервера.
 Схема реализации, которой я воспользовался очень проста, даже для людей, мало знакомых с электроникой. Это один полевой транзистор, один подтягивающий резистор и... все...
 Выглядит таким образом (взято с http://elinux.org/RPi_GPIO_Interface_Circuits):


В моем случае, разница только в том, что с GPIO мы берем только PWM-сигнал (GPIO 18) и GND, а питание идет с отдельного ИИП на 12в.
Транзистор пойдет любой Logic Level, откатывающийся с 3в.

Если кому интересно, вот такой PWM-сигнал формирует WiringPi в разных режимах работы:



Обратите внимание на показатель заполнения (+Duty\-Duty). Это как раз и есть показатель скважности и коэффициента заполнения, иными словами - период, на который транзистор будет открыт\закрыт.

Далее, нужно было только написать небольшую программу, которая бы использовала показатель температуры Raspberry и соотносила его со скоростью вращения нашего кулера.
В итоге "на коленке" было написан следующий питоний скрипт. Скачать его можно тут.

Никаких сверх-навороченных функций он не делает, но все же имеет возможность относительно гибко задавать настройки через аргументы командной строки.
usage: raspberry_fan.py [-h] [-H N] [-r N] [-m N] [-d N] [-v] [-D]
Для тех, кто не очень понимает Python, варианты аргументов могут быть следующие:
  • Ключ "-H" позволяет задать гистерезис ( 1 < n < 10) в градусах (по-умолчанию 5)
  • Ключ "-r" позволяет задать частоту обновления температуры ( 1 < n < 30) в секундах (по-умолчанию 5)
  • Ключ "-m" позволяет задать "потолок" температуры, на котором кулер будет вращаться на максимальных оборотах (60 < n < 80) в градусах (по-умолчанию 70)
  • Ключ "-d" позволяет задать температуру, при которой кулер отключается ( 40 < n < 55) в градусах (по-умолчанию 47)
  • Ключ "-v" сделан для отладки, и позволяет выводить информацию после каждой итерации в stdout (при режиме "-D", вывод идет в /var/log/r_fan.log)
  • Ключ "-D" режим запуска в виде сервиса
Скрипт требует root-прав для запуска.

После данных манипуляций, шум меня больше особо не беспокоит, правда на продолжение изучения девайса времени, пока что, не осталось :)
Читать дальше...

Комментариев нет:

Отправить комментарий