![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Script 15-10-2019
Dependencies: Servoaansturing mbed QEI HIDScope biquadFilter MODSERIAL FastPWM
main.cpp
- Committer:
- Renate
- Date:
- 2019-10-11
- Revision:
- 6:64146e16e10c
- Parent:
- 5:9f1260408ef2
- Child:
- 7:1d57463393c6
File content as of revision 6:64146e16e10c:
#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, No_mov_before_pick_up, Servo_horizontal, Position_1, Slide, Lift, No_mov_before_drop_off, Position_drop_off, Servo_tilt_down, Position_2}; 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 // (Motor_calib_button_pressed()) nog een extra button toevoegen voordat dit kan { currentState = Calib_motor; stateChanged = true; pc.printf("Moving to Calib_motor state\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"); } 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"); } break; case Homing: if (stateChanged) { // Ervoor zorgen dat de motoren zo bewegen dat de robotarm in de juiste home positie wordt gezet currentState = No_mov_before_pick_up; stateChanged = true; pc.printf("Moving to no movement before pick up state \n"); } break; case No_mov_before_pick_up: // De robot arm beweegt niet, soort ruststand na de homing if (stateChanged) { if (// eis om naar positie 1 te gaan) { currentState = Position_1 stateChanged = true; pc.printf("Moving to position_1 state\n"); } if (// eis om naar positie 2 te gaan) { currentState = Position_2; stateChanged = true; pc.printf("Moving to position_2 state\n"); } if (// eis om naar drop off positie te gaan, als het eraf glijden mislukt is) { currentState = Position_drop_off; stateChanged = true; pc.printf("Moving to position_drop_off state\n"); } if (// eis voor nieuwe poging om home positie juist te bereiken) { currentState = Homing; // Mogelijk de state Calib_motor stateChanged = true; pc.printf("Retry homing\n"); } if (// eis om de motoren uit te zetten) { currentState = Motors_off stateChanged = true; pc.printf("Shutting down\n"); } } break; case Position_1: if (stateChanged) { // Ervoor zorgen dat de end-effector if (stateChanged) { // Ervoor zorgen dat de motoren zo bewegen dat de robotarm in de juiste home positie wordt gezet currentState = No_mov_before_pick_up; stateChanged = true; pc.printf("Moving to no movement before pick up state \n"); } break; 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; }