Yuta Kozaki / Mbed 2 deprecated winkey_1_3_11U24_smd

Dependencies:   mbed Servo LSM9DS1_Library_

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?

UserRevisionLine numberNew 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 }