前一陣子,一位外國朋友看到我做的用手機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輸出電流大約只有40m A,所以上述,除了伺服馬達可直接接Arduino DC電源並以PWM信號驅動外,其餘都須靠電晶體放大器來產生足夠的電流驅動。
例如ULN2003,是高耐壓、大電流驅動陣列,包含7個達靈頓電晶體單元,單獨每個單元驅動電流最大可達350m A。
ULN2003內部結構
但若要使用市售給步進馬達的用的ULN2003驅動板,則只剩下1~4組達靈頓電晶體單元可以使用。且達靈頓電晶體並不能控制電流方向,使用這類驅動電路,馬達就只能往單一方向運動。
ULN2003
若要讓馬達能夠做正/反轉向控制,則需要搭配H-橋式(H-Bridge)驅動,例如L293D。我到電子材料行詢價過,單顆L293D跟我要150元台幣,還要待料。瘋了! 我直接買L293D驅動板,內含兩顆L293D與1顆74HCT595移位暫存器(Shift Register)來擴充微控制器的腳位不夠用的問題,才180元台幣。可以同時接4顆DC馬達與2顆伺服馬達。
L293D橋式驅動板(含2個L293D與1個74HCT595N)
一顆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 (達靈頓放大器)
| ||
L293D Board (H-橋式電機驅動器)
|
180~250
| |
DC直流馬達(普通)
|
30
| |
減速馬達(普通)
|
150
| |
步進馬達(普通)
|
90~300
|
7~20
|
伺服馬達(普通)
|
70~90
|
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,在每次堆積藍芽串列信息時多等待了5m s。這樣子比較保險,因為相較藍芽預設的9600bps鮑率,Arduino每次對loop的polling明顯頻率快多了! 有時候我們直接用實體Rx/Tx取代SoftwareSerial的時候,感覺更明顯(Arduino更不會Lag)! 其次,對於Servo的控制,我發現每次動作完(驅動到特定轉角之後)若不detach掉,PWM好像還是不停的做動? 為了省電,只好每次動作完將Servo detach掉,但請記得給Servo馬達一些時間,例如500m s,不要才下了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已成為顯學,深圳Incubator、Accelerator是直接助力,你只要一想到Idea,一個月後淘寶就有商品在賣了! 現在這個世界,是跟國際在賽跑的! 台灣! 你要加油! 連製造業轉型(由Fab到Incubator、Accelerator)你都輸了!
我發現「自做」飛行器前! 還是先讀一下幼兒園大班,DIY一個手機App遙控車好了~