让树莓派不算太吃灰的一小步: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
口步骤:
- 启用
num
号GPIO
口:echo num /sys/class/gpio/export
- 对
export,unexport
文件赋值即可启用或者禁用对应的GPIO
口
- 对
- 设置
I/O
:echo 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
但是问题又来了,我怎么样才能在没有烙铁等高级操作工具的情况下将这个东西尽量放在亚克力外壳里面 <(= ̄_ ̄|||)>
研究研究。。。
Last modified on 2018-09-25