面對台灣接連的天災人禍,希望大家能以正面的態度面對眼前發生的每件事,同心協力一起努力往前走。
據說,文創與觀光必須合力將外來訪客推向4,000萬人次,才能對台灣GDP造成較顯著的影響,真是條艱辛但又必須走的路。最近「智能家電」、「智慧城市」產業在國際間走紅(據估有1.5兆美元產值),看到對岸許多產、官、學合作推出的相關課程、聯盟與認證制度,…
心想再不做些什麼或貢獻些什麼,可能又會落後世界一節了(如之前提到的3D-printed-Prosthetics等應用)。或許台灣的製造業有機會搭著這班順風車,由Fab成為Incubator、Accelerator,荷包滿滿的既得利益者們應試圖讓更多青年的創意變成創業吧!?
飛上天之前,今天先讓大家了解自己其實也可以很快DIY一部可以用手機App藍芽遙控的車車(基礎原理都一樣的)。看過我們這一系列文章,你會發現Kickstarter裡頭有許多東西都很簡單(尤其是智慧家電),你也可以做(這是術),但重點是創意、應用與改善問題的巧思(這是道)。相信小朋友們(我們的下一代)若能成長在有更多知識/資源可供使用的基礎下,定能想出更高竿(可以造福人群)的應用。共創價值(有錢大家賺)、走出代工。
一些前置作業(知識):
- 關於手機App藍芽控制程式與Arduino的通訊,請參閱: Android與Arduino的藍芽通訊、App簡訊廣告看板、用手機App遙控家電開關、實作App遠程遙控智慧家電控制中心等。
- 關於Arduino馬達簡介與機電控制原理,請參閱: 實作App遠程遙控門禁管制。
- 關於Arduino機電與馬達控制,請參閱: DIY實作Blumoduino控制板。
機電與馬達配置:
我們知道一部遙控車,至少要能前進、後退與轉向。因此,若要符合前述功能且將成本降至最低,整個系統至少要兩顆馬達。一顆伺服馬達(~90塊台幣)控制前輪轉向,一顆DC馬達(~30塊台幣)驅動後輪。當然你可以更便宜地用1顆萬向輪,加2顆DC馬各別達控制左右兩顆輪子,但若沒有減速齒輪的協助,車速會過快(很快撞牆)。而我們今天要學的是控制的精隨,愈慢愈好,因此後輪選用較貴的減速馬達(~150塊台幣),其配置如圖所示。
圖中有點厚度像疊疊樂的板子我把它稱為Blumoduino(是L293D+Arduino+HC06藍芽整合板),可以同時推2顆伺服馬達與4顆DC馬達,其中發紅光的板子是HC06藍芽模組。
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
|
減速馬達(普通)
|
150
|
4~6
|
伺服馬達(普通)
|
70~90
|
12~16
|
厚紙板與吸管
|
NA
|
NA
|
組裝前測試:
Android App手機程式規劃
手機程式沿用之前的App藍芽控制程式(BTCom),主要測試藍芽通訊、機電板驅動功能、後輪的前進/後退與前輪伺服馬達的轉角控制。Coding、安裝與執行方式,請參閱前幾回的Android與Arduino的藍芽通訊、App簡訊廣告看板、用手機App遙控家電開關、實作App遠程遙控智慧家電控制中心等,不再贅述。
Arduino Uno端系統與程式規劃
仍然沿用之前的DIY實作Blumoduino控制板的程式,手機傳給Arduino的指令格式也不變,提供4個指令,分別為f(前進)、b(後退)、a(轉角)與x(停止)。
<Command><逗號><轉速0~255>
例如:
f,100 前進,轉速100
b,150 後退,轉速150
a,90 前輪轉動90度
x, 停止
關於L293D機電控制的部份,為簡化程式碼我們直使用AF_Motor函式庫,想知道更多細節的人請參考上一篇DIY實作Blumoduino控制板。
#include <Servo.h>
#include <AFMotor.h>
#define MAX_UARTCMDLEN 128
#define SERVO1_PWM 10 // Pin10/SERVO1_PWM, and Pin9/SERVO2_PWM for L293D motor shield
// up to 128 bytes UART command received from the Android system
byte uartCmdBuff[MAX_UARTCMDLEN];
int uartCmdLen = 0; // received BT command length
// Higher frequencies produce less audible hum in operation, but may result in lower torque
// The valid values for speed are between 0 and 255.
AF_DCMotor motor(1,MOTOR12_2KHZ); // DC減速馬達, 1KHZ會有鳴叫聲
Servo servo; // 伺服器馬達, 紅色(VDD), 棕色(GND), 橙色(Signal)
void setup() {
Serial.begin(9600); // can connect with the bluetooth HC_06, after downloading the software
servo.attach(SERVO1_PWM);
servo.write(0); // 設置旋轉的角度
motor.run(RELEASE);
}
void loop() {
if ( listenSerialCmd()>0 )
executeSerialCmd();
}
void executeSerialCmd() {
char cmd[MAX_UARTCMDLEN];
char* p;
int value = 0; // angle or speed value
// parse UART command
sprintf(cmd,"%s",uartCmdBuff);
if ( (p=strchr(cmd,','))==NULL )
return;
*p = '\0';
// get speed
value = atoi(p+1);
Serial.print("Dir:"); Serial.print(cmd); Serial.print(", Value:"); Serial.println(value);
// Be friendly to the motor: stop it before reverse.
// DC馬達的轉速反應與程式的RPM不是線性的
switch ( cmd[0] ) {
case 'a':
servo.write(value); // 設置旋轉的角度
break;
case 'f': // DC motor forward
motor.run(RELEASE);
motor.setSpeed(value);
motor.run(FORWARD);
break;
case 'b': // DC motor backword
motor.run(RELEASE);
motor.setSpeed(value);
motor.run(BACKWARD);
break;
case 'x':
default:
motor.run(RELEASE);
break;
}
}
int listenSerialCmd() {
char tmp;
uartCmdLen = 0;
memset(uartCmdBuff,0,MAX_UARTCMDLEN);
while( Serial.available()>0 ) {
if( (tmp=Serial.read())=='O' ){
uartCmdLen = 0;
}
uartCmdBuff[(uartCmdLen++)%MAX_UARTCMDLEN] = tmp;
delay(5); // wait RX signal
}
return uartCmdLen;
}
|
使用命令列指令(BTCom)控制前後輪(DC減速馬達)轉速,並測試前輪(伺服馬達)轉角。
還沒結束! 因為上頭還插著USB線(除了燒錄軟體還供Arduino與L293D電源),待軟體測試無誤之後,還得將其移除。上一回有提過,馬達是蠻耗能的原件,因此離線(USB)之後,必須掛載2顆9V DC電池(一顆給Arduino,一顆給L293D)才能動作。
車體規劃與組裝後測試:
歐吉尚很摳,不想花錢,於是撿了一些資源回收的厚紙板與吸管來「自做」車體、轉軸與輪子。「自做」過程相當艱辛,材料行也找不到適當的齒輪組與軸承(可以體會3D Printer的好處),花了好幾個小時,也就不再贅贅述了。
定裝照,可想而知Arduino+L293D+HC06,外加2顆9V DC電池,相當的重哪! 左邊右邊各來一張,有效控制距離約10~15公尺 。(有沒有像「蝸牛背著那種重的殼呀…」?)
前輪轉向控制測試,測試轉角0~180度再回來90度。
轉向測試沒問題之後,接著測試前進跟後退。(吸管不太能承受整體的重量,有點Lag卡卡)
因為前後輪軸承都使用吸管,因此這次作品Run不到5分鐘輪之就散了! 但是就軟/硬體與藍芽控制而言,結果仍然是成功的! 好啦,算我硬掰…
用文字命令控制車子,不撞牆才怪!? 下次手機App會使用Android系統內建的3軸加速感應器重寫(Reuse很多回合了,有點不捨! 但這樣操控比較直覺,小朋友都能操控),並且將輪子改成機械甲蟲雪恥! (課本有的也不再贅述)