![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Script 15-10-2019
Dependencies: Servoaansturing mbed QEI HIDScope biquadFilter MODSERIAL FastPWM
Diff: main.cpp
- Revision:
- 17:e371bced66da
- Parent:
- 16:733a71a177e8
- Child:
- 18:315a7670d0ca
--- a/main.cpp Tue Oct 15 13:52:25 2019 +0000 +++ b/main.cpp Fri Oct 18 13:30:09 2019 +0000 @@ -17,14 +17,44 @@ DigitalOut motor2_dir(D4); DigitalIn Power_button_pressed(D1); // Geen InterruptIn gebruiken! -DigitalIn Emergency_button_pressed(D2); +DigitalIn Emergency_button_pressed(D2); AnalogIn EMG_biceps_right_raw (A0); AnalogIn EMG_biceps_left_raw (A1); Analogin EMG_calf_raw (A2); Ticker loop_ticker; -Ticker sample_timer; +Ticker HIDScope_ticker; +Ticker emgSampleTicker; + +HIDScope scope(3); + +BiQuadChain bqc; // Let op !!! Deze coëfficiënten moeten nog worden veranderd +BiQuad bq1(0.0030, 0.0059, 0.0030, -1.8404,0.8522); //voor low-pass +BiQuad bq2(0.9737, -1.9474, 0.9737, -1.9467, 0.9481); //voor high-pass +BiQuad bq3(0.9912, -1.9823,0.9912, -1.9822, 0.9824); //lage piek eruit-> voor coëfficienten, zie matlab + +void emgSampleFilter() // Deze functie wordt aangeroepen dmv een ticker. Het sampled + // hierdoor het EMG signaal en het haalt er een filter overheen +{ + double filtered_EMG_biceps_right=bqc.step(EMG_biceps_right_raw.read()); + double filtered_EMG_biceps_left=bqc.step(EMG_biceps_left_raw.read()); + double filtered_EMG_calf=bqc.step(EMG_calf_raw.read()); +} + +void sendHIDScope() // Deze functie geeft de gefilterde EMG-signalen weer in de HIDScope + // Wordt eveneens gerund dmv een ticker +{ + /* Set the sampled emg values in channel 0 (the first channel) and 1 (the second channel) in the 'HIDScope' instance named 'scope' */ + scope.set(0, filtered_EMG_biceps_right() ); // Werkt dit zo? Of nog met .read? + scope.set(1, filtered_EMG_biceps_left() ); + scope.set(2, filtered_EMG_calf() ); + /* Repeat the step above if required for more channels of required (channel 0 up to 5 = 6 channels) + * Ensure that enough channels are available (HIDScope scope( 2 )) + * Finally, send all channels to the PC at once */ + scope.send(); + // Eventueel nog een ledje laten branden +} // Emergency void emergency() @@ -55,30 +85,20 @@ motor1_dir.write(1); pc.printf("Motoren aan functie\r\n"); } - -// EMG inladen -void emg_load() - { - EMG_biceps_right_raw.read(); - EMG_biceps_left_raw.read(); - EMG_calf_raw.read(); - pc.printf("EMG data inladen\r\n"); - } - - -void emg_discrete_filter() - { - // De ticker functie sample_timer hier toepassen voor het discretiseren? - // -> werkt een ticker in dit geval binnnen een void? - // Gemaakte filter toepassen op ruwe EMG data - } // EMG kalibreren void emg_calibration() { - // Spieren maximaal aanspannen om het maximale potentiaal te - // verkrijgen. Een fractie hiervan kan als drempel worden gebruikt voor - // beweging + // Gedurende bijv. 5 seconden EMG meten, wanneer de spieren maximaal + // worden aangespannen -> maximaal potentiaal verkrijgen. Een fractie + // hiervan kan als drempel worden gebruikt voor beweging + + // *Tijd instellen* + + filtered_EMG_biceps_right_max + filtered_EMG_biceps_left_max + filtered_EMG_calf_max + } // Finite state machine programming (calibration servo motor?) @@ -201,6 +221,9 @@ int main(void) { pc.printf("Opstarten\r\n"); + bqc.add(&bq1).add(&bq2).add(&bq3); + emgSampleTicker.attach(&emgSampleFilter, 0.01f); + HIDScope_ticker.attach(&sendHIDScope, 0.01f); loop_ticker.attach(&ProcessStateMachine, 5.0f); while(true) { /* do nothing */}