ITСooky

IT-рецепты съедобные и не очень!

Включаем дополнительные вентиляторы на ПК через Arduino!

дата 16.10.2020

Поиграл я тут в Assassin’s Creed Odyssey и опять испугался как греется ПК! Windows у меня исключительно для игр, поэтому решил там включать дополнительные вентиляторы — через Arduino, а в Ubuntu, где наслаждаюсь «тишиной» буду их автоматом выключать! C Arduino будем общаться по Serila Port’у!

Нам потребуется следующее оборудование:

1. Кабель 9-pin на мать плате на микро USB — он у меня был, от Thermaltake Riing Trio 12 — сначала использовал его в схеме с Ардуино, так как на этом кабеле два micro USB, но котроллер Thermaltake перестает работать если на этом же USB висит Arduino! Да и нет под него 80мм вентиляторов…
2. Arduino c micro USB и 5V пином. Подошел бы оригинальный Arduino Nano но у меня его не было, а был вот этот RobotDyn UNO R3 CH340G (R3-ATmega328/CH340G)
3. Реле двойное, типа такого Relay Module 2 relays, 5V
4. Корпус под Ардуино
5. Переходник Molex на 4 (2x5V 2x12V) вентиляторных разъема. У меня был старый Zalman ZM-MC 1, пришлось разъемы под вентиляторы подрезать, чтобы подходили под разъемы PWM
6. Кабель Molex to Molex
7. Ну и ПК вентиляторы у меня влезло всего два 120мм и 80мм, к дополнению к тем что уже были.


8-9 пин от Ардуино подключаю к реле, питание 5V и землю соответственно. На Molex кабеле режу желтый и красный кабель, и подключаю их в реле, в одно реле кабели одного цвета.

В корпус удалось более менее прилично засунуть!

Программируем Arduino
Выясняется что Arduino перезагружается если попытаться к ней первый раз подключиться по Serial Portу, говорят это фича, а не баг! Поэтому программировать будем с учетом этого, состояние писать в память, но памяти в Arduino нет, но каким-то хитрым образом она там появляется с библиотекой EEPROM.h

#include <EEPROM.h>

const int PIN9 = 9; 
const int PIN8 = 8; 
bool value;
String sdata="";  // Initialised to nothing.

void setup() {
  // initialize digital pin LED_BUILTIN as an output.
   pinMode(PIN8, OUTPUT);
   pinMode(PIN9, OUTPUT);
   Serial.begin(9600);
   value = EEPROM.read(0);
}


void loop(void ) {
byte ch;
//Serial.println(value);

  if (value == 0) {
digitalWrite(PIN9, HIGH);
digitalWrite(PIN8, HIGH);
}
if (value == 1) {
digitalWrite(PIN9, LOW);
digitalWrite(PIN8, LOW);
}

   if (Serial.available()) {
      ch = Serial.read();

      sdata += (char)ch;

      if (ch=='\r') {  // Command recevied and ready.
         sdata.trim();
         // Process command in sdata.
         switch( sdata.charAt(0) ) {
           case 'n':
             EEPROM.write(0, 0);
             value = 0;
            break;
         case 'y':
             EEPROM.write(0, 1);
             value = 1;
            break;
         } // switch

         sdata = ""; // Clear the string ready for the next command.
      }
   }
}

Если Ардуино получает n она выключает реле и пишет 0 в память
Если получает y включает и пишет 1 в память
При загрузке Arduino читает что в памяти, и переключает реле по этому значению

Включатель/Выключатель на Arduino в Ubuntu по Serial Port
Сначала смотрю где у нас появилось Arduino
dmesg | grep ttyUSB

[    5.100813] usb 3-5: ch341-uart converter now attached to ttyUSB0

Буду его умно искать, хотя оно всегда скорее всего будет на ttyUSB0

Создаю файл, в своей папке у вас она может быть другой
vi /home/alexandr/.win_fan_off
с кодом

#!/usr/bin/bash
utty=`dmesg | grep "ch341-uart converter now attached to" | awk '{printf $10}'`
cat /dev/$utty & > /dev/null
sleep 10
echo -e 'n\r' > /dev/$utty

Arduino по Serial Portу в Ubuntu работает странно(и не только с ним). Тут какое то шаманство не знаю что делает cat но без этого не работает. После вот такого cat уже можно в любой момент посылать n и y через eсho оно его обработает!

Sleep добавлен чтобы ждать, вдруг Arduino перезагрузиться — такое случается, но не каждый раз!

Делаем его исполнемым
sudo chmod +x /home/alexandr/.win_fan_off

Попробовал systemd и прочии «положите скрипт в эту папку» нифига не работает! Только через окна Ubuntu если добавить то работает

В Startup Aplications Preference добавляем вот так

И все работает, после загрузки раздается первый щелчок, потом через 10 секунд второй выключающий! Если и так были выключены щелчков реле не будет!

Хотел, так же чтобы при выходе из системы срабатывал скрипт включающий вентиляторы, но не один из официальных способ это сделать не сработал!

Включатель/Выключатель на Arduino в Windows 10 Serial Port
Запускаем Windows PowerShell ISE с правами администратора

Создаем файл с именем fan_on.ps1 и текстом

$port= new-Object System.IO.Ports.SerialPort COM4,9600,None,8,one #opens serial port - adjust parameters accordingly
$port.open() #opens serial connection
$port.Writeline("y`r") #writes your content to the serial connection
$port.Close() #closes serial connection
Start-Sleep -s 15
$port= new-Object System.IO.Ports.SerialPort COM4,9600,None,8,one #opens serial port - adjust parameters accordingly
$port.open() #opens serial connection
$port.Writeline("y`r") #writes your content to the serial connection
$port.Close() #closes serial connection

У меня Arduino на COM4 и это не изменится так как внутри подключен, у вас может быть другой
Команду включится посылаем два раза, потому что после первого обращения по Serial Port ардуинка перезагружается

В Schedule Task Manager создаем задание

Галка — Выполнять с наивысшим приоритетом

Триггер

Срабатывать при входе в систему любого пользователя

Действие

Запускать скрипт, тут важно какие аргументы

Command: powershell
Arguments: -ExecutionPolicy Bypass -File C:\Users\Alexandr\fan_on.ps1
WorkingDirectory:

Ура и в Windows тоже работает, вентиляторы включаются! Только вот при заходе появдяется синее окно powershell, не могу найти работающего способа запускать сркипт без окна…

Вот они дополнительные вентиляторы которые влезли в корпус Coguar QBX

1 — 120 мм выдув
2 — 80 мм вдув
Итого в Windows 10 крутятся 6 вентиляторв. Вообщето, производитель копуса обещал что еще 3шт 120мм должны влезть — но это оказалось неправдой. Второй 120 сверху упирается в кбалеь блока питания. А внизу два 120 не встают из-за видео карты, видимо если карта однослотовая тогда влезают!


Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *