實作App遠程遙控門禁管制

前一陣子,一位外國朋友看到我做的用手機App遙控家電,問我「那我可以用手機App遠程開/關家裡的門鎖嗎?

記得前一陣子Kickstarter有一個創意,就是屋子的主人可以動態的改變門鎖的密碼,並且透過手機App開鎖。屋主可以根據需求(比方說辦了一個Party)只設定某些好友可以收到門鎖密碼,收到密碼的人可以直接以手機App開鎖(Party結束門鎖密碼也可以失去效力)

其實朋友與Kickstarter上的這兩個Ideas類似,只是後者有經過優化的Application包裝與詮釋。能不能做答案是肯定的,而且超極簡單!

最近那種文章貼來貼去的網站,「將廣告夾帶於引人注目的文章、影片等媒介獲利,還可依照資訊性質篩選刊登廣告的類別、擷取分享者的資訊做Big data連結分析免費市場圖得就是使用者自身的資訊(! ...包含這句話也是轉貼的),如雨後春筍般(傾巢而出,多到眼花撩亂),連原本附屬於一些知名網站的寫手也都自立門戶,

話題又扯遠了全球網路廣告營收也不過430億美元(我想只有前20%入口網站能賺到錢),半導體這將超過台灣半世紀的痛,好歹也有3400億美元產值(Big-Data提升5% Yield, Competiveness, Reliability, Productivity and etc.相對容易得多!)。因此,我們還是做智慧城市好了據估有1.5兆美元產值,有錢大家賺,「走出代工、共創價值。」

剛好想自做飛行器,但是心想都還不會走路怎麼可能飛上天呢二話不說,立馬買了一堆馬達與驅動器回來開始研究(但沒想到馬達原來這麼貴啊!?)關於馬達與驅動器,網路上有許多更詳細的介紹。

一堆馬達的合照


由於經費有限,因此只針對所買的馬達(普通型)依照功能性分成四類:

功能性
名稱
附註
提供一般正/反向轉動
DC直流馬達
無法精準控制RPM
含減速齒輪提高扭力
減速馬達
低速轉
提供較精準的RPM控制
步進馬達
低速轉
提供較精準的轉向角度控制
伺服馬達
0~180度固定轉向



其中以DC直流馬達價位最便宜(~台幣30),提供一般正/反向轉動,但無法精準控制每分鐘的轉速(RPM)。雖然PWM信號提供0~255解析度,或許我買的是便宜貨每一顆馬達的反應都不是線性的但掛在遙控汽車上跑夠用了!

 
DC直流馬達(線要自己焊)


減速馬達因為內含減速齒輪組,藉此可以提高扭力,轉速較低不適合做競速車用,但蠻適合用來示範手機App遙控車,因為直接用DC直流馬達會跑太快,而且Arduino+DC電池組還蠻重的。價格相對較貴(一顆約150~200元台幣),感覺直接買四驅車架還比較划算(四顆馬達含輪子跟車架約320~400元台幣)

內含齒輪的減速馬達


步進馬達(Stepper)通常以四個Phase驅動,可以使馬達以小角度逐步轉動進而控制轉速,但轉速極慢,感覺較適合需要較精準RPM控制系統,如時鐘秒針指示之類的。

步進馬達


而伺服馬達(Servo),內含回授控制電路,可以提供較精準的轉向角度控制,較適合做為機器人手臂。可以再細分連續轉動與固定半週轉動兩種,而我們今天就用可精準控制0~180度轉角的伺服馬達來處理門閂開關的示範。

 
固定半週轉動(可精準控制0~180度轉角)的伺服馬達


其實馬達是蠻耗電的原件,而Arduino Uno輸出電流大約只有40mA,所以上述,除了伺服馬達可直接接Arduino DC電源並以PWM信號驅動外,其餘都須靠電晶體放大器來產生足夠的電流驅動。

例如ULN2003,是高耐壓、大電流驅動陣列,包含7個達靈頓電晶體單元,單獨每個單元驅動電流最大可達350mA



 
ULN2003內部結構


但若要使用市售給步進馬達的用的ULN2003驅動板,則只剩下1~4組達靈頓電晶體單元可以使用。且達靈頓電晶體並不能控制電流方向,使用這類驅動電路,馬達就只能往單一方向運動。

ULN2003


若要讓馬達能夠做正/反轉向控制,則需要搭配H-橋式(H-Bridge)驅動,例如L293D。我到電子材料行詢價過,單顆L293D跟我要150元台幣,還要待料。瘋了我直接買L293D驅動板,內含兩顆L293D174HCT595移位暫存器(Shift Register)來擴充微控制器的腳位不夠用的問題,才180元台幣。可以同時接4DC馬達與2顆伺服馬達。

L293D橋式驅動板(2L293D174HCT595N)


一顆L293D提供兩組H-橋驅動,可推兩組DC馬達做雙向轉動。
L293D內部結構


細部的工作原理非常簡單,我用簡圖表示,透過便換H-Bridge接腳對互換輸入高/低電位,即可控制電流流經馬達的方向(控制轉向),而致能接腳能以PWM信號控制轉速。課本有的,我就不寫了!…


H-Bridge控制馬達轉向




BOM (我們把虛擬通路也一起放進來Survey, 相同型號下台灣價格太黑了!)

項目(不含運費)
台灣(台幣)
淘寶(人民幣)
Arduino UNO R3
290~450
12~40
Bluetooth HC-06
210~350
17~30
ULN2003 Board (達靈頓放大器)
 70~150
 3~7
L293D Board (H-橋式電機驅動器)
180~250
 12~21
DC直流馬達(普通)
30
 1.2
減速馬達(普通)
150
 4~6
步進馬達(普通)
90~300
7~20
伺服馬達(普通)
70~90
 12~16






Android App程式規劃
Android手機程式仍然跟上一回一樣使用BTCom,程式碼不用變(非常環保,重複利用)Coding、安裝與執行方式,請參閱前幾回的Android與Arduino的藍芽通訊。如果懶得寫程式可以使用下面QR Code下載,若有Bug煩請告知,感恩!



不過這支App會被Android手機歸屬於來路不明的程式,前請先將安全性設為允許不明來源的安裝,請放心不會收集用戶端資訊的安裝完成請記得取消允許不明來源的安裝,以免產生安全漏洞。




Arduino Uno端系統與程式規劃
繼上好幾回前BTCom Project--用Android手機傳送命令(簡訊)到Arduino板子後。這一回,我們仍然沿用BTCom App的藍芽控制,App與門鎖的通訊協定(手機傳給Arduino的指令格式)也不變,但新增加一個設備名稱「door(看吧這就是之前所說的「彈性」,這接下來的數回不同應用中,手機App根本不同改!)

<DeviceName><逗號><ON/OFF>
例如:
door,on   開門
door,off   關門


Arduino BTCom範例程式:
其中,我稍微修改了函式listenBTCmd,在每次堆積藍芽串列信息時多等待了5ms。這樣子比較保險,因為相較藍芽預設的9600bps鮑率,Arduino每次對looppolling明顯頻率快多了有時候我們直接用實體Rx/Tx取代SoftwareSerial的時候,感覺更明顯(Arduino更不會Lag)! 其次,對於Servo的控制,我發現每次動作完(驅動到特定轉角之後)若不detach掉,PWM好像還是不停的做動為了省電,只好每次動作完將Servo detach掉,但請記得給Servo馬達一些時間,例如500ms,不要才下了Servo.write命令就立刻detach,不然Servo直接擺爛不做事給你看。

#include <SoftwareSerial.h>
#include <Servo.h> // 我們用伺服器馬達當門控開關

#define MAX_BTCMDLEN 128
#define BTSW_Door     2  // pin2  BlueTooth Switch for Door

// 建立一個軟體模擬的序列埠
SoftwareSerial BTSerial(10,11); // HC-06/TX-->PIN10(Arduino/RX), HC-06/RX-->PIN11(Arduino/TX)
Servo myServo; // 伺服器馬達

byte btCmdBuff[MAX_BTCMDLEN]; // up to 128 bytes BT command received from the Android system
int btCmdLen = 0; // received BT command length

void setup() {
    //Serial.begin(9600); // serial port for debugging
    BTSerial.begin(9600); // 建立藍芽軟體串列埠
}

void loop() {
    listenBTCmd();
    executeBTCmd();
}

void executeBTCmd() {
    char cmd[MAX_BTCMDLEN];
    char* p;
    int angle = 0;
   
    if ( btCmdLen>0 ) {
        // parse BT command
        sprintf(cmd,"%s",btCmdBuff);
        if ( (p=strchr(cmd,','))==NULL )
            return;
        *p = '\0';
        if ( strcmp("door",cmd)!=0 )
            return;
        // execute BT command
        angle = atoi(p+1);
        myServo.attach(2);
        myServo.write(angle); // 設置旋轉角度開門
        delay(500);
        myServo.detach(); // to save power
    }
}

void listenBTCmd() {
    char tmp; 
    btCmdLen = 0;
    memset(btCmdBuff,0,MAX_BTCMDLEN);
    while( BTSerial.available()>0 ) {
        if( (tmp=BTSerial.read())=='O' ){
            btCmdLen = 0;
        }
        btCmdBuff[(btCmdLen++)%MAX_BTCMDLEN] = tmp;
        delay(5); // wait 5ms for Rx signa
    }
}

void showBTCmd() {
    char cmd[MAX_BTCMDLEN];
    if ( btCmdLen>0 ) {
        sprintf(cmd,"%s",btCmdBuff);
        Serial.println(cmd);
    }
}


實驗結果 不錯,其實我在家裡每個房間關上房門都還Sense得到藍芽信號(約10~15公尺)






當然!,不是真的直接用Servo的塑膠手臂去做門閂囉而是要用齒輪去帶動金屬門閂




看到這兒,你有沒有覺得你也可以至Kickstarter上架但其實不需要因為Maker已成為顯學,深圳IncubatorAccelerator是直接助力,你只要一想到Idea,一個月後淘寶就有商品在賣了現在這個世界,是跟國際在賽跑的台灣你要加油連製造業轉型(FabIncubatorAccelerator)你都輸了!


我發現「自做」飛行器前還是先讀一下幼兒園大班,DIY一個手機App遙控車好了~