close

【創客】芝麻開門~遠端遙控車庫門

「遙控自家的車庫門」這個構思其實已經想了很久,直到最近過年後才實現。這兩天有空把 Arduino Code 的部分整理之後放到 Github 上,有興趣的話可以參考。詳細的技術細節就不說了,不是什麼啥高深複雜的玩意兒,底下聊聊這個構思從發想到實現過程中的點點滴滴,給一樣有興趣的人當參考。

構思緣由

兩年多前「只管出一張嘴:用 Siri 控制家裡老電器」獲得成功實現之後,有時候會想家裡面還有什麼是可以拿來用程式遙控,不久後腦筋動到車庫門上。每次回家時想打開車庫門停車,得先把車停在門口,再花點時間在公事包內翻找車庫遙控器,每日例行公事,久了覺得有點煩,希望能找出便捷快速的方法。不過控制車庫的使用條件與遙控冷氣不同,不能像上次那樣「只出一張嘴」如法泡製,原因是剛回到家不一定有 Wifi 網路,再者也有安全疑慮,萬一有人在家門口大喊「嘿!Siri」觸發家裡 Homekit 裝置就這樣輕鬆打開我家的車庫門,那玩笑就開大了。

所以「遙控車庫門」的構思想了很久,也拖了很久,最後決定把遙控器做在手機上,因為手機對我來說是隨手可取之物,「用嘴巴喊芝麻開門」這回事想想就算了。

開發歷程

依照上次的經驗,第一步是「自製 Wifi 車庫遙控器」。一開始把這問題想得太簡單,以為拿一顆現有的遙控器,把遙控器按鈕的線路跟 MCU 的 GPIO 對接就行了,沒想到竟然失敗。原因是 GPIO 與 GND 始終是通路,遙控器按鈕接在 MCU GPIO 上面一定形成通路,程式怎麼寫都沒用。

隨後把這個問題發到臉書的創客社團,沒多久就得到「繼電器」這個答案。另外也發現「控制車庫門」早就有人實做過了,還有人大方分享他的做法。不過他的做法卻嚇到我了。他去變更車庫門的開關與供電,塞進一顆 NodeMCU 進去控制鐵捲門的動作。對我來說,改動實體線路的方法的工程太大、太冒險。

後來爬文找到一篇國外的作法,使用 CD4066 這顆 IC 模擬按鈕開關(文章),這種 IC 也很便宜,一顆才 2 元,趕在過年前買了幾顆。實作結果又失敗了,原因一樣,這顆 IC 的 I/O 端依然是電阻值很大的通路,不適用與遙控器按鈕串接的情況,看來只剩繼電器的解法了。過年期間買不到繼電器就無計可施,那幾天簡直快悶壞了。

【創客】芝麻開門~遠端遙控車庫門

以為很簡單的「Wifi 鐵捲門遙控器」在實作時也會一波三折,到頭來也只是 NodeMCU (後來改用 Wemos D1 mini)與遙控器之間,多加一組繼電器就解決了。我走過的路,總是比別人坎坷。

功能與使用情境

硬體的部分一波三折,軟體倒是沒遇到什麼麻煩。不過,考量到使用情境與適用條件,所以在軟體功能上加油添醋了一些東西,這部分講起來也是一堆毛,看倌們還有耐心的話,請繼續看下去。

上面提到,不論是與遙控器直接對接、或是使用 CD4066 IC、使用繼電器等方式,MCU 控制按鈕的程式全都都一樣,程式很簡單(BeButton.h),對 MCU 的 GPIO 腳輸出高或低電位就行了。接下來是考慮如何傳送與接收按鈕指令的方式。就像「只出一張嘴:用 Siri 遙控家裡的老電器」那樣,也在 MCU 建立 HTTP WebServer 接收外來的指令。

【創客】芝麻開門~遠端遙控車庫門

不過問題跟著來了,還是那兩個萬年問題:便利性與安全性的拉扯。WebServer 若沒有對外開放,每次回家時就得在門口等,等手機連進家裡的 Wifi 才能用,便利性就沒了。一旦對外開放,總不能任何人都能連上網頁開門,這玩笑就開大了,所以又得在網頁上加入帳密登入,這麼一來每次回家又得輸入帳密,便利性又沒了。便利性與安全性,兩者就像拔河一樣,總是互相拉扯。

便利與安全兼顧的方案,想了幾天,終於想到要導入 MQTT 了。所以實作起來的運作架構,就變成下圖的模樣。

【創客】芝麻開門~遠端遙控車庫門

上圖中「Garage Controller MQTT Client」就是提到的「自製 Wifi 車庫遙控器」,而 MQTT Broker 是家裡的樹莓派。控制車庫動作的 MCU (Wifi 車庫遙控器) ,除了 HTTP 之外,也同時支援了 MQTT,這部分的程式碼我都放在 Github 上了。至於手機端的遙控,則搭配 MQTT-Client-Framework 寫一支 iOS App, 很快就搞定,必須在手機上使用專屬 APP 才能控制車庫門,基本的安全跟便利性都有了。另外也在樹莓派上用 Node.js 寫一支 MQTT client 程式,負責監聽所有的訊息(Logs)並儲存到樹莓派的 MySQL 資料庫上,再用 PHP 寫一支網頁撈出 Log 紀錄。

【創客】芝麻開門~遠端遙控車庫門

也就是說,這張運作架構圖中,硬體的部分為:

  • 車庫遙控器:拿家裡另一顆備用的來改。
  • MCU 一顆( Wemos D1 R2 mini 基於 ESP8266):100 元
  • 四路繼電器:120 元
  • 樹莓派:使用 3B,約 1000 元
  • 手機:iPhone 5s,無價...

使用程式語言:有四種

  • Arduino Code (C/C++):MCU 韌體,包含 MQTT Client 端、Web 服務,與驅動 GPIO 按鈕腳位。
  • Node.js:用作 MQTT 的 Client 端監聽訊息,並將訊息記錄在 MySQL 上。
  • PHP:從 MySQL 撈出訊息記錄產生網頁。
  • Object-C:手機端 APP,用作 MQTT Client 端,發布開關門的動作訊息。

網路服務建置:皆建置在樹莓派上

  • MQTT
  • Apache2
  • MySQL

另外還有 DNS 與 NAT 轉址等網路設定工作,所以光是一個「用手機開關車庫門」的計畫,就用了超過 10 種技術項目。在這個的運作架構下,快樂的用了一段日子,每次回到家門口 200 公尺前就可以預先打開車庫,到家就直接把車子溜進去,一切行雲流水免等待。直到另一個問題漸漸地浮上檯面。

便利性與安全性基本上都有了,手上這支手機可以在全世界任何可上網的角落,一鍵開啟家裡的車庫門,這種便利性總讓我心裡發毛。萬一不小心誤觸 App 的開關,自己又沒發現怎麼辦?萬一手機在解鎖的狀態被別人撿去用怎麼辦?

所幸這個問題也有解,手機導入 Touch ID 生物特徵驗證就行了。

【創客】芝麻開門~遠端遙控車庫門

慶幸手機還是搭載 Touch ID 的 iPhone 5s。如果是 Face ID,又是安全帽又是戴口罩,恐怕很難在第一時間解鎖車庫門,反而更麻煩。

一個開啟車庫門的簡單動作,到後來連 Touch ID 都用上了。問題就全部解決了嗎?似乎並沒有。幾天之後,又一個問題慢慢浮現。iPhone 5s 的第一代 Touch ID 感應沒那麼好,手指出油、髒污,或是行進中的震動,都會讓 Touch ID 失靈。一旦解鎖失敗,一切又回到原點,回家開個車門又變得麻煩了。

綜合這些日子以來的實際體驗,我想到「地理認證(Geo Authentication)」的方法。在住家附近標出一個範圍,定義遙控手機在範圍內免用 Touch ID。超出範圍才啟用 Touch ID 認證以防萬一。

【創客】芝麻開門~遠端遙控車庫門

使用一段時間下來,地理認證+Touch ID 認證+MQTT 身份認證的三層把關,已經滿足個人大部分的需求。「遙控車庫門」從當初以為應該很簡單的發想、僅需三個 GPIO 控制開關,實施到後來全方面兼顧安全、便利與實用性等等因素,前後也經歷了很長一段時間。

所謂看起來越簡單的東西,真正做起來就越複雜,大概就是這個意思吧。

arrow
arrow

    benjenq 發表在 痞客邦 留言(2) 人氣()