Pssst – want some high tech protection for your home office, or a secret lock for your “workshop” (ok, you got me, it’s actually a dungeon/gaming room) that the kids won’t be able to figure out? We’ve got you covered. Let’s build a DIY smart lock that automatically detects when you’re there, and locks when you’re not.
它如何工作?没人知道!更确切地说,是蓝牙。
概念
您的智能手机是一款功能强大的设备,可以不断向外界显示有关自身的信息;蓝牙的一种实现方式。
在发现模式下,它会广播一个唯一的标识号-但是即使没有明确允许自己被发现,知道该地址的任何人都可以尝试对其进行ping操作。如果听到响应,则表明它是否在范围内。
我们将设置具有蓝牙适配器的Raspberry Pi,以便在智能手机超出范围时不断监视,然后继电器就会动作并锁定门。
您将需要
使用蓝牙
蓝牙是该项目的核心,所以让我们首先安装一些蓝牙支持并测试我们的适配器。您可以直接在Pi上执行此操作,也可以在远程SSH中执行此操作(如何将Windows设置为通过SSH进入您的Pi)。
sudo apt-get install bluez python-bluez
如果尚未插入加密狗,请看一下
hcitool dev
如果输出中列出了某些内容,那就很好了。接下来,我们将使用Python脚本来轮询附近的蓝牙设备,并获取唯一的设备地址。我们只需为每个设备执行一次此操作。
wget https://raw.githubusercontent.com/karulis/pybluez/master/examples/simple/inquiry.pypython inquiry.py
如果看到“找到了0个设备",则说明您没有兼容的USB蓝牙加密狗,或者找不到智能手机。不过请不要失望:我发现我实际上必须打开iPhone上的Bluetooth设置页面才能使其进入发现模式,然后发生了:
太好了,现在让我们创建软件的第一阶段做检测。创建一个名为 detect.py 的Python应用,并使用Nano打开它。
nano detect.py
粘贴以下示例代码:
#!/usr/bin/pythonimport bluetoothimport timewhile True: print "Checking " + time.strftime("%a, %d %b %Y %H:%M:%S", time.gmtime()) result = bluetooth.lookup_name('78:7F:70:38:51:1B', timeout=5) if (result != None): print "User present" else: print "User out of range" time.sleep(10)
,并用您的蓝牙设备地址:
result = bluetooth.lookup_name('78:7F:70:38:51:1B', timeout=5)
按 CTRL-X 和 Y 关闭并保存。运行相同的代码,您会看到类似以下内容的代码:
即使您之前从未接触过Python,代码也应该非常简单易懂:它每10秒钟扫描一次特定的蓝牙设备,并且它会根据是否找到打印出不同的消息。切换手机上的蓝牙以模拟移入和移出范围(实际上大约为4m)。您可以减少或增加两次扫描之间的时间,但是我觉得10秒钟是一个合理的时间,可能需要等待门解锁,这毕竟是我们整个项目要进行的工作。
我应该补充,我不知道这样做的功耗,但是我认为更频繁地ping设备肯定会消耗更多的功率。我在测试中没有发现任何明显的性能问题,但是如果电池寿命对您来说是一个严重的问题,请考虑在办公室内设置一个开关来激活和禁用扫描循环,因此一旦进入室内,您就可以暂停锁定系统,然后在您离开时重新激活扫描。
恭喜,您现在有了一个Python应用程序,该应用程序知道您何时在范围内,因此我们可以对此采取行动。
Before continuing, you need to figure out which board mode you’re going to use. There’s no right or wrong answer, it just affects whether you specify the literal pin number or the virtual GPIO pin number.
默认为使用文字引脚号(“板模式"),从左下角的引脚1开始(如果向下看带有USB端口的Pi, )。引脚2刚好在它上面。
但是,如果您具有GPIO分支(“补鞋匠")板,则标签来自备用模式,称为“ BCM"(Broadcom SOC通道),并且通常用GPIO或P开头。严格来说,您不需要GPIO中断,它只会使事情变得更容易。如果您没有分线板并且不想购买,请使用以下图表:
请注意,原始型号B的修订版1,修订版2和型号B +和Pi2都具有不同的引脚输出。请参考此StackExchange问题以获取适合您的电路板的图。
在此项目代码中,我使用的BCM GPIO编号系统与我拥有的Adafruit突破性板相对应。如果要使用原义引脚模式,则需要进行细微修改。
继电器中的导线
连接分支板,确保来自引脚1和2的导线( Pi的一角)附加到突破上的3v3和5V0。您可能想拔出一个电压测试仪来检查这一点。
在继续之前,请检查是否有人在Raspberry Pi上使用了您的特定继电器(或事先找到了您知道可以使用的继电器)。有些可能需要5V才能激活–但是RPi只能在GPIO输出引脚上提供3.3V。偶然地,我使用的是3.3V,所以我不需要任何其他电路,只需 5V0到VCC , GND到GND ,以及第一个继电器输入的GPIO引脚23 。
我以前的GPIO教程显示了如何在需要时将晶体管电路接线以将3.3V放大至5V。实际上,我在该教程中使用了相同的继电器板,但事实证明我根本不需要5V电压。
现在还不需要连接电磁体,因为您可以
下一步,让我们抓取一些代码与GPIO端口进行交互。
我们将首先在Python外部进行测试,以确认一切正常。在港口本身上工作。安装connectionPicture,它将为您提供一些有用的命令行工具。
git clone git://git.drogon.net/wiringPicd wiringPi./build
Once installed, configure GPIO pin 23 to be an output.
gpio -g mode 23 out
现在,快速扫描所有端口以确认
gpio -g readall
尽管您的型号在B +或Pi2上可能更长一些,因为它具有更多的GPIO引脚:
起初这可能有点令人困惑,但该表分为中间部分和中间部分列的顺序在每一侧都相反。在最左侧和最右侧是BCM引脚号。由于我们使用的是23,因此您应该会看到现在列为OUT的模式。这是一个有用的小命令,目的只是为了了解所有引脚在任何时刻的状况。
要将引脚设置为高电平或低电平,只需使用
gpio -g write 23 1gpio -g write 23 0
Hopefully, if you have the relay wired correctly, you’ll hear it clicking on and off. If not, don’t continue until you’ve figured out the wiring. Remember, you may need a higher voltage to activate the relay.
一次您已经确认继电器和GPIO正常工作,请添加GPIO的Python模块。
sudo apt-get install python-dev python-rpi.gpio
现在,我们来修改Python应用,以在检测到手机时触发继电器开或关。您可以在此摘要中找到最终代码。将现有的 detect.py 复制到新的 lock.py ,然后添加以下导入和设置命令:
import RPi.GPIO as GPIOGPIO.setmode(GPIO.BCM)RELAY = 23GPIO.setup(RELAY, GPIO.OUT)
在IF语句中,添加用于激活或停用继电器的命令。请注意,您的继电器可能会在低信号或高信号下工作,因此请在测试后进行相应调整。
GPIO.output(RELAY,1)
要运行此新版本,请在命令前加上 sudo –访问GPIO需要root特权。
连接它
一旦确认中继正在使用接近传感器触发,请添加电磁锁。在继电器侧,将12V正电压带入标有COM的端子(公共),然后从电磁体向NO端子输入正功率(常开,即,这通常不连接至公共端子,但会)。
通过电源和GND端子上的电磁体接地。
请参阅随附的安装说明您的锁;门需要很厚,如果它从您要打开锁的那一侧打开则更容易。我的是相反的,所以我需要L形安装支架,以及一块额外的木头来增加门的厚度。
改进
这是证明我想在其他项目的基础上建立一个概念,实际上只是在不在办公室时让我的眼睛窥视我的办公室–它不是设计成一个万无一失的安全系统。为此,您需要备用电池以在断电时保持电源畅通。
当然,如果有人闯入您的房屋并遇到断电的麻烦,您可能更大的问题是,他们是一个要杀死你的精神病患者,而不是一个临时的小偷。除了电子锁之外,您还需要物理锁栓和一根大棒子。
当然,这种使用蓝牙的接近检测技术不仅限于自动门锁,您还可以还可以用来在您回家时触发车库门打开,或者在您走进门之前打开家庭影院。
您认为我下一步应该添加什么功能? 在构建此文件时遇到任何问题吗?在评论中让我知道,我将竭尽所能!