control for robotic arm that can play chess using a granular gripper
Dependencies: Encoder mbed HIDScope Servo MODSERIAL
Fork of chessRobot by
main.cpp@130:2542f844ba1e, 2015-10-30 (annotated)
- Committer:
- annesteenbeek
- Date:
- Fri Oct 30 10:32:49 2015 +0100
- Revision:
- 130:2542f844ba1e
- Parent:
- 128:c583aff5a7bf
changes
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
annesteenbeek | 59:fe00be2cf8fd | 1 | /* |
annesteenbeek | 59:fe00be2cf8fd | 2 | ________ ____ __ __ |
annesteenbeek | 59:fe00be2cf8fd | 3 | / ____/ /_ ___ __________ / __ \____ / /_ ____ / /_ |
annesteenbeek | 59:fe00be2cf8fd | 4 | / / / __ \/ _ \/ ___/ ___/ / /_/ / __ \/ __ \/ __ \/ __/ |
annesteenbeek | 59:fe00be2cf8fd | 5 | / /___/ / / / __(__ |__ ) / _, _/ /_/ / /_/ / /_/ / /_ |
annesteenbeek | 59:fe00be2cf8fd | 6 | \____/_/ /_/\___/____/____/ /_/ |_|\____/_.___/\____/\__/ |
annesteenbeek | 59:fe00be2cf8fd | 7 | |
annesteenbeek | 59:fe00be2cf8fd | 8 | */ |
annesteenbeek | 59:fe00be2cf8fd | 9 | |
annesteenbeek | 12:61759f94c07a | 10 | #include "mbed.h" |
annesteenbeek | 127:831f03471efb | 11 | #include "config.h" // settings and pin configurations |
annesteenbeek | 127:831f03471efb | 12 | #include "actuators.h" // all the actuator related functions |
annesteenbeek | 127:831f03471efb | 13 | #include "buttons.h" // reading switches and buttons |
annesteenbeek | 127:831f03471efb | 14 | #include "debug.h" // HIDscope |
annesteenbeek | 127:831f03471efb | 15 | #include "emg.h" // EMG |
annesteenbeek | 127:831f03471efb | 16 | #include "serialcom.h" // Communication with web app |
annesteenbeek | 6:b957d8809e7c | 17 | |
annesteenbeek | 125:749b8ce2e040 | 18 | Ticker switchesTick, debugTick, motorTick, EMGTick, safetyTick, serialTick; |
annesteenbeek | 124:f67ce69557db | 19 | volatile bool switches_go=false, debug_go=false, motor_go=false, emg_go=false, safety_go=false, serial_go=false; |
annesteenbeek | 0:525558a26464 | 20 | |
annesteenbeek | 30:a20f16bf8dda | 21 | void switches_activate(){switches_go=true;}; |
annesteenbeek | 30:a20f16bf8dda | 22 | void debug_activate(){debug_go=true;}; |
annesteenbeek | 30:a20f16bf8dda | 23 | void motor_activate(){motor_go=true;}; |
annesteenbeek | 60:20945383ad1b | 24 | void emg_activate(){emg_go=true;}; |
annesteenbeek | 79:cf500b63f349 | 25 | void safety_activate(){safety_go=true;}; |
annesteenbeek | 124:f67ce69557db | 26 | void serial_activate(){serial_go=true;}; |
annesteenbeek | 59:fe00be2cf8fd | 27 | |
annesteenbeek | 111:43c0881fe7e7 | 28 | void tickerAttach(){ |
annesteenbeek | 98:25528494287d | 29 | switchesTick.attach(&switches_activate, 0.02f); |
annesteenbeek | 127:831f03471efb | 30 | // debugTick.attach(&debug_activate, motorCall); |
annesteenbeek | 98:25528494287d | 31 | motorTick.attach(&motor_activate, motorCall); |
annesteenbeek | 98:25528494287d | 32 | safetyTick.attach(&safety_activate, 0.001f); |
annesteenbeek | 126:56866cefaa08 | 33 | |
annesteenbeek | 111:43c0881fe7e7 | 34 | } |
annesteenbeek | 111:43c0881fe7e7 | 35 | |
annesteenbeek | 111:43c0881fe7e7 | 36 | double motorCall = 0.01; // set motor frequency global so it can be used for speed. |
annesteenbeek | 127:831f03471efb | 37 | const int sample = 0; // Constant for EMG mode switching |
annesteenbeek | 127:831f03471efb | 38 | const int normalize = 1; // Constant for EMG mode switching |
annesteenbeek | 127:831f03471efb | 39 | bool mode = normalize; |
annesteenbeek | 111:43c0881fe7e7 | 40 | bool tickersActivated = false; |
annesteenbeek | 127:831f03471efb | 41 | bool calReady = false; // flag for motor calibration |
annesteenbeek | 111:43c0881fe7e7 | 42 | |
annesteenbeek | 127:831f03471efb | 43 | bool usePotmeters = true; // flag for using the potmeters/EMG to control the system |
annesteenbeek | 127:831f03471efb | 44 | bool controlAngle = false; // control the system using motor angles |
annesteenbeek | 127:831f03471efb | 45 | bool controlDirection = true; // control the system using kinematics |
annesteenbeek | 128:c583aff5a7bf | 46 | bool enableEMG = false; |
annesteenbeek | 128:c583aff5a7bf | 47 | bool startCalibration = false; |
annesteenbeek | 128:c583aff5a7bf | 48 | bool EMGCalReady = false; |
annesteenbeek | 124:f67ce69557db | 49 | |
annesteenbeek | 111:43c0881fe7e7 | 50 | int main(){ |
annesteenbeek | 126:56866cefaa08 | 51 | serialInit(); |
annesteenbeek | 126:56866cefaa08 | 52 | serialTick.attach(&serial_activate, 0.1f); // initialze serial communication first |
annesteenbeek | 127:831f03471efb | 53 | EMGTick.attach(&emg_activate, 0.005f); |
annesteenbeek | 111:43c0881fe7e7 | 54 | motorInit(); |
annesteenbeek | 126:56866cefaa08 | 55 | |
annesteenbeek | 0:525558a26464 | 56 | while (true) { |
annesteenbeek | 127:831f03471efb | 57 | if(serial_go){ // communication between serial and the webpage |
annesteenbeek | 126:56866cefaa08 | 58 | serial_go=false; |
annesteenbeek | 126:56866cefaa08 | 59 | serialCom(); |
annesteenbeek | 126:56866cefaa08 | 60 | } |
annesteenbeek | 127:831f03471efb | 61 | if(startCalibration & !calReady){ // start calibration |
annesteenbeek | 127:831f03471efb | 62 | calReady = calibrateMotors(); |
annesteenbeek | 127:831f03471efb | 63 | } |
annesteenbeek | 127:831f03471efb | 64 | if(emg_go){ |
annesteenbeek | 128:c583aff5a7bf | 65 | emg_go=false; |
annesteenbeek | 127:831f03471efb | 66 | if(enableEMG){ |
annesteenbeek | 127:831f03471efb | 67 | readEMG(); |
annesteenbeek | 127:831f03471efb | 68 | } |
annesteenbeek | 128:c583aff5a7bf | 69 | if(mode==0){ |
annesteenbeek | 128:c583aff5a7bf | 70 | EMGCalReady = true; |
annesteenbeek | 128:c583aff5a7bf | 71 | } |
annesteenbeek | 127:831f03471efb | 72 | } |
annesteenbeek | 127:831f03471efb | 73 | if(calReady && !tickersActivated){ // when done with calibration, start rest of tickers |
annesteenbeek | 111:43c0881fe7e7 | 74 | tickerAttach(); |
annesteenbeek | 111:43c0881fe7e7 | 75 | tickersActivated = true; |
annesteenbeek | 111:43c0881fe7e7 | 76 | } |
annesteenbeek | 127:831f03471efb | 77 | if(safety_go){ |
annesteenbeek | 127:831f03471efb | 78 | safety_go=false; |
annesteenbeek | 127:831f03471efb | 79 | safety(); // springs at the side to constrain arm movement |
annesteenbeek | 127:831f03471efb | 80 | } |
annesteenbeek | 127:831f03471efb | 81 | if(switches_go){ |
annesteenbeek | 127:831f03471efb | 82 | switches_go=false; |
annesteenbeek | 127:831f03471efb | 83 | checkSwitches(); // read potmeters and buttons on the motor board |
annesteenbeek | 78:0cc7c64ba94c | 84 | } |
annesteenbeek | 127:831f03471efb | 85 | if(debug_go){ |
annesteenbeek | 127:831f03471efb | 86 | debug_go=false; |
annesteenbeek | 127:831f03471efb | 87 | debugProcess(); // send data to HIDscope |
annesteenbeek | 127:831f03471efb | 88 | } |
annesteenbeek | 127:831f03471efb | 89 | if(motor_go){ |
annesteenbeek | 127:831f03471efb | 90 | motor_go=false; |
annesteenbeek | 127:831f03471efb | 91 | motorControl(); // write data to the motors |
annesteenbeek | 127:831f03471efb | 92 | } |
annesteenbeek | 0:525558a26464 | 93 | } |
annesteenbeek | 0:525558a26464 | 94 | } |