前言
最近放在阳台的花草被啥东西给吃了,然后厨房挂在墙上的小虾米也不知道咋的被抓破吃光了(我怀疑是隔隔壁两条泰迪),所以打算做个简单的项目,教训一下偷吃贼。时间比较仓促,内容比较多,能力有比较有限,好好写是不可能好好写的,这辈子都不可能的好好写的,只能糊弄一下这样子。
【Figure 1. 远在天国的熊童子】
一、项目概览
DFRobot万物互联大赛第二轮的比赛更加开放,提供了多种不同的模块,就看每个人戴着脚铐跳舞,详细要求及介绍请看论坛帖子。
如前文所述,本项目起源自种的花草和小虾米被吃了,所以想要对植物进行自动浇水和对偷吃贼进行警戒两部分功能,microbit+Obloq负责浇水和告警驱离,树莓派配合摄像头负责拍照取证,相关传感器数据和偷吃贼的狼狈模样都可以在手机上或者网页上看到。
1.1 比赛限制
所提供的硬件列表如下:
- 模拟声音传感器
- 电容式土壤湿度传感器
- 红外热释电运动传感器
- 数字继电器模块
- 微型舵机
- 带功放喇叭模块,注意不是Buzzer
只准使用提供的传感器,相当于限制了感受器,好在效应器无限制,不过呢,Microbit Mate引出引脚有限,Analog+Digital总共只有6个引脚。编程环境限制为MakeCode,存在种种掣肘,不过也是为了公平起见。
存在问题:
- Obloq占用两个引脚
- Speaker是Analog不是Digital,标错
- 购买的舵机云台不合
官方提供模块的介绍及使用可以移步http://wiki.dfrobot.com
1.2 项目设想
我们设想两部分功能,根据microbit的特点,物尽其用。首先我们看看引脚分配,Mate板提供了3个模拟量引脚和3个数字量引脚,OBLOQ模块需要占用两个引脚(Rx-Tx),引脚2暂时还没确定,可以接高亮度LED或者震动器。
示意图如下:
F2. 注意方块指直接与Microbit相连的部分,左下角和右上角是系统最终的目标。想要用热释电阵列进行粗略定位,受限于microbit引脚数量,所以我们和舵机一起放在树莓派上。
- microbit + OBLOQ|对植物自动监测,必要时浇水遮阳,对入侵者告警驱离
- Raspberry Pi 3 + RPi Camera|入侵物种识别,取证上传
二、项目实现
以下分述各个部分的具体实现。(大标题下不加点废话看起来好难受,加了自己也好难受)
2.1 模块检测
开工之前先要测试一下各个模块,这里方便起见就用microPython for micro:bit的Read Eval Print Loop (REPL) 模式进行测试。
REPL gives you a command line that actually runs on your micro:bit. It can be
handy for trying out MicroPython commands on the micro:bit without having to go
to the trouble of writing an entire program.借助REPL,将在microbit上烧录一个“操作系统”固件,可以实时响应你的microPython命令,而不需要生成hex固件烧录,每次更改功能都需要重新烧录。
简述如下,下载安装Thonny,Tools->Manage Plugin-ins->thonny-microbit
,然后在Tools->Options->Interpreter
选择BBC microbit
即可。然后接入microbit,等待显示microbit connected之后点击烧入REPL。
测试的话就比较简单,分别模拟/数字读写各个引脚,例如:
from microbit import *
import music
display.show(Image.HAPPY)
music.play(music.NYAN)
pin0.read_analog()
pin8.write_digital(0)
诸此以上种种,更多用法参考官方BBC micro:bit MicroPython 手册。
感觉microPython代码占用的内存空间比较大,经常报内存分配错误。
2.1 植物监测灌溉系统
2.1.1 需要讨论的问题
-
自来水可以直接浇花吗?
一般来说答案是否,因为含有残氯,且pH为酸性。因为氯气易挥发,解决方法就是用个贮水装置在外面暴晒2-3h或者静置24h以上。
-
一天之中什么时候浇水合适?
- 从时间考虑,选择早晚阳光微弱、蒸发量少的时候,毕竟蒸发也会吸热
- 从季节考虑,夏季最好早晚浇水,春秋季则在上午九点和下午三点左右浇水为宜,冬天则在中午浇水为佳,不过具体大致保证气温和水温接近就好了,不用那么严苛。
-
植物生长适宜的温湿度和光亮度?
这个没查资料,应该不是主要影响因素。
-
如何尽量降低设备功耗?
-
水泵的摆放,如何避免克服重力做功?
-
借鉴新疆坎儿井,减少水浪费?
2.1.2 土壤传感器灵敏度和反应延时问题
参考wiki上的演示代码,有两种思路:
- 持续泵水,实时读取土壤湿度,到指定值停下来(官方代码采用)
- 断续短时泵水,复读土壤湿度,达到大致标准即可
两种方法主要受限于土壤湿度传感器的灵敏度和反应延时,比如多久可以感知湿度变化,最小时间间隔如何,我们看看该传感器的采用的元件,从土壤湿度传感器wiki可以下载到传感器的原理图,如下:
结构比较简单,稳压芯片非常重要,关系测量基准,定时器采用Texas Instruments TLC555CDR芯片,介绍及原理图点此下载,最后就是测量用的电容。因为本人小白,但是采用德州TI的芯片测量灵敏度和延时想必有保证,但最后还是需要时间测试一下才行。
2.1.3 硬件组装
使用前需要对土壤湿度传感器进行校准
2.1.4 程式代码
流程如下:
- 间隔12小时检测一次土壤湿度或者从RPi那里获取当前时间
- 如果湿度低于指定值,浇水
- (Optional) 读取当前温度和亮度,很高的话就不浇水,近似时间。
2.2 识别取证系统(RPi)
受限于microbit的IO数量和计算能力,将识别取证功能独立出来,树莓派和microbit之间进行通讯。
这里我们选择无线网络进行通讯,wireless增加了灵活性,同时bt有时候会跑飞。在RPi端的使用Python进行编程。
我们采用的摄像头可视角小于180°,所以设想将摄像头安装在云台上,由RPi识别出偷吃贼入侵的方向调转摄像头进行识别取证,我们这里采用PIR阵列进行定位。
2.2.1 基于红外热释电传感器的空间定位
相信很多人都看过连姆尼森的经典电影《飓风营救2》,里面就有通过投掷手雷听爆炸声时间差来判断地点的片段。另外,我们知道一个小常识来判断打雷的地方离自己有多远,就是看到闪电和听到雷声的时间差乘以340米进行估算。这里的原理类似,可是看时间差。
AM412 红外热释电传感器
普通的PIR模块具有两个可变电阻用以调节检测范围(阈值)和持续时间,我们拿到的DF模块是固定范围和时常的,比较遗憾。关于红外热释电模块的详细讲解可以看杜洋的视频课程工欲善其事 。
热释电效应
是指热释电晶体和压电陶瓷等在温度变化时产生临时电压的能力。温度变化引起这些材料在结构上出现电荷中心相对位移,极化程度发生变化,两端产生异号束缚电荷,导致在其两端产生一个电压信号。
DF的模块采用AM412传感器,可以从这里下载数据手册。需要注意:
检测人体以外的热源,或无热源温度变化及移动的情况下,可能无法进行检测。需要注意以下一般事项。请务必通过实际使用状态确认性能以及可靠性。
1)检测人体以外的热源时
(1)小动物进入检测范围时
(2)太阳光、汽车车头灯、白炽灯等的远红外线直射传感器时
(3)因冷温室设备的暖风、冷风和加湿器的水蒸气等而使检测范围的温度发生剧烈变
化时
2)难以检测热源时
(1)在传感器和检测物体之间有玻璃和丙烯基等难以透过远红外线的物质时
(2)检测范围内的热源几乎不动作,或高速移动时
另外还要注意该PIR传感器探测视角的问题,并不是前方180°:
菲涅尔透镜
菲涅尔透镜 (Fresnel lens) ,又名螺纹透镜,镜片表面一面为光面,另一面刻录了由小到大的同心圆,它的纹理是根据光的干涉及扰射以及相对灵敏度和接收角度要求来设计的。
左侧为普通透镜,右侧为菲涅尔透镜。
菲涅尔透镜作用有两个:一是聚焦作用,即将热释红外信号折射(反射)在PIR上,第二个作用是将探测区域内分为若干个明区和暗区,使进入探测区域的移动物体能以温度变化的形式在PIR上产生变化热释红外信号。
PIR模块采用具有热释电效应的感受器,将生物热红外信号转换为电信号。声音的传播速度是343.2 m/s,生物热红外信号属于红外线,是介于微波和可见光之间的电磁波,也就是约等于光速。
Kalman滤波算法
获取的信号中存在干扰,需要滤掉。【To-do】
硬件组装
- RPi Camera
- RPi 3b
- 红外热释电传感器
- 云台+舵机
云台用的DF的迷你2自由度云台,可是和舵机轮盘 不合。。。
2.2.2 基于计算机视觉的图像物种识别系统
使用Python + SimpleCV库在树莓派上实现,具体内容【Todo。。。】——楼主你咋又todo啊,不知道一般todo的都没下文了吗?
2.2.3 分步代码
a) RPi通知
-
通过无线mqtt激活microbit警告驱离系统
-
拍摄入侵者图片并上传至网络 | sm.ms API/bypy
-
通过微信通知我有入侵者|server酱/wxpy
import paho.mqtt.publish as publish
import requests
publish.single('topic', 'hello, world!', hostname='iot.dfrobot.com.cn',
client_id='cid',
auth= {'username':"username", 'password':"pwd"})
payload = {'text': '标题', 'desp': '内容,<64Kb,支持markdown'}
requests.get('https://sc.ftqq.com/[SCKEY(登入后可见)].send', params=payload)
详细我就不多讲了,雪球越滚越大,看看paho-mqtt的API手册,我这里单向和mb通讯,仅需要publish。
b) RPi 摄像头捕捉上传识别
拍照并上传到百度网盘,调用simpleCV进行识别,需要安装python3-picamera和bypy,参考我之前写的文章:
import picamera
from bypy import ByPy
bp=ByPy()
# camera.rotation = 180
camera.capture('image.jpg')
# 将当前目录同步至你的百度网盘/apps/bypy目录下
bp.syncup()
c) 定位转向抓拍
通过三个PIR模块将空间三等分(120°),云台将摄像头带向先捕捉到运动信号的PIR模块方向,然后抓拍。
2.2.4 综合代码
#!/usr/bin/env python3
"""
Detects invader and send alert to Wechat & microbit.
"""
__author__ = "pATAq"
__version__ = "0.1"
import paho.mqtt.publish as publish
import time, requests, picamera
import RPi.GPIO as gpio
from bypy import ByPy
gpio.setmode(gpio.BCM)
# 定义三个PIR模块引脚
gpio.setup(17, gpio.IN)
gpio.setup(27, gpio.IN)
gpio.setup(22, gpio.IN)
# 定义舵机引脚(with PWM support)
gpio.setup(12, gpio.OUT)
bp=ByPy()
current_state = 0
try:
while True:
time.sleep(0.1)
pir1 = gpio.input(17)
pir2 = gpio.input(27)
pir3 = gpio.input(22)
current_state = pir1 or pir2 or pir3
if current_state == 1:
# active microbit with 'cmd' channel, replace - with ur info
alert('-', '-', '-', '-', '-')
# 转向目标
if pir1 == 1:
pass
elif pir2 == 1:
pass
elif pir3 == 1:
pass
# SAY C-H-E-E-S-E!
camera.capture('image.jpg')
bp.syncup()
time.sleep(5)
except KeyboardInterrupt:
pass
finally:
gpio.cleanup()
def alert(topic, cid, usrname, pwd, SCKEY):
publish.single(topic, 'thief', hostname='iot.dfrobot.com.cn',
client_id=cid,
auth= {'username':usrname, 'password':pwd})
# single(topic, payload=None, qos=0, retain=False, hostname="localhost",
# port=1883, client_id="", keepalive=60, will=None, auth=None, tls=None,
# protocol=mqtt.MQTTv311, transport="tcp")
payload = {'text': '贼来了!', 'desp': ''}
requests.get('https://sc.ftqq.com/' +SCKEY+ '.send', params=payload)
云台部分参考文末链接,我的转盘不合没搞起来。。。
2.3 microbit警告驱离系统
比较简单,接收树莓派传来的告警信息,响起大喇叭,开启振动器(大号的绑个蛇效果更好),闪烁高亮LED:
这里新建一个Topic_1,用于接收控制命令。
3、总结
完整代码如下:https://makecode.microbit.org/_aaxU6JLY105L
我们选择12小时(43200000ms)检测一次。第一轮使用过的功能如利用led矩阵和手机端功能都没复述,实际上想实现比较简单。其他一些功能受限于个人原因,暂时没实现/没加入,以后会进一步完善。
进一步扩充:
- 使用额外的RTC模块附加到microbit或者RPi上,进行更精确的定时科学浇花
- 增加读取内置亮度、温度传感器,增加一个遮阳板用舵机控制开合
- 开发手机端功能,比如Blnky或支持mqtt的HOME Assistant
- 待补充
参考
-
farmMinder | hackster.io
-
Crop Defender | hackster.io
-
黄鑫. 热释电红外无线传感器网络人体定位系统设计与实现[D]. 中山大学, 2009.
-
李博雅, 李方敏, 刘新华,等. 基于P IR Sensor的单目标跟踪系统的设计与实现[J]. 传感技术学报, 2014(9):1214-1220.
-
文科. 基于PIR探测器的人与非人识别方法研究[D]. 重庆大学, 2013.
-
臧会巧. 盆栽花卉浇水应注意的几个问题[J]. 河北林业科技, 2007(1):52-52.
-
姚遥. 盆栽花卉浇水的原则及方法[J]. 现代种业, 2007(4):37-37.