香橙派 Zero3 增加风扇控制

jc39
jc39
发布于 2026-02-16 / 6 阅读
0
0

香橙派 Zero3 增加风扇控制

Orange Pi Zero3 买了个 3D 打印外壳,有预留风扇位置。虽然发热量十分的低,但空着太怪了,还是安个风扇吧。

怕风扇一直转坏的太快,打算使用最简单的 GPIO 加三极管作开关的方法,结合 CPU 温度做启停控制。

硬件

所需硬件

  1. 3007 DC 5V/3.3V 散热风扇(3007 指大小为 30x30x7mm)。
  2. SS8050 直插 TO-92 NPN 晶体管(三极管)。
  3. 杜邦线若干(2 根公对母,2 根母对母)。

连接方法

  1. 风扇正极接 5V/3.3V,负极接三极管集电极 C。
  2. 三极管发射极 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

评论