DIY手機App藍芽遙控車

面對台灣接連的天災人禍,希望大家能以正面的態度面對眼前發生的每件事,同心協力一起努力往前走。


據說文創與觀光必須合力將外來訪客推向4,000萬人,才能對台灣GDP造成較顯著的影響,真是條艱辛但又必須走的路。最近「智能家電」、「智慧城市」產業在國際間走紅(據估有1.5兆美元產值),看到對岸許多產、官、學合作推出的相關課程、聯盟與認證制度,

心想再不做些什麼或貢獻些什麼,可能又會落後世界一節了(如之前提到的3D-printed-Prosthetics應用)或許台灣的製造業有機會搭著這班順風車,由Fab成為Incubator、Accelerator,荷包滿滿的既得利益者們應試圖讓更多青年的創意變成創業吧!?

飛上天之前,今天先讓大家了解自己其實也可以很快DIY一部可以用手機App藍芽遙控的車車(基礎原理都一樣的)。看過我們這一系列文章,你會發現Kickstarter裡頭有許多東西都很簡單(尤其是智慧家電),你也可以做(這是術),但重點是創意應用與改善問題的巧思(這是道)相信小朋友們(我們的下一代)若能成長在有更多知識/資源可供使用的基礎下,定能想出更高竿(可以造福人群)的應用。共創價值(有錢大家賺)、走出代工



一些前置作業(知識):



機電與馬達配置:
我們知道一部遙控車,至少要能前進、後退與轉向。因此,若要符合前述功能且將成本降至最低,整個系統至少要兩顆馬達。一顆伺服馬達(~90塊台幣)制前輪轉向,一顆DC馬達(~30塊台幣)驅動後輪。當然你可以更便宜地用1顆萬向輪2DC馬各別達控制左右兩顆輪子,但若沒有減速齒輪的協助,車速會過快(很快撞牆)。而我們今天要學的是控制的精隨,愈慢愈好,因此後輪選用較貴的減速馬達(~150塊台幣),其配置如圖所示。

圖中有點厚度像疊疊樂的板子我把它稱為Blumoduino(是L293D+Arduino+HC06藍芽整合板),可以同時推2顆伺服馬達與4DC馬達,其中發紅光的板子是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(除了燒錄軟體還供ArduinoL293D電源),待軟體測試無誤之後,還得將其移除。上一回有提過,馬達是蠻耗能的原件,因此離線(USB)之後,必須掛載29V DC電池(一顆給Arduino,一顆給L293D)才能動作。




車體規劃與組裝後測試:
歐吉尚很摳,不想花錢,於是撿了一些資源回收的厚紙板與吸管來「自做」車體、轉軸與輪子。「自做」過程相當艱辛,材料行也找不到適當的齒輪組與軸承(可以體會3D Printer的好處),花了好幾個小時,也就不再贅贅述了。



定裝照,可想而知Arduino+L293D+HC06,外加29V DC電池,相當的重哪左邊右邊各來一張,有效控制距離約10~15公尺(有沒有像「蝸牛背著那種重的殼呀?)
 





 前輪轉向控制測試,測試轉角0~180度再回來90度





 轉向測試沒問題之後,接著測試前進跟後退。(吸管不太能承受整體的重量有點Lag卡卡) 





因為前後輪軸承都使用吸管,因此這次作品Run不到5分鐘輪之就散了但是就軟/硬體與藍芽控制而言,結果仍然是成功的好啦算我硬掰

用文字命令控制車子,不撞牆才怪!? 下次手機App會使用Android系統內建的3軸加速感應器重寫(Reuse很多回合了,有點不捨! 但這樣操控比較直覺,小朋友都能操控),並且將輪子改成機械甲蟲雪恥! (課本有的也不再贅述)