sdf

Dependencies:   mbed QEI HIDScope biquadFilter MODSERIAL FXOS8700Q FastPWM

Opzet_Eli.cpp

Committer:
Mortimerz
Date:
2019-10-18
Revision:
3:0c31a4a5d1fe
Parent:
2:5730195cf595

File content as of revision 3:0c31a4a5d1fe:

// Robot states
#include "mbed.h"
#include "HIDScope.h"
#include "QEI.h"
#include "MODSERIAL.h"
#include "biquadFilter.h" 
#include "math.h" 
#include "FastPWM.h"

// Define objects
AnalogIn emg1(A0);
AnalogIn emg2(A1);
AnalogIn emg3(A2);
AnalogIn emg4(A3);
MODSERIAL pc(USBTX,USBRX);
DigitalOut led_red(LED_RED);
DigitalOut led_blue(LED_BLUE);
DigitalOut led_green(LED_GREEN);
InterruptIn button_Mbed(PTC6); //Button 1 Mbed
InterruptIn button_1(); //Button 2 BRS
InterruptIn button_2(); // Button 3 BRS

FastPWM motor1(D6);
DigitalOut motor1_dir(D7);
FastPWM motor2(D5);
DigitalOut motor2_dir(D4);


//ticker setup
Ticker states_machine;

    
//encoder setup
QEI encoder_1(D13,D12,NC,32,QEI::X4_ENCODING);
QEI encoder_2(D11,D10,NC,32,QEI::X4_ENCODING);

//motor setup
int motordir1 = 1;
int motordir2 = 1;
double Kp = 17.5;

//Hidscope setup
HIDScope    scope(4); 

// EMG setup
biquadFilter filterhigh1(-1.1430, 0.4128, 0.6389, -1.2779, 0.6389);
biquadFilter filterlow1(1.9556, 0.9565, 0.9780, 1.9561, 0.9780);
biquadFilter notch(-1.1978e-16, 0.9561, 0.9780, -1.1978e-16, 0.9780);
biquadFilter filterlow2(-1.9645, 0.9651, 1.5515e-4, 3.1030e-4, 1.5515e-4);
double emg_value_1;
double signalpart1_1;
double signalpart2_1;
double signalpart3_1;
double signalpart4_1;
double signalfinal_1;
double emgsignal_1;
double onoffsignal_1;
double maxcal_1=0;        

double emg_value_2;
double signalpart1_2;
double signalpart2_2;
double signalpart3_2;
double signalpart4_2;
double signalfinal_2;
double emgsignal_2;
double onoffsignal_2;
double maxcal_2=0; 

double emg_value_3;
double signalpart1_3;
double signalpart2_3;
double signalpart3_3;
double signalpart4_3;
double signalfinal_3;
double emgsignal_3;
double onoffsignal_3;
double maxcal_3=0; 

double emg_value_4;
double signalpart1_4;
double signalpart2_4;
double signalpart3_4;
double signalpart4_4;
double signalfinal_4;
double emgsignal_4;
double onoffsignal_4;
double maxcal_4=0; 

double emgx;
double emgy;
double kemg = 0.1;

//kinematics setup
double xgoal;
double ygoal;
double theta1;
double theta2;

   
// State machine
enum states{START,KAL_ME,KAL_EMG,MOVE_START,READY_START,DEMO,MOVE,WAIT,OFF};
states CurrentState = START;
bool StateChanged = true;         // this is the initialization of the first state

// button functions

void emgread(){
     emg_value_1 = emg1.read();//read the emg value from the elektrodes
        signalpart1_1 = notch.step(emg_value_1);//Highpass filter for removing offset and artifacts
        signalpart2_1 = filterhigh1.step(signalpart1_1);//rectify the filtered signal
        signalpart3_1 = abs(signalpart2_1);//low pass filter to envelope the emg
        signalpart4_1 = filterlow1.step(signalpart3_1);//notch filter to remove 50Hz signal
        emgsignal_1 = filterlow2.step(signalpart4_1);//2nd low pass filter to envelope the emg
     emg_value_2 = emg2.read();//read the emg value from the elektrodes
        signalpart1_2 = notch.step(emg_value_2);//Highpass filter for removing offset and artifacts
        signalpart2_2 = filterhigh1.step(signalpart1_2);//rectify the filtered signal
        signalpart3_2 = abs(signalpart2_2);//low pass filter to envelope the emg
        signalpart4_2 = filterlow1.step(signalpart3_2);//notch filter to remove 50Hz signal
        emgsignal_2 = filterlow2.step(signalpart4_2);//2nd low pass filter to envelope the emg
    emg_value_3 = emg3.read();//read the emg value from the elektrodes
        signalpart1_3 = notch.step(emg_value_3);//Highpass filter for removing offset and artifacts
        signalpart2_3 = filterhigh1.step(signalpart1_3);//rectify the filtered signal
        signalpart3_3 = abs(signalpart2_3);//low pass filter to envelope the emg
        signalpart4_3 = filterlow1.step(signalpart3_3);//notch filter to remove 50Hz signal
        emgsignal_3 = filterlow2.step(signalpart4_3);//2nd low pass filter to envelope the emg
    emg_value_4 = emg4.read();//read the emg value from the elektrodes
        signalpart1_4 = notch.step(emg_value_4);//Highpass filter for removing offset and artifacts
        signalpart2_4 = filterhigh1.step(signalpart1_4);//rectify the filtered signal
        signalpart3_4 = abs(signalpart2_4);//low pass filter to envelope the emg
        signalpart4_4 = filterlow1.step(signalpart3_4);//notch filter to remove 50Hz signal
        emgsignal_4 = filterlow2.step(signalpart4_4);//2nd low pass filter to envelope the emg
}
void emgcal(){
            emgread();
            double signalmeasure_1 = emgsignal_1;
            if (signalmeasure_1 > maxcal_1){//determine what the highest reachable emg signal is
                maxcal_1 = signalmeasure_1;}
            double signalmeasure_2 = emgsignal_2;
            if (signalmeasure_2 > maxcal_2){//determine what the highest reachable emg signal is
                maxcal_2 = signalmeasure_2;}
            double signalmeasure_3 = emgsignal_3;
            if (signalmeasure_3 > maxcal_3){//determine what the highest reachable emg signal is
                maxcal_3 = signalmeasure_3;}
            double signalmeasure_4 = emgsignal_4;
            if (signalmeasure_4 > maxcal_4){//determine what the highest reachable emg signal is
                maxcal_4 = signalmeasure_4;}
            scope.set(0,signalmeasure_1);//set emg signal to scope in channel 1
            scope.set(1,signalmeasure_2);//set filtered signal to scope in channel 2
            scope.set(2,signalmeasure_3);//set filtered signal to scope in channel 3
            scope.set(3,signalmeasure_4);//set filtered signal to scope in channel 4
        }
    

void emgshow(){
        emgread();
        onoffsignal_1=emgsignal_1/maxcal_1;// emg positive x
        onoffsignal_2=emgsignal_2/maxcal_2;// emg negative x   
        onoffsignal_3=emgsignal_3/maxcal_3;// emg positive y
        onoffsignal_4=emgsignal_4/maxcal_4;// emg negative y
        scope.set(0,onoffsignal_1);//set emg signal to scope in channel 1
        scope.set(1,onoffsignal_2);//set filtered signal to scope in channel 2
        scope.set(2,onoffsignal_3);//set filtered signal to scope in channel 3
        scope.set(3,onoffsignal_4);//set filtered signal to scope in channel 4
        emgx = onoffsignal_1- onoffsignal_2;
        emgy = onoffsignal_3- onoffsignal_4;
    scope.send();
        }

void forwardkin(){
    double qref2 = encoder_2.getPulses();
    double q2_correct = (qref2*2*3.14)/8400.0;
    double qref1 = encoder_1.getPulses();
    double q1_correct = (qref1*2*3.14)/8400.0;
    double x = 0.3*cos(q1_correct)+0.3*cos(q1_correct+q2_correct);
    double y = 0.3*sin(q1_correct)+0.3*cos(q1_correct+q2_correct);
    emgshow();
    xgoal = x + emgx* kemg;
    ygoal = y + emgy* kemg;
    }
    
void reversekin(){
    forwardkin();
    theta2= acos(((xgoal*xgoal)+(ygoal*ygoal)-(0.3*0.3)-(0.3*0.3))/(2*0.3*0.3));
    theta1= atan(ygoal/xgoal)-atan((0.3*sin(theta2))/(0.3+0.3*cos(theta2)));
    }
    
void motor_position()
{
    reversekin();
    double pos_1 = encoder_1.getPulses();
    double poscorrect_1 = (pos_1*3.14*2)/8400.0;
    double error1 = theta1-poscorrect_1;
    if (error1 >=0) motor1_dir=1;
    else motor1_dir=0;
    if (fabs(error1)>1) motor1 = 1;
    else motor1 = fabs(error1);
    
    double pos_2 = encoder_2.getPulses();
    double poscorrect_2 = (pos_2*3.14*2)/8400.0;
    double error2 = theta2-poscorrect_2;
    if (error2 >=0) motor2_dir=1;
    else motor1_dir=0;
    if (fabs(error2)>1) motor2 = 1;
    else motor1 = fabs(error2);
    }

void kalmot(){
    CurrentState = KAL_ME;
    StateChanged = true;
}
           
void kalemg(){
    CurrentState = KAL_EMG;
    StateChanged = true;
    wait(0.2f);
}
void movestart(){
    CurrentState = MOVE_START;
    StateChanged = true;
    wait(0.2f);
    }
    
void readystart(){
    CurrentState = READY_START;
    StateChanged = true;
    wait(0.2f);
    }
void demo(){
    CurrentState = DEMO;
    StateChanged = true;
    wait(0.2f);
    }
void move(){
    CurrentState = MOVE;
    StateChanged = true;
    wait(0.2f);
    }
void wait(){
    CurrentState = WAIT;
    StateChanged = true;
    wait(0.2f);
    }
void off(){
    CurrentState = OFF;
    StateChanged = true;
    wait(0.2f);
    }
    
//led functions
void flashred(){
    led_red = !led_red;
    wait(0.4f);
    }
void flashgreen(){
    led_green = !led_green;
    wait(0.4f);
    }    
void flashblue(){
    led_blue = !led_blue;
    wait(0.4f);
    } 
// Function START_TO_KAL_ME

void StateMachine(void)
{
    switch(CurrentState)
    {
        case START:     
            if (StateChanged)
            {
                pc.printf("Start state, red led is on. If button 1 pressed, go to kal_me state");
                led_red = 0;  // Red led is on 
                led_blue = 1;
                led_green = 1;
                StateChanged = false;
            }
            button_Mbed.rise(&kalmot);  // State switches when button pressed
                           
        break;      // end of state START
                
        case KAL_ME:
            if (StateChanged)
            {
                pc.printf("Calibration ME state, red ld flickers slow"); 
                flashred();
                                
                
                // FUNCTION Move to mechanical stop, include v_motor, t_passed
                // FUNCTION Reset encoders
                
                StateChanged = false;
            }
            
            button_Mbed.rise(&kalemg);
        break;      // end of state KAL_ME
        
        case KAL_EMG:
            if (StateChanged)
            {
                flashgreen();
                emgcal();              
                StateChanged = false;
            }
            
            button_Mbed.rise(&readystart);
            
        break;      // end of state KAL_EMG
        
        case MOVE_START:
            if(StateChanged)
            {
                led_red = 1;
                led_blue = 1; 
                led_green = 0;   // Green led is on
            
                // FUNCTION move to start, t_passed
                // Define current_position & start_position 
                StateChanged = false; 
            }
            
            button_Mbed.rise(&readystart);
            
        break;      // end of state MOVE_START
        
        case READY_START:
            if (StateChanged)
            {
                led_red = 1;
                led_blue = 1;
                led_green = 0;       // Green led is on 
                
                StateChanged = false;
            }
            
            button_Mbed.rise(&demo);
            //button_1.rise(&move);
                           
        break;      // end of state READY_START
        
        case DEMO:
            if (StateChanged)
            {
                //FUNCTION Blue led blink fast
                
                //FUNCTION perform straight movements for demo
                
                StateChanged = false; 
            }
            
            button_Mbed.rise(&movestart);
        break;      // end of state DEMO
        
        case MOVE:
            if (StateChanged)
            {
                led_red = 1;
                led_green = 1;
                led_blue = 0;  //Blue led is on 
                
                // FUNCTION Play the game with EMG signal
                
                StateChanged = false; 
            }
            
            button_Mbed.rise(&off);
            button1.rise(&wait);
            
            break;      // end of state MOVE
        
        case WAIT:
            if (StateChanged)
            {
                led_red = 0;   // Pink led iS on 
                led_blue = 0; 
                led_green = 1
                
            button_Mbed.rise(&off);
            button1.rise(&movestart);
            button2.rise(&move);
           
            
        break;      // end of state WAIT
        
        case OFF:
            led_red = 0;       // White led is on 
            led_blue = 0; 
            led_green = 0;
            
        break;      // end of state OFF
        
        default:
        TurnMotorsoff(); //FUNCTION 
        printf("Unknown state reached");
    }               // End of the switch, all states are prescribed
}

int main(void)      // wat hier in moet snap ik nog niet 
{
        states_machine.attach(&StateMachine, 0.002)
        // hier moeten dingen komen
        while (true)
        {
            CheckForCommandFromTerminal();
        }
}