背景:

话说自从我厂的商务部门搬到旁边的商务楼之后,工程师发现漂亮的前台MM也搬走了,某区只留下冷冷清清的鱼缸。然后,工程师们发现开门成了个问题。鉴于进门需要刷卡,所以没有带卡的工程师就不得不摁下门铃,等待其他人从座位上起身为自己开门。经历过多次不得不让别人来开门以及不得不为别人开门之后,终于有工程师不能忍受了(我就是其中一个),于是,决定自己动手解决问题。要知道,地球上没有能难住工程师的问题!

研究与选择方案:

我厂的电子门锁的开门设备是通过一个带弹簧的开关(门内,类似墙面上开灯的开关)控制的,按下开关就能打开门,按下开关的时候能够听到明显的继电器闭合的声音,因此,趁着没人的时候我把开关拆开看了一下,证实的确是通过触电控制的一个继电器。按下开关时,两个金属触电接触,继电器动作,门打开。继电器在动作后延时4秒左右恢复。这样看来,硬件层面的开门实现就非常简单了:跨接一个数字继电器,要开门时,通过电平信号控制继电器闭合并保持2秒即可。

但要实现远程控制,必须设置一台可以通过TCP或是HTTP协议接受用户命令,并能控制开门硬件(继电器)的设备。最初考虑过Arduino,作为一个开源的硬件平台,Arduino的电平输出非常易于控制和操作。而且Arduino也有RJ45或是无线的接口模块。不过在查看了Arduino的无线模块的操作方式之后,我发现要让Arduino接入一个WPA加密的无线网络并实现一个web server并不容易。所以最终还是选择了树莓派(Raspberry PI),虽然RPI的硬件成本更高一点。

RPI与Arduino的设计目标不同,它主要是一个超小的PC主机。幸好RPI本身提供了若干个GPIO的输出口(3.3V),用来操作数字继电器倒是没有问题。

请特别注意:由于GPIO的引脚是没有保护电路的,不当的硬件连接很可能会导致整块RPI板子烧掉,连接和操作时务必慎重。在确定方案时,我个人使用了面包板,电阻和二极管等电子元件搭建实验电路,并反复用万用表验证过输出电压和电流(主要是对RPI的每个脚的输出不确定)。

操作步骤

在RPI上安装操作系统

拿到RPI后,首先要在RPI上安装操作系统。这里有份文档:http://log.liminastudio.com/writing/tutorials/getting-started-with-the-raspberry-pi,安装完操作系统后,确保重新启动成功(RPI的视频输出口是HDMI接口,可以直接连接在支持HDMI的显示器或是电视上,或者可以通过HDMI转VGA/DVI的连接线连接到支持VGA/DVI的显示器上。注意:无源的HDMI转VGA的线可能会损坏RPI板)。

配置网络

RPI本身的网络支持已经比较完善,通过有线方式接入的话,只要直接插入网线就可。考虑到无线方式部署比较方便,我采用的是无线连接的方式。

RPI仅对部分网卡支持较好,利用RPI的官网上的无线网卡兼容信息,最终选择了一款相对便宜且能得到较好支持的网卡:TP-LINK TL-WN823N,该网卡可以从amazon.cn购买,购买地址见本文最后的列表。

插入网卡后,修改网卡的配置信息:

sudo vi /etc/network/interfaces

修改其中与wlan0相关的部分:

auto lo

iface lo inet loopback

iface eth0 inet dhcp

allow-hotplug wlan0

iface wlan0 inet static

wpa-ssid 你要连接的wifi ssid

wpa-psk 你的wpa连接密码

address 192.168.0.20 # 设定的静态IP地址

netmask 255.255.255.0 # 网络掩码

gateway 192.168.0.1 # 网关

network 192.168.0.0 # 网络地址

#wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf

iface default inet dhcp

这里我选择了使用静态地址,原因是我们不希望开门的服务器地址老是变来边去。设置好网络并确认能够正常工作后,就可以着手进行下一个步骤了。

连接硬件

下图是具体的连接方式,注意连在RPI上的三条线,白色(电源)、黑色(GND)、灰色(信号)分别连接在RPI GPIO的2号、6号与7号针脚上。

编写代码

RPI的操作系统缺省已经有一个Python的安装了。因此,我们可以使用Python来设置Web Server并控制开门的硬件设备。我选择了web.py作为Web server的开发基础,加上GPIO的python库来完成工作。

接下来就是在RPI上设置Web server了。遵循我厂的传统,使用Python作为Web server的主要开发语言。

开门硬件控制相关代码:

import RPi.GPIO as GPIO

import time

PORT = 7

def reset():

GPIO.setmode(GPIO.BOARD)

GPIO.setup(PORT, GPIO.IN)

def initcontroller():

GPIO.setmode(GPIO.BOARD)

GPIO.setup(PORT, GPIO.OUT)

GPIO.output(PORT, True)

def opendoor():

GPIO.setup(PORT, GPIO.OUT)

GPIO.output(PORT, False)

time.sleep(2)

GPIO.output(PORT, True)

Web server代码(基于web.py)

import web

from web import form

import doorop

import requests

render = web.template.render('templates/')

urls = (

'/', 'index'

)

app = web.application(urls, globals())

myform = form.Form(

form.Textbox("username"),

form.Textbox("password", form.notnull)

)

#initial door controller

doorop.initcontroller()

def verifyuser(uname, passwd):

#这里是验证用户的逻辑,我是用公司的LDAP服务器进行验证的

#验证成功返回True,否则返回False

pass

class index:

def GET(self):

form = myform()

return render.formtest(form)

def POST(self):

form = myform()

if not form.validates():

return render.formtest(form)

else:

if(verifyuser(form['username'].value, form['password'].value)):

doorop.opendoor()

return "door opened!"

else:

return "Username/Password invalid!"

if __name__ == "__main__":

web.internalerror = web.debugerror

app.run()

这样就在RPI上建立了一个web server,用HTTP POST方式输入正确的用户名和口令就能实现开门。

为了更方便地应用远程开门(例如,用手机开门显然更cool),可以编写iOS或是Android上运行的开门应用。当然,由于开门只需要发送一个HTTP POST请求,直接写成一个可以在Mac/Linux/Win下运行的命令行也可以。

部署后的全景

豆瓣开门

豆瓣开门widget

后记与感谢

感谢所有参与这个项目的我厂同学们,豆瓣的确是个有着独特的技术文化的环境,这里不仅有许多可以互相交流想法的技术geek,还有这庞大的对所有新鲜的东西感兴趣的工程师群体,欢迎各位喜欢这个环境的其他非我厂同学们参观和加入:)

成本与硬件列表(为方便想要动手的同学,带购买链接,点击请慎重)

4 anbox 树莓派_使用树莓派制作的远程开门器相关推荐

  1. esp32树莓派_用树莓派 DIY 宠物自动喂食机,再也不用担心家里的萌宠了

    由于公众号文章的推送规则已经改成了不按照发布时间排序,所以为了大家能够准时收到我们的文章推送,请记得猛戳右下角的「在看」,并点击公号主页右上角的" ... "将 程序员极客实验室  ...

  2. 使用树莓派制作的远程开门器

    背景: 话说自从我厂的商务部门搬到旁边的商务楼之后,工程师发现漂亮的前台MM也搬走了,某区只留下冷冷清清的鱼缸.然后,工程师们发现开门成了个问题.鉴于进门需要刷卡,所以没有带卡的工程师就不得不摁下门铃 ...

  3. zero 免焊 树莓派_给树莓派 Zero 添加一个RCA视频输出插头

    你知道吗?树莓派 Zero 也是有集成视频输出接口的. 如果你希望用老式的电视作为树莓派 Zero 的显示器,往下阅读吧-- 没错,正如图上这么简单就可以搞定.树莓派 Zero 并没有限制视频只能通过 ...

  4. 姿态检测 树莓派_利用树莓派追踪飞机航行轨迹的骚姿势分享

    开篇 你知道如何利用你手中的树莓派来观察天空中的飞机吗?通过调谐和接收距离你所在地点250英里以外飞机无线电信号,你就可以追踪飞机航线,而完成这个任务,仅需要随处就能购买到的廉价USB电视棒. 本文将 ...

  5. openhd 树莓派_记录树莓派数字图传

    用树莓派做数字图传,这应该是好多年前的一个想法了,一直是玩的模拟图传,大疆垄断的数字图传对玩开源的就是一个坎儿,因为大疆的数字图传就是6000多,和它的整体价格差不多,一直开源图传就没人把这个开发出来 ...

  6. 树莓派001-购买树莓派

    我是买的树莓派3B中国版-外加一个32G的内存卡. 一个树莓派呢也不算贵,才190一个.当然还有更便宜的.不过贵点性能也就要好点. 树莓派3B 淘宝上有很多树莓派卖,大家择其合适者而购之. 不过你得确 ...

  7. 玩转树莓派---详解树莓派的系统烧录,基础使用及基于树莓派制作手势控制的小车(附详细代码及演示效果)

    目录 一.写在前面 二.系统实现: Author:qyan.li Date:2022.6.10 Topic:详解树莓派的使用及基于树莓派制作手势控制的小车 Reference:如何给树莓派安装操作系统 ...

  8. esp32树莓派_用 ESP32 制造炫彩 LED 球

    MAKER:jiripraus/ 译:趣无尽 本期带大家制作一个 LED 的炫彩发光球,使用 3D 打印外壳搭建球体并将 LED 灯嵌入在球体表面,最后再上传代码,一个颜色绚丽的 LED 球就完成了. ...

  9. 树莓派python物体识别_基于树莓派和Tensowflow的物体识别

    近来这篇文章很火:How to build a robot that "sees" with $100 and TensorFlow (作者是Lukas,CrowdFlower创始 ...

最新文章

  1. 集成测试_渐增与非渐增模式优缺点
  2. linux 命令 跳过yes,Linux命令之yes
  3. Zxing二维码开源项目
  4. wireshark提取流量包中的文件_从Wireshark监听的数据中提取需要的数据
  5. opencv利用矩形框选中某一区域_【从零学习OpenCV】4Ubuntu系统中安装OpenCV 4
  6. 台式计算机更新不了,台式机更新造成电脑关不了机怎么办
  7. 【bzoj2648】SJY摆棋子 KD-tree
  8. java 微服务实践 视频,全新JAVA微服为务实战Spring Boot系列视频教程 小马哥 JAVA微服务实践视频课程...
  9. 用计算机弹传说之下鱼姐的bgm,传说之下战斗曲曲谱_传说之下打托丽尔的bgm
  10. STM32学习心得三十七:MPU6050六轴传感器实验
  11. 树莓派python调用摄像头拍照
  12. ZOJ3987(二进制枚举+java大数)
  13. Java对接腾讯IM以及一些方法的简单封装
  14. uni-app学习路线与建议
  15. P1458 [USACO2.1]顺序的分数 Ordered Fractions
  16. 基于Java的员工管理系统
  17. 《Web安全之机器学习入门》笔记:第十章 10.3 K-Means算法检测DGA域名
  18. Learning to Learn
  19. 浅谈傅里叶——8. 一维iDFT的实现
  20. IT知识百科:什么是基站?

热门文章

  1. 视频网站提取原始地址之二——土豆
  2. android 5.0 pie,Android各版本份额占比出炉:Android Pie仍未知
  3. 【推文】人间清醒VS梅花痣俏郎君
  4. 买了个新主机,从0开始配电脑(持续更新ing)
  5. S3C2410原理图导读
  6. c语言中位数怎么求,C计算中位数参考
  7. 5分钟使用Echarts轻松实现地图下钻
  8. 整理了MariaDB和MySQL数据库历年发布版本和对应关系,方便记忆命令。
  9. 研究报告 | “洗剪吹”市场逆势增长,黑马突围捷登三大电商平台销量榜首
  10. 第一集 斗罗世界 第八章