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: MODSERIAL biquadFilter mbed
Fork of Kinematics by
Diff: main.cpp
- Revision:
- 14:e3fe54f0a4b4
- Parent:
- 13:f77c5f196161
- Child:
- 15:38258e6b6e91
diff -r f77c5f196161 -r e3fe54f0a4b4 main.cpp
--- a/main.cpp Wed Oct 31 17:36:26 2018 +0000
+++ b/main.cpp Wed Oct 31 18:15:10 2018 +0000
@@ -6,8 +6,16 @@
#include "BiQuad.h"
#include <algorithm>
#define PI 3.14159265
+
+//Inputs and outputs
MODSERIAL pc(USBTX, USBRX); // connecting to pc
-
+MODSERIAL pc(USBTX, USBRX); //Use computer
+AnalogIn EMG0In(A0); //EMG input 0
+AnalogIn EMG1In(A1); //EMG input 1
+InterruptIn button(SW3); //Define button
+DigitalOut greenled(LED_GREEN); //Green led
+DigitalOut blueled(LED_BLUE); //Blue led
+DigitalOut redled(LED_RED); //Red led
@@ -17,24 +25,54 @@
double omega4;
-//Joe dit zijn de inputsignalen (en tussenvariabelen)
+//parameters for kinematics
//vorige theta
double theta1 = PI*0.49; // huidige/nieuwe theta
double theta4 = PI*0.49;
-bool emg1;
-bool emg2;
-bool emg3;
-double thetaflip = 0;
+double thetaflip = 0; //angle of the flipping motor
+double prefx; //Preference for x, will later be defined due to the motor
+double prefy; //" "
+double deltat = 0.01; //tijdstap(moet nog aangepast worden)
+
+//Parameters for the first EMG signal
+float EMG0; //float for EMG input
+float EMG0filt; //float for filtered EMG
+float EMG0filtArray[Parts]; //Array for the filtered array
+float EMG0Average; //float for the value after Moving Average Filter
+float Sum0 = 0; //Sum0 for the moving average filter
+float EMG0Calibrate[Length]; //Array for the calibration
+int ReadCal0 = 0; //Integer to read over the calibration array
+float MaxValue0 = 0; //float to save the max muscle
+float Threshold0 = 0; //Threshold for the first EMG signal
-double prefx;
-double prefy;
-double deltat = 0.01; //tijdstap(moet nog aangepast worden)
-//Joe dit zijn de constantes
-double ll = 200.0;
-double lu = 170.0;
-double lb = 10.0;
-double le = 79.0;
-double xbase = 340;
+//Parameters for the second EMG signal
+float EMG1; //float for EMG input
+float EMG1filt; //float for filtered EMG
+float EMG1filtArray[Parts]; //Array for the filtered array
+float EMG1Average; //float for the value after Moving Average Filter
+float Sum1 = 0; //Sum0 for the moving average filter
+float EMG1Calibrate[Length]; //Array for the calibration
+int ReadCal1 = 0; //Integer to read over the calibration array
+float MaxValue1 = 0; //float to save the max muscle
+float Threshold1 = 0; //Threshold for the second EMG signal
+
+//Constants
+const double ll = 200.0;
+const double lu = 170.0;
+const double lb = 10.0;
+const double le = 79.0;
+const double xbase = 340;
+const int Length = 10000; //Length of the array for the calibration
+const int Parts = 50; //Mean average filter over 50 values
+
+//Filter variables
+BiQuad Notch50_0(0.7887,0,0.7887,0,0.5774); //Make Notch filter around 50 Hz
+BiQuad Notch50_1(0.7887,0,0.7887,0,0.5774); //Make Notch filter around 50 Hz
+BiQuad High0(0.8006,-1.6012,0.8006,-1.561,0.6414); //Make high-pass filter
+BiQuad High1(0.8006,-1.6012,0.8006,-1.561,0.6414); //Make high-pass filter
+BiQuadChain filter0; //Make chain of filters for the first EMG signal
+BiQuadChain filter1; //Make chain of filters for the second EMG signal
+
//forward kinematics, Check mathematica! Omdat mbed in paniek raakt met meerdere wortels, hebben we de vergelijking opgedeeld in 3 stukken
@@ -68,6 +106,45 @@
Ticker SwitchState_timer; //Timer to switch from the Calibration to the working mode
+//Bool for movement
+bool xMove = false; //Bool for the x-movement
+bool yMove = false; //Bool for the y-movement
+
+//Parameters for the state machine
+enum States {Calibration, WorkingMode}; //Initialize state machine
+States CurrentState = Calibration; //Start in the calibration mode
+bool StateBool = true; //Bool to first go in a state
+bool SwitchStateBool = false; //Bool to switch from calibration to working mode
+
+//Function to read and filter the EMG
+void ReadUseEMG0(){
+ for(int i = Parts ; i > 0 ; i--){ //Make a first in, first out array
+ EMG0filtArray[i] = EMG0filtArray[i-1]; //Every value moves one up
+ }
+
+ Sum0 = 0;
+ EMG0 = EMG0In; //Save EMG input in float
+ EMG0filt = filter0.step(EMG0); //Filter the signal
+ EMG0filt = abs(EMG0filt); //Take the absolute value
+ EMG0filtArray[0] = EMG0filt; //Save the filtered signal on the first place in the array
+
+ for(int i = 0 ; i < Parts ; i++){ //Moving Average filter
+ Sum0 += EMG0filtArray[i]; //Sum the new value and the previous 49
+ }
+ EMG0Average = (float)Sum0/Parts; //Divide the sum by 50
+
+ if (EMG0Average > Threshold0){ //If the value is higher than the threshold value
+ redled = 0; //Turn the LED on
+ xMove = true; //Set movement to true
+ }
+ else{
+ redled = 1; //Otherwise turn the LED off
+ yMove = false; //Otherwise set movement to false
+ }
+}
+
+
+
//dit wordt aangeroepen in de tickerfunctie
void inverse(double prex, double prey){
