遠端鐵捲門遙控自幹計畫

前言

時間過得很快,距上一篇文章已經事隔三年。

研究所畢業之後發生了許多阿哩阿雜的事情,發了兩篇文之後,接著就停更,一停就是三年。

過了這段時間,心情分享也是廢文,為了避免Google AdSense還是繼續把本Blog當作缺乏價值…所以我還是保持以前的作風,發發對世界有點益處的文章…

 

會做這個Side Project也是有原因的,自從2020年1月再次捏LP訂下坐落於新埔與竹北交界處的「馬來西亞式」透天之後,就有了這個概念發想。

因為一樓最外圍人車出入全靠一個靜音高速鐵門,本人常常丟三落四出門只想帶手機,常常不喜歡不帶鑰匙就不帶,連遙控器也不帶。

所以當初就開始研究了一下鐵捲門控制器,不過也僅於網路上的資料研究,因為壓根兒房子還沒蓋好。

 

時光匆匆,1年過後,2021年1月交屋了,我第一件事情就是拆開鐵捲門控制器的外殼,看到控制接點時鬆了一口氣。

上面的象形文字淺顯易懂,再拿條單芯線,接觸GND+上下停個三個點,就可以輕鬆透過外部訊號控制來操控鐵捲門。

「非常簡單,大概就是高職生能輕鬆秒殺的專案」-我心想

 

心中最大的石頭放下了,因為這個環節是我最沒有把握的,如果沒有控制點,勢必要用其他手段(例如物理按面板開關這種機械結構XD)

再來是要開發這個專案用的平台,最早其實就想到我還有庫存聯發科當年的開發版,Linkit Smart 7688 Duo。

這片開發版已經被我從研究所碩二冷凍到現在,因為一直沒有甚麼非用他不可的理由…,再加上當年我是 App+藍芽+開發版做 remote control 這塊地流派,所以對於這種跑 Linux配 Arduino 的平台就沒甚麼想法…

時空背景不同,回到五年後的今天,如今我已經掌握簡單的 Web 開發 & 熟悉 Networking,不如就拿他來自幹整套系統吧!

初期發想

最初在整個環節由上往下看的想法與使用者情境是:

  1. 使用者可以透過任何具備瀏覽器的裝置控制鐵門(且具備基本驗證機制)->所以會有一個前端,但我只會HTML,所以不會有用上甚麼炫泡Bootstrap
  2. 有前端就要有後端,畢業後第一份全職,在Addweup跟一堆全端大神偷學了Python flask,輕量簡單,又是Python一家親,首選就是他。
  3. 再往下接,就是要準備碰到MCU&電氣訊號了,我好久沒寫Arduino,所幸有pyfirmata這玩意兒,配上Arduino的Firmata protocol firmware,直接可以從Flask那一隻操控Arduino做動
  4. GPIO訊號控制繼電器,來透過控制接點控制鐵捲門動作。

 

OK,理想上軟體都蠻完美的,軟體雛形+7688重新整理起來的部分只花了一個晚上約3小時驗證OK。

但橋接硬體的時候反而忽略了7688那貧弱的Fade out current…(就算有MCU也無用,邏輯閘設計的Spec完全不是Maker取向XD),完全無法直推繼電器,所以後來花了額外的時間處理電晶體放大電路讓7688的GPIO訊號能放大到推得動繼電器。

再來是聯發科看起來已經放棄7688了(也停產了),想當然爾,上面的Firmware也已經從2016年至今沒有更新。不知道是心理因素還是怎麼樣,總覺得7688在這些應用堆起來之後,相對系統不是很穩定,長時間運行(>4天),就會自己hang機…,且一堆系統特性都有點怪小怪小的,例如crontabe service還要自己在rc.local每次開機啟動,就算註冊service auto start也沒用,或者NTP開機也不會自動update時間等等莫名其妙的事情。

因為我有兩片,換了一片狀況也一樣,所以萌生刷機的念頭。好家在7688依然能刷上最新的OpenWrt!

刷完之後真的穩定非常多。

而完成沒多久,家裡胖豬直接許願想要Hey Siri…,原本以為很困難,但結合現成的HomeBridge橋接,省掉接去Apple Home Kit跟Google Home的繁瑣手續…只花了2個小時就橋接好這個功能。不過就多了一個Raspberry Pi當作跑HomeBridge的平台,但我本來就打算在區網內Always-on一台RPI,我這邊用RPI3來做這件事情。

最近又花了一點時間想嘗試加入WiFi scan到特定SSID跟MAC後開基的功能,但應該是7688的網卡無法在掃描時維持網路連線,所以如果縮短掃描頻率,反而讓手動控制的request packet難以回應…,測試階段還被這樣鎖在門外兩次-.-

所以code會留著,但該thread不會打開,預計之後嘗試在裝另一個USB WiFi網卡掃掃看能不能避掉這個問題。

 

一路下來,其實硬體可以簡化只需一個Raspberry Pi就好,但基於HW failedover(事實上前期7688穩定度還差於RPi許多…)的理由還有廢物利用…所以還是維持7688+RPI兩平台的架構。但軟體其實要移植到RPI可以說是無痛的~,不過就交給想要幹這件事情的人自行研究啦~,難的路都走過,單平台其實是更簡單的作法。

 

以上,時空背景解釋完畢,接下來整理記錄一下整個開發脈絡了,不過順序會調整一下,畢竟冤枉路我走就好…

實作

首先要來準備一些材料

  1. MTK LinkIt Smart 7688 Duo x1
  2. 3.3V UART Adapter
  3. Raspberry Pi x1 (建議2代含以後,可能裝HomeBridge會比較順利一些)
  4. LEG-3繼電器 x3
  5. 電晶體 x3 (2N5551或者其他替代,足夠推得動你的繼電器就好)
  6. 二極體 x3
  7. 電阻 x3 (200歐姆,注意7688每根腳的扇出電流不一樣,所以最好是有可變電阻先做fine tune XD)

軟體部分

首先先升級7688為首要優先

直接借用參考: https://blog.abysm.org/2018/12/linkit-7688-upstream-openwrt/

升級後存取

升級後預設 Wi-Fi 是停用的,有兩種方式可以存取 7688:

  1. 透過 3.3V UART adapter 接 7688 的 UART console
  2. 透過 breakout board 接 Ethernet

走 Ethernet 的話大家都很熟了,可以直接連到 LuCI 做後續設定。

走 UART console 的話就得用到 UCI。在 command-line 介面下如下的指令

1
2
uci set wireless.radio0.disabled=0
service network reload

就會暫時性地啟用 Wi-Fi,開出一個 SSID 叫 OpenWrt 的 AP,讓我們可以連進 LuCI。為什麼說暫時性呢?因為我們沒有跑

1
uci commit

所以重開之後,Wi-Fi 又會回到停用狀態。如果希望永久啟用 Wi-Fi,可以加跑上面這個指令,或是在重開前以 LuCI 將 Wi-Fi 調整為啟用。

這種有現成文章的,我轉貼重點部分避免來源失效,另外需要具備OpenWrt相關知識,這部分Config才會順利喔~,另外升級完之後,也可以Station Mode + Client Mode一起了,比原廠的FW好用太多XDDD

升級完成後,準備7688的軟體運行環境

安裝SFTP
opkg update
opkg install vsftpd openssh-sftp-server
/etc/init.d/vsftpd enable
/etc/init.d/vsftpd start
安裝Python 3 & flask & pyfirmata
opkg install python3
opkg install python3-pip
pip3 install flask
pip3 install flask-cors
pip3 install pyfirmata
然後燒Firmata到7688的Arduino 上面

https://docs.labs.mediatek.com/resource/linkit-smart-7688/en/tutorials/linkit-smart-7688-duo/using-firmata-with-python

注意,Firmata serial要改&&while括號也要改,這樣才能跟7688 SOC對上:

  Serial1.begin(57600); 
  Firmata.begin(Serial1); 
  while (!Serial1) {
    ; // wait for serial port to connect. Needed for ATmega32u4-based boards and Arduino 101
  }
到我的Github repo 抓取網頁&python:

https://github.com/thkaw/irdc

 

透過SFTP把irdc_v1.html放去/www底下

然後irdc_v3.py要做點修改再放在/root底下

magic_sets = ["TaiwanNo1"]

這邊舉個簡單的驗證機制,[]裡面可以放你要控制的密碼,可以支援多組,當然這東西是明碼且沒有加密
為的是好讓程式簡化,如果要拿去做商業用途,這段邏輯請自行強化~

你接著可以手動執行這個腳本

cd /root && python3 ./irdc_v3.py

7688不快,起server要一點時間(約30秒),之後你可以透過瀏覽

http://[你的7688 local ip]/irdc_v1.html?magic=TaiwanNo1

可看到介面出現,理論上你可以透過AC_ON/OFF的按鈕驗證你前面串的內容有沒有做對,有的話應該會看到7688 LED 13的燈可以控制開關

如果到這邊都順利,恭喜你~可以繼續往硬體的部分前進,之後再回頭看HomeBridge這段

HomeBrige在RPI上建置

照這官方步驟安裝:

https://github.com/homebridge/homebridge/wiki/Install-Homebridge-on-Raspbian

或著可以直接去官方下載已經裝好的Image,我是選前者,如果是新手可以選後者省事。

至於詳細HomeBridge的操作,官方文件寫得很詳細了~不贅述

需要安裝兩個Plugin

  1. Homebridge Http Switch,用來向Flask 打RESTful API
  2. Homebridge Google Smart Home,用來連上Google Home

至於Apple HomeKit, 他本來就是base on apple home kit,所以哀鳳直接家庭App掃QR code添加就可以

 

第一個Plugin比較需要特別講,我也直接貼範例上來

可以看到,直接透過POST去打API接口,跟網頁操作後端其實是一樣的道理

這樣會在Home kit跟Google Home看到四顆開關,要注意的是每次調整Plugin Setting,務必按HomeBridge管理頁面右上角齒輪->Restart Server重新reload Homebridge。

也可以使用語音控制

OK google, 打開開啟鐵捲門

沒錯,因為裝置名稱是先想好給HomeKit用

但在Siri上,就可以

Hey, Siri,開啟鐵捲門

這完全牽扯到兩家語意辨識的設計。

其實這個Plugin超爆強,還有支援超多種Profile,有興趣的人自己研究~~~

 

另外小小抱怨一下,HomeKit需要有Homekit Gateway才能由網際網路控制,也就是說你的區域網路要有一台Ipad或者HomePod…不然都只能做區網下控制。相較於Google Home,到哪只要有網路都可以~

硬體部分

硬體接線圖非常簡單,但本人不(ㄌㄢˇ)會(ㄉㄜ˙)畫Layout,直接幹別人的圖

來源:https://makerpro.cc/2019/10/the-specification-and-activation-of-relay/

基本上R1一開始可以用可變電阻,去調整阻值控制IB電流大小,另外5V改接成3.3V(可從7688 3.3v腳拉出來)

以及我有在三個電晶體C極拉線出來,到一顆共陽極的RGB三色LED各色腳位去當狀態指示燈,低態動作

接腳對應7688 Duo的接腳位置:

  • up_relay_pin = 2
  • stop_relay_pin = 3
  • down_relay_pin = 5
  • ac_relay_pin = 13
  • up_led_pin = 10
  • stop_led_pin = 11
  • down_led_pin = 12
 
 
簡單的插啊插拔阿拔焊阿焊,就搞定惹
 
 
示範影片:
 
 

後記

首先就是,出社會之後,做Side project的時間被切得非常碎,按照我現在的功力+以前學生的閒度,大概只需要花1個週末就能專心搞定。總共耗時下來+打文章的時間20小時都不到。

但因為工作的關係,周末又有其他安排,頂多抽空幾個下班晚間或者周末的部分時間,從3月中慢慢搞了1個多月才搞得差不多。

關於這個project後面todo list,大概還有WiFi Scan自動開門的機制穩定性要在改善的空間~,之後有改版就直接修改在本文。

 

其實市面上類似的替代品很多,例如Sonoff,但…自幹無價,硬體材料成本總共花不到1000,(7688是最貴的但都是庫存),不過時間也是無價就是惹QQ。

無論如何,也是把我底層電路的知識重新renew了一下,也把好久用的工具重新整理一番起來用。

接下來比較大的side project可能就是太陽能發電系統了,不過比較偏向現成零組件買回來拼拼湊湊,技術含量就比較偏向「缺乏價值的內容」了。

 

真的有閒才會記錄下來~

以上。

 

此專案謝謝阿迪&許禎祐學弟的幫忙+胖豬的許願 🙂

Leave a comment

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料