シリアルモニタに @角度<CR><LF> と入力すると、その角度にサーボが回るプログラムです。

Dependencies:   Servo mbed-dev

Hybrid_ServoMotor.cpp

Committer:
Gaku0606
Date:
2017-01-18
Revision:
0:2d7d98ccddfa

File content as of revision 0:2d7d98ccddfa:

#include "mbed.h"
#include "Servo.h"

RawSerial pc(USBTX, USBRX);

#define SERVO1_PIN p22

#define MAX_PULSE 0.00245//[s]
#define MIN_PULSE 0.00065//[s]
Servo servo1(SERVO1_PIN, MAX_PULSE, MIN_PULSE);

DigitalOut led1(LED1);
DigitalOut led2(LED2);
DigitalOut led3(LED3);
DigitalOut led4(LED4);

DigitalOut nicrom(p21);

void angleChange(){
    const int BUFFER_SIZE = 16;
    static float angle = 0;
    static char buff[BUFFER_SIZE] = {'\0'};
    static int count = 0;
    static bool startFlag = false;
    
    char temp = pc.getc();   
    if(temp == 'u') nicrom = 1;
    else if(temp == 'd')    nicrom = 0;
    pc.printf("%c", temp);
    if(temp == '@'){
        startFlag = true;
        memset(buff, '\0', BUFFER_SIZE);
        
        return;
    }
    if(startFlag){
        
        if(temp == '\r'){
            buff[count] = '\0';
            startFlag = false;
            angle = (float)atof(buff);
            servo1 = angle;
            pc.printf("\r\nangle : %3.2f [degree]\r\n", servo1());
            pc.printf("Please send like @***.*<CR><LF>\r\n\r\n");
            pc.printf("---------------------------------------\r\n");
            /*
            if(angle < -90.0)   angle = -90.0f;
            else if(angle > 90.0)  angle = 90.0f;
            servo1.position(angle);
            pc.printf("angle : %3.0f [degree]\r\n", angle);*/
               
            memset(buff, '\0', BUFFER_SIZE);
            count = 0;
            return;
        }   
        buff[count] = temp;
        count++;
        if(count > BUFFER_SIZE - 1){//null文字分空けておく
            startFlag = false;
            memset(buff, '\0', BUFFER_SIZE);
            count = 0;
            pc.printf("\r");
            pc.printf("\033[K");
            return; 
        }
        
    }
}

void ledDriver(unsigned char bin){
    unsigned char cmd = bin & 0b00000001;
    if(cmd) led1 = 1;
    else    led1 = 0;
    cmd = bin & 0b00000010;
    if(cmd) led2 = 1;
    else    led2 = 0;            
    cmd = bin & 0b00000100;
    if(cmd) led3 = 1;
    else    led3 = 0;
    cmd = bin & 0b00001000;
    if(cmd) led4 = 1;
    else    led4 = 0;
}

int main() {
    
    wait(3.0);
    
    pc.baud(115200);
    pc.attach(&angleChange, Serial::RxIrq);
    //char count = 0b00000001;
    pc.printf("\r\nStart boot phase:\r\n");
    for(int i = 0; i < 100; i++){
        pc.printf("\033[K");
        pc.printf("Loading... : %3d [%%]\r", i);
        wait(0.01);   
    }
    pc.printf("Loading... : %3d [%%]\r\n", 100);
    pc.printf("  -> OK!\r\n");
    wait(1.0);
    pc.printf("Initialize...\r\n");
    for(int i = 0;i < 20; i++){
        ledDriver(0b00001111);
        wait(0.05);
        ledDriver(0b00000000);
        wait(0.05);   
    }
    servo1 = 0.0f;
    pc.printf("angle : %3.2f [degree]\r\n", servo1());
    pc.printf("  -> OK!\r\n");
    wait(0.5);
    
    pc.printf("End boot phase\r\n");
    wait(1.0);
    pc.printf("Start _Servo Driving System ver 1.5.1_\r\n");
    pc.printf("\r\nPlease send like @***.*<CR><LF>, ***.* = angle[degree]\r\n");
   
    while(1) {    
        ledDriver(0b00000001);
        wait(0.2);
        ledDriver(0b00000010);
        wait(0.2);
        ledDriver(0b00000100);
        wait(0.2);
        ledDriver(0b00001000);
        wait(0.2);
    }
}