Script 15-10-2019

Dependencies:   Servoaansturing mbed QEI HIDScope biquadFilter MODSERIAL FastPWM

Committer:
Renate
Date:
Mon Oct 14 15:15:12 2019 +0000
Revision:
13:cb40c3037f9c
Parent:
12:93ad9781eeef
Child:
14:54343b9fd708
Verschillende snelheden

Who changed what in which revision?

UserRevisionLine numberNew contents of line
RobertoO 0:67c50348f842 1 #include "mbed.h"
Rosalie 3:6ee0b20c23b0 2 #include "HIDScope.h"
Rosalie 3:6ee0b20c23b0 3 #include "QEI.h"
RobertoO 1:b862262a9d14 4 #include "MODSERIAL.h"
Rosalie 3:6ee0b20c23b0 5 #include "BiQuad.h"
Rosalie 3:6ee0b20c23b0 6 #include "FastPWM.h"
WiesjeRoskamp 2:aee655d11b6d 7 #include <math.h>
Rosalie 5:9f1260408ef2 8 #include "Servo.h"
RobertoO 0:67c50348f842 9
Renate 11:4bc0304978e2 10 // Definieer objecten
WiesjeRoskamp 2:aee655d11b6d 11 Serial pc(USBTX, USBRX);
Rosalie 3:6ee0b20c23b0 12
Rosalie 4:6742476fadcf 13 PwmOut motor1(D6);
Rosalie 4:6742476fadcf 14 PwmOut motor2(D5);
Rosalie 3:6ee0b20c23b0 15
Renate 9:4de589636f50 16 DigitalIn Power_button_pressed(D1);
Renate 9:4de589636f50 17 DigitalIn Emergency_button_pressed(D2);
WiesjeRoskamp 2:aee655d11b6d 18
Renate 8:c7d3b67346db 19 Ticker loop_ticker;
Renate 8:c7d3b67346db 20
Renate 11:4bc0304978e2 21 // Motoren aan-/uitzetten
Renate 8:c7d3b67346db 22 void motors_on_off()
WiesjeRoskamp 2:aee655d11b6d 23 {
Renate 13:cb40c3037f9c 24 if (motor1 == 0)
Renate 13:cb40c3037f9c 25 {
Renate 13:cb40c3037f9c 26 if (motor2 == 0)
Renate 13:cb40c3037f9c 27 {
Renate 13:cb40c3037f9c 28 motor2 = 0.1;
Renate 13:cb40c3037f9c 29 motor1 = 0.9;
Renate 13:cb40c3037f9c 30 }
Renate 13:cb40c3037f9c 31 else
Renate 13:cb40c3037f9c 32 {
Renate 13:cb40c3037f9c 33 motor2 = 0;
Renate 13:cb40c3037f9c 34 motor1 = 0.9;
Renate 13:cb40c3037f9c 35 }
Renate 13:cb40c3037f9c 36 }
Renate 13:cb40c3037f9c 37 else
Renate 13:cb40c3037f9c 38 {
Renate 13:cb40c3037f9c 39 if (motor2 == 0)
Renate 13:cb40c3037f9c 40 {
Renate 13:cb40c3037f9c 41 motor2 = 0.1;
Renate 13:cb40c3037f9c 42 motor1 = 0;
Renate 13:cb40c3037f9c 43 }
Renate 13:cb40c3037f9c 44 else
Renate 13:cb40c3037f9c 45 {
Renate 13:cb40c3037f9c 46 motor2 = 0;
Renate 13:cb40c3037f9c 47 motor1 = 0;
Renate 13:cb40c3037f9c 48 }
Renate 13:cb40c3037f9c 49 }
Renate 13:cb40c3037f9c 50
Renate 13:cb40c3037f9c 51 // motor1=!motor1;
Renate 13:cb40c3037f9c 52 // motor2=!motor2;
Renate 9:4de589636f50 53 pc.printf("Motoren aan/uit functie\r\n");
Renate 8:c7d3b67346db 54 }
Renate 11:4bc0304978e2 55
Renate 11:4bc0304978e2 56 // Emergency
Renate 8:c7d3b67346db 57 void emergency()
Rosalie 3:6ee0b20c23b0 58 {
Renate 11:4bc0304978e2 59 loop_ticker.detach();
Renate 8:c7d3b67346db 60 motor1.write(0);
Renate 8:c7d3b67346db 61 motor2.write(0);
Renate 11:4bc0304978e2 62 pc.printf("Ik ga exploderen!!!\r\n");
Renate 11:4bc0304978e2 63 // Alles moet uitgaan (evt. een rood LEDje laten branden), moet
Renate 11:4bc0304978e2 64 // opnieuw worden opgestart. Mogelijk kan dit door de ticker de
Renate 11:4bc0304978e2 65 // detachen
Renate 8:c7d3b67346db 66 }
Renate 11:4bc0304978e2 67
Renate 11:4bc0304978e2 68 // Motoren uitzetten
Renate 8:c7d3b67346db 69 void motors_off()
Renate 8:c7d3b67346db 70 {
Renate 8:c7d3b67346db 71 motor1.write(0);
Renate 8:c7d3b67346db 72 motor2.write(0);
Renate 9:4de589636f50 73 pc.printf("Motoren uit functie\r\n");
Renate 8:c7d3b67346db 74 }
Renate 8:c7d3b67346db 75
Rosalie 3:6ee0b20c23b0 76
Renate 6:64146e16e10c 77 // Finite state machine programming (calibration servo motor?)
Renate 12:93ad9781eeef 78 enum states {Motors_off, Calib_motor, Calib_EMG, Homing, Operation_mode};
Renate 6:64146e16e10c 79
Renate 6:64146e16e10c 80 states currentState = Motors_off;
Renate 6:64146e16e10c 81 bool stateChanged = true; // Make sure the initialization of first state is executed
Renate 6:64146e16e10c 82
Renate 6:64146e16e10c 83 void ProcessStateMachine(void)
Renate 9:4de589636f50 84 {
Renate 6:64146e16e10c 85 switch (currentState)
Renate 6:64146e16e10c 86 {
Renate 6:64146e16e10c 87 case Motors_off:
Renate 6:64146e16e10c 88
Renate 9:4de589636f50 89 if (stateChanged)
Renate 6:64146e16e10c 90 {
Renate 8:c7d3b67346db 91 motors_off(); // functie waarbij motoren uitgaan
Renate 11:4bc0304978e2 92 stateChanged = false;
Renate 9:4de589636f50 93 pc.printf("Motors off state\r\n");
Renate 9:4de589636f50 94 }
Renate 11:4bc0304978e2 95 if (Power_button_pressed.read() == false) // Normaal waarde 1 bij indrukken, nu nul -> false
Renate 6:64146e16e10c 96 {
Renate 10:83f3cec8dd1c 97 motors_on_off();
Renate 9:4de589636f50 98 currentState = Calib_motor;
Renate 11:4bc0304978e2 99 stateChanged = true;
Renate 11:4bc0304978e2 100 pc.printf("Moving to Calib_motor state\r\n");
Renate 6:64146e16e10c 101 }
Renate 11:4bc0304978e2 102 if (Emergency_button_pressed.read() == false) // Normaal waarde 1 bij indrukken, nu nul -> false
Renate 8:c7d3b67346db 103 {
Renate 10:83f3cec8dd1c 104 emergency();
Renate 9:4de589636f50 105 }
Renate 6:64146e16e10c 106 break;
Renate 6:64146e16e10c 107
Renate 9:4de589636f50 108 case Calib_motor:
Renate 9:4de589636f50 109
Renate 9:4de589636f50 110 if (stateChanged)
Renate 9:4de589636f50 111 {
Renate 9:4de589636f50 112 // Hier wordt een kalibratie uitgevoerd, waarbij de motorhoeken worden bepaald
Renate 11:4bc0304978e2 113 currentState = Calib_EMG;
Renate 11:4bc0304978e2 114 stateChanged = true;
Renate 9:4de589636f50 115 pc.printf("Moving to Calib_EMG state\r\n");
Renate 9:4de589636f50 116 }
Renate 11:4bc0304978e2 117 if (Emergency_button_pressed.read() == false)
Renate 11:4bc0304978e2 118 {
Renate 11:4bc0304978e2 119 emergency();
Renate 11:4bc0304978e2 120 }
Renate 11:4bc0304978e2 121 break;
Renate 11:4bc0304978e2 122
Renate 11:4bc0304978e2 123 case Calib_EMG:
Renate 11:4bc0304978e2 124
Renate 11:4bc0304978e2 125 if (stateChanged)
Renate 11:4bc0304978e2 126 {
Renate 11:4bc0304978e2 127 // Hierbij wordt een een kalibratie uitgevoerd, waarbij de maximale EMG-amplitude waarde wordt bepaald
Renate 11:4bc0304978e2 128 currentState = Homing;
Renate 11:4bc0304978e2 129 stateChanged = true;
Renate 11:4bc0304978e2 130 pc.printf("Moving to Homing state\r\n");
Renate 11:4bc0304978e2 131 }
Renate 10:83f3cec8dd1c 132 if (Emergency_button_pressed.read() == false)
Renate 10:83f3cec8dd1c 133 {
Renate 11:4bc0304978e2 134 emergency();
Renate 11:4bc0304978e2 135 }
Renate 11:4bc0304978e2 136 break;
Renate 11:4bc0304978e2 137
Renate 11:4bc0304978e2 138 case Homing:
Renate 11:4bc0304978e2 139
Renate 11:4bc0304978e2 140 if (stateChanged)
Renate 11:4bc0304978e2 141 {
Renate 11:4bc0304978e2 142 // Ervoor zorgen dat de motoren zo bewegen dat de robotarm
Renate 11:4bc0304978e2 143 // (inclusief de end-effector) in de juiste home positie wordt gezet
Renate 11:4bc0304978e2 144 currentState = Operation_mode;
Renate 11:4bc0304978e2 145 stateChanged = true;
Renate 12:93ad9781eeef 146 pc.printf("Moving to operation mode \r\n");
Renate 11:4bc0304978e2 147 }
Renate 11:4bc0304978e2 148 if (Emergency_button_pressed.read() == false)
Renate 11:4bc0304978e2 149 {
Renate 10:83f3cec8dd1c 150 emergency();
Renate 10:83f3cec8dd1c 151 }
Renate 11:4bc0304978e2 152 break;
Renate 11:4bc0304978e2 153
Renate 11:4bc0304978e2 154 case Operation_mode:
Renate 11:4bc0304978e2 155
Renate 11:4bc0304978e2 156 if (stateChanged)
Renate 12:93ad9781eeef 157
Renate 11:4bc0304978e2 158 // Hier moet een functie worden aangeroepen die ervoor zorgt dat
Renate 11:4bc0304978e2 159 // aan de hand van EMG-signalen de motoren kunnen worden aangestuurd,
Renate 11:4bc0304978e2 160 // zodat de robotarm kan bewegen
Renate 11:4bc0304978e2 161
Renate 11:4bc0304978e2 162 if (Power_button_pressed.read() == false) // Normaal waarde 1 bij indrukken, nu nul -> false
Renate 11:4bc0304978e2 163 {
Renate 12:93ad9781eeef 164 motors_on_off();
Renate 11:4bc0304978e2 165 currentState = Motors_off;
Renate 11:4bc0304978e2 166 stateChanged = true;
Renate 12:93ad9781eeef 167 pc.printf("Terug naar de state Motors_off\r\n");
Renate 11:4bc0304978e2 168 }
Renate 11:4bc0304978e2 169 if (Emergency_button_pressed.read() == false)
Renate 11:4bc0304978e2 170 {
Renate 11:4bc0304978e2 171 emergency();
Renate 11:4bc0304978e2 172 }
Renate 12:93ad9781eeef 173 // wait(5);
Renate 11:4bc0304978e2 174 else
Renate 11:4bc0304978e2 175 {
Renate 11:4bc0304978e2 176 currentState = Homing;
Renate 11:4bc0304978e2 177 stateChanged = true;
Renate 12:93ad9781eeef 178 pc.printf("Terug naar de state Homing\r\n");
Renate 11:4bc0304978e2 179 }
Renate 11:4bc0304978e2 180 break;
Renate 9:4de589636f50 181
Renate 7:1d57463393c6 182 default:
Renate 7:1d57463393c6 183 // Zelfde functie als die eerder is toegepast om motoren uit te schakelen -> safety!
Renate 9:4de589636f50 184 pc.printf("Unknown or uninplemented state reached!\r\n");
Renate 8:c7d3b67346db 185
WiesjeRoskamp 2:aee655d11b6d 186 }
Renate 11:4bc0304978e2 187 }
WiesjeRoskamp 2:aee655d11b6d 188
Renate 8:c7d3b67346db 189 int main(void)
Renate 8:c7d3b67346db 190 {
Renate 9:4de589636f50 191 pc.printf("Opstarten\r\n");
Renate 12:93ad9781eeef 192 loop_ticker.attach(&ProcessStateMachine, 5.0f);
Renate 8:c7d3b67346db 193 while(true)
Renate 11:4bc0304978e2 194 { /* do nothing */}
Renate 8:c7d3b67346db 195 }