2014年9月14日日曜日

マイコンカー製作(6)~プログラム作成~

前回発注した基板が届くまでにプログラムを作成しなければならない。

今回使用するマイコンはLPC1114FN28でmbedのオンラインコンパイラを使用する。

無線通信にbluetoothをしようするので送信機はスマートフォンでを使う。
まずテスト動作をしたいのでPLAYストアにあったアプリ「Bluetooth Serial Controller」を使用する。
テスト動作がうまくいけばコントローラも自前でなんとかしたい。

今回書いたプログラムは以下のとおり

#include "mbed.h"

DigitalOut led(LED1);
DigitalOut um66t(dp9);
DigitalOut l1(dp4);
DigitalOut l2(dp6);
DigitalOut r1(dp26);
DigitalOut r2(dp25);
PwmOut lpwm(dp2);
PwmOut rpwm(dp24);
Serial ctrl(dp16,dp15);

char lold = 's',rold = 's',val;

void motorL(char action,float pwm){
    if(action == 'f'){
        if(lold == 'r'){
            l1 = 1;
            l2 = 1;
            lpwm = 1.0;
            wait(0.2);
        }
        l1 = 1;
        l2 = 0;
        lold = 'f';
    }else if(action == 'r'){
        if(lold == 'f'){
            l1 = 1;
            l2 = 1;
            lpwm = 1.0;
            wait(0.2);
        }
        l1 = 0;
        l2 = 1;
        lold = 'r';
    }else if(action == 'b'){
        l1 = 1;
        l2 = 1;
        lold = 'b';
    }else{
        l1 = 0;
        l2 = 0;
        lold = 's';
    }
    lpwm = pwm;
}

void motorR(char action,float pwm){
    if(action == 'f'){
        if(rold == 'r'){
            r1 = 1;
            r2 = 1;
            rpwm = 1.0;
            wait(0.2);
        }
        r1 = 1;
        r2 = 0;
        rold = 'f';
    }else if(action == 'r'){
        if(rold == 'f'){
            r1 = 1;
            r2 = 1;
            rpwm = 1.0;
            wait(0.2);
        }
        r1 = 0;
        r2 = 1;
        rold = 'r';
    }else if(action == 'b'){
        r1 = 1;
        r2 = 1;
        rold = 'b';
    }else{
        r1 = 0;
        r2 = 0;
        rold = 's';
    }
    rpwm = pwm;
}

void manual(){
    if( ctrl.readable() == 1){
        val = ctrl.getc();
    }  
    if(val == '1'){
        led = 1;
        motorL('f',0.2);
        motorR('f',1.0);
        led = 0;
    }else if(val == '2'){
        led = 1;
        motorL('f',1.0);
        motorR('f',1.0);
        led = 0;
    }else if(val == '3'){
        led = 1;
        motorL('f',1.0);
        motorR('f',0.2);
        led = 0;
    }else if(val == '4'){
        led = 1;
        motorL('r',1.0);
        motorR('f',1.0);
        led = 0;
    }else if (val == '5'){
        led = 1;
        motorL('s',0);
        motorR('s',0);
        led = 0;
    }else if (val == '6'){
        led = 1;
        motorL('f',1.0);
        motorR('r',1.0);
        led = 0;
    }else if (val == '7'){
        led = 1;
        motorL('r',0.2);
        motorR('r',1.0);
        led = 0;
    }else if (val == '8'){
        led = 1;
        motorL('r',1.0);
        motorR('r',1.0);
        led = 0;
    }else if (val == '9'){
        led = 1;
        motorL('r',1.0);
        motorR('r',0.2);
        led = 0;
    }else if (val == '0'){
        um66t = !um66t;
        val = 'r';                
    }
    wait(0.5);    
}


int main(){
    led = 0;
    um66t = 0;
    motorL('s',0.0);
    motorR('s',0.0);
    ctrl.baud(115200);
    val = '5';
 
    while(1){
         manual();
    }
}


RN42-XVPから受けた数字で動作を行う。

1=前進左折
2=前進
3=前進右折
4=左旋回
5=停止
6=右旋回
7=後退左折
8=後退
9=後退右折
0=メロディオンオフ

安全のため、モーターの回転方向が切り替わる際に(正転から逆転または逆転から正転)0.2秒間モーターを停止させた。

0 件のコメント:

コメントを投稿