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: mbed Servo LSM9DS1_Library_
main.cpp@1:d22b2e802de9, 2020-02-26 (annotated)
- Committer:
- kzkyuta
- Date:
- Wed Feb 26 03:01:40 2020 +0000
- Revision:
- 1:d22b2e802de9
- Parent:
- 0:f66784158dab
This version is for spontaneous blink detection ;
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| kzkyuta | 0:f66784158dab | 1 | #define DEVICE_SERIAL_FC 1 |
| kzkyuta | 0:f66784158dab | 2 | #include "mbed.h" |
| kzkyuta | 0:f66784158dab | 3 | #include "Servo.h" |
| kzkyuta | 0:f66784158dab | 4 | #include "LSM9DS1.h" |
| kzkyuta | 0:f66784158dab | 5 | |
| kzkyuta | 0:f66784158dab | 6 | //Serial pc(USBTX, USBRX); // to receive the name of participant |
| kzkyuta | 0:f66784158dab | 7 | Serial pc(P0_19, P0_18); // to receive the name of participant |
| kzkyuta | 0:f66784158dab | 8 | LSM9DS1 imu(P0_5, P0_4, 0xD6, 0x3C); |
| kzkyuta | 0:f66784158dab | 9 | |
| kzkyuta | 0:f66784158dab | 10 | AnalogIn sensor_0(P0_11); |
| kzkyuta | 0:f66784158dab | 11 | AnalogIn sensor_1(P0_12); |
| kzkyuta | 0:f66784158dab | 12 | AnalogIn sensor_2(P0_13); |
| kzkyuta | 0:f66784158dab | 13 | |
| kzkyuta | 0:f66784158dab | 14 | #define ARRAY_SIZE 10 |
| kzkyuta | 0:f66784158dab | 15 | int array_0[ARRAY_SIZE]; |
| kzkyuta | 0:f66784158dab | 16 | int array_1[ARRAY_SIZE]; |
| kzkyuta | 0:f66784158dab | 17 | int array_2[ARRAY_SIZE]; |
| kzkyuta | 0:f66784158dab | 18 | |
| kzkyuta | 0:f66784158dab | 19 | int diff_0; |
| kzkyuta | 0:f66784158dab | 20 | int diff_1; |
| kzkyuta | 0:f66784158dab | 21 | int diff_2; |
| kzkyuta | 0:f66784158dab | 22 | |
| kzkyuta | 0:f66784158dab | 23 | int val_0; |
| kzkyuta | 0:f66784158dab | 24 | int val_1; |
| kzkyuta | 0:f66784158dab | 25 | int val_2; |
| kzkyuta | 0:f66784158dab | 26 | |
| kzkyuta | 0:f66784158dab | 27 | bool TH_Vol; |
| kzkyuta | 0:f66784158dab | 28 | |
| kzkyuta | 0:f66784158dab | 29 | int val; |
| kzkyuta | 0:f66784158dab | 30 | |
| kzkyuta | 0:f66784158dab | 31 | unsigned short counter_read; |
| kzkyuta | 0:f66784158dab | 32 | unsigned short prev_counter_read; |
| kzkyuta | 0:f66784158dab | 33 | unsigned short counter_wait; |
| kzkyuta | 0:f66784158dab | 34 | unsigned short position; |
| kzkyuta | 0:f66784158dab | 35 | |
| kzkyuta | 1:d22b2e802de9 | 36 | #define THRESHOLD 500 |
| kzkyuta | 0:f66784158dab | 37 | #define THRESHOLD_VOL -100 |
| kzkyuta | 0:f66784158dab | 38 | |
| kzkyuta | 0:f66784158dab | 39 | DigitalOut rled(P0_15); |
| kzkyuta | 0:f66784158dab | 40 | DigitalOut sp(P0_15); |
| kzkyuta | 0:f66784158dab | 41 | DigitalOut gled(P0_23); |
| kzkyuta | 0:f66784158dab | 42 | DigitalOut bled(P0_16); |
| kzkyuta | 0:f66784158dab | 43 | DigitalIn sw(P0_1); |
| kzkyuta | 0:f66784158dab | 44 | DigitalIn bt(P0_14); |
| kzkyuta | 0:f66784158dab | 45 | |
| kzkyuta | 0:f66784158dab | 46 | Servo myservo(P0_9); |
| kzkyuta | 0:f66784158dab | 47 | bool servoState_c = true; |
| kzkyuta | 0:f66784158dab | 48 | bool servoState_p = true; |
| kzkyuta | 0:f66784158dab | 49 | bool isAutoActuation = false; |
| kzkyuta | 0:f66784158dab | 50 | bool isServoClose = false; |
| kzkyuta | 0:f66784158dab | 51 | |
| kzkyuta | 0:f66784158dab | 52 | Ticker timer_1; |
| kzkyuta | 0:f66784158dab | 53 | |
| kzkyuta | 0:f66784158dab | 54 | uint8_t mode; // 0:auto, 1:manual, 2:BT base ctrl |
| kzkyuta | 0:f66784158dab | 55 | uint8_t bt_state; |
| kzkyuta | 0:f66784158dab | 56 | bool sw_state = true; |
| kzkyuta | 0:f66784158dab | 57 | |
| kzkyuta | 0:f66784158dab | 58 | void counter(){ |
| kzkyuta | 0:f66784158dab | 59 | counter_read ++; |
| kzkyuta | 0:f66784158dab | 60 | counter_wait ++; |
| kzkyuta | 0:f66784158dab | 61 | if(counter_read >= 60000) counter_read = 0; |
| kzkyuta | 0:f66784158dab | 62 | if(counter_wait >= 60000) counter_wait = 1000; |
| kzkyuta | 0:f66784158dab | 63 | } |
| kzkyuta | 0:f66784158dab | 64 | |
| kzkyuta | 0:f66784158dab | 65 | void readVal(){ |
| kzkyuta | 0:f66784158dab | 66 | // imu.readAccel(); |
| kzkyuta | 0:f66784158dab | 67 | // imu.readMag(); |
| kzkyuta | 0:f66784158dab | 68 | // imu.readGyro(); |
| kzkyuta | 0:f66784158dab | 69 | // read the sensor value and push to the window array for differenciation. |
| kzkyuta | 0:f66784158dab | 70 | val_0 = sensor_0.read_u16(); |
| kzkyuta | 0:f66784158dab | 71 | val_1 = sensor_1.read_u16(); |
| kzkyuta | 0:f66784158dab | 72 | val_2 = sensor_2.read_u16(); |
| kzkyuta | 0:f66784158dab | 73 | |
| kzkyuta | 0:f66784158dab | 74 | if(val_1 < 100 && val_2 < 100) TH_Vol = true; |
| kzkyuta | 0:f66784158dab | 75 | else TH_Vol = false; |
| kzkyuta | 0:f66784158dab | 76 | |
| kzkyuta | 0:f66784158dab | 77 | if(val_0 > 36000 && val_0 < 27000) val_0 = array_0[ARRAY_SIZE - 1]; |
| kzkyuta | 0:f66784158dab | 78 | if(val_1 > 36000 && val_1 < 27000) val_1 = array_1[ARRAY_SIZE - 1]; |
| kzkyuta | 0:f66784158dab | 79 | if(val_2 > 36000 && val_2 < 27000) val_2 = array_2[ARRAY_SIZE - 1]; |
| kzkyuta | 0:f66784158dab | 80 | |
| kzkyuta | 0:f66784158dab | 81 | position ++; |
| kzkyuta | 0:f66784158dab | 82 | int tempPos = position % ARRAY_SIZE; |
| kzkyuta | 0:f66784158dab | 83 | |
| kzkyuta | 1:d22b2e802de9 | 84 | //array_0[tempPos] = (val_0 + array_0[ARRAY_SIZE - 1] + array_0[ARRAY_SIZE - 2] + array_0[ARRAY_SIZE - 3])/3; |
| kzkyuta | 1:d22b2e802de9 | 85 | // array_1[tempPos] = (val_1 + array_1[ARRAY_SIZE - 1] + array_1[ARRAY_SIZE - 2] + array_1[ARRAY_SIZE - 3])/3; |
| kzkyuta | 1:d22b2e802de9 | 86 | // array_2[tempPos] = (val_2 + array_2[ARRAY_SIZE - 1] + array_2[ARRAY_SIZE - 2] + array_2[ARRAY_SIZE - 3])/3; |
| kzkyuta | 1:d22b2e802de9 | 87 | array_0[tempPos] = val_0; |
| kzkyuta | 1:d22b2e802de9 | 88 | array_1[tempPos] = val_1; |
| kzkyuta | 1:d22b2e802de9 | 89 | array_2[tempPos] = val_2; |
| kzkyuta | 0:f66784158dab | 90 | |
| kzkyuta | 0:f66784158dab | 91 | // calcurate the differenciation. |
| kzkyuta | 0:f66784158dab | 92 | if(tempPos == ARRAY_SIZE - 1){ |
| kzkyuta | 0:f66784158dab | 93 | diff_0 = array_0[tempPos] - array_0[0]; |
| kzkyuta | 0:f66784158dab | 94 | diff_1 = array_1[tempPos] - array_1[0]; |
| kzkyuta | 0:f66784158dab | 95 | diff_2 = array_2[tempPos] - array_2[0]; |
| kzkyuta | 0:f66784158dab | 96 | }else{ |
| kzkyuta | 0:f66784158dab | 97 | diff_0 = array_0[tempPos] - array_0[tempPos + 1]; |
| kzkyuta | 0:f66784158dab | 98 | diff_1 = array_1[tempPos] - array_1[tempPos + 1]; |
| kzkyuta | 0:f66784158dab | 99 | diff_2 = array_2[tempPos] - array_2[tempPos + 1]; |
| kzkyuta | 0:f66784158dab | 100 | } |
| kzkyuta | 0:f66784158dab | 101 | } |
| kzkyuta | 0:f66784158dab | 102 | |
| kzkyuta | 0:f66784158dab | 103 | void setup(){ |
| kzkyuta | 0:f66784158dab | 104 | timer_1.attach_us(&counter, 1000); |
| kzkyuta | 0:f66784158dab | 105 | myservo.calibrate(0.0005, 45.0); |
| kzkyuta | 0:f66784158dab | 106 | myservo = 0.55; |
| kzkyuta | 0:f66784158dab | 107 | imu.begin(); |
| kzkyuta | 0:f66784158dab | 108 | sw.mode(PullUp); |
| kzkyuta | 0:f66784158dab | 109 | // pc.set_flow_control(Serial::RTSCTS, p7, p8); |
| kzkyuta | 0:f66784158dab | 110 | } |
| kzkyuta | 0:f66784158dab | 111 | |
| kzkyuta | 0:f66784158dab | 112 | void ledShow(uint8_t _input){ |
| kzkyuta | 0:f66784158dab | 113 | switch(_input){ |
| kzkyuta | 0:f66784158dab | 114 | case 0: |
| kzkyuta | 0:f66784158dab | 115 | rled = 0; |
| kzkyuta | 0:f66784158dab | 116 | gled = 0; |
| kzkyuta | 0:f66784158dab | 117 | bled = 0; |
| kzkyuta | 0:f66784158dab | 118 | break; |
| kzkyuta | 0:f66784158dab | 119 | case 1: |
| kzkyuta | 0:f66784158dab | 120 | rled = 1; |
| kzkyuta | 0:f66784158dab | 121 | gled = 0; |
| kzkyuta | 0:f66784158dab | 122 | bled = 0; |
| kzkyuta | 0:f66784158dab | 123 | break; |
| kzkyuta | 0:f66784158dab | 124 | case 2: |
| kzkyuta | 0:f66784158dab | 125 | rled = 0; |
| kzkyuta | 0:f66784158dab | 126 | gled = 1; |
| kzkyuta | 0:f66784158dab | 127 | bled = 0; |
| kzkyuta | 0:f66784158dab | 128 | break; |
| kzkyuta | 0:f66784158dab | 129 | case 3: |
| kzkyuta | 0:f66784158dab | 130 | rled = 0; |
| kzkyuta | 0:f66784158dab | 131 | gled = 0; |
| kzkyuta | 0:f66784158dab | 132 | bled = 1; |
| kzkyuta | 0:f66784158dab | 133 | break; |
| kzkyuta | 0:f66784158dab | 134 | default: |
| kzkyuta | 0:f66784158dab | 135 | rled = 0; |
| kzkyuta | 0:f66784158dab | 136 | gled = 0; |
| kzkyuta | 0:f66784158dab | 137 | bled = 0; |
| kzkyuta | 0:f66784158dab | 138 | break; |
| kzkyuta | 0:f66784158dab | 139 | } |
| kzkyuta | 0:f66784158dab | 140 | } |
| kzkyuta | 0:f66784158dab | 141 | |
| kzkyuta | 0:f66784158dab | 142 | void ledCtrl(){ |
| kzkyuta | 0:f66784158dab | 143 | if(bt_state){ |
| kzkyuta | 0:f66784158dab | 144 | if(counter_read % 500 >= 250){ |
| kzkyuta | 0:f66784158dab | 145 | ledShow(mode + 1); |
| kzkyuta | 0:f66784158dab | 146 | }else{ |
| kzkyuta | 0:f66784158dab | 147 | ledShow(0); |
| kzkyuta | 0:f66784158dab | 148 | } |
| kzkyuta | 0:f66784158dab | 149 | }else{ |
| kzkyuta | 0:f66784158dab | 150 | ledShow(mode + 1); |
| kzkyuta | 0:f66784158dab | 151 | } |
| kzkyuta | 0:f66784158dab | 152 | } |
| kzkyuta | 0:f66784158dab | 153 | |
| kzkyuta | 0:f66784158dab | 154 | void changeMode(){ |
| kzkyuta | 0:f66784158dab | 155 | mode++; |
| kzkyuta | 0:f66784158dab | 156 | if(mode >= 3) mode = 0; |
| kzkyuta | 0:f66784158dab | 157 | } |
| kzkyuta | 0:f66784158dab | 158 | |
| kzkyuta | 0:f66784158dab | 159 | void servoOpen(){ |
| kzkyuta | 0:f66784158dab | 160 | myservo = 0.55; |
| kzkyuta | 0:f66784158dab | 161 | } |
| kzkyuta | 0:f66784158dab | 162 | |
| kzkyuta | 0:f66784158dab | 163 | void servoClose(){ |
| kzkyuta | 0:f66784158dab | 164 | myservo = 0.0; |
| kzkyuta | 0:f66784158dab | 165 | } |
| kzkyuta | 0:f66784158dab | 166 | |
| kzkyuta | 0:f66784158dab | 167 | void autoActuation(){ |
| kzkyuta | 0:f66784158dab | 168 | if(isAutoActuation){ |
| kzkyuta | 0:f66784158dab | 169 | if(servoState_c && servoState_p){ |
| kzkyuta | 0:f66784158dab | 170 | servoState_c = false; |
| kzkyuta | 0:f66784158dab | 171 | myservo = 0.0; |
| kzkyuta | 0:f66784158dab | 172 | counter_wait = 0; |
| kzkyuta | 0:f66784158dab | 173 | }else if(!servoState_c && servoState_p){ |
| kzkyuta | 0:f66784158dab | 174 | if(counter_wait >= 250) servoState_p = false; |
| kzkyuta | 0:f66784158dab | 175 | }else if(!servoState_c && !servoState_p){ |
| kzkyuta | 0:f66784158dab | 176 | servoState_c = true; |
| kzkyuta | 0:f66784158dab | 177 | myservo = 0.55; |
| kzkyuta | 0:f66784158dab | 178 | counter_wait = 0; |
| kzkyuta | 0:f66784158dab | 179 | }else if(servoState_c && !servoState_p){ |
| kzkyuta | 0:f66784158dab | 180 | if(counter_wait >= 500) servoState_p = true; |
| kzkyuta | 0:f66784158dab | 181 | isAutoActuation = false; |
| kzkyuta | 0:f66784158dab | 182 | } |
| kzkyuta | 0:f66784158dab | 183 | } |
| kzkyuta | 0:f66784158dab | 184 | } |
| kzkyuta | 0:f66784158dab | 185 | |
| kzkyuta | 0:f66784158dab | 186 | void btnCtrl(){ |
| kzkyuta | 0:f66784158dab | 187 | if(!sw){ |
| kzkyuta | 0:f66784158dab | 188 | pc.printf("Pushed"); |
| kzkyuta | 0:f66784158dab | 189 | if(sw_state){ |
| kzkyuta | 0:f66784158dab | 190 | sw_state = false; |
| kzkyuta | 0:f66784158dab | 191 | counter_wait = 0; |
| kzkyuta | 0:f66784158dab | 192 | } |
| kzkyuta | 0:f66784158dab | 193 | } |
| kzkyuta | 0:f66784158dab | 194 | if(sw && !sw_state){ |
| kzkyuta | 0:f66784158dab | 195 | if((counter_wait > 50) && (counter_wait < 800)){ |
| kzkyuta | 0:f66784158dab | 196 | if(mode == 1){ |
| kzkyuta | 0:f66784158dab | 197 | if(isServoClose){ |
| kzkyuta | 0:f66784158dab | 198 | servoOpen(); |
| kzkyuta | 0:f66784158dab | 199 | }else{ |
| kzkyuta | 0:f66784158dab | 200 | servoClose(); |
| kzkyuta | 0:f66784158dab | 201 | } |
| kzkyuta | 0:f66784158dab | 202 | isServoClose = !isServoClose; |
| kzkyuta | 0:f66784158dab | 203 | } |
| kzkyuta | 0:f66784158dab | 204 | }else if(counter_wait >= 800){ |
| kzkyuta | 0:f66784158dab | 205 | changeMode(); |
| kzkyuta | 0:f66784158dab | 206 | servoOpen(); |
| kzkyuta | 0:f66784158dab | 207 | } |
| kzkyuta | 0:f66784158dab | 208 | sw_state = true; |
| kzkyuta | 0:f66784158dab | 209 | pc.printf("mode is %d\n", mode); |
| kzkyuta | 0:f66784158dab | 210 | } |
| kzkyuta | 0:f66784158dab | 211 | } |
| kzkyuta | 0:f66784158dab | 212 | |
| kzkyuta | 0:f66784158dab | 213 | void detection(){ |
| kzkyuta | 0:f66784158dab | 214 | if(TH_Vol){ |
| kzkyuta | 0:f66784158dab | 215 | if(diff_0 < THRESHOLD_VOL){ |
| kzkyuta | 0:f66784158dab | 216 | if((diff_0 > -10000) || (diff_1 > -10000) || (diff_2 < -10000)){ |
| kzkyuta | 0:f66784158dab | 217 | pc.printf("detected!!"); |
| kzkyuta | 0:f66784158dab | 218 | isAutoActuation = true; |
| kzkyuta | 0:f66784158dab | 219 | } |
| kzkyuta | 0:f66784158dab | 220 | } |
| kzkyuta | 1:d22b2e802de9 | 221 | }else{ |
| kzkyuta | 1:d22b2e802de9 | 222 | if((diff_0 > THRESHOLD) || (diff_1 > THRESHOLD) || (diff_2 > THRESHOLD)){ |
| kzkyuta | 1:d22b2e802de9 | 223 | if((diff_0 < 3000) || (diff_1 < 3000) || (diff_2 < 3000)){ |
| kzkyuta | 1:d22b2e802de9 | 224 | pc.printf("detected"); |
| kzkyuta | 1:d22b2e802de9 | 225 | isAutoActuation = true; |
| kzkyuta | 1:d22b2e802de9 | 226 | } |
| kzkyuta | 1:d22b2e802de9 | 227 | } |
| kzkyuta | 1:d22b2e802de9 | 228 | } |
| kzkyuta | 0:f66784158dab | 229 | } |
| kzkyuta | 0:f66784158dab | 230 | |
| kzkyuta | 0:f66784158dab | 231 | int main() { |
| kzkyuta | 0:f66784158dab | 232 | setup(); |
| kzkyuta | 0:f66784158dab | 233 | while(1) { |
| kzkyuta | 0:f66784158dab | 234 | if(counter_read % 3 == 0){ |
| kzkyuta | 0:f66784158dab | 235 | readVal(); |
| kzkyuta | 0:f66784158dab | 236 | detection(); |
| kzkyuta | 0:f66784158dab | 237 | } |
| kzkyuta | 0:f66784158dab | 238 | if(mode == 0){ |
| kzkyuta | 0:f66784158dab | 239 | autoActuation(); |
| kzkyuta | 0:f66784158dab | 240 | } |
| kzkyuta | 0:f66784158dab | 241 | btnCtrl(); |
| kzkyuta | 0:f66784158dab | 242 | bt_state = bt; |
| kzkyuta | 0:f66784158dab | 243 | ledCtrl(); |
| kzkyuta | 0:f66784158dab | 244 | } |
| kzkyuta | 0:f66784158dab | 245 | } |