OrangePi Plus 2의 발열문제는 심각하다고 알려져있기에...
Aliexpress 에서 애초에 OrangePi 를 주문할 때 같이 아크릴케이스+Fan을 주문했다.
(1.6GHz 이상에서 발열문제가 심각하다고 하여, ARMBIAN에서 1.2GHz정도로 CPU frequency를 제한해 놓아서 실제로 사용하는데 큰 문제가 되진 않는다.)
FAN GPIO에 연결하여 Air Cooling 을 해주고자 하는데,
문제는 FAN이 겁나 시끄럽다.
발열도 발열이지만 시끄러워서 못쓰겄다.
저항을 달아 FAN 소리를 조금 잡아주는 방법도 있겠지만(저항을 추가 하더라도, 소리는 여전히 신경이 쓰인다.),
보다 나은 방법으로 CPU 온도가 높을 때만 FAN 이 동작하도록 하고 싶다.
H3 chip의 GPIO를 사용하는 python library 가 있지만, 뭔가 동작이 잘 안된다 싶어 코드를 짰다.
본인이 사용하는 환경은, Ubuntu 16.04 기반의 ARMBIAN5.38, 커널버전 3.4.113-sun8i 이다.
사용 방법
- HW setting
OrangePi 의 GPIO 는 FAN 을 구동시키기에 충분한 전류를 흘려주지 못한다.(GPIO로 HIGH output을 주더라도 FAN이 돌아가지 않는다.)
따라서 전원은 5V와 GND 를 사용하면서, Control 은 릴레이를 사용하여야 한다.
사용하고자 하는 릴레이는 아래와 같다.
아두이노용 1 채널 릴레이 모듈을 검색하면 구매 할 수 있다.(알리 익스프레스 등에서)
가운데 네모난 부분이 릴레이 인데, 릴레이 스펙에 따라 컨트롤 가능한 전압 범위가 다르지만, 왠만하면 작은 FAN 동작을 제어하는데는 문제가 없다.
그림의 왼쪽 부분은 output으로, NO는 Normally Opened, COM은 Common port, NC는 Normally Closed를 뜻한다.
그림의 오른쪽 부분은 input 으로, VCC는 3.3V(OrangePI의 GPIO는 3.3V), GND는 gnd 핀에 연결하면 된다. SIG는 IN으로 적혀있기도 한데, control하는 signal 이다. SIG가 HIGH일 때는 COM 과 NO 가 연결되고, LOW일 때는 COM과 NC가 연결 된다. 따라서, IN은 Control할 핀인 PA13과 연결하고, COM은 5V, NO와 FAN의 빨간선, FAN의 검은선은 gnd로 연결해주면 된다. NC는 연결하지 않아도 된다.
아래와 같이 회로를 구성하면 된다.
<회로 사진>
참조: https://m.blog.naver.com/PostView.nhn?blogId=eduino&logNo=220884752484&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F
- 코드
우선, ARMBIAN 의 기본 Configuration은 GPIO를 꺼놓은 상태이므로, sunxi-tools를 활용해 GPIO를 enable 한다.
부팅 시, /boot/script.bin 파일을 읽어 Configuration을 확인하는데, sunxi-tools를 사용하면 script.bin 파일을 수정할 수 있다.
참조: http://linux-sunxi.org/GPIO
sunxi-tools에서 제공하는 bin2fex 를 이용해 binary 파일을 수정할 수 있게 fex 파일로 conversion 하고
fex 파일에서 GPIO 를 enable 시켜준 후
다시 sunxi 에서 제공하는 fex2bin 을 이용해 binary 파일로 conversion 해야 한다.
우선 bin2fex / fex2bin 을 사용하기 위해 linux-sunxi github 로 부터 sunxi-tools 소스를 fetch 한다. (사실 bin2fex, fex2bin 은 같은 파일이다.)
$ sudo apt-get update
$ sudo apt-get install libusb-1.0-0-dev
$ git clone https://github.com/linux-sunxi/sunxi-tools
fetch 한 sunxi-tools 소스를 make 한다.
보다 편리한 사용을 위해 path 를 설정한다.
/boot/script.bin 파일을 fex 로 conversion 한다.(/boot/script.bin 파일이 심볼릭링크로 /boot/bin/orangepiplus.bin 으로 연결되어 있으니 orangepiplus.bin 을 conversion 하면 된다.)
$ cd /boot/bin
$ sudo bin2fex orangepiplus.bin orangepiplus.fex
fex 파일을 열어 필요한 부분을 수정하면 된다.
이때, fex 가이드, Expansion port 정보, GPIO pinout 을 참고하자.
$ sudo vi orangepiplus.fex
orangepiplus.fex
...
[gpio_para]
gpio_used = 1
gpio_num = 1
gpio_pin_1 = port:PA13
...
수정이 끝나면, fex 파일을 다시 binary 파일로 conversion 해주자
$ sudo fex2bin orangepiplus.fex orangepiplus.bin
재부팅 하면 바뀐 설정이 적용되어 GPIO 를 사용할 수 있게 된다.
아래와 같이 모듈을 불러오면, /sys/class/gpio_sw 디렉토리가 생성되고, 해당 디렉토리에는 위의 fex에 포함한 GPIO포트가 생성된다.
$ sudo modprobe gpio-sunxi
해당하는 GPIO포트에 대해 data값을 write하게 되면 GPIO의 output(HIGH/LOW)이 바뀌게 된다.
$ echo 0 | sudo tee /sys/class/gpio_sw/PA13/data
초기 설정은 output / low_active 상태인 듯 하다. data 에 0을 써주면 output 으로 HIGH가 된다.
cfg 는 direction(input/output) 이라고 하는데(참조), 초기값이 0이다. output이 0인듯...
이제 모든 설정은 끝났으니,
cpu 온도에 따른 Fan control 만 해주면 된다.
cpu 온도는 아래와 같이 확인 할 수 있다.(파일에 주기적으로 쓰여진다.)
$ cat /sys/class/thermal/thermal_zone0/temp
그러므로 우리는 script 에서 주기적으로 온도가 써지는 파일을 읽어 그에 따라 Fan 을 On/Off 시켜주면 된다.
Fan_on_GPIO.sh
#!/bin/bash
if [ $EUID -ne 0 ]
then
echo "Pleas run as root"
exit
fi
TEMP_TRHES=70
modprobe gpio-sunxi
sleep 10s
while [ 1 ];
do
CUR_TEMP=`cat /sys/class/thermal/thermal_zone0/temp`
#echo $CUR_TEMP
if [ $CUR_TEMP -ge $TEMP_TRHES ]
then
#echo "Turn on FAN"
echo 0 | sudo tee /sys/class/gpio_sw/PA13/data > /dev/null
else
#echo "Turn off FAN"
echo 1 | sudo tee /sys/class/gpio_sw/PA13/data > /dev/null
fi
sleep 10s
done