motor(lpc1768)

Dependencies:   mbed PololuLedStrip

main.cpp

Committer:
hamaken1018
Date:
2021-01-25
Revision:
0:3b06c3283e31

File content as of revision 0:3b06c3283e31:

#include "mbed.h"
#include "PololuLedStrip.h"
#include <math.h>

Serial Xbee(P0_10,P0_11,19200); //TX,RX,クロックレート
Serial Xbee2(P0_0,P0_1,19200); //LEDに送信
Serial pc(USBTX,USBRX); //pc(USBTX,USBRX)
Ticker ticker;
unsigned char RX_data;

#define DIGITS 8
#define ledsize 65
//円周率
#define PI 3.14159265358979
//モータードライバ
#define M1 0x01

//モータードライバへの命令
#define STOP 0
#define CW 1
#define CCW -1
#define bSTOP 10
#define bCW 11
#define bCCW -11

#define sCW 21
#define sCCW -21
#define sSTOP 20
#define shCW 31
#define shCCW -31

#define lCW 51
#define lCCW -51
#define lSTOP 50
#define lsCW 61
#define lsCCW -61
#define lsSTOP 60

#define rON 41
#define rOFF -41

DigitalOut led1(LED1);
DigitalOut led2(LED2);
DigitalOut led3(LED3);
DigitalOut ledx(LED4);
I2C md_i2c_tx(P0_27, P0_28);

void cv2bin( unsigned char n ) {
    int i;

    for( i = DIGITS-1; i >= 0; i-- ) {
        printf( "%d", ( n >> i ) & 1 );
    }
    printf( "\n" );
}

//i2c通信
void md_setoutput(unsigned char address, int rotate, int duty) {
    char val;
    char data[2];
        /* H30新型:処理最適化 */
        switch (rotate) {
            case CW:    data[0] = 'F'; break;// 電圧比例制御モード(PWMがLの区間はフリー)
            case CCW:   data[0] = 'R'; break;
            case STOP:  data[0] = 'S'; break;

            case bCW:   data[0] = 'f'; break; // 電圧比例制御モード(PWMがLの区間はブレーキ) //ブレーキ停止は機体に負荷がかかるため使用禁止
            case bCCW:  data[0] = 'r'; break;
            case bSTOP: data[0] = 's'; break;
            
            case sCW:   data[0] = 'A'; break; // 速度比例制御モード
            case sCCW:  data[0] = 'B'; break;
            case sSTOP: data[0] = 'T'; break;
            
            case shCW:   data[0] = 'a'; break; // 速度比例制御モード(命令パケット最上位ビットに指令値9ビット目を入れることで分解能2倍)
            case shCCW:  data[0] = 'b'; break;

            case lCW:   data[0] = 'L'; break; // 通常LAP
            case lCCW:  data[0] = 'M'; break;
            case lSTOP: data[0] = 'N'; break;
            case lsCW:   data[0] = 'l'; break; // 速調LAP
            case lsCCW:  data[0] = 'm'; break;
            case lsSTOP: data[0] = 'n'; break;

            case rON: data[0] = 'P'; break; //リレー駆動モード
            case rOFF: data[0] = 'p'; break;
        }
            
    data[1] = duty & 0xFF;
    
    val = md_i2c_tx.write(address << 1, data, 2); //duty送信
}
#define LED_COUNT 66 //LEDの数
PololuLedStrip ledStrip1(P2_13);
rgb_color colors[LED_COUNT];
int cnt = 0;
int EMS = 0;
int con = 0;
int motorOn = 0;
int LEDDATA = 1;

void Xbee_RX(){
    
    RX_data = Xbee.getc(); //Xbeeから送られてきた文字を代入
    pc.putc(RX_data); //値をpcに表示
    
    //非常停止 EMSが1で入る
    if (cnt == 0 && RX_data == 'S'){
        cnt++;
    }else if (cnt == 1 && RX_data == 'T'){
        cnt++;
    }else if (cnt == 2 && RX_data == 'O'){
        cnt++;
    }else if (cnt == 3 && RX_data == 'P'){
        cnt = 0;
        EMS = 1;
        led1 = 1;
    }else if (RX_data == 'L'){
        cnt = 0;
        EMS = 0;
        led1 = 0;
    }
}

rgb_color COLOR(float H,int n){

    float r = 0, g = 0, b = 0;
    H = 100; //光の強さ
    switch (n){
        case 1:r = H; g = 0; b = 0; break; //赤
        case 2:r = 0; g = H; b = 0; break; //緑
        case 3:r = 0; g = 0; b = H; break; //青
        case 4:r = H; g = H; b = 0; break; //黄色
        case 5:r = 0; g = H; b = H; break; //水色
        case 6:r = H; g = 0; b = H; break; //紫
        case 7:r = H; g = H; b = H; break; //白
        case 8:r = H; g = H * 0.5; b = 0; break; //オレンジ
        }
    return (rgb_color){r,g,b};
}

//フォトリフレクタ
double fot;
int h = 0;
int b = 0;
//↓LED色
int R = 1;
int G = 2;
int B = 3;
int Y = 4;
int L = 5;
int P = 6;
int W = 7;
int O = 8;

void ledsw(){
    h++;
}

int main() {
    wait_ms(10);
    led1 = 1;
    led2 = 0;
    led3 = 0;
    ledx = 1;
    Xbee.attach(&Xbee_RX, Serial::RxIrq); //割り込み
    pc.baud(115200); //pcクロックレート
    md_i2c_tx.frequency(20000000UL/(16 + 2 * 2 * 16));//I2C通信
    
    while(1){
        //機構用モータ
        if(EMS){
            md_setoutput(M1,STOP,0);
        }else if(EMS == 0){
            md_setoutput(M1,CW,255);
        }
        
        //***************打ち上げ処理******************//
        if(RX_data == 'A' && con == 0){
            con = 1;
            h = 0;
            ticker.attach(ledsw,0.05);
        }else if(RX_data == 'B' && con == 1){
            con = 2;
            h = 0;
            ticker.attach(ledsw,0.2);
        }else if(RX_data == 'C' && con == 2){
            con = 3;
            h = 0;
            ticker.attach(ledsw,0.2);
        }else if(RX_data == 'D' && con == 3){
            con = 4;
            h = 0;
            ticker.attach(ledsw,0.2);
        }else if(RX_data == 'E' && con == 4){
            con = 5;
            h = 0;
            ticker.attach(ledsw,0.2);
        }else if(RX_data == 'A' && con == 5){
            con = 6;
            h = 0;
            ticker.attach(ledsw,0.2);
        }else if(RX_data == 'B' && con == 6){
            con = 7;
            h = 0;
            ticker.attach(ledsw,0.2);
        }else if(RX_data == 'C' && con == 7){
            con = 8;
            h = 0;
            ticker.attach(ledsw,0.2);
        }else if(RX_data == 'D' && con == 8){
            con = 9;
            h = 0;
            ticker.attach(ledsw,0.2);
        }
        
        if(con == 1){
            if(h < LED_COUNT + 1){
                for(int k = 0; k < LED_COUNT; k++){
                    uint8_t phase =(k << 1);
                    colors[k] = COLOR(phase, 0);
                }
                    
                uint8_t phase =(h << 1);
                colors[ledsize - h] = COLOR(phase, B);
                ledStrip1.write(colors, LED_COUNT);
                 
                if(h == LED_COUNT + 1){
                    ticker.detach();
                    Xbee2.putc('A');
                }
            }
        }
        
        if(con == 2){
            if(h < LED_COUNT + 1){
                for(int k = 0; k < LED_COUNT; k++){
                    uint8_t phase =(k << 1);
                    colors[k] = COLOR(phase, 0);
                }
                    
                uint8_t phase =(h << 1);
                colors[ledsize - h] = COLOR(phase, G);
                ledStrip1.write(colors, LED_COUNT);
                 
                if(h == LED_COUNT + 1){
                    ticker.detach();
                    Xbee2.putc('B');
                }
            }
        }
        
        if(con == 3){
            if(h < LED_COUNT + 1){
                for(int k = 0; k < LED_COUNT; k++){
                    uint8_t phase =(k << 1);
                    colors[k] = COLOR(phase, 0);
                }
                    
                uint8_t phase =(h << 1);
                colors[ledsize - h] = COLOR(phase, R);
                ledStrip1.write(colors, LED_COUNT);
                  
                if(h == LED_COUNT + 1){
                    ticker.detach();
                    Xbee2.putc('C');
                }
            }
        }
        
        if(con == 4){
            if(h < LED_COUNT + 1){
                for(int k = 0; k < LED_COUNT; k++){
                    uint8_t phase =(k << 1);
                    colors[k] = COLOR(phase, 0);
                }
                    
                uint8_t phase =(h << 1);
                colors[ledsize - h] = COLOR(phase, O);
                ledStrip1.write(colors, LED_COUNT);
                
                if(h == LED_COUNT + 1){
                    ticker.detach();
                    Xbee2.putc('D');
                }
            }
        }
        
        if(con == 5){
            if(h < LED_COUNT + 1){
                for(int k = 0; k < LED_COUNT; k++){
                    uint8_t phase =(k << 1);
                    colors[k] = COLOR(phase, 0);
                }
                    
                uint8_t phase =(h << 1);
                colors[ledsize - h] = COLOR(phase, P);
                ledStrip1.write(colors, LED_COUNT);
                
                if(h == LED_COUNT + 1){
                    ticker.detach();
                    Xbee2.putc('E');
                }
            }
        }
        
        if(con == 6){
            if(h < LED_COUNT + 1){
                for(int k = 0; k < LED_COUNT; k++){
                    uint8_t phase =(k << 1);
                    colors[k] = COLOR(phase, 0);
                }
                    
                uint8_t phase =(h << 1);
                colors[ledsize - h] = COLOR(phase, P);
                ledStrip1.write(colors, LED_COUNT);
                  
                if(h == LED_COUNT + 1){
                    ticker.detach();
                    Xbee2.putc('F');
                }
            }
        }
        
        if(con == 7){
            if(h < LED_COUNT + 1){
                for(int k = 0; k < LED_COUNT; k++){
                    uint8_t phase =(k << 1);
                    colors[k] = COLOR(phase, 0);
                }
                    
                uint8_t phase =(h << 1);
                colors[ledsize - h] = COLOR(phase, P);
                ledStrip1.write(colors, LED_COUNT);
                
                    
                if(h == LED_COUNT + 1){
                    ticker.detach();
                    Xbee2.putc('G');
                }
            }
        }
        
        if(con == 8){
            if(h < LED_COUNT + 1){
                for(int k = 0; k < LED_COUNT; k++){
                    uint8_t phase =(k << 1);
                    colors[k] = COLOR(phase, 0);
                }
                    
                uint8_t phase =(h << 1);
                colors[ledsize - h] = COLOR(phase, P);
                ledStrip1.write(colors, LED_COUNT);
                
                   
                if(h == LED_COUNT + 1){
                    ticker.detach();
                    Xbee2.putc('H');
                }
            }
        }
        
        if(con == 9){
            if(h < LED_COUNT + 1){
                for(int k = 0; k < LED_COUNT; k++){
                    uint8_t phase =(k << 1);
                    colors[k] = COLOR(phase, 0);
                }
                    
                uint8_t phase =(h << 1);
                colors[ledsize - h] = COLOR(phase, P);
                ledStrip1.write(colors, LED_COUNT);
            
                if(h == LED_COUNT + 1){
                    ticker.detach();
                    Xbee2.putc('I');
                    con = 0;
                }
            }
        }
        
    ledStrip1.write(colors, LED_COUNT);
    }
}