使用樹莓派製作的遠程開門器

來源:互聯網
上載者:User
文章目錄
  • 背景:
  • 研究與選擇方案:
  • 操作步驟
  • 後記與感謝
  • 成本與硬體列表(為方便想要動手的同學,帶購買連結,點擊請謹慎)

 

背景:

話說自從我廠的商務部門搬到旁邊的商務樓之後,工程師發現漂亮的前台MM也搬走了,某區只留下冷冷清清的魚缸。然後,工程師們發現開門成了個問題。鑒於進門需要刷卡,所以沒有帶卡的工程師就不得不摁下門鈴,等待其他人從座位上起身為自己開門。經曆過多次不得不讓別人來開門以及不得不為別人開門之後,終於有工程師不能忍受了(我就是其中一個),於是,決定自己動手解決問題。要知道,地球上沒有能難住工程師的問題!

研究與選擇方案:

我廠的電子門鎖的開門裝置是通過一個帶彈簧的開關(門內,類似牆面上開燈的開關)控制的,按下開關就能開啟門,按下開關的時候能夠聽到明顯的繼電器閉合的聲音,因此,趁著沒人的時候我把開關拆開看了一下,證實的確是通過觸電控制的一個繼電器。按下開關時,兩個金屬觸電接觸,繼電器動作,門開啟。繼電器在動作後延時4秒左右恢複。這樣看來,硬體層面的開門實現就非常簡單了:跨接一個數字繼電器,要開門時,通過電平訊號控制繼電器閉合并保持2秒即可。

但要實現遠端控制,必須設定一台可以通過TCP或是HTTP協議接受使用者命令,並能控制開門硬體(繼電器)的裝置。最初考慮過Arduino,作為一個開源的硬體平台,Arduino的電平輸出非常易於控制和操作。而且Arduino也有RJ45或是無線介面模組。不過在查看了Arduino的無線模組的操作方式之後,我發現要讓Arduino接入一個WPA加密的無線網路並實現一個web server並不容易。所以最終還是選擇了樹莓派(Raspberry PI),雖然RPI的硬體成本更高一點。

RPI與Arduino的設計目標不同,它主要是一個超小的PC主機。幸好RPI本身提供了若干個GPIO的輸出口(3.3V),用來運算元字繼電器倒是沒有問題。

  1. RPI的GPIO引腳的定義:http://elinux.org/RPi_Low-level_peripherals#General_Purpose_Input.2FOutput_.28GPIO.29
  2. 引腳的輸出規格:http://elinux.org/RPi_BCM2835_GPIOs
  3. 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庫來完成工作。

  1. Web.py的下載、安裝與教程:http://webpy.org/
  2. 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,還有這龐大的對所有新鮮的東西感興趣的工程師群體,歡迎各位喜歡這個環境的其他非我廠同學們參觀和加入:)

成本與硬體列表(為方便想要動手的同學,帶購買連結,點擊請謹慎)
  1. 樹莓派(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

  2. TP-LINK TL-WN823N 300M迷你型無線USB網卡 55元 http://www.amazon.cn/gp/product/B009A2WQTW

  3. 連接線:2元 http://item.taobao.com/item.htm?id=13451559655>

  4. 兩路數字繼電器 5元 http://item.taobao.com/item.htm?id=13451559655

  5. 其他: 約60元 導線 4G SD卡一張

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.