文章目錄
- 背景:
- 研究與選擇方案:
- 操作步驟
- 後記與感謝
- 成本與硬體列表(為方便想要動手的同學,帶購買連結,點擊請謹慎)
背景:
話說自從我廠的商務部門搬到旁邊的商務樓之後,工程師發現漂亮的前台MM也搬走了,某區只留下冷冷清清的魚缸。然後,工程師們發現開門成了個問題。鑒於進門需要刷卡,所以沒有帶卡的工程師就不得不摁下門鈴,等待其他人從座位上起身為自己開門。經曆過多次不得不讓別人來開門以及不得不為別人開門之後,終於有工程師不能忍受了(我就是其中一個),於是,決定自己動手解決問題。要知道,地球上沒有能難住工程師的問題!
研究與選擇方案:
我廠的電子門鎖的開門裝置是通過一個帶彈簧的開關(門內,類似牆面上開燈的開關)控制的,按下開關就能開啟門,按下開關的時候能夠聽到明顯的繼電器閉合的聲音,因此,趁著沒人的時候我把開關拆開看了一下,證實的確是通過觸電控制的一個繼電器。按下開關時,兩個金屬觸電接觸,繼電器動作,門開啟。繼電器在動作後延時4秒左右恢複。這樣看來,硬體層面的開門實現就非常簡單了:跨接一個數字繼電器,要開門時,通過電平訊號控制繼電器閉合并保持2秒即可。
但要實現遠端控制,必須設定一台可以通過TCP或是HTTP協議接受使用者命令,並能控制開門硬體(繼電器)的裝置。最初考慮過Arduino,作為一個開源的硬體平台,Arduino的電平輸出非常易於控制和操作。而且Arduino也有RJ45或是無線介面模組。不過在查看了Arduino的無線模組的操作方式之後,我發現要讓Arduino接入一個WPA加密的無線網路並實現一個web server並不容易。所以最終還是選擇了樹莓派(Raspberry PI),雖然RPI的硬體成本更高一點。
RPI與Arduino的設計目標不同,它主要是一個超小的PC主機。幸好RPI本身提供了若干個GPIO的輸出口(3.3V),用來運算元字繼電器倒是沒有問題。
- RPI的GPIO引腳的定義:http://elinux.org/RPi_Low-level_peripherals#General_Purpose_Input.2FOutput_.28GPIO.29
- 引腳的輸出規格:http://elinux.org/RPi_BCM2835_GPIOs
- RPI的GPIO教程:http://log.liminastudio.com/writing/tutorials/tutorial-how-to-use-your-raspberry-pi-like-an-arduino
請特別注意:由於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庫來完成工作。
- Web.py的下載、安裝與教程:http://webpy.org/
- RPI GPIO的python庫安裝和使用:http://log.liminastudio.com/writing/tutorials/tutorial-how-to-use-your-raspberry-pi-like-an-arduino
接下來就是在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,還有這龐大的對所有新鮮的東西感興趣的工程師群體,歡迎各位喜歡這個環境的其他非我廠同學們參觀和加入:)
成本與硬體列表(為方便想要動手的同學,帶購買連結,點擊請謹慎)
樹莓派(MODB-512M) 帶運費,稅費,約300元 http://cn.element14.com/raspberry-pi/raspbrry-modb-512m/%E5%8D%95%E6%9D%BF%E6%9C%BA-%E6%A0%91%E8%8E%93%E6%B4%BE-raspberry-pi-b%E5%9E%8B-512mb/dp/2191863?ref=lookahead
TP-LINK TL-WN823N 300M迷你型無線USB網卡 55元 http://www.amazon.cn/gp/product/B009A2WQTW
連接線:2元 http://item.taobao.com/item.htm?id=13451559655>
兩路數字繼電器 5元 http://item.taobao.com/item.htm?id=13451559655
其他: 約60元 導線 4G SD卡一張