使用智能手机接近传感器制作自动上锁的办公室门
嘘 – 想要为您的家庭办公室提供一些高科技保护,或者为您的“工作室”安装一个秘密锁(好吧,你明白了,它实际上是一个地牢/游戏室) 孩子会不会想不通?我们已经为您提供了保障。让我们来构建一个 DIY 智能锁,当你在那里时自动检测,并在你不在时上锁。
它是如何工作的?没人知道!或者更具体地说,蓝牙。
概念
您的智能手机是一种功能强大的设备,它会不断向外界透露有关自身的信息;这样做的一种方式是蓝牙。
在发现模式下,它会广播一个唯一的标识号——但即使没有明确允许自己被发现,任何知道该地址的东西都可以尝试 ping 它。如果听到响应,则表明它是否在范围内。
我们将设置一个带有蓝牙适配器的 Raspberry Pi,以不断留意您的智能手机何时超出范围,当超出范围时,继电器将立即启动并锁上门。
你需要
- Raspberry Pi – 任何型号都可以工作,因为它不是 CPU 密集型任务,但我使用的是旧型号 B,并且您的型号的 GPIO 引脚排列可能略有不同。请参阅下面的板载模式部分。您还需要一些基础知识,例如有线以太网连接或 Wi-Fi 配置;外加 SD 卡和微型 USB 电源线。
- 蓝牙 USB 适配器。 Adafruit 出售已确认工作的蓝牙 4.0 BLE 模块(蓝牙 4.0 是什么?),但您应该在为该项目购买新模块之前测试您已经拥有的模块。我发现我在日本购买的旧标准蓝牙迷你适配器似乎工作正常。我们不关心传输速度或连接可靠性,因为我们所做的只是发送一个快速握手信号,看看设备是否正常运行。
- GPIO 分线板(“补鞋匠”)和跨接电缆。您可以直接使用 Pi 上的引脚进行工作,但如果每个引脚上都有标签,那就容易多了,而且它们也只需 6 美元。
- 中继板。您在这里有各种各样的选择,如果它是为与微控制器一起使用而设计的,并且可以在 5 安培下驱动至少 12 伏特,那么任何东西都可以使用。我使用了一个与此类似的通用 4 通道板,价格约为 5 美元,但我假设您知道如何使用您的板。
- 12/24V 电磁锁,不过电子电磁锁也应该可以使用。我购买的那个有 180 公斤的夹持力,并附有安装板和说明,价格约为 35 美元。
- 12/24V 电源。磁力锁必须有单独的电源 - 无论您做什么,都不要试图从 Pi 上为其供电。
- Lock.py Python 应用程序,但我们将在进行过程中编写此应用程序。
使用蓝牙
蓝牙是这个项目的核心,所以让我们先安装一些蓝牙支持并测试我们的适配器。您可以直接从 Pi 执行此操作,也可以远程通过 SSH 执行此操作(如何设置 Windows 以通过 SSH 连接到您的 Pi)。
sudo apt-get install bluez python-bluez
如果您还没有插入加密狗,请插入它,让我们看看它报告的内容。
hcitool dev
如果您在输出中列出了某些内容,那么您就可以开始了。接下来,我们将使用 Python 脚本轮询附近的蓝牙设备,并获取唯一的设备地址。我们只需要为每个设备执行一次。
wget https://pybluez.googlecode.com/svn/trunk/examples/simple/inquiry.py python query.py
如果您看到“找到 0 个设备”,则您要么没有兼容的 USB 蓝牙加密狗,要么无法发现您的智能手机。不过不要绝望:我发现我必须在 iPhone 上实际打开蓝牙设置页面才能将其踢入发现模式,然后发生了这种情况:
太好了,现在让我们创建进行检测的软件的第一阶段。创建一个名为 detect.py 的 Python 应用 , 然后用 Nano 打开。
nanodetect.py
粘贴此示例代码:
#!/usr/bin/python import bluetooth import time while 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 ):打印“用户存在” else:打印“用户超出范围” time.sleep(10)
并用您的蓝牙设备地址调整以下行:
result =bluetooth.lookup_name('78:7F:70:38:51:1B', timeout=5)
按 CTRL-X 和是 关闭并保存。运行相同的代码,您会看到如下内容:
即使您以前从未接触过 Python,代码也应该非常容易理解:它每 10 秒扫描一次特定的蓝牙设备,并根据是否找到它打印出不同的消息。切换手机上的蓝牙以模拟进出范围(实际上可能约为 4m)。您可以减少或增加扫描之间的时间,但我觉得 10 秒是可能需要等待门解锁的合理时间,毕竟这是我们整个项目的目标。
我应该补充一点,我不知道这样做的功耗,但我认为更频繁地 ping 设备必然会消耗更多的电量。我在测试中没有看到任何明显的性能问题,但是如果电池寿命对您来说是一个严重的问题,请考虑在您的办公室内安装一个开关来激活和停用扫描循环,因此一旦您进入室内,您就可以暂停锁定系统,然后离开时重新激活扫描。
恭喜,您现在拥有了一个 Python 应用,它知道您何时在范围内,因此我们可以开始对此采取行动。
GPIO 板模式
在继续之前,您需要弄清楚您将使用哪种棋盘模式。没有正确或错误的答案,它只影响您指定的是文字引脚编号还是虚拟 GPIO 引脚编号。
默认是使用文字引脚编号(“板模式”),从左下角的引脚 1 开始(如果向下看带有右侧 USB 端口的 Pi)。 Pin 2 就在上面。
但是,如果您有 GPIO 分线(“补鞋匠”)板,则您拥有的标签来自替代模式,称为“BCM”(Broadcom SOC 通道),并且通常在数字前加上 GPIO 或 P。你并不严格需要 GPIO 突破——它只是让事情变得更容易。如果您没有分线板并且不想购买,请使用此图:
请注意,原始模型 B 修订版 1、修订版 2 以及模型 B+ 和 Pi2 都有不同的引脚排列。请参阅此 StackExchange 问题以获取适合您的电路板的图表。
在此项目代码中,我使用 BCM GPIO 编号系统,它对应于我拥有的 Adafruit 分线板。如果您希望使用文字 pin 模式,则需要稍作修改。
继电器中的接线
连接分线板,确保引脚 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 之外进行测试,以确认一切都在端口本身上运行。安装wiringPi,它为您提供了一些有用的命令行工具。
git clone git://git.drogon.net/wiringPi cdwiringPi ./build
安装后,将 GPIO 引脚 23 配置为输出。
gpio -g mode 23 out
现在,快速扫描所有端口以确认
gpio -g readall
您将拥有与此类似的东西,尽管在 B+ 或 Pi2 型号上您的时间可能更长,因为它有更多的 GPIO 引脚:
更多细节:用智能手机接近传感器制作一个自动上锁的办公室门
制造工艺