Как сделать умную охлаждающую подставку с крайне сомнительной эффективностью

Привет, путник. В данной статье я хочу затронуть тему того, как из глупой идеи получить такое же глупое решение, которое, к тому же, еще и не доделано. А если быть точнее, то я расскажу вам (на самом деле себе), как из готовых компонентов, небольшого количества припоя и кода собрать нечто, что будет охлаждать ваш Windows (а можно и не только) ноутбук в жаркую погоду.

Спойлер: не будет

Дисклеймер: по опыту работы я разработчик для PC и чуток embedded, но никак не разработчик под МК, не проектировщик плат и устройств. Данная статья не является гайдом «как сделать или как не стоит делать». А в тексте нарочно упущены некоторые технические моменты, чтобы не перегружать читателя. И вообще тут не хабр.

Так же обращу ваше внимание, что текст не редактировался кем-либо с оценкой по русскому языку выше 3. К тому же стиль написания достаточно вольный, с неуместными шуточками и прочими.

Спасибо!

Причины

Как поется в песне Игоря Николаева — первая причина это мак, который стал дороже просто мрак, а вторая причина это желание получить какой-никакой RTX и вообще дискретную карту. А как мы знаем ноутбуки для игр — бесовщина, которая греется и никаких этих ваших фпсов не показывает. С чем я и столкнулся, попрощавшись с 13 дюймовым Macbook Pro 2017 года, безжалостно променяв его на ноутбук с AMD, RTX 3050ti и Windows 11.

Муки выбора, причины, мощности и прочие холиварные вещи оставлю за бортом, но цифры температуры на ЦП и ГП за 80 градусов цельсия, во время прогона обучения нейросетей казались, по-моему субъективному мнению, высокими.

Альтернативы

Любой из вас справедливо может заметить, что охлаждающих подставкой на рынке огромное множество. Но, в чем же их беда? А в том, что после бегло просмотра (и даже покупки пары штук) оказалось, что все эти подставки — мусор. Будь в них 2, 3 или 4 вентилятора, питается такое чудо от обычного USB. Удобно? Да, просто подключил в ноутбук и работает. Не эффективно? Почти полностью, ведь обычный USB способен отдать 2.5 Вт, то есть 500 мА при 5 В. Обеспечить хороший воздушный поток с такими цифрами, как мне кажется, не возможно.

Идея

Так как 75% времени я пользуюсь компьютером в стационарном режиме, то есть с большим монитором, клавиатурой и мышкой, то основная идея была в том, чтобы поднять ноутбук над столом (тем самым освободив полезную площадь) и обеспечить дополнительный приток воздуха снизу при помощи 2-3 вентиляторов на 12 В. Но, я же всего лишь разработчик из Bioware… в смысле программист и делать простую подачу питания на вентиляторы с выключателем — скучно. Поэтому было решено, что скорость вращения вентиляторов должна регулироваться автоматически, в зависимости от температуры на ЦП и ГП. Это в свою очередь означает, что необходимо уметь общаться с тем, кто будет регулировать вращение, и еще круче — отображать показатели на дисплее и иметь возможность конфигурировать свое поведение в зависимости от ситуации.

Компоненты

Для общения с ПК решено было использовать никак не меньше, а USB, так как хаотичное поведение т. н. COM-портов на Windows, необходимость их перебора и т. д. выглядит совершенно ни как простой опыт для пользователя.

От разводки своей платы решено было отказаться сразу (как минимум сейчас) из-за того, что я не ставлю перед собой задачу создать коммерческое устройство. К тому же я ничего не понимаю в этих процессах (разводка, травля, нанесение проводящего слоя и т. д.), а заказ производства плат для прототипа — банально дорого. В тоже время решено было отказаться от вариантов реализации на Arduino (простите ардуинщики, но ваш мир упрощения был бы слишком сильным соблазном, против старого-доброго С) и Raspberry (проклятого Linux’а и на работе хватает). Следовательно выбор пал на еще один популярный вариант самоделок — STM32 Cortex M3 в виде готовой платки Blue Pill. Установленного на такой плате STM32F103C8T6 хватит за глаза (даже с избытком) по всей периферии и поддержке USB.

Blue Pill с STM32
Blue Pill с STM32

Широтно-импульсная модуляция (ШИМ) как способ управления скоростью вентиляторов был выбрал без альтернативно. Вентиляторы с 4 контактами (4-х пиновые) на рынке представлены в огромном разнообразие. Выбор пал в пользу двух 120мм вентиляторов Arctic P12.

Arctic P12 PWM ACFAN00119A
Arctic P12 PWM ACFAN00119A

Для отображения информации хотелось использовать простой, не яркий дисплей, с простой шиной данных и логикой. Выбор пал на старый добрый 1,3 дюймовый OLED дисплей с контроллером SH1106.

1,3` OLED дисплей с SH1106
1,3` OLED дисплей с SH1106

А также кучка рассыпухи, в виде «китайского» программатора/отладчика st-link v2, микросхемы постоянной памяти eeprom и т. д.

Проектирование

Да простят меня инженеры за такой заголовок раздела, но без «посидел и подумал как правильно« ничего не обошлось. Конечно же, как и любой »профессионал» я не рисовал схем, ограничившись отрывком туалетной бумаги, который к сожалению уже утрачен.

Для начала было очевидно, что на входе в наше устройство нужно иметь 12 В (требование для работы вентиляторов), следовательно мы должны понизить напряжение до 3.3 В для всего остального, чтобы устройство умело полноценно работать и без подключения по USB к компьютеру. На выручку приходит LDO-регулятор напряжения LD1117V33, возможностей которого нам более чем хватит (3.3В 1А).

ST LD1117V33
ST LD1117V33

Главное все правильно подключить, следуя документации (с правильной парой конденсаторов).

Как сделать умную охлаждающую подставку с крайне сомнительной эффективностью

А в качестве источника питания будем использовать любой доступный 12 В блок питания с круглым разъемом и такой же круглый переходник с винтовыми зажимами. Главное не забывать, что все устройства которые общаются между собой должны иметь соединенные «земли», иначе работать не будет (чертова физика).

Вот такой красавец. Надеюсь не сожжет мне квартиру
Вот такой красавец. Надеюсь не сожжет мне квартиру

Синхронизация уровней, в данном случае, не потребовалась (как это замечательно), а от идеи полного отключения вентиляторов от 12 В было решено отказаться, так как установка ШИМ на 0 приводит к их остановке (возможно это ошибочное решение). А выбор резисторов был сделан просто по схемам из документаций или советам из интернета.

Не забываем про правильную разводку подключения вентиляторов, так как мы собираемся не только ими управлять, но и считать количество оборотов при помощи прерываний

Как сделать умную охлаждающую подставку с крайне сомнительной эффективностью

И подглядываем схему подключения нашего дисплея у коллег

Как сделать умную охлаждающую подставку с крайне сомнительной эффективностью

Так же было решено «паять» плату максимально модульно, чтобы можно было легко заменять ПЗУ, Blue pill, дисплей и вентиляторы.

Сборка

«Быстрая» сборка показала у кого руки не оттуда растут для пайки, но выбора нет, взялся — делай. Результатом нескольких часов страданий стало это:

Устройство "без мозгов"
Устройство "без мозгов"
И его страшная сторона
И его страшная сторона
И "с мозгами"
И "с мозгами"

Как можно заметить питание для Blue pill сделано «проводками» потому-что так было проще, вот и все тут. А одинокий пин внизу служит подключением земля для отладчика.

А как крепить?

Еще в самом начале я упомянул, что ноутбук хотелось поднять над столом и здесь мы тоже займёмся колхозом. А если быть точнее — использованием старого VESA крепления для телевизора, деревянной доски и 3D принтера.

Вот такое крепление (прошу прощение за отвратительное качество фото):

И обычная разделочная доска:

Как сделать умную охлаждающую подставку с крайне сомнительной эффективностью

В которой нужно проделать большие отверстия и прикрутить вентиляторы.

Не забывайте пользоваться сверлом, перед тем как закручивать саморезы, не повторяйте моих ошибок.

Для изменения плоскости крепления пришлось «нарисовать» (не без помощи более опытного товарища) и отпечатать переходник. К сожалению исходного файла проекта от компаса я уже не могу найти, поэтому остались только такие фотографии:

И собрать все вместе направив вентиляторы «вверх» (то есть нагонять воздух на корпус ноутбука).

Firmware

Прошивка для STM32 разрабатывается на «мерзком» STM32cubeIDE с использованием не менее ужасной HAL библиотеки. Пока еще не совсем понимаю за что библиотеку так сильно ругают (кроме большого объема). Зато дилетанты вроде меня могут без глубокого погружения создать себе устройство (не надо так делать в серьезном продакшене, мат часть учите вы).

Логика прошивки будет простая: следить за диапазоном температур (нижний предел означает 0% заполнения ШИМ для вентиляторов, а верхний — 100%) и выставлять заполнение ШИМ (число от 0 до 255) согласно записанной в память таблице. То есть, исходя из разницы температур устройство будет находить индекс элемента в таблице, в котором заранее посчитано значение для ШИМ для текущей температуры. В качестве текущей температуры будет использоваться самое горячее из 2-ух устройств (ЦП и ГП). Пределы температур так же выбираются из заданного максимума и минимума для 2-ух устройств.

Пример таблицы на 64 записи ШИМ, посчитанной для минимальной температуры 50 C° и максимальной 70 C°, с минимальным значением ШИМ 90 (из 255).

[98, 106, 115, 123, 131, 140, 148, 156, 164, 172, 181, 189, 197, 206, 214, 222, 230, 238, 247, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]

Минимальное значение ШИМ существует не просто так, а из-за того, что минимальные обороты вентиляторов не имеют никакого смысла, а начало вращение происходит далеко не на 1% заполнения.

USB HID заведен теме же средствами, но не без помощи интернета.

Clock configuration проекта
Clock configuration проекта

USB HID report descriptor для передачи 64 байт данных в пакете, чего достаточно для команд записи и чтения.

/** Usb HID report descriptor. */ __ALIGN_BEGIN static uint8_t CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END = { /* USER CODE BEGIN 0 */ 0x06, 0x00, 0xff, // Usage Page(Undefined ) 0x09, 0x01, // USAGE (Undefined) 0xa1, 0x01, // COLLECTION (Application) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255) 0x75, 0x08, // REPORT_SIZE (8) 0x95, 0x40, // REPORT_COUNT (64) 0x09, 0x01, // USAGE (Undefined) 0x81, 0x02, // INPUT (Data,Var,Abs) 0x95, 0x40, // REPORT_COUNT (64) 0x09, 0x01, // USAGE (Undefined) 0x91, 0x02, // OUTPUT (Data,Var,Abs) 0x75, 0x08, // REPORT_SIZE (8) 0x95, 0x40, // REPORT_COUNT (1) 0x09, 0x01, // USAGE (Undefined) 0xb1, 0x02, // FEATURE (Data,Var,Abs) /* USER CODE END 0 */ 0xC0 /* END_COLLECTION */ };

В принципе можно было реализовать тот же modbus внутри пакета USB HID, но что-то было лень, из-за чего я ограничился простой схемой:

  • 0-й байт: команда
  • 1-й байт: адрес
  • 2-й байт: количество
  • Байты с 3-го по 63-й: полезная нагрузка (для команды записи)

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

uint8_t memory[80]; uint8_t* state = &memory[0]; uint8_t* minimum_cpu_temp = &memory[1]; uint8_t* minimum_gpu_temp = &memory[2]; uint8_t* maximum_cpu_temp = &memory[3]; uint8_t* maximum_gpu_temp = &memory[4]; uint8_t* minimum_pwm = &memory[5]; uint8_t* current_cpu_temp = &memory[6]; uint8_t* current_gpu_temp = &memory[7];

Не забываем добавить подсчет количества оборотов вентиляторов

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == TIM3 && htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) { if (Is_First_Capture == FALSE) { IC_Val1 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1); Is_First_Capture = TRUE; } else { IC_Val2 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1); if (IC_Val2 > IC_Val1) difference = IC_Val2 - IC_Val1; else difference = (0xffffffff - IC_Val1) + IC_Val2; rpm = (36000/difference)*30; __HAL_TIM_SET_COUNTER(htim, 0); Is_First_Capture = FALSE; } } }

Пишем простой и кривой драйвер для работы с дисплеем и… забиваем на написание кода прошивки, выставив ШИМ для вертушек по умолчанию на максимум.

Software

Для быстрой и простой работы с USB HID устройством, в качестве прототипа, я решил использовать Python3 в связке с OpenHardwareonitor, CPUThermometer и PyUSB (libusb) для сбора информации по температурам ЦП и ГП, а так же записью данных в USB HID устройство. Таблица ШИП для температура считается так же тут.

minimum_cpu_temp = 50 minimum_gpu_temp = 50 maximum_cpu_temp = 70 maximum_gpu_temp = 70 minimum_pwm = 25 minimum_temp = min(minimum_cpu_temp, minimum_gpu_temp) maximum_temp = max(maximum_cpu_temp, maximum_gpu_temp) temp_diff = maximum_temp - minimum_temp write_target_temperatures(endpoint=ep, minimum_cpu_temp=minimum_cpu_temp, minimum_gpu_temp=minimum_gpu_temp, maximum_cpu_temp=maximum_cpu_temp, maximum_gpu_temp=maximum_gpu_temp) write_minimum_pwm(endpoint=ep, minimum_pwm=minimum_pwm) if temp_diff > 64: return table = [255] * 64 pwm_step_value_per_percent = (255 - minimum_pwm) / 100.0 # PWM step value per one percent temp_step_value_per_percent = temp_diff / 100 for i in range(1, temp_diff + 1): target_pwm = round(i / temp_step_value_per_percent * pwm_step_value_per_percent + minimum_pwm) table[i - 1] = target_pwm print(table); write_temp_pwm_table(endpoint=ep, table=table)

Одна из проблем такого решения заключается в том, что библиотека libusb должна лежать прямо в System32 (иначе работа с USB HID в Python3 просто не работает).

Запущенный процесс в отладчике
Запущенный процесс в отладчике

К сожалению на данный момент это все, что реализовано из кода (помимо кучи созданной для отладки тех или иных моментов).

Тестирование

Всю эту конструкцию я использую уже пару месяцев в режиме включено или выключено и наблюдаю очень малу эффективность (по ощущениям на грани погрешности) в 1-2 градуса.

Для простейшего теста была запущена Baldur’s Gate 3 со следующими настройками:

Скриншоты снимались в меню и в игре (первый акт, какое-то подземелье) с разницей в 5 минут (вентиляторы выключены — скриншот снят через 5 минут, вентиляторы включены — скриншот снят через 5 минут). Сдвиг камеры произошел из-за нажатия Shift-Right для снятия скриншота.

Железо: 5600h, 3050ti, 32GB

Итого

Эффективность не ясна. По «глупым» текстам скидывает целых 4 градуса, явно помогает остудить ноутбук быстрее. Имеет ли смысл? Не понятно. Буду ли доделывать? Тоже не известно. Заметка написана больше для себя, что бы схоранить PDF и не забыть, что вообще делалось. Код на гит не размещал (но если кому надо — сделаю). Ожидаю Starfield, чтобы посмотреть как 3050ti будет от него гореть, правда его еще и купить надо.

1.3K1.3K показов
165165 открытий
10 комментариев

Зачем в этой схеме что-то кроме вентиляторов?

Ответить

"скорость вращения вентиляторов должна регулироваться автоматически, в зависимости от температуры на ЦП и ГП. Это в свою очередь означает, что необходимо уметь общаться с тем, кто будет регулировать вращение"

Ответить

Комментарий недоступен

Ответить

Вот же лучше

Ответить

ахуй
а мне розетко иногда током ебашит просто так

Ответить

Хер его знает зачем но:
Сделать макетную плату без пайки чую было проще
Поток воздуха от 12v вентиляторов, не особо хороший (если не модифицировал крыльчатку)
Хочешь охрененную продуваемость - серверные вентиляторы тебе в помощь или мастырь осевую турбину в 2+ рабочих колеса (в любом случае будет громко)
Хочешь чтобы это хлаждалось прям отлично? Даёшь орочь технологии и водянку на ноут с выносным радиатором охлаждения)

Ответить

Они все равно сильно лучше того, что ставят во все «подставки». Эффективность конечно тоже такая себе, зато опыт

Ответить