前一陣子終於把家裡的門鎖改成可以使用手機控制開門,這個計劃的開端始於2018年8月份,一個沒記性的人為什麼記得那麼清楚,因為淘寶上記錄呀。因為這個計劃一直沒實現,所以當我跟某人說我想做什麼新的事情,某人就會酸我之前也說要弄自動開門呀,弄到哪去了……2018年的時候搞了一陣子,然後就放棄了。但這件事一直在我心中,所以在某一天就GOOGLE了一下,找到了一篇教學,跟著做就實現了。
Raspberry Pi 是一種單片機,就是電腦主機所需的基本零件都焊在一起的主機,底板上有CPU 、RAM、HDMI接口、LAN接口、WI-FI晶片等等,再插上一張SD就是一台可以運作像手掌大小電腦。除了尺寸外,它和一般家用電腦的區別是它所採用的CPU 架構是ARM,而一般PC是使用X86架構,如果你有下載過作業系統(OS)的安裝檔案,會見過x86(i386)、86_x64、 AMD64 等字眼,x86也是我們常說的32bit OS,x64就是64bit OS。32bit 與 64bit 指的是CPU 的通用寄存器的長度,32bit 的長度就是 2的32次方。在某個年代,我們的Windows xp 是32bit ,OS 最多只能記得2^32/1024/1024/1024=4Gb的地址,但硬體RAM可能會超過4Gb,多出來的就RAM就不能當RAM使用,其中一個方法就把它當做硬盤使用(Ram Disk),這個Ram Disk 就會比一般的Disk 飛快了許多,缺點就是儲存在RAM Disk 上的重新開機就沒了,所以必須把RAM Disk 的資料同步到真正的硬盤上,或者可以把虛擬記憶體放到RAM Disk 裡。越說越遠了……
然而,基於x86 架構的OS是不能在ARM 硬體上運行的,所以Raspberry Pi 必須安裝支持ARM的作業系統。Raspberry Pi 有官方基於 Linux 的作業系統,安裝也十分方便,官網都有詳細的教學,很適合我們這種小白學習。
ARM其中一個優點是功耗低很多,所以我們大多數手機也是使用ARM CPU,所以Raspberry Pi 的優點就是功耗低囉?是沒錯,但它還有另外一個強大的Function 啦,就是上圖無名指和尾指旁邊的兩排針,它們叫做GPIO,General Purpose Input Out,它是可以用來給其他裝置供電或控制其他裝置,比例控制門鎖,傳感器,淘寶上有一大堆Raspberry Pi 的傳感器,例如溫度、濕度、紅外線、人體感應,都很便宜。供電的電壓有5v 和 3.3 V,也可以與裝置互動,進行傳送和接收資料。也可以使用繼電器來控制220 V電器,讓220V的電器通電或不通電。還有就是Raspberry Pi 價格300塊人民幣就可以買到了。
第一次嘗試
一開始的想法是買個電鎖和Raspberry Pi,Raspberry Pi 控制電鎖開門。要準備的東西有:
繼電器 Relay
繼電器可以使小電流控制大電源的開關,並且將兩段電路隔離。Raspberry Pi GPIO 輸出電壓最大是5V,而電鎖是使用12V,用Raspberry Pi GPIO 不能直接控制電鎖,所以我們使用繼電器。購買繼電器需要注意參數,右圖最上面標示的12VDC是繼電器工作電壓,給Rasphberry Pi 用要買5V。下面三個電壓是繼電器可以控制的電壓,DC 沒有標示,這款是30VDC。光耦繼電器反應比較慢,跳轉開合需要一兩秒時間,可以選用固態繼電器,購買要留意能否控制DC 電流,淘寶沒能找到可以控制DC的,只有控制AC。
電鎖專用電源接線圖
電鎖專用電源也內置了一個繼電器,用來控制電鎖,所以整個聯動控制是 Raspbery Pi -> 繼電器-> 電鎖專用電源(繼電器)->電鎖。繼電器一般都會有三個接口
- NC(Normal Close) 繼電器在收到觸發訊號前NC 與COM是接通的,觸發後就是斷開的。
- NO(Normal Open)繼電器在收到觸發訊號前NO與COM是斷開的,觸發後就是接通的。
- COM(Common) NC 和 NO 的共同觸點
- 觸發訊號在樹莓派連接的繼電器可以使用高電平(即1),或者低電平(即0)。電鎖專用電源,我們使用PUSH 和GND,只要PUSH 和 GND 接通了(開關按鈕原理),電鎖專用電源的繼電器就會被觸發。
電鎖接線
這裡選用了A方法接線。B方法看不明白該怎麼接。
整體接線圖
Raspberry Pi 5V 、GND 接繼電器DC+、DC- 給繼電器提供電源(電力),GPIO(隨便找一個就可以,這裡使GPIO 17 物理編號PIN 11)接IN,GPIO發送低電平訊號給IN,就會觸發繼電器吸合,使NO和COM接通,然後電鎖專用電源的Push 和GND就會接通,再觸發電源繼電器吸合,使NO和GND接通(0~10秒可調,有延時功能)並輸出電壓訊號至電鎖L+ 和GND,使電鎖開門。電源+12、GND連接電鎖12V、GND給電鎖提供工作電壓(電力)。
最後附上python 代碼
#!/usr/bin/env python
import RPi.GPIO as GPIO
import time
RelayPin = 11
GPIO.setmode(GPIO.BOARD)
GPIO.setup(RelayPin, GPIO.OUT)
time.sleep(1)
GPIO.output(RelayPin, GPIO.LOW)
time.sleep(1)
GPIO.output(RelayPin, GPIO.HIGH)
time.sleep(1)
GPIO.cleanup()
實際上我並沒有使用這個方案,因為家裡的門要改用上電鎖,不太合適,難度太高放棄了。最後使用的是本文開頭提及GOOGLE找到的一個方案。