Script 15-10-2019

Dependencies:   Servoaansturing mbed QEI HIDScope biquadFilter MODSERIAL FastPWM

main.cpp

Committer:
Renate
Date:
2019-10-11
Revision:
7:1d57463393c6
Parent:
6:64146e16e10c
Child:
8:c7d3b67346db

File content as of revision 7:1d57463393c6:

#include "mbed.h"
#include "HIDScope.h"
#include "QEI.h"
#include "MODSERIAL.h"
#include "BiQuad.h"
#include "FastPWM.h"
#include <math.h>
#include "Servo.h"

//definieer objecten
Serial pc(USBTX, USBRX);

//Servo myservo(D8);

Ticker myControllerTicker1;
Ticker myControllerTicker2;

AnalogIn potMeter1(A1);
AnalogIn potMeter2(A0);

PwmOut motor1(D6);  
PwmOut motor2(D5);  

DigitalOut motor1_dir(D7);
DigitalOut motor2_dir(D4);


InterruptIn button1(D1);
InterruptIn button2(D2);

//richting wisselen van motor 1
void direction1(void)
    {
        motor1_dir=!motor1_dir;
    }

//richting wisselen van motor 2
void direction2(void)
    {
        motor2_dir=!motor2_dir;
    }


//snelheid motor 1 aansturen
void motor1Controller( )
    {
    // Determine reference (desired) fan speed
        double y1_des = potMeter1.read();
    // Controller (calculate motor torque/pwm)
        if( y1_des > 1 ) y1_des = 1; // y1_des must be <= 1
        if( y1_des < 0 ) y1_des = 0; // y1_des must be >= 0
        double power1 = pow(y1_des, 2.0); // Inverse relation between input and output
    // Send to motor
        motor1.write( power1 );
        pc.printf("power1: %.2f\t",power1);
    }

//snelheid motor 2 aansturen
void motor2Controller( )
    {
    // Determine reference (desired) fan speed
        double y2_des = potMeter2.read();
    // Controller (calculate motor torque/pwm)
        if( y2_des > 1 ) y2_des = 1; // y2_des must be <= 1
        if( y2_des < 0 ) y2_des = 0; // y2_des must be >= 0
        double power2 = pow(y2_des, 2.0); // Inverse relation between input and output
    // Send to motor
        motor2.write( power2 );
        pc.printf("power2: %.2f\n\r",power2);
    }

// Finite state machine programming (calibration servo motor?)
enum states {Motors_off, Calib_motor, Calib_EMG, Homing, Operation_mode, Failure_mode};

states currentState = Motors_off; 
bool stateChanged = true; // Make sure the initialization of first state is executed


void ProcessStateMachine(void) 
{ 
    switch (currentState) 
    { 
        case Motors_off:
        
            if (stateChanged)
            {
                // functie toevoegen waarbij motoren uitgaan
                stateChanged = false;
                pc.printf("Motors off\n");
            }            
            if // (Power_button_pressed()) nog een button toevoegen voordat dit kan
            {      
                currentState = Calib_motor;
                stateChanged = true;
                pc.printf("Moving to Calib_motor state\n");
            }
            if // (Emergency_button_pressed()) nog een button toevoegen voordat dit kan
            {
                currentState = Failure_mode;
                stateChanged = true;
                pc.printf("Moving to failure_mode\n");
            }
                
            break;
            
        case Calib_motor:
            
            if (stateChanged)
            {       
                // Hier wordt een kalibratie uitgevoerd, waarbij de motorhoeken worden bepaald
                currentState = Calib_EMG;
                stateChanged = true;
                pc.printf("Moving to Calib_EMG state\n");
            }   
            if // (Emergency_button_pressed()) nog een button toevoegen voordat dit kan
            {
                currentState = Failure_mode;
                stateChanged = true;
                pc.printf("Moving to failure_mode\n");
            }
                
            break;
            
        case Calib_EMG:
            
            if (stateChanged)
            {
                // Hierbij wordt een een kalibratie uitgevoerd, waarbij de maximale EMG-amplitude waarde wordt bepaald
                currentState = Homing;
                stateChanged = true;
                pc.printf("Moving to Homing state\n");
            }
            if // (Emergency_button_pressed()) nog een button toevoegen voordat dit kan
            {
                currentState = Failure_mode;
                stateChanged = true;
                pc.printf("Moving to failure_mode\n");
            }
            
            break;
            
        case Homing:
            
            if (stateChanged)
            {   
                // Ervoor zorgen dat de motoren zo bewegen dat de robotarm 
                // (inclusief de end-effector) in de juiste home positie wordt gezet
                currentState = Operation_mode;
                stateChanged = true;
                pc.printf("Moving to operation mode\n");
            }
            if // (Emergency_button_pressed()) nog een button toevoegen voordat dit kan
            {
                currentState = Failure_mode;
                stateChanged = true;
                pc.printf("Moving to failure_mode\n");
            }   
            break;
                  
        case Operation_mode:
        
            if (stateChanged)
            { 
                // Hier moet een functie worden aangeroepen die ervoor zorgt dat 
                // aan de hand van EMG-signalen de motoren kunnen worden aangestuurd, 
                // zodat de robotarm kan bewegen   
                
                if // (Power_button_pressed())
                {
                    currentState = Motors_off;
                    stateChanged = true;
                }
                if // (Emergency_button_pressed()) nog een button toevoegen voordat dit kan
                {
                    currentState = Failure_mode;
                    stateChanged = true;
                    pc.printf("Moving to failure_mode\n");     
                }
                else 
                { 
                    currentState = Homing; 
                    stateChanged = true; 
                }
                break;
                
        case Failure_mode:
        
            if (stateChanged)
            { 
                pc.printf("Ik ga exploderen!!!");
                // Alles moet uitgaan (evt. een rood LEDje laten branden), moet 
                // opnieuw worden opgestart. Mogelijk kan dit door de ticker de 
                // detachen
            }
            break;
            
        default:
            // Zelfde functie als die eerder is toegepast om motoren uit te schakelen -> safety!
            pc.printf("Unknown or uninplemented state reached!\n");
        }

int main()
    {
      //  for(float p=0; p<1.0; p += 0.1)
        //    {
        //        myservo == p;
         //       wait(0.2);
         //   }
        myControllerTicker1.attach(motor1Controller, 0.1 ); // Every 1/10 second
        myControllerTicker2.attach(motor2Controller, 0.1 ); // Every 1/10 second

        button1.mode(PullUp);   
        button1.rise(direction1);
        button2.mode(PullUp);   
        button2.rise(direction2);


        while( true ) { /* do nothing */ }
    return 0;
    }