Обновлено 25 июня 2018
Кравченко Виктор

Raspberry Pi 3: GPIO (#3) — умное управление собственным активным охлаждением

Радиотехника и электроника Цифровые устройства Умный дом Raspberry
01
Содержание:
02 На заметку:
У данной статьи есть видеоверсия!

Подписывайтесь на канал , чтобы быть в курсе обновлений!
03
05

Но поскольку, по умолчанию, вентилятор напрямую подключается к гребенке GPIO — это подразумевает постоянную его работу. Несмотря на относительную бесшумность работы вентилятора, его постоянная работа не является эффективным использованием активной системы охлаждения. В то же время, постоянное шуршание вентилятора может просто раздражать.

Проверено — автор рекомендует:
Купить Корпус для Raspberry Pi 3 Model B с активным охлаждением (4 цвета)
06

Дискомфорта доставляет и тот факт, что даже если Raspberry Pi 3 выключен, при подключенном питании вентилятор все равно будет работать. Да и в конце концов, почему бы просто не сэкономить немного электроэнергии?

07

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

08

Вся модификация состоит из 2 частей — аппаратной и программной.

09

Аппаратная часть

Заключается во внедрении в схему подключения вентилятора обычного транзистора, при помощи которого управляющий пин GPIO будет управлять включением вентилятора. Подойдет любой транзистор с подходящими характеристиками:

  • структура NPN;
  • максимальное напряжение база-эмиттер не менее 3,3 В;
  • максимальное напряжение коллектор-эмиттер — не менее 5 В;
  • максимальный ток коллектора — не менее 0,2 А.

10

В данном примере используется NPN-транзистор 2N5551. Схема подключения следующая:

11
12

Наглядная схема:

13
14 На заметку:
Токоограничивающий резистор нужен для устранения нагрузки с пина GPIO, максимальный ток которого не должен превышать 16 мА.
15

Программная часть

Работа скрипта основана на ежесекундном запросе температуры процессора. Из терминала подобную информацию можно получить выполнив команду vcgencmd с параметром measure_temp:

16
1
vcgencmd measure_temp
17
18

Логика скрипта такова — при достижении заданной температуры (более 60°С) вентилятор включается, и отключается только когда температура снизится более чем на 10°С от максимального порога (менее 50°С).

19 Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#!/usr/bin/python # -*- coding: utf-8 -*- import RPi.GPIO as GPIO # Импортируем библиотеку по работе с GPIO import sys, traceback # Импортируем библиотеки для обработки исключений from time import sleep # Импортируем библиотеку для работы со временем from re import findall # Импортируем библиотеку по работе с регулярными выражениями from subprocess import check_output # Импортируем библиотеку по работе с внешними процессами def get_temp(): temp = check_output(["vcgencmd","measure_temp"]).decode() # Выполняем запрос температуры temp = float(findall('\d+\.\d+', temp)[0]) # Извлекаем при помощи регулярного выражения значение температуры из строки "temp=47.8'C" return(temp) # Возвращаем результат try: tempOn = 60 # Температура включения кулера controlPin = 14 # Пин отвечающий за управление pinState = False # Актуальное состояние кулера # === Инициализация пинов === GPIO.setmode(GPIO.BCM) # Режим нумерации в BCM GPIO.setup(controlPin, GPIO.OUT, initial=0) # Управляющий пин в режим OUTPUT while True: # Бесконечный цикл запроса температуры temp = get_temp() # Получаем значение температуры if temp > tempOn and not pinState or temp < tempOn - 10 and pinState: pinState = not pinState # Меняем статус состояния GPIO.output(controlPin, pinState) # Задаем новый статус пину управления print(str(temp) + " " + str(pinState)) # Выводим температуру в консоль sleep(1) # Пауза - 1 секунда except KeyboardInterrupt: # ... print("Exit pressed Ctrl+C") # Выход из программы по нажатию Ctrl+C except: # ... print("Other Exception") # Прочие исключения print("--- Start Exception Data:") traceback.print_exc(limit=2, file=sys.stdout) # Подробности исключения через traceback print("--- End Exception Data:") finally: print("CleanUp") # Информируем о сбросе пинов GPIO.cleanup() # Возвращаем пины в исходное состояние print("End of program") # Информируем о завершении работы программы
20

Как поместить Python-скрипт в автозагрузку

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

21

Для этого, в конец файла /etc/rc.local:

22
1
sudo nano /etc/rc.local
23

Нужно поместить команду запуска скрипта перед строкой exit 0:

24
1
sudo python /home/pi/temp_control.py &
25 На заметку:
Наличие символа & в конце команды обязательно, так как он является флагом запуска процесса в фоновом режиме. Если по каким-то причинам забыть его указать, то после перезагрузки загрузка системы завершится черным экраном. В этом случае, необходимо переключиться в консоль Ctrl+Alt+F1, остановить исполнение скрипта Ctrl+C. И далее отредактировать команду автозапуска так, как указано выше.
26

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

27

Чтобы проверить факт запуска, после перезагрузки, нужно переключиться в консоль Ctrl+Alt+F1, и убедиться, что данные об актуальной температуре поступают, после этого вернуться в оконный интерфейс можно комбинацией клавиш Ctrl+Alt+F7.

28

Как проверить?

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

29

«Нагревать» процессор будет утилита sysbench, которую предварительно нужно установить:

30
1
sudo apt-get install sysbench
31

Запуск утилиты с задействованием 4 ядер:

32
1
sysbench --num-threads=4 --test=cpu --cpu-max-prime=20000 --validate run
33

Температура процессора сразу начнет повышаться.

34

Контроль температуры будет осуществляться упрощенным вариантом скрипта управления на Python:

35 Python
1
2
3
4
5
6
7
8
9
10
11
12
13
import os # Импортируем библиотеку по работе с ОС from time import sleep # Импортируем библиотеку для работы со временем from re import findall # Импортируем библиотеку по работе с регулярными выражениями def get_temp(): temp = os.popen("vcgencmd measure_temp").readline() # Выполняем запрос температуры temp = float(findall('\d+\.\d+', temp)[0]) # Извлекаем при помощи RE значение температуры из строки "temp=47.8'C" return(temp) # Возвращаем результат while True: # Бесконечный цикл запроса температуры temp = get_temp() # Получаем значение температуры print(temp) # Выводим температуру в консоль sleep(1) # Ждем 1 секунду
36
37

Принудительно завершить, как выполнение теста утилитой sysbench, так и Python-скрипта можно сочетанием клавиш Ctrl+C.

38

Удаление скрипта из автозагрузки

Для удаления скрипта из автозагрузки нужно просто удалить строку с запуском скрипта из файла /etc/rc.local.

39

Похожие запросы:

  • Выбор кулера для Raspberry Pi 3 Model B
  • Как подключить кулер к Raspberry Pi 3
  • Как правильно управлять вентилятором для Raspberry Pi 3
comments powered by HyperComments

Яндекс.Метрика