라즈베리파이4를 중고로 영입했는데, 케이스와 냉각팬을 같이 주셨네요.
원래는 생각이 없었다가 꽁짜로 생겼으니 일단 달아보았는데요.
냉각팬이 생각보다 소음이 크더라구요.
온도가 높을 때만 잠깐씩 돌아주면 좋겠다 싶어, CPU 온도에 따라 냉각팬을 껐다 켰다 하도록 만들어보았습니다.
nodejs 기반입니다.
우선 CPU 온도를 가져올 수 있는지 찾아봤습니다.
아래와 같이 간단한 쉘 스크립트를 만들고,
#!/bin/sh
temp=$(cat /sys/class/thermal/thermal_zone0/temp)
temp2=$(($temp/1000))
echo $temp2
실행하면,
$ ./chk_temp.sh
51
현재 CPU 온도는 51도네요.
그 다음으로 필요한 건,
nodejs를 통해 온도를 받아올 수 있어야 하고,
이 온도를 기준으로 냉각팬을 제어해야 합니다.
그리고 냉각팬에 전원을 넣고빼고 하려면, 트랜지스터 1개와 저항 1개가 필요합니다.
간단히 구성도를 그려보자면,
대략 이렇습니다.
27R은 저항값이고, NPN은 트랜지스터 타입입니다.
GPIO, 5V, GND는 아래와 같이 각각 연결했습니다.
그리고 nodejs 코딩
async function get_temp() {
setTimeout(get_temp, 10000);
try {
const temp = await exe_shell("cat /sys/class/thermal/thermal_zone0/temp");
if(temp/1000 > 55){
fan.writeSync(1);
}
else{
fan.writeSync(0);
}
i("cpu temperture", temp/1000, fan.readSync());
}catch(error) {
e(error.toString());
}
}
메인 로직입니다.
10초에 한번씩 온도를 얻어와서 55도가 넘었으면 GPIO에 신호를 줘서 팬을 돌리고,
55도가 안넘었으면 팬을 멈춥니다.
실행시키고 로그를 확인해봅니다.
{"level":"info","message":{"contents":[["cpu temperture",53.556,0]],"timestamp":"2022-07-29 15:52:52"}}
{"level":"info","message":{"contents":[["cpu temperture",53.069,0]],"timestamp":"2022-07-29 15:53:02"}}
{"level":"info","message":{"contents":[["cpu temperture",54.53,0]],"timestamp":"2022-07-29 15:53:12"}}
{"level":"info","message":{"contents":[["cpu temperture",55.504,1]],"timestamp":"2022-07-29 15:53:22"}}
{"level":"info","message":{"contents":[["cpu temperture",55.991,1]],"timestamp":"2022-07-29 15:53:32"}}
{"level":"info","message":{"contents":[["cpu temperture",53.069,0]],"timestamp":"2022-07-29 15:53:42"}}
{"level":"info","message":{"contents":[["cpu temperture",55.017,1]],"timestamp":"2022-07-29 15:53:52"}}
{"level":"info","message":{"contents":[["cpu temperture",54.043,0]],"timestamp":"2022-07-29 15:54:02"}}
{"level":"info","message":{"contents":[["cpu temperture",54.043,0]],"timestamp":"2022-07-29 15:54:12"}}
{"level":"info","message":{"contents":[["cpu temperture",54.043,0]],"timestamp":"2022-07-29 15:54:22"}}
{"level":"info","message":{"contents":[["cpu temperture",55.017,1]],"timestamp":"2022-07-29 15:54:32"}}
{"level":"info","message":{"contents":[["cpu temperture",55.017,1]],"timestamp":"2022-07-29 15:54:42"}}
{"level":"info","message":{"contents":[["cpu temperture",53.556,0]],"timestamp":"2022-07-29 15:54:52"}}
잘 동작합니다.
다만 55도 사이를 너무 빈번히 왔다갔다해서 알고리즘 보완은 필요해보입니다.
온도가 높으면 그냥 1분은 돌리고, 낮으면 10초간격 체크 정도면 되겠네요.
회로는 빵판에 납땜해서 정리를 좀 하고,
코딩한 건 상시 돌아가도록 서비스 등록해주면 될 것 같습니다.
서비스 등록은 지금까지 nodejs의 forever 라는 서비스를 사용했는데,
얼마전에 쿠버네티스를 셋팅했으니, daemonset으로 동작을 시켜봐야 겠습니다.
풀 소스는 git에 올려두었습니다.
https://github.com/becans/raspberry_fan_controller.git
'Raspberry pi' 카테고리의 다른 글
라즈베리파이4 라즈비안 64bit 쿠버네티스 설치 실패 (0) | 2022.08.02 |
---|---|
라즈베리파이 쿨링팬 제어 nodejs 도커로 실행하기 :GPIO 접근권한 (0) | 2022.07.31 |
라즈베리파이 4 라즈비안 64bit 설치 : SSH 최초 접속 : 스펙 확인 (0) | 2022.07.27 |
공공데이터포털 nodejs로 일출 일몰 시간 가져오기 (0) | 2022.03.17 |
AlexaPi - Bluetooth Speaker 연결하기 2 (2) | 2018.01.15 |