“就像动听的声音……”,或者我们基于微控制器(Canny或Arduino)和Raspberry PI制作一个简单的安全系统

在编写有关使用TensorFlow和OpenCV识别微控制器的文章的过程中,Craftduino,Canny 3 tiny和Raspberry PI同时引起了我的注意,此后,我决定将它们再次合并在一篇文章中是很不错的。我想了很长时间,然后才感到羞愧,我想起自己是一个健康的叔叔,而且我还从未通过UART连接过任何东西。我想:“生活中的一切都需要尝试。”但是只写关于连接UART的书很无聊,因此立即订购了各种“玩具”,其中包括全新的Arduino和几个传感器。

因此,今天我们将为我最喜欢的笔建立一个安全系统。你惊讶为什么要一支笔?秘密很简单,我在各种电子产品领域都经验不足,因此,当我订购压力传感器时,我认为它可以在整个区域使用,但事实证明,它仅适用于特定的接触区域。奇怪的是,除了这支钢笔,整个房子里没有什么东西足够重,稳定和合适的大小。好吧,除了我的手指,但我还没有准备好尝试它

在本文中,我将分享将压力传感器和多普勒运动传感器连接到微控制器的经验。我们将通过有线UART接口将控制器连接到GPIO Raspberry PI3。然后,我们将使用Python编写一个简单程序来显示安全系统的状态,最后,我们将使用VNC将智能手机连接到“树莓”,以在距计算机一定距离处监视安全系统。

想要让印第安纳·琼斯失业吗?那么,您将受到猫的欢迎。



与往常一样,在一开始,我将向您解释我自己对DIY电子产品问题还是陌生的,并且正在逐篇学习。因此,不要以为我将写成最终真理。当然,一切都可以做得更好。

这就是我们今天要谈论的内容:

第一部分:简介
第二部分:连接Canny 3 tiny
的电路和程序第三部分:连接Arduino Uno的电路和程序
第四部分:Raspberry PI和Python中的监视程序
第五部分:结论

第一部分:简介


细心的读者可能会问:“如果以前提到过CraftDuino,为什么为什么要买Arduino?”,一切都很普通。CraftDuino再次破裂。一旦德祖格里克我修好了它,现在它变成了“自我孤立”,我不想无所事事地打扰一个人。

因此,我们顺利地接近了物质基础。对于本文,我使用了:

  1. 压力电阻FSR402:


  2. 多普勒运动传感器RCWL-0516:


    在我在现场说明中购买的两个传感器的商店中,都写着它们是用于Arduino的,但实际上,事实证明不需要任何特殊的库,并且在Canny上一切都开始没有问题。
  3. 单片机Arduino Uno:


  4. Canny 3 Tiny微控制器-带有端子块和电缆线束的版本:


  5. Raspberry PI 3 Model B单板计算机:

  6. 其他:Breboard面包板,鳄鱼线和夹子,Raspberry电源适配器

让我们转到工作上。

第二部分:为Canny 3 tiny连接电路和程序


互联网上有许多如何通过UART连接Arduino的示例,关于Canny的示例则少得多,所以让我们开始吧。
为了不膨胀文章的长度,而不是重复自己,我要提醒你,我认为最基本的问题,如何与坎尼和CannyLab发展环境工作在这篇文章中,和传感器连接到模拟数字转换器(ADC)的例子以及经由虚拟COM消息端口,我在这篇文章中做了介绍

对于那些不读此书,但立即尝试将传感器连接到ADC的人来说,有一个重要的意义。不要重复我的错误,为使5号和6号控制器的输出在ADC模式下工作,有必要设置跳线,如下图所示。即使做到了,这也不难。


控制器输出端的另一个重要点是电源电压,也就是说,如果您使用外部电源而不是USB连接,请确保输出电压不超过传感器和UART的允许电压。

对于本文而言,一个跳线对我们来说已经足够了,但是如果我们有烙铁,为什么还要在琐事上浪费时间?

请注意接线端子,此版本控制器的标准电缆线束为标准电缆束,如果在车内使用,则很难使用,可能很方便,但不能用于台式实验。我想出了专门技术,用通常与计算机设备捆绑在一起的线束代替了本地线束,或者在出售DIY电子产品的商店中出售,事实证明这非常方便。它们在块体中的位置不会很糟,柔软,同时又增加了长度。

让我们继续进行连接图:


一切都很简单,不需要任何特殊技能,我想几乎任何人都可以处理。

首先,让我们处理一下董事会的力量。我们将从控制器的“-”输出中获取“接地”,但是加上加号,一切都不那么清楚。乍一看,连接到“ +”端子似乎合乎逻辑,但实际上,它显然是+ 5V INPUT的端子。因此,代替它,我们将其中一个输出配置为+ 5V输出,为其提供逻辑单元并将其拉至“ +”。我决定从3号出口离开。

压力传感器的连接非常简单。实际上,这是一个电阻。我们给它的一个“分支”供电,然后从第二个“分支”将导线缠绕到连接到ADC的控制器输入端(5号或6号)。我选择了6号。

顺便说一句,我两次丢失了压力传感器。我的第二个错误是连接传感器。它不适合面包板,事实证明必须将其连接到螺钉接线端子或类似的端子上。我不得不走出“鳄鱼”的行列。

运动传感器的连接并不复杂,我们将来自开发板的+ 5V电压输入Vin插孔,将其连接至面包板上的GND插孔,然后将OUT插孔连接至控制器的任何数字输入,我将其连接至输出5(我们不会将其切换到ADC模式)。

仍然可以通过UART将控制器连接到“ Raspberry”。为此,必须将2号控制器输出(在我们的UART模式下变为TX输出)连接到Raspberry GPIO RX输入,并且还必须连接板上的接地和Raspberry PI GPIO GND。

许多人建议将电压电平调整为3.3 V,我什至尝试通过分压器连接Canny,但与之相比,使用它的效果要好于没有分压器(或根本不起作用),因此在这种情况下,我直接连接了Raspberry UART。似乎什么都没有耗尽。一切正常。


也许您有这样的想法:“为什么要通过蓝牙将其连接至UART,如果可能的话?” 确实,有许多通过UART将Arduino连接到网络上的HC-06模块的示例。如果您相信该论坛,那么Canny也会毫无问题地连接到论坛但是我自己还没有尝试过。我想使用电线进行连接,因此我决定将蓝牙连接推迟到下一次。

这是电路的样子:


让我们继续进行控制器的程序(图):


“参数设置”,我们把对ADC模式信道(输入)第6号,传送通道号3至离散输出模式和进料在一个逻辑单元(+ 5V在我们的情况下),几乎所有的分析在本文中

只有UART设置是我们不熟悉的。幸运的是,一切都很简单。Canny 3 tiny只有1个UART接口(例如,Canny 7有两个)。激活UART模式后,输出1变为RX,输出2变为TX。我们将选择常规的9600波特率,但是数据传输模式受到限制。可用的数据位只有8个字节和1个停止位(对于“较旧”的控制器型号有更多选择)要启用UART,必须在相应的寄存器中输入UART1配置寄存器 写一个预定义的常量:


实际上,在我们的情况下,可以选择一个仅包含UART传输模式的常量,因为我们不打算收回任何东西。但是我决定展示一个更一般的例子。

如果在创建图表时选择了正确的控制器,则CannyLab将不允许您选择不适合他的常数。因此,选择已知为危险的模式不起作用。事实总是有机会手动输入一个常数,但最好不要这样做。

我们将在邮件中发送10个字符(包括2个问题),因此我们将在邮件寄存器中写入一个等于10的常量。

我不确定将1个TX提升为1,但以防万一我打开了这个项目(据我了解),我需要它不要用电阻拧紧。

在块中“通过UART和VCP定期发送”
我们使用PWM发生器在2秒内发送1次,这样控制器就不会通过不断发送消息而阻塞通道一秒钟,我们使用了“跟踪边缘检测器”。在从零切换到零的那一刻仅工作一次,如果控制器此时准备通过UART发送消息,则逻辑乘法模块的输入将分别有两个单位,也为“ 1”,这将命令控制器通过UART发送消息。 ,以防在USB-COM端口中进行调试(我在上一篇文章中对此进行了详细介绍)。

“显示”块中一切都非常简单,如果压力传感器的值小于某个阈值并且运动传感器已触发(输出将给出``1''),那么我们将打开控制器的绿色LED作为警报信号。

如果该系统像电影中那样工作,那就太酷了:



但是我们将仅限于打开LED。

这是一个视觉演示:


最后一块“消息形成”仍然存在

我们从ADC接收数据,ADC分辨率为0到1023。我们向UART发送字符,这意味着必须将压力传感器的读数转换为字符串。由于最大数量为1023(4位数字),因此我们需要4个字节。 “数字到字符串转换器”在输出处输出几个字符,我们将有两对字符,每对我们将向安装寄存器发送UART和VCP消息。接下来,我们需要编写一个分隔符,以使读数不会合并,因为CannyLab使用了两个字符,所以我们将两个“空格”字符用作分隔符。类似地,我们转换运动传感器的读数,给出离散的00或01,这意味着我们只需要一对字符。在消息的最后,输入回车符和换行符。

正如我已经在有关光敏电阻的文章中所写的那样,Canny没有自己的COM端口监视器,但是您可以使用任何第三方端口,并且由于稍后我们将使用Arduino IDE,因此我们将使用内置的COM端口监视器。

因此,我将手指放在压力传感器上并沿以下方向移动:



该图和下面的完整代码一样,可以从GitHub下载

现在让我们继续到Arduino。


第三部分:Arduino Uno的接线图和程序


我不会详细讨论Arduino,因为一切都很微不足道。

接线图:



注意!由于Arduino RX / TX输出工作在5V,并且Raspberry PI具有3.3V,因此人们建议使用特殊模块或至少使用分压器将Arduino连接到Raspberry UART。我没有特殊的模块,但总欢迎使用分压器。我拿了3个标称值为1000欧姆的电阻。然后他在第二个电阻器之后抽头,其上的2/3电压将下降。如果您通过USB将电源关闭到5 V,那么结果就是 5*0.66=3.3

虽然我也将Arduino直接连接到UART Raspberry PI,但一切似乎都可以正常工作。

我们将压力传感器连接到“ +”和模拟输入“ A1”。用于5号电源和数字输入的运动传感器。

这是组装电路时的样子:



这是Ardino的草图代码: 该代码很简单,唯一值得说明的是“ adjustment”变量。事实是,当连接到Arduino时,压力传感器有时甚至会显示无零值,即使没有负载,我也没有想到比减去``噪声''的平均值来使Canny读数统一更好的方法了。 另外,与前面的情况一样,在传感器正常工作的情况下,我们使用内置LED来实现显示器的功能:

byte photoPin = A0;

void setup() {
Serial.begin(9600);
pinMode(photoPin, INPUT);
pinMode(5, INPUT);
pinMode(13, OUTPUT);
}

void loop() {
int adjustment = 250;
int pressure_sensor = analogRead(A1) - adjustment;
int motion_sensor = digitalRead(5);

Serial.print(pressure_sensor);
Serial.print(" ");
Serial.println(motion_sensor);
if ((pressure_sensor<380) && (motion_sensor==1))
{
digitalWrite(LED_BUILTIN, HIGH);
}
else {
digitalWrite(LED_BUILTIN, LOW);
}
delay(1000);
}









第四部分:Raspberry PI和Python中的监视程序


首先,您需要启用UART以及SSH和VNC,然后使用智能手机连接到Raspberry。

转到Raspberry PI设置并启用SSH,VNC,UART,如图所示:



以防万一,我关闭了蓝牙。

我们将编写一个简单的Python程序,我使用了内置IDE,并且未安装任何其他Python模块。我有一个带有桌面映像的Raspbian,中等大小,大约需要1.1 GB。

在我们的监视程序中,我们将同时使用控制台和图形界面来显示信息。为了实现GUI,我决定使用Tkinter。我确实有生以来第二次使用它,但是我只需要几个文本字段和一个对话框。

这是程序代码:

import serial
import time
from tkinter import *
from tkinter import ttk
from tkinter import messagebox

serialport = serial.Serial("/dev/ttyS0", baudrate=9600, timeout=1.0) 

window = Tk()  
window.title("Security system for my pen")  
window.geometry('400x170')
#Presure sensor label
lbl_ps = ttk.Label(window, text="Pressure sensor", font=("Arial Bold", 20))
lbl_ps.grid(column=0, row=0)
lbl_ps_status = ttk.Label(window, text=" ",  font=("Arial Bold", 20))
lbl_ps_status.grid(column=1, row=0)
#Motion sensor label
lbl_ms = ttk.Label(window, text="Motion sensor", font=("Arial Bold", 20))
lbl_ms.grid(column=0, row=1)
lbl_ms_status = ttk.Label(window, text=" ", font=("Arial Bold", 20))
lbl_ms_status.grid(column=1, row=1)

while True:
   counter = 0
   rcv = serialport.readline().decode('utf-8').replace("\r\n","").split('  ')
   if (len(rcv)==2):
       ps=rcv[0]
       ms=rcv[1]
       print (ps+ " " +ms)
       if (int(ps)<380):
           lbl_ps_status.config(text = " Warning!")
           counter += 1
       else:
           lbl_ps_status.config(text = " Ok")

       if (int(ms)>0):
           lbl_ms_status['text']=" Warning!"
           counter += 1
       else:
           lbl_ms_status['text']=" Ok"  
       window.update_idletasks()  
       window.update()
       if (counter == 2):
            messagebox.showinfo("Alarm!", "heck your pen!")     
       time.sleep(1)


我可能会跳过库的导入。

导入后,我们设置UART,端口本身,速度和超时的设置。

serialport = serial.Serial("/dev/ttyS0", baudrate=9600, timeout=1.0) 


接下来,我们将文本字段(标签)放置在表格布局上(在网格上)。
我们将有4个字段,其中2个未更改,传感器的状态将显示在其他两个字段中。

window.title("Security system for my pen")  
window.geometry('400x170')
#Presure sensor label
lbl_ps = ttk.Label(window, text="Pressure sensor", font=("Arial Bold", 20))
lbl_ps.grid(column=0, row=0)
lbl_ps_status = ttk.Label(window, text=" ",  font=("Arial Bold", 20))
lbl_ps_status.grid(column=1, row=0)
#Motion sensor label
lbl_ms = ttk.Label(window, text="Motion sensor", font=("Arial Bold", 20))
lbl_ms.grid(column=0, row=1)
lbl_ms_status = ttk.Label(window, text=" ", font=("Arial Bold", 20))
lbl_ms_status.grid(column=1, row=1)


接下来,创建一个无限循环。
在周期开始时,我们将重置警报标签 counter
然后从串行端口读取数据。
为了不查看“ \ x00”之类的所有条目,我们将消息重新编码为UTF-8。
然后,我们删除行的开头和结尾,以便仅保留数字。
接下来,我们将这一行分开,注意分隔符为2个空格,而不是1个空格。
这样,在消息不正确时程序不会崩溃,与接收消息相关的其他代码将挤入一个条件结构中,该条件结构仅在消息可分为2部分时才有效。
好吧,在控制台中显示压力传感器和运动传感器。

while True:
   counter = 0
   rcv = serialport.readline().decode('utf-8').replace("\r\n","").split('  ')
   if (len(rcv)==2):
       ps=rcv[0]
       ms=rcv[1]
       print (ps+ " " +ms)


检查传感器是否正常工作,如果一切正常,系统将写“ OK”,如果其中一个传感器正常工作,则计数器加1并发出警告。


       if (int(ps)<380):
           lbl_ps_status.config(text = " Warning!")
           counter += 1
       else:
           lbl_ps_status.config(text = " Ok")

       if (int(ms)>0):
           lbl_ms_status['text']=" Warning!"
           counter += 1
       else:
           lbl_ms_status['text']=" Ok"  


在最后一个块中,我们更新Tkinter表单的元素,然后检查有多少个传感器工作。如果两个传感器都已在循环中工作,则会出现一个模态窗口,并显示一条警报消息。


       window.update_idletasks()  
       window.update()
       if (counter == 2):
            messagebox.showinfo("Alarm!", "heck your pen!")     
       time.sleep(1)


重要的是在此处注意,运动传感器从检测到运动的那一刻起,将输出“ 1”保持两秒钟。因此,通常情况下,系统可以正常工作。

以下是显示程序运行情况的屏幕截图:

所有传感器都保持稳定:



工作的两件事之一:



两者都起作用,系统等待操作员确认:



似乎一切都按计划进行。


结论


总之,请考虑从智能手机连接到Raspberry PI。原则上,没有什么复杂的,如果您可以通过计算机进行连接,则可以通过电话进行连接。您只需要知道Raspberry IP,用户名和密码即可。我在Android智能手机上安装了VNC Viewer,但是您当然可以拥有另一个客户端。

使用起来不太方便,但是可以使用:


让我再次提醒您,所有代码都可以从GitHub下载

每次我向自己保证不会写很长的文章时,草稿都超过了10页。本文展示了一个易于实施的自制安全系统示例,其想象力范围很大。

如果我了解这篇文章对您很有趣,那么稍后我将概述另一篇有关通过蓝牙适配器进行连接的文章。

UPD:
似乎我收到了一些文章,因此为方便起见,我将保留指向其他相关文章的链接:


  1. “一,二,三-烧圣诞树!” 或我首先看一下CANNY 3微型控制器
  2. “目的地有很多伪装……”,或者我们使用CANNY 3 tiny和光敏电阻自动控制自动灯
  3. “什么码头?” 或者我们使用Xamarin(Android)上的移动应用程序通过蓝牙控制控制器

All Articles