Привет Друзья!
Сегодня я хотел бы показать вам вот такие интересные устройства, которые я соорудил на досуге. Возможно, кто-то захочет повторить
Это, что ни на есть самодельные реобасы с функцией управления подсветкой. Для тех кто не знает, реобас - это такое устройство, которое занимается управлением корпусными вентиляторами, в данном же случае у меня получился целый корпусный комбайн. Данные устройства умеют:
-Управлять оборотами 4-пин вентиляторов с возможностью подключения вразрез
-Управлять оборотами 3-пин вентиляторов (управление 3-пинами отличается от 4-пиновых)
-Плавно менять обороты вентиляторов
-Управлять адресной светодиодной лентой
Что касается ленты, реализовано:
-Статическая подсветка
-Режим цветовой индикации температур
-Режим цветовых эффектов
Видео-версия данной статьи:
А теперь, давайте обо всём по-порядку.
Началось всё с покупки нового корпуса, который оказался достаточно душным для моего горячего железа. С покупкой нового корпуса пришлось так же озадачиться вопросом покупки корпусных вентиляторов и вопросами продуваемости.
Помучавшись с этим немного я заметил интересный эффект - при одинаковой загрузке в разных играх температура ГПУ достигала разных значений, причём, если можно сказать, что разные движки задействуют разные возможности ГПУ, и отсюда вытекает такой результат, то в случае с Battlefield 1 и Battlefield 4 такое оправдание подходит слабо. Обе игры построены на движке Frostbyte, и хотя версии Фростбайта разные - дело тут не в движке. Обе игры без проблем пользуются возможностями моего ГПУ и процессор не становится помехой, но температура GPU в Battlefield 1 стабилизируется на 73 градусах, а в Battlefield 4 - и 78 не предел. Так в чём же тут дело? А дело тут вот в чём - Battlefiel 1 в отличии от "четвёрки" крайне активно использует и разогревает процессор, корпусные вентиляторы повышают свои обороты, улучшается продув, и как следствие ГПУ чувствует себя комфортнее.
Разобравшись с причинами я принялся искать решение, а именно инструмент, который позволял бы управлять корпусными вентиляторами опираясь не только на температуры ЦПУ, но и на температуру ГПУ. Софт от матплаты, а у меня на тот момент была матплата MSI Z87 G45-GAMING, делать такое не позволял, и единственное, что приходило на ум - утилита SpeedFan. Поковырявшись с ней в очередной раз (а я уже предпринимал попытки в прошлом), я понял, что или она не работает с моей конкретной матплатой, или я в очередной раз не разобрался с настройками (больно уж путанный у неё интерфейс), и отложив SpeedFan в сторону снова, я вспомнил ещё один случай: зеоносборку на e5 1660 которую я недавно собирал своему другу. Китайские матплаты конструктивно не умеют управлять корпусными вентиляторами, а часть нестандартных прошивок лишает пользователей даже возможности управления процессорным вентилятором. Волею случая, на руках у меня были микроконтроллеры ESP8266, которые я закупил для постройки умного дома, и я решил попобовать собрать универсальное устройство для управления корпусными вентиляторами, причём с сохранением возможности управления от штатных PWM-линий.
Тогда я ещё не был до конца знаком с возможностями ESP8266 и не знал как правильно управлять вентиляторами, потому самой первой идеей было подключить вентиляторы через реле - в нормально-разомкнутом состоянии подавая на него PWM сигнал с матплаты, а в нормально-замкнутом - нужное напряжение для нужных оборотов или высокий уровень на линию PWM.
Идея примитивная, и от неё я быстро отказался познакомившись с PWM-регулировкой. Возможности ESP8266 к PWM регулировке крайне ограничены, ESPшка имеет всего одну софтовую линию с ограничением в 1кГц, потому мне она в целом не подходила, но не имея на тот момент ей замены и не зная о возможных вариантах, первую версию проекта я решил строить именно на ней. По стандарту для управления вентиляторами используется частота 20-21кГц во избежании свиста обмоток двигателя. Соответственно, 1кГц абсолютно недостаточно для управления 3-пин вентиляторами через транзистор, но вполне достаточно для управления 4-пин вентиляторами, т.к. мы не управляем двигателем напрямую, а отправляем сигнал во встроенный контроллер вентилятора. В общем, сделал первую версию скрипта для ESP, написал программу для десктопа, и придумал аппаратную реализацю. Ну, как придумал, на самом деле как электронщик я не очень, потому элементы для реализации мне любезно подсказал один человек с одного анонимного форума, за что выражаю ему огромную благодарность. И да, буду рад любым подсказкам и исправлениям по-поводу аппаратных моментов с вашей стороны. Так вот аппаратная часть представляла собой микроконтроллер ESP8266, элемент логическое И и элемент логическое ИЛИ. PWM сигнал с матплаты поступал на логический элемент И, и в случае, если на него подавался разрешающий сигнал с ESP8266 - передавался далее на логическое ИЛИ, откуда устремлялся уже на выход, а когда необходимо было перехватить управление - останавливалась подача разрешающего сигнала на логическое И, и генерировался PWM сигнал с ESP8266 на логическое ИЛИ, отправляясь оттуда на выход.
Что касается софтовой части, её я написал на языке Python. Первая версия программы была написана абсолютно на скорую руку и представляла из себя набор функций, часть из которых были закольцованы в фоновые циклы в отдельных тредах. Я изучал новые возможности языка, и особо не заморачиваясь закидывал их в виде отдельных функций в основную программу. Концепция программы получилаь следующая: вентиляторы реагируют на температуру не плавно, но ступенями. Часть программы, запускаемая на ПК получает данные о температурах из MSI Afterburner и опираясь на эти данные отправляет через USB на ESP сигнал о необходимых оборотах вентиляторов. На выходе получился вполне себе работоспособный продукт, который я успешно тестировал в своём ПК примерно месяц.
Во время разработки я узнал о более современной ESP32, которая уже имела 4 аппаратные PWM-линии, и когда я закончил с ESP8266, ESP32 уже ждала меня в филиале почты России. Немного отдохнув - я принялся за неё. Прежде всего модернизации подверглась основная программа которая теперь стала называться ESP32 FanControl и получила версию 2.0. Я постарался сделать максимально понятный интерфейс, поработал над нормальным масштабированием. Функционал был расширен, добавлены дополнительные линии PWM и возможность управления подсветкой. Что касается кода: для удобста я выделил несколько классов, и поместил в них функции, к которым теперь стало проще обращаться, однако стиль написания всё-ещё неправильный, и в будущем, когда будет свободное время, я или пепрепишу программу под ООП на Python, или вовсе перенесу проект на C#. Кстати говоря, я не профессиональный программист, и не отказался бы от помощи или подсказок, если будут желающие. В данный же момент в программе остались небольшие мини-баги, которые можно отловить, но в целом программа работает прекрасно, абсолютно не влияя на производительность ПК: потребляет в фоновом режиме минимум процессорного времени и всего в районе 4-16мб оперативной памяти.
Так выходит потому, что CP2102 умеет дёргать аппаратный ресет, а CH340 - не умеет. Иногда для успешного подключения к устройству ресет просто необходим.
Первый вариант реализации на готовых модулях с AliExpress:
Данная схема вполне жизнеспособна, хотя и обладает некоторыми существенными недостатками. Данная схема подразумевает только управление вентиляторами и подсветкой, и не позволяет подключаться вразрез, не подразумевает возможности измерения оборотов вентиляторов, хотя вы можете вручную прокинуть сигнал тахометра от вентилятора к матплате. Несмотря на то, что используются готовые модули, минимальный навык пайки для сборки всё-же необходим.
Нам потребуются:
ESP32, стоит в данный момент в районе 370 рублей с доставкой Standart Shiping
Модуль реле, который может вам пригодится, обойдётся в дополнительные 70 рублей
Подключается всё это по следующей схеме:
Что касается светодиодной ленты, есть два способа подключения.
Первый способ - запитать ленту от USB порта, для этого вешаем плюс адресной ленты на 5v контакт ESP, минус на земляной контакт ESP, а управляющий контакт ленты на контакт указанный в прошивке FanControl через резистор в 200-300 Ом. Данный способ имеет некоторые ограничения. Во-первых, такой способ подойдёт ТОЛЬКО при поключении к USB 3.0, т.к. USB2.0 позволяет передавать ток в 0.5А, USB3.0 же по спецификации разрешает передавать ток 0.9 ампер, а по факту и чуть больше переварит. Максимальный ток одного адресного светодиода составляет 60мА, делим 0.9 на 0.06, и получаем 15 светодиодов. В своём корпусе я использую как раз ленту на 15 светодиодов, и этого достаточно для неплохого равномерного освещения. В тестовой же сборке у меня от ESP32 запитан 21 светодиод и на максимальной яркости каких-либо проблем я пока не заметил (и да, это конечно же на свой страх и риск). По-мимо ограничения на колличество светодиодов, в данном случае имеются следующие ограничения:
-Тип ленты - применять можно только 5-вольтовую WS2812b
-USB порт должен выключаться вместе с ПК, иначе лента не будет тухнуть (Постараюсь исправить чуть позже)
Плотность ленты в данном случае стоит выбирать исходя из длины поверхности, на которую планируется установка, и количества светодиодов, питание которых потянет USB-порт.
Второй способ - подключить ленту к внешнему источнику питания через модуль реле. Причём под внешним источником питания в данном случае я подразумеваю не блок питания компьютера (в этом случае пришлось бы так же плясать с развязками), а внешний, отдельный адаптер на 5 или 12v взависимости от типа ленты. Для этого землю с источника питания подаём на LED-ленту и объединяем с землёй ESP32. Питание с источника питания подаём на вход реле, а с выхода реле отдаём питание на led-ленту. На управляющие контаты реле подаём +5v и землю от ESP, а так же управляющий сигнал с пина, который прописан в прошивке через резистор в 300оМ. Управляющий сигнал LED-ленты прописанный в прошивке подаём на LED-ленту через резистор в 200-300оМ. В данном случае нет ограничения на тип светодиодной ленты (можно использовать как WS2812b так и WS2811), так же нет ограничения на количество светодиодов (оно будет зависеть от источника питания, выбирать который следует исходя из того, что один светодиод потребляет 60mA).
В данном случае чем больше плотность ленты - тем лучше.
В дополнение: помимо модуля опторазвязки я опробовал готовый модуль, который представляет из себя связку N-канального транзистора и оптопары, который вы сможете увидеть на фото ниже. Так вот, нормальной его работы, что называется малой кровью, мне достичь не удалось, нам он не подходит:
Внимание! Схема подключения вразрез нуждается в доработке! Так же, следует понимать, что это может быть опасно для вашей матплаты!
Как вы можете видеть, в моей последней реализации всё-ещё есть неучтённые элементы, которые пришлось напаять навенсым монтажём, потому будет как минимум ещё одна версия платы, изготовление которой я уже закажу фабричным методом на заводе в китае. Собственно, чертёж платы, который уже немного видоизменён от той версии что имеется у меня на руках, можно найти в папке \scheme. И да, я его ещё не заказывал и не травил, возможны ошибки, советую за мной перепроверять, а информация о том, что чертёж уже испробован будет в приложеном файлике readme.
Что тут ещё можно добавить - я незнаю. Все желающие могут взять готовые схемы, вытравить/заказать и спаять. Так же я оставлю список компонентов. Можете так же придумать свою плату под другую версию доски ESP32, или под использование развязок HCPL2630/2631 вместо ADUM1400.
Пара слов о прошивке ESP32. Программы необходимые для прошивки:
Драйвер CP2102, необходим, если со штатным драйвером ESPшка отказывается прошиваться. Использовать драйвер 6.7.6 для Windows 7/8.1.
Утилита Flash Download Tools для прошивки ESP32
Утилита Espy для работы с файловой системой ESP32:
Качаем с гитахаба архив репозитория ESP32 Fan Control
Для прошивки нам потребуется утилита Flash Download Tools от Espressif. Прошивка firmware.bin находится в папке /ESP32 репозитория. Утилиту и прошивку помещаем в корень диска C:\, т.к. это как раз тот случай, когда программа действительно не переваривает кирилицу. Подключаем ESP32 к USB-порту. Запускаем утилиту, выбираем ESP32 Download Tool. Вверху программы оставляем чекбокс только на одной строке, в которой выбираем путь до прошивки, и чуть правее вбиваем адрес: 0x1000. Внизу справа выбираем нужный COM-порт и жмём ERASE. Ждём завершения очистки, и после жмём кнопку START.
boot.py можно и нужно предварительно отредактировать при помощи Notepad++ или любого другого редактора (Не пользуйтесь обычным Блокнотом). В самом начале файла идут пользовательскиеи переменные, часть из которых я бы трогать не рекомендовал. А вот те, которые можно и нужно исправить:-boost_zone: как я уже говорил, если собирать схему на PC817 диапазон регулировки немного сужается. boost_zone - граница оборотов, в процентах, до которой на 3-pin вентилятор подаются бустовые импульсы при старте с нуля. Допустим минимальные обороты для вашего вентилятора = 5% заполнения. Без буста 3-pin на этих 5% просто не стартанёт. Можно попробовать сдвинуть эту планку вниз, если, допустим, ваш вентилятор без проблем стартует с нуля до 30% без буста. Чтобы это выявить можно попробовать запускать 3-pin вентилятор в режиме 4-pin (Без галочки 3-pin), в таком случае бустовый импульс подаваться не будет.
-as_pin: пин автостарта, для запуска программы данный пин должен быть замкнут на землю. В тех ЕСПшках, которые есть у меня на руках, этот пин соседствует с землёй, соответственно, просто замыкается джампером на землю. Список доступных пинов можно найти перед модулем переменных в файлике boot.py. Расположение пинов смотрим на распиновке конкретно вашей реализации ESP32 (Найти без проблем можно в Яндекс-картинках по запросу "Распиновка ESP32")
-PWM-Pins: здесь указываем пины, к которым у вас подключены PWM-линии. Выбирать из списка доступных к подключению пинов.
-EXT_Pins: используются для подключения вразрез. В случае, если PWM линия отключена (установлена в 0), через EXT_Pins подаётся питание на логический элемент И, к которому так же подключён сигнал PWM матплаты. Если используются - по расположению в списке должны соответствовать линиям PWM из разводки платы.
-led_pin: пин подключения LED-ленты. Выбирать так же из списка доступных к подключению пинов.
-led_relay: пин подключения реле питания LED-ленты. Выбирать так же из списка доступных к подключению пинов.
Убедитесь в отсутствии дублирующихся пинов!
Основное окно, вкладка с мониторингом температур. В данном режиме происходит контроль за температурами и управление вентиляторами. В свёрнутом состоянии окно не обновляется.
В окне расширенных настроек, во вкладке вентиляторы, вверху есть комбо-бокс выбора линии, и элементы управления выбранной линией: чекбокс включения и выключения данной линии, чекбокс 3-пин, при включении которого на вентилятор будет подаваться BOOST-импульс, можно выбрать элемент за которым будет вести наблюдение данная линия - CPU и/или GPU, можно выбрать рабочую частоту (для реализации на травленной плате с нормальной развязкой лучше оставлять дефолтные 21кГц, а о частотах для сборки на модулях я уже говорил выше). Тут же находится ползунок выбора оборотов. Выбрав обороты, можно запустить вентилятор и посмотриеть, что эти обороты из себя представляют, после чего задать их соответствующей кнопкой выбраной зоны. Соответственно ниже есть кнопки установки оборотов для зон и температур для зон.Минимальные обороты для 3-pin стоит выбирать путём снижения оборотов с более высоких: например, мы знаем что при 50% оборотов наш 3-pin вентилятор стартует, и работает. Снижаем обороты до тех пор, пока не найдём обороты на которых он глохнет - в моём случае это 10%, тоесть 15% - это его минимальные рабочие обороты. Убеждаемся что вентилятор может стартануть с нуля до этих оборотов, если нет - можно попробовать подправить accel_speed на 0.01 в прошивке.
Во вкладку подсветка стоит перейти прежде чем пытаться включить подсветку: она не заработает, если не вбить колличество светодиодов в вашей ленте. Тут же можно выбрать яркость, цвет. Вместо статического цвета можно использовать несколько LED-эффектов: "Волна", "Бегущая строка", "Появление" и "Замыкание". Да-да, я написал всего 4 эффекта, если кому-то будет не лень, буду рад если этот список будет пополнен. Для LED-эффектов доступна настройка скорости. Для режима статической подсветки доступен режим цветовой индикации температур, элементы управления которым расположены ниже: выбираем линию PWM, по которой будет вестись индикация, и зоны с их цветами.