2015年12月29日 星期二

02162411_劉永健_Week15_期末作品製作過程記錄

期末作品製作過程記錄


伺服馬達轉向測試

使用Arduino uno+變阻器+伺服馬達進行轉向測試
2015.12.21

藍牙通訊測試(HC-06)

   搭載

   Bluetooth HC-06


L293D Board (H-橋式電機驅動器)


進行藍牙連接伺服馬達進行轉向的測試


  2015.12.23



測試影片

(只會轉向)




車體拼裝組合+自帶電源

2016.1.2









#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;
}


沒有留言:

張貼留言