Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: HIDScope MODSERIAL QEI biquadFilter mbed Servo
Diff: main.cpp
- Revision:
- 27:eee900e0a47d
- Parent:
- 23:7d83af123c43
- Child:
- 28:d952367fc0fc
diff -r 53c300d1320e -r eee900e0a47d main.cpp
--- a/main.cpp Mon Oct 29 12:38:04 2018 +0000
+++ b/main.cpp Mon Oct 29 15:03:14 2018 +0000
@@ -33,14 +33,24 @@
// tickers and timers
Ticker loop_ticker;
Timer state_timer;
+Timer emg_timer;
enum States {failure, waiting, calib_enc, calib_emg, operational, demo}; //All possible robot states
+enum Emg_measures_states {not_in_calib_emg, calib_right_bicep, calib_right_tricep, calib_left_bicep, calib_left_tricep}; // States inside
//Global variables/objects
States current_state;
+Emg_measures_states curent_emg_calibration_state = not_in_calib_enc;
double des_vx, des_vy, x, y, q1, q2, qref1, qref2, e1, e2, u1, u2, raw_emg_0, process_emg_0, raw_emg_1, process_emg_1; //will be set by the motor_controller function
double vxmax = 1.0, vymax = 1.0;
+double right_bicep_max = 0.0, right_tricep_max = 0.0, left_bicep_max= 0.0, left_tricep_max = 0.0;
+
+// Meaning of process_emg_0 and such
+// - process_emg_0 is right biceps
+// - process_emg_1 is right triceps
+// - process_emg_2 is left biceps
+// - process_emg_3 is left triceps
int counts_per_rotation = 32;
bool state_changed = false;
@@ -90,13 +100,76 @@
// fabs(motor1.velocity()) < 0.1f &&
if (state_timer.read() > 5.0f) {
current_state = calib_emg; //the NEXT loop we will be in calib_emg state
+ curent_emg_calibration_state = calib_right_bicep;
state_changed = true;
}
break;
case calib_emg: //calibrate emg-signals
- current_state = operational;
- break;
+ if (state_changed == true){
+ state_timer.reset();
+ state_timer.start();
+ emg_timer.reset();
+ emg_timer.start();
+ state_changed = false;
+ }
+
+ // calibrating right bicep
+ switch(curent_emg_calibration_state){
+ case calib_right_bicep:
+ if(emg_timer < 5.0f){
+ if (process_emg_0 > right_bicep_max){
+ right_bicep_max = process_emg_0;
+ }
+ }
+ else{
+ current_emg_calibration_state = calib_right_tricep;
+ emg_timer.reset();
+ emg_timer.start();
+ }
+ break;
+ case calib_right_tricep:
+ if(emg_timer < 5.0f){
+ if (process_emg_1 > right_tricep_max){
+ right_tricep_max = process_emg_1;
+ }
+ }
+ else{
+ current_emg_calibration_state = calib_left_bicep;
+ emg_timer.reset();
+ emg_timer.start();
+ }
+ break;
+ case calib_left_bicep:
+ if(emg_timer < 5.0f){
+ if (process_emg_2 > left_bicep_max){
+ left_bicep_max = process_emg_2;
+ }
+ }
+ else{
+ current_emg_calibration_state = calib_left_tricep;
+ emg_timer.reset();
+ emg_timer.start();
+ }
+ break;
+ case calib_left_tricep:
+ if(emg_timer < 5.0f){
+ if (process_emg_3 > left_tricep_max){
+ left_tricep_max = process_emg_3;
+ }
+ }
+ else{
+ current_emg_calibration_state = not_in_calib_emg;
+ current_state = operational;
+ state_changed = true;
+ emg_timer.reset();
+ emg_timer.start();
+ }
+ break;
+ default:
+ current_state = failure;
+ state_changed = true;
+
case operational: //interpreting emg-signals to move the end effector