Output the angle data of Encoder

Dependencies:   AD5754 FatFileSystem Impact_nagano_0630 MSCFileSystem QEI mbed

main.cpp

Committer:
hikaru24
Date:
2016-07-16
Revision:
1:f37787740470
Parent:
0:27283d71db7d
Child:
2:8b24c7cfc9b2

File content as of revision 1:f37787740470:

#include "mbed.h"
#include "QEI.h" // for encoder
#include "USBHostMSD.h" // for USB memory
#include "AD5754.h" // for DA converter

#define PIEZO_PERIOD_US 1000 // 1kHz
#define ENCODER_PERIOD_US 1000 // 1kHz
//#define ENCODER_PERIOD_US 100000 // 10Hz
//#define VIBRATOR_PERIOD_US 200 // 5kHz
//#define ACC_PERIOD_US 200 //5kHz

//// State in main phase ////
#define INITIALISATION_STATE 0
#define BEFORE_IMPACT_STATE 1
#define AFTER_IMPACT_STATE 2

#define RECORD_PERIOD 1.0

#define SAVE_NUMBER 1024 // 5(kHz) * 0.2(s) = 1000

#define AVE_WINDOW 10
#define VEL_WINDOW 10

Serial pc(USBTX, USBRX);
 
AnalogIn piezo(p19);
QEI encoder(p21, p22, NC, 2000);  // encoder
AnalogOut vibrator(p18);
AD5754 dac(p5, NC, p7, p8); // spi_(mosi, miso, sck), nCS_(cs)


Ticker piezo_t;
Ticker encoder_t;
//Ticker vibrator_t;
//Ticker acc_t;

Timer t;

volatile bool piezo_flag = false;
void piezo_interrupt(){
    piezo_flag = true;
}

volatile bool encoder_flag = false;
void encoder_interrupt(){
    encoder_flag = true;
}

/*
volatile bool vibrator_flag = false;
void vibrator_interrupt(){
    vibrator_flag = true;
}
*/
/*
volatile bool acc_flag = false;
void acc_interrupt(){
    acc_flag = true;
}
*/

int main() {
    
    pc.baud(115200);
    
    USBHostMSD msd("usb");
    
    
    while(!msd.connect()){
        wait(1);
    }
    
    piezo_t.attach_us(&piezo_interrupt, PIEZO_PERIOD_US);
    encoder_t.attach_us(&encoder_interrupt, ENCODER_PERIOD_US);
    //vibrator_t.attach_us(&vibrator_interrupt, VIBRATOR_PERIOD_US);
    //acc_t.attach_us(&acc__interrupt, ACC_PERIOD_US);
    
    uint16_t DAdata[3] = {}; // 16bit; 0 ~ 32768 ~ 65535 (-5 ~0 ~ 5(V))
    int channel = 0;
    
    
    bool start_flag = true;
    bool main_flag = false;
    bool end_flag = false;
    
    short state = INITIALISATION_STATE;
    
    //// Time ////
    float start_time;
    
    //// Piezosensor ////
    float piezo_val = 0.0;
    //float piezo_val_buf[10] = {};
    
    //// Encoder ////
    int encoder_cnt = 0;
    int encoder_buf[AVE_WINDOW] = {};
    int encoder_ave = 0;
    int encoder_ave_buf[VEL_WINDOW] = {};
    int encoder_vel = 0;
    
    int i = 0;
    int j = 0;
    int buf[500] = {};
    int data = 0;
    int ret;
    
    /*
    //// Vibrator ////
    float vib_cmd = 0.5;
    */
    
    //// Accelerometer ////
    /*
    int acc_val[3] = {};
    float acc_fval[3] {};
    float acc_fval_xbuf[5] = {};
    float acc_fval_ybuf[5] = {};
    float acc_fval_zbuf[5] = {};
    */
    
    //// Data buff ////
    float save_data[SAVE_NUMBER] = {};
    int save_cnt;
    
    LocalFileSystem local("local"); 
    
    //// Option ////
    int print_cnt = 0;
    
    
    // Fix vibrator
    vibrator = 0.0;
    
    pc.printf("'S' key: Start state\n\n");
    //pc.printf("'E' key: End state\n\n");
    wait(1);
    
    dac.rangeSelect();
    dac.setPowerControl();
    
    
    while(start_flag){
        if(pc.readable()){
            if(pc.getc() == 's'){
                start_flag = false;
                pc.printf("\nHAPTIC test start\n");
                
                /*
                pc.printf("\nFile reading:\n");
                FILE *fp = fopen( "/usb/test.csv", "r");
                
                if ( fp == NULL )
                {
                    error("\nCould not open file\n");
                }
                */
                
                /*
                while( (ret=fscanf(fp, "%d", &data)) != EOF){
                    buf[i] = data;
                    i++;
                    pc.printf("\nError\n");
                }
                */
                
                
                //fclose(fp); 
                
                wait(0.5);
                pc.printf("Start initialization\nLift device\n\n");
                wait(0.5);
                main_flag = true;
            }
        }
    }
    
    t.start();

    while(main_flag){
        switch(state){
            case INITIALISATION_STATE:
                if(encoder_flag){
                    vibrator = 0.5;
                    encoder_flag = false;
                    encoder_cnt = encoder.getPulses();  // One of the encoders needs a sign change
                    
                    encoder_ave = encoder_cnt;
                    for(int i=0; i<AVE_WINDOW-1; i++){
                        encoder_buf[i+1] = encoder_buf[i];
                        encoder_ave += encoder_buf[i];
                    }
                    encoder_buf[0] = encoder_cnt;
                    encoder_ave = encoder_ave/AVE_WINDOW;
                    
                    if(encoder_ave < -350){
                        state = BEFORE_IMPACT_STATE;
                        pc.printf("Finish initialization\n\n");
                    }
                    
                    
                    if(print_cnt > 1000000/ENCODER_PERIOD_US){
                        printf("encoder = %d\n", encoder_ave);
                        print_cnt = 0;
                    }
                    print_cnt++;
                    
                    ////// DA converter //////
                    DAdata[0] = (uint16_t)((int16_t)(32768)); // 16bit; 0 ~ 32768 ~ 65535 (-5 ~0 ~ 5(V))
                    if(DAdata[0] > 65536){
                        DAdata[0] = 0;
                    }
                    channel = 0;
                    dac.send(channel, DAdata[0]);
                    //////
                    
                }
                break;
            case BEFORE_IMPACT_STATE:
                
                if(piezo_flag){
                    piezo_flag = false;
                    piezo_val = piezo; // 0.0(0.0V)~ 0.5(1.65V) ~ 1.0(3.3V)
                    /*
                    if(print_cnt > 1000000/PIEZO_PERIOD_US){
                        //printf("piezosensor = %0.3f\n", piezo_val);
                        //printf("time = %f\n", t.read());
                        print_cnt = 0;
                    }
                    print_cnt++;
                    */
                    
                    // Save piezo data in save_data[0] ~ [99]
                    /*
                    save_data[100] = piezo_val;
                    for(save_cnt=0; save_cnt<100; save_cnt++){
                        save_data[save_cnt] = save_data[save_cnt+1];
                    }
                    */
                    
                }
                if(encoder_flag){
                    encoder_flag = false;
                    encoder_cnt = encoder.getPulses();  // One of the encoders needs a sign change
                    
                    
                    encoder_ave = encoder_cnt;
                    for(int i=0; i<AVE_WINDOW-1; i++){
                        encoder_buf[i+1] = encoder_buf[i];
                        encoder_ave += encoder_buf[i];
                    }
                    encoder_buf[0] = encoder_cnt;
                    encoder_ave = encoder_ave/AVE_WINDOW;
                    
                    
                    
                    for(int i=VEL_WINDOW-2; i>=0; i--){
                        encoder_ave_buf[i+1] = encoder_ave_buf[i];
                    }
                    encoder_ave_buf[0] = encoder_ave;
                    encoder_vel = encoder_ave_buf[VEL_WINDOW-1] - encoder_ave_buf[0];
                    
                    if(print_cnt > 1000000/ENCODER_PERIOD_US){
                        printf("velocity = %d\n", encoder_vel);
                        print_cnt = 0;
                    }
                    print_cnt++;
                    
                    //if(encoder_cnt < 1 && encoder_vel >10){
                    if(encoder_cnt > -1 && encoder_vel == -16){ // 
                        state = AFTER_IMPACT_STATE;
                        pc.printf("Collision!!\n\n");
                        printf("Collision velocity = %d\n", encoder_vel);
                        start_time = t.read();
                        save_cnt = 100;
                        
                        DAdata[0] = (uint16_t)((int16_t)(50000)); // 16bit; 0 ~ 32768 ~ 65535 (-5 ~0 ~ 5(V))
                        if(DAdata[0] > 65536){
                            DAdata[0] = 0;
                        }
                        channel = 0;
                        dac.send(channel, DAdata[0]);
                    
                    }
                    
                    /*
                    if(print_cnt > 1000000/ENCODER_PERIOD_US){
                        printf("encoder = %d\n", encoder_cnt);
                        print_cnt = 0;
                    }
                    print_cnt++;
                    */
                }
                break;
            case AFTER_IMPACT_STATE:
                DAdata[0] = (uint16_t)((int16_t)(50000)); // 16bit; 0 ~ 32768 ~ 65535 (-5 ~0 ~ 5(V))
                if(DAdata[0] > 65536){
                    DAdata[0] = 0;
                }
                channel = 0;
                dac.send(channel, DAdata[0]);
                    
                /*
                if(vibrator_flag){
                    vibrator_flag = false;
                    //vibrator = vib_cmd;
                }
                */
                
                pc.printf("'R' key: Restart\n\n");
                while(state == AFTER_IMPACT_STATE) {
                    if(pc.readable()){
                        if(pc.getc() == 'r'){
                            state = INITIALISATION_STATE;
                        }
                    }
                }
                break;
            default:
                state = INITIALISATION_STATE;
                break;
        }
            
        /*
        if(acc_flag){
            acc_flag = false;
            accelerometer.getOutput(acc_val);
            acc_fval[0] = (float)(int16_t)acc_val[0];
            acc_fval[1] = (float)(int16_t)acc_val[1];
            acc_fval[2] = (float)(int16_t)acc_val[2];
            //printf("x = %6.2f y = %6.2f z = %6.2f\n", acc_fval[0]*200/4096, acc_fval[1]*200/4096, acc_fval[2]*200/4096);
        }
        */
        
        if(pc.readable()){
            if(pc.getc() == 'e'){
                main_flag = false;
                end_flag = true;
            }
        }
        
    }
    pc.printf("HAPTIC test stop\n\n\n");
    wait(1);
    
    while(end_flag){
        
        FILE *fp;
        fp = fopen("/usb/test.csv", "w"); 
        if(fp == NULL){
            error("Could not open file for write\n");
        }
        else{
            for(int i=0; i<SAVE_NUMBER-1; i++){
                fprintf(fp,"%f\n",save_data[i]);
            }
            fclose(fp);
        }
        
        end_flag = false;
    }
    printf("END Haptic test\n");
}