неділя, 9 листопада 2014 р.

Воздушное охлаждение raspberry pi


Как известно, Raspberry pi можно разогнать до 1 Ггц без потери гарантии, но после разгона возникает проблема с нагревом процессора.
Один из вариантов - поставить небольшой радиатор, что собственно я и сделал, но как показала практика, даже с радиатором Raspberry pi сильно грелся, поэтому возник вопрос о дополнительном охлаждении.
Первое что пришло в голову - это поставить небольшой вентилятор от старой видеокарты, и запитать его от самой Raspberry pi, благо, на это есть порты на самой плате. После установки вентилятора температура не поднималась выше 31С, но хоть вентилятор и несильно шумящий, он создавал шум.
Т.к. малинка у меня находится рядом с спальным местом, было принято решение, что постоянно охлаждать процессор необязательно, а можно его включать по достижению какой-либо температуры.
Сразу возник вопрос о том, что нужно подключать датчик температуры, снимать с него показания, и в зависимости от его показаний, включать или выключать охлаждение. 
После небольших поисков в интернете оказалось, что температуру можно узнать и без датчика. Для этого в консоли вводим команду:

cat /sys/class/thermal/thermal_zone0/temp
или визуально более удобная:
vcgencmd measure_temp
Я решил написать небольшой скрипт на Bash, который проверяет температуру каждые 10 секунд, и если температура поднялась выше, чем задано в скрипте, будет включаться вентилятор, управляемый 4 GPIO портом на малинке.
Создадим скрипт temp.sh
touch temp.sh
с следующим содержанием:
#!/bin/bash
temp="40" # Устанавливаем какую хотим поддерживать температуру
while true; do
realtemp=`cat /sys/class/thermal/thermal_zone0/temp`
str2="${realtemp%???}"
if [ "$str2" -gt "$temp" ]
then
echo "1" > /sys/class/gpio/gpio4/value
else
echo "0" > /sys/class/gpio/gpio4/value
fi
sleep 10 # Устанавливаем как часто будем снимать показания температуры
done
Даем права на выполнение
chmod 774 /home/pi/temp.sh
Создадим скрипт инициализирующий порты GPIO при загрузке системы и запускающий скрипт temp.sh
touch gpio.sh
Содержание скрипта
#!/bin/sh
echo "4" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio4/direction
/home/pi/temp.sh &
Даем права на выполнение
chmod 774 /home/pi/gpio.sh
и добавляем в /etc/*rc.local
/home/pi/gpio.sh
имейте ввиду, что он должен быть добавлен до строки
exit 0
Далее приступим к подключению вентилятора к самой raspberry pi. Подключать вентилятор напрямую к порту GPIO 4 нельзя, во-первых, не достаточно напряжения; во-вторых, его можно просто сжечь под нагрузкой, поэтому лучше подключать через транзистор или через оптрон, что более безопасно. Ниже приведены две схемы включения.
В схеме 1 используется оптрон РС817 и резистор на 1 килоом. Выводы, обозначенные Ground, должны быть соединены вместе и подключены к соответствующему порту на плате.
На схеме 2 используется транзистор КТ315 или любой аналог, например,
2SC641, 2SC634, BFP722
Подключаем схему к raspberry pi  и перезагружаем ее. Теперь при достижении температуры 40С будет включаться вентилятор на 10 секунд. 
Копипаста отсюда

10 коментарів:

  1. Відповіді
    1. Извиняюсь я чайник. Просто интересно есть печатная плата ПЕЧАТНОЙ Платы MB-102 MB102. а нее можно будет оптрон или транзистор воткнуть и потом как кулер установить?

      Видалити
  2. не работает, пишет: sh: line 6: [cat /sys/class/thermal/thermal_zone0/temp: integer expression expected

    ВідповістиВидалити
  3. Не подскажите, а оптрон pc817 с какой маркировкой используется? pc817c подойдет?

    ВідповістиВидалити
    Відповіді
    1. Никакой не подойдет. Схема с оптроном работать не будет - через оптрон нельзя напрямую коммутировать кулер. Оптрон рассчитан на очень маленький ток и сгорит сразу после включения.

      Видалити
  4. Спасибо, работает. А можно сделать чтобы вентилятор включался при заданной температуре и охлаждался до заданной температуры?

    ВідповістиВидалити
    Відповіді
    1. temp_max="65" # Устанавливаем максимальную температуру
      temp_min="55" # Устанавливаем минимальную температуру
      while true; do
      realtemp=`cat /sys/class/thermal/thermal_zone0/temp`
      str2="${realtemp%???}"
      if [ "$str2" -gt "$temp_max" ]
      then
      echo "1" > /sys/class/gpio/gpio17/value
      if [ "$str2" -lt "$temp_min" ]
      echo "0" > /sys/class/gpio/gpio17/value
      fi
      sleep 10 # Устанавливаем как часто будем снимать показания температуры
      done

      Видалити
  5. День добрый. а можно приложить фото что из всего этого получилось. На основном фото не очень видно. спасибо

    ВідповістиВидалити