香橙派 Zero3 增加风扇控制
给 Orange Pi Zero3 买了个 3D 打印外壳,有预留风扇位置。虽然发热量十分的低,但空着太怪了,还是安个风扇吧。
怕风扇一直转坏的太快,打算使用最简单的 GPIO 加三极管作开关的方法,结合 CPU 温度做启停控制。
硬件
所需硬件
- 3007 DC 5V/3.3V 散热风扇(3007 指大小为 30x30x7mm)。
- SS8050 直插 TO-92 NPN 晶体管(三极管)。
- 杜邦线若干(2 根公对母,2 根母对母)。
连接方法
- 风扇正极接 5V/3.3V,负极接三极管集电极 C。
- 三极管发射极 E 接地,基极 B 接一个 GPIO。
注意:SS8050 标识面向自己,管脚朝下,从左往右为:发射极 E、基极 B、集电极 C。
┌────────┐ ┌─────┐
│ SS8050 │ │ │
│ D331 │ │ fan │
└─┬──┬─┬─┘ └─┬─┬─┘
E│ B│ │C -│ │+
│ │ └──────┘ │
│ └─┐ │
┌┬┴──┬┬┴───┬┬───┴┬┐
││GND││GPIO││3.3V││
│└───┘└────┘└────┘│
│ Orange Pi Zero3│
└─────────────────┘
这图等距字体才能对齐,网页上应该很抽象吧。
软件
GPIO 映射一览
$ gpio readall
+------+-----+----------+--------+---+ H616 +---+--------+----------+-----+------+
| GPIO | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | GPIO |
+------+-----+----------+--------+---+----++----+---+--------+----------+-----+------+
| | | 3.3V | | | 1 || 2 | | | 5V | | |
| 229 | 0 | SDA.3 | OFF | 0 | 3 || 4 | | | 5V | | |
| 228 | 1 | SCL.3 | OFF | 0 | 5 || 6 | | | GND | | |
| 73 | 2 | PC9 | OFF | 0 | 7 || 8 | 0 | OFF | TXD.5 | 3 | 226 |
| | | GND | | | 9 || 10 | 0 | OFF | RXD.5 | 4 | 227 |
| 70 | 5 | PC6 | ALT5 | 0 | 11 || 12 | 0 | OFF | PC11 | 6 | 75 |
| 69 | 7 | PC5 | ALT5 | 0 | 13 || 14 | | | GND | | |
| 72 | 8 | PC8 | OFF | 0 | 15 || 16 | 0 | OFF | PC15 | 9 | 79 |
| | | 3.3V | | | 17 || 18 | 0 | OFF | PC14 | 10 | 78 |
| 231 | 11 | MOSI.1 | OFF | 0 | 19 || 20 | | | GND | | |
| 232 | 12 | MISO.1 | OFF | 0 | 21 || 22 | 0 | OFF | PC7 | 13 | 71 |
| 230 | 14 | SCLK.1 | OFF | 0 | 23 || 24 | 0 | OFF | CE.1 | 15 | 233 |
| | | GND | | | 25 || 26 | 0 | OFF | PC10 | 16 | 74 |
| 65 | 17 | PC1 | OFF | 0 | 27 || 28 | 0 | ALT2 | PWM3 | 21 | 224 |
| 272 | 18 | PI16 | ALT2 | 0 | 29 || 30 | 0 | ALT2 | PWM4 | 22 | 225 |
| 262 | 19 | PI6 | OFF | 0 | 31 || 32 | | | | | |
| 234 | 20 | PH10 | ALT3 | 0 | 33 || 34 | | | | | |
+------+-----+----------+--------+---+----++----+---+--------+----------+-----+------+
| GPIO | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | GPIO |
+------+-----+----------+--------+---+ H616 +---+--------+----------+-----+------+
其中 1 到 26 号引脚与开发板上的 26pin 引脚是一一对应的,26pin 接口中总共有 17 个 GPIO 口,所有 GPIO 口的电压都是 3.3V。
27 号引脚对应开发板上 13pin 的 10 号引脚,29 号引脚对应开发板上 13pin 的 11 号引脚,31 号引脚对应开发板上 13pin 的 12 号引脚,33 号引脚对应开发板上 13pin 的 13 号引脚。
28、30、32、34 号引脚为空,请直接忽略。
控制风扇脚本
这里接的 GPIO 物理引脚是 18,对应 wPi 是 10,ctrl-fan.sh:
#!/bin/sh
sleep 60 # 立刻执行 gpio 命令, 好像会导致死机
wpi_pins="10" # 万一以后要同时控制多个 gpio 呢
temp_limite=50000 # 温度是摄氏度乘以 1000
# 将 gpio 设置为 out 模式
for wpi_pin in ${wpi_pins}; do
gpio mode ${wpi_pin} out
echo "[$(date)] [info ] set gpio mode out, wpi_pin = [${wpi_pin}]."
done
# 对 Orange Pi Zero3 Linux 6.1 而言是这个文件, 0-gpu 1-ve 2-cpu 3-ddr
temp_type=$(cat /sys/class/thermal/thermal_zone2/type)
while true; do
temp_val=$(cat /sys/class/thermal/thermal_zone2/temp)
echo "[$(date)] [info ] temp_type = [${temp_type}], temp_limite = [${temp_limite}], temp_val = [${temp_val}]."
# 比较大小, 设置 gpio 电平
for wpi_pin in ${wpi_pins}; do
if [ ${temp_val} -gt ${temp_limite} ]; then
gpio write ${wpi_pin} 1
else
gpio write ${wpi_pin} 0
fi
done
sleep 60 # 检测间隔 60s
done
systemd 脚本
ctrl-fan.service:
[Unit]
Description=Control Fan Service
[Service]
ExecStart=/workspace/shell/ctrl-fan.sh
Restart=always
User=root
[Install]
WantedBy=multi-user.target