zzndb's world
All things will better soon...let's see...
树莓派温控风扇(GPIO&三极管)
一超简陋的三极管开关功能检验

让树莓派不算太吃灰的一小步:joy:


2018-10-01 16:44:05 星期一

  • 更新自启动及脚本v2

2018-09-29 22:32:01 星期六

  • 更新在openSUSE上的gpio操作及gpio文档

2018-09-25 22:56:21 星期二


缘由

前不久某宝购入的树莓派亚克力外壳给送了一个小风扇,给出的连接建议就是直接接在04和06pin那两个相邻的5VDC端和地端上,等于就是直接供电,感觉不太优雅´ ▽ ` )ノ,也会比较费电(还在找有什么能给会断电的宿舍放置的树莓派维持供电的简单方法,,目前正在测试充电宝,,,),所以决定得搞一搞这个风扇(到手树莓派鸽了这么久了终于开动了o<(=////▽////=)>o)。

准备

得到温度

考虑要温控首先得先知道它的温度,遂在Embedded Linux Wiki这里找到了树莓派获取温度的方法

To monitor the Raspberry Pi’s temperature, look at: /sys/class/thermal/thermal_zone0/temp

返回的是五位未格式化的温度值(如41231),同样通过这个vcgencmd measure_temp能得到格式化的温度值(如41.2'C)

实现开关

然后是得能控制风扇,经过实验直接将风扇接在GPIO上只能看到扇叶轻微转动然后停止,通过一番查找发现在树莓派官方GPIO文档里注明了警告<(ˉ▽ˉ;=)>

Warning: while connecting up simple components to the GPIO pins is perfectly safe, it’s important to be careful how you wire things up. LEDs should have resistors to limit the current passing through them. Do not use 5V for 3V3 components. Do not connect motors directly to the GPIO pins, instead use an H-bridge circuit or a motor controller board.

里面提到了用H桥和电机控制板,考虑到功能单一我还是用三极管来控制吧。顺便复习一下模电,大致的三极管开关电路,如下,利用一个NPN型三极管加上一个GPIO口的不同输出状态实现,只要IO口能提供电流即可使三极管导通 三极管开关控制电路

shell 操作GPIO

接下来就是如何控制GPIO口,树莓派官方GPIO文档里面关于 Programming with GPIO 的部分有Scratch,Python的文档,可是这俩我都不会,shell脚本还会一点,而且作为一个万物皆文件的Linux怎么可能不能直接操作呢?于是找到了这篇Blog,知道了大致直接操作GPIO的几个步骤。

在树莓派的/sys/class虚拟文件系统路径下有gpio的对应的设备模型文件夹1里面的目录树大致如下:

.
├── export
├── gpio3 -> ../../devices/platform/soc/3f200000.gpio/gpiochip0/gpio/gpio3
├── gpiochip0 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpiochip0
├── gpiochip128 -> ../../devices/gpiochip1/gpio/gpiochip128
└── unexport

3 directories, 2 files

具体gpio口链接文件夹下目录结构:

.
├── active_low
├── device -> ../../../gpiochip0
├── direction
├── edge
├── power
│   ├── autosuspend_delay_ms
│   ├── control
│   ├── runtime_active_time
│   ├── runtime_status
│   └── runtime_suspended_time
├── subsystem -> ../../../../../../../class/gpio
├── uevent
└── value

3 directories, 10 files

详细配置文档见Kernel里的GPIO文档

简单使用一个GPIO口步骤:

  • 启用numGPIO口:echo num /sys/class/gpio/export
    • export,unexport文件赋值即可启用或者禁用对应的GPIO
  • 设置I/Oecho inOrOut /sys/class/gpio/gpionum/direction
  • 设置电平:echo 1Or0 /sys/class/gpio/gpionum/value
    • 其中0为低电平,1为高电平

最后实现就是对应的shell脚本的编写,以及具体温度区间的选择,自启动等问题

实战

当前测试版本用到了下列器件:

  • RaspberryPi 3B+ x1
  • 随亚克力外壳附赠 5V~0.2A 风扇 x1
  • S8050 三极管 x1
  • 1k 电阻 x1
  • 面包板 x1
  • 各种杜邦线 xN

Shell 脚本

具体shell如下

#!/bin/bash
# version 0.2
# Mon Sep 24 13:54:09 UTC 2018
# use raspberrypi gpio3 and triode to control the fan
# run fan when temp above 50
# stop run when temp lower 38
ionum=461
initdir=/sys/class/gpio
#iodir=/sys/class/gpio/gpio3
iodir=/sys/class/gpio/gpio$ionum
temp=
# init GPIO
if [ -d $iodir ]; then
        echo out > $iodir/direction
else
        echo $ionum > $initdir/export
        echo out > $iodir/direction
fi

# get temp
function getTemp()
{
        temp=$(cat /sys/class/thermal/thermal_zone0/temp)
}

# on & off
function ON_OFF()
{
        if getTemp && (($temp > 50000)); then
                echo 1 > $iodir/value   # run fan

        elif getTemp && (($temp < 38000)); then
                echo 0 > $iodir/value   # stop fan
        fi
}

# main loop
while true; do
        ON_OFF
        sleep 5
done

在大蜥蜴上直接echo 3 > /sys/class/gpio/export貌似不行,显示write error: Invalid argument
大蜥蜴arm邮件列表发现问题解决方法
替换为/sys/class/gpio/目录的gpiochipxx的xx加上偏移量实现如:

# ls
export  gpiochip458  unexport
# echo 461 > ./export
# ls
export  gpio461  gpiochip458  unexport

所以改进版v2如上


然后是自启动: 在debian系(如raspbian)中,可以直接将脚本文件写入/etc/rc.local中,这也是树莓派官方文档提供的自启动方法

在大蜥蜴中貌似并没有这个文件,听说已弃用,那就写个systemd service``Fan.service来启动吧,如下

[Unit]
Description=Fan Boot service
[Service]
User=root
Group=root
ExecStart=/usr/local/config/Fanboot.sh
[Install]
WantedBy=multi-user.target

放在/usr/lib/systemd/system/中,执行systemctl enable Fan.service开启自启动systemd start Fan.service启动

实物图

实物图

Other

但是问题又来了,我怎么样才能在没有烙铁等高级操作工具的情况下将这个东西尽量放在亚克力外壳里面 <(= ̄_ ̄|||)>

研究研究。。。


  1. https://www.ibm.com/developerworks/cn/linux/l-cn-sysfs/index.html ↩︎


Last modified on 2018-09-25