This code is for Embedded System class homework1 use only.
Dependencies: Useless SB TSI mbed
Fork of Final_Homework1 by
main.cpp@1:c2e5e8c9a797, 2014-02-15 (annotated)
- Committer:
- stanislashzc
- Date:
- Sat Feb 15 06:18:12 2014 +0000
- Revision:
- 1:c2e5e8c9a797
- Parent:
- 0:c8a7071d8692
This is code for Embedded system homework1
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
bmdlh | 0:c8a7071d8692 | 1 | #include "mbed.h" |
bmdlh | 0:c8a7071d8692 | 2 | #include "TSISensor.h" |
bmdlh | 0:c8a7071d8692 | 3 | #include "MMA8451Q.h" |
bmdlh | 0:c8a7071d8692 | 4 | #include "MAG3110.h" |
bmdlh | 0:c8a7071d8692 | 5 | #include <cstdlib> |
stanislashzc | 1:c2e5e8c9a797 | 6 | |
stanislashzc | 1:c2e5e8c9a797 | 7 | #define OFF 0 |
stanislashzc | 1:c2e5e8c9a797 | 8 | #define ON 1 |
bmdlh | 0:c8a7071d8692 | 9 | |
bmdlh | 0:c8a7071d8692 | 10 | Serial pc(USBTX, USBRX); |
bmdlh | 0:c8a7071d8692 | 11 | |
bmdlh | 0:c8a7071d8692 | 12 | PwmOut rled(PTE29); |
bmdlh | 0:c8a7071d8692 | 13 | PwmOut gled(PTD5); |
stanislashzc | 1:c2e5e8c9a797 | 14 | |
stanislashzc | 1:c2e5e8c9a797 | 15 | MMA8451Q acc(PTE25, PTE24,0x1d<<1); |
stanislashzc | 1:c2e5e8c9a797 | 16 | MAG3110 mag(PTE25, PTE24); |
bmdlh | 0:c8a7071d8692 | 17 | AnalogIn lightSensor(PTE22); |
stanislashzc | 1:c2e5e8c9a797 | 18 | TSISensor tsi; |
stanislashzc | 1:c2e5e8c9a797 | 19 | AnalogIn sinwave(PTB1); |
stanislashzc | 1:c2e5e8c9a797 | 20 | |
stanislashzc | 1:c2e5e8c9a797 | 21 | int MAG_STATUS = OFF; |
stanislashzc | 1:c2e5e8c9a797 | 22 | int ACCL_STATUS = OFF; |
stanislashzc | 1:c2e5e8c9a797 | 23 | int LIGHT_STATUS = OFF; |
stanislashzc | 1:c2e5e8c9a797 | 24 | int TOUCH_STATUS = OFF; |
stanislashzc | 1:c2e5e8c9a797 | 25 | int SIN_STATUS = OFF; |
stanislashzc | 1:c2e5e8c9a797 | 26 | |
stanislashzc | 1:c2e5e8c9a797 | 27 | Timer timer_mag; |
stanislashzc | 1:c2e5e8c9a797 | 28 | Timer timer_acc; |
stanislashzc | 1:c2e5e8c9a797 | 29 | Timer timer_light; |
stanislashzc | 1:c2e5e8c9a797 | 30 | Timer timer_touch; |
stanislashzc | 1:c2e5e8c9a797 | 31 | Timer timer_sin; |
bmdlh | 0:c8a7071d8692 | 32 | |
stanislashzc | 1:c2e5e8c9a797 | 33 | int count_mag = 32767; |
stanislashzc | 1:c2e5e8c9a797 | 34 | int count_acc = 32767; |
stanislashzc | 1:c2e5e8c9a797 | 35 | int count_light = 32767; |
stanislashzc | 1:c2e5e8c9a797 | 36 | int count_touch = 32767; |
stanislashzc | 1:c2e5e8c9a797 | 37 | int count_sin = 32767; |
stanislashzc | 1:c2e5e8c9a797 | 38 | |
stanislashzc | 1:c2e5e8c9a797 | 39 | int START = OFF; |
stanislashzc | 1:c2e5e8c9a797 | 40 | |
stanislashzc | 1:c2e5e8c9a797 | 41 | void send4bytes(char label,void* x){ |
stanislashzc | 1:c2e5e8c9a797 | 42 | char *p = (char *)x; |
stanislashzc | 1:c2e5e8c9a797 | 43 | pc.putc(label); |
stanislashzc | 1:c2e5e8c9a797 | 44 | pc.putc(*p); |
stanislashzc | 1:c2e5e8c9a797 | 45 | pc.putc(*(p+1)); |
stanislashzc | 1:c2e5e8c9a797 | 46 | pc.putc(*(p+2)); |
stanislashzc | 1:c2e5e8c9a797 | 47 | pc.putc(*(p+3)); |
stanislashzc | 1:c2e5e8c9a797 | 48 | } |
bmdlh | 0:c8a7071d8692 | 49 | void calXY() //magnetometer calibration: finding max and min of X, Y axis |
bmdlh | 0:c8a7071d8692 | 50 | { |
bmdlh | 0:c8a7071d8692 | 51 | int tempXmax, tempXmin, tempYmax, tempYmin, newX, newY; |
bmdlh | 0:c8a7071d8692 | 52 | |
bmdlh | 0:c8a7071d8692 | 53 | rled = ON; |
bmdlh | 0:c8a7071d8692 | 54 | |
bmdlh | 0:c8a7071d8692 | 55 | printf("Waiting for initial press\n"); |
bmdlh | 0:c8a7071d8692 | 56 | // Wait for slider to be pressed |
bmdlh | 0:c8a7071d8692 | 57 | while( tsi.readDistance() == 0 ) { |
bmdlh | 0:c8a7071d8692 | 58 | rled = ON; |
bmdlh | 0:c8a7071d8692 | 59 | wait(0.2); |
bmdlh | 0:c8a7071d8692 | 60 | rled = OFF; |
bmdlh | 0:c8a7071d8692 | 61 | wait(0.2); |
bmdlh | 0:c8a7071d8692 | 62 | } |
bmdlh | 0:c8a7071d8692 | 63 | |
bmdlh | 0:c8a7071d8692 | 64 | printf("Waiting for release\n"); |
bmdlh | 0:c8a7071d8692 | 65 | |
bmdlh | 0:c8a7071d8692 | 66 | // Wait for release |
bmdlh | 0:c8a7071d8692 | 67 | while( tsi.readDistance() != 0 ) { |
bmdlh | 0:c8a7071d8692 | 68 | rled = OFF; |
bmdlh | 0:c8a7071d8692 | 69 | wait(0.2); |
bmdlh | 0:c8a7071d8692 | 70 | rled = ON; |
bmdlh | 0:c8a7071d8692 | 71 | wait(0.2); |
bmdlh | 0:c8a7071d8692 | 72 | } |
bmdlh | 0:c8a7071d8692 | 73 | rled = OFF; |
bmdlh | 0:c8a7071d8692 | 74 | wait(0.5); |
bmdlh | 0:c8a7071d8692 | 75 | |
bmdlh | 0:c8a7071d8692 | 76 | printf("Rotate\n"); |
bmdlh | 0:c8a7071d8692 | 77 | |
bmdlh | 0:c8a7071d8692 | 78 | tempXmax = tempXmin = mag.readVal(MAG_OUT_X_MSB); |
bmdlh | 0:c8a7071d8692 | 79 | tempYmax = tempYmin = mag.readVal(MAG_OUT_Y_MSB); |
bmdlh | 0:c8a7071d8692 | 80 | |
bmdlh | 0:c8a7071d8692 | 81 | while(tsi.readDistance() == 0) { |
bmdlh | 0:c8a7071d8692 | 82 | gled = ON; |
bmdlh | 0:c8a7071d8692 | 83 | wait(0.1); |
bmdlh | 0:c8a7071d8692 | 84 | gled = OFF; |
bmdlh | 0:c8a7071d8692 | 85 | wait(0.1); |
bmdlh | 0:c8a7071d8692 | 86 | newX = mag.readVal(MAG_OUT_X_MSB); |
bmdlh | 0:c8a7071d8692 | 87 | newY = mag.readVal(MAG_OUT_Y_MSB); |
bmdlh | 0:c8a7071d8692 | 88 | if (newX > tempXmax) tempXmax = newX; |
bmdlh | 0:c8a7071d8692 | 89 | if (newX < tempXmin) tempXmin = newX; |
bmdlh | 0:c8a7071d8692 | 90 | if (newY > tempYmax) tempYmax = newY; |
bmdlh | 0:c8a7071d8692 | 91 | if (newY < tempYmin) tempYmin = newY; |
bmdlh | 0:c8a7071d8692 | 92 | } |
bmdlh | 0:c8a7071d8692 | 93 | |
bmdlh | 0:c8a7071d8692 | 94 | mag.setCalibration( tempXmin, tempXmax, tempYmin, tempYmax ); |
bmdlh | 0:c8a7071d8692 | 95 | |
bmdlh | 0:c8a7071d8692 | 96 | // Wait for release |
bmdlh | 0:c8a7071d8692 | 97 | while( tsi.readDistance() != 0 ) { |
bmdlh | 0:c8a7071d8692 | 98 | gled = OFF; |
bmdlh | 0:c8a7071d8692 | 99 | wait(0.2); |
bmdlh | 0:c8a7071d8692 | 100 | gled = ON; |
bmdlh | 0:c8a7071d8692 | 101 | wait(0.2); |
bmdlh | 0:c8a7071d8692 | 102 | } |
bmdlh | 0:c8a7071d8692 | 103 | gled = OFF; |
bmdlh | 0:c8a7071d8692 | 104 | wait(1.0); |
bmdlh | 0:c8a7071d8692 | 105 | } |
stanislashzc | 1:c2e5e8c9a797 | 106 | void mag_send(){ |
stanislashzc | 1:c2e5e8c9a797 | 107 | int temp_x = 0, temp_y = 0, temp_z = 0; |
stanislashzc | 1:c2e5e8c9a797 | 108 | float temp_h = mag.getHeading(); |
stanislashzc | 1:c2e5e8c9a797 | 109 | mag.getValues(&temp_x, &temp_y, &temp_z); |
stanislashzc | 1:c2e5e8c9a797 | 110 | __disable_irq(); |
stanislashzc | 1:c2e5e8c9a797 | 111 | send4bytes(0x00,&temp_x); |
stanislashzc | 1:c2e5e8c9a797 | 112 | send4bytes(0x01,&temp_y); |
stanislashzc | 1:c2e5e8c9a797 | 113 | send4bytes(0x02,&temp_z); |
stanislashzc | 1:c2e5e8c9a797 | 114 | send4bytes(0x03,&temp_h); |
stanislashzc | 1:c2e5e8c9a797 | 115 | __enable_irq(); |
stanislashzc | 1:c2e5e8c9a797 | 116 | } |
stanislashzc | 1:c2e5e8c9a797 | 117 | void accl_send(){ |
stanislashzc | 1:c2e5e8c9a797 | 118 | float temp_x = acc.getAccX(); |
stanislashzc | 1:c2e5e8c9a797 | 119 | float temp_y = acc.getAccY(); |
stanislashzc | 1:c2e5e8c9a797 | 120 | float temp_z = acc.getAccZ(); |
stanislashzc | 1:c2e5e8c9a797 | 121 | __disable_irq(); |
stanislashzc | 1:c2e5e8c9a797 | 122 | send4bytes(0x04,&temp_x); |
stanislashzc | 1:c2e5e8c9a797 | 123 | send4bytes(0x05,&temp_y); |
stanislashzc | 1:c2e5e8c9a797 | 124 | send4bytes(0x06,&temp_z); |
stanislashzc | 1:c2e5e8c9a797 | 125 | __enable_irq(); |
stanislashzc | 1:c2e5e8c9a797 | 126 | } |
bmdlh | 0:c8a7071d8692 | 127 | |
stanislashzc | 1:c2e5e8c9a797 | 128 | void light_send(){ |
stanislashzc | 1:c2e5e8c9a797 | 129 | float temp_x = lightSensor; |
stanislashzc | 1:c2e5e8c9a797 | 130 | __disable_irq(); |
stanislashzc | 1:c2e5e8c9a797 | 131 | send4bytes(0x07,&temp_x); |
stanislashzc | 1:c2e5e8c9a797 | 132 | __enable_irq(); |
stanislashzc | 1:c2e5e8c9a797 | 133 | } |
stanislashzc | 1:c2e5e8c9a797 | 134 | void touch_send(){ |
stanislashzc | 1:c2e5e8c9a797 | 135 | float temp_x = tsi.readPercentage();; |
stanislashzc | 1:c2e5e8c9a797 | 136 | __disable_irq(); |
stanislashzc | 1:c2e5e8c9a797 | 137 | send4bytes(0x08,&temp_x); |
stanislashzc | 1:c2e5e8c9a797 | 138 | __enable_irq(); |
stanislashzc | 1:c2e5e8c9a797 | 139 | } |
stanislashzc | 1:c2e5e8c9a797 | 140 | void sin_send(){ |
stanislashzc | 1:c2e5e8c9a797 | 141 | float temp_x = sinwave.read();; |
stanislashzc | 1:c2e5e8c9a797 | 142 | __disable_irq(); |
stanislashzc | 1:c2e5e8c9a797 | 143 | send4bytes(0x09,&temp_x); |
stanislashzc | 1:c2e5e8c9a797 | 144 | __enable_irq(); |
stanislashzc | 1:c2e5e8c9a797 | 145 | } |
stanislashzc | 1:c2e5e8c9a797 | 146 | |
stanislashzc | 1:c2e5e8c9a797 | 147 | void configure(){ |
stanislashzc | 1:c2e5e8c9a797 | 148 | rled = OFF; |
stanislashzc | 1:c2e5e8c9a797 | 149 | // stop all the sensors |
stanislashzc | 1:c2e5e8c9a797 | 150 | MAG_STATUS = OFF; |
stanislashzc | 1:c2e5e8c9a797 | 151 | timer_mag.stop(); |
stanislashzc | 1:c2e5e8c9a797 | 152 | ACCL_STATUS = OFF; |
stanislashzc | 1:c2e5e8c9a797 | 153 | timer_acc.stop(); |
stanislashzc | 1:c2e5e8c9a797 | 154 | LIGHT_STATUS = OFF; |
stanislashzc | 1:c2e5e8c9a797 | 155 | timer_light.stop(); |
stanislashzc | 1:c2e5e8c9a797 | 156 | TOUCH_STATUS = OFF; |
stanislashzc | 1:c2e5e8c9a797 | 157 | timer_touch.stop(); |
stanislashzc | 1:c2e5e8c9a797 | 158 | SIN_STATUS = OFF; |
stanislashzc | 1:c2e5e8c9a797 | 159 | timer_sin.stop(); |
bmdlh | 0:c8a7071d8692 | 160 | |
stanislashzc | 1:c2e5e8c9a797 | 161 | char command = pc.getc(); |
stanislashzc | 1:c2e5e8c9a797 | 162 | if (command != 0xEE) |
stanislashzc | 1:c2e5e8c9a797 | 163 | return; |
stanislashzc | 1:c2e5e8c9a797 | 164 | command = pc.getc(); |
stanislashzc | 1:c2e5e8c9a797 | 165 | float sr; |
stanislashzc | 1:c2e5e8c9a797 | 166 | char temp[4]; |
stanislashzc | 1:c2e5e8c9a797 | 167 | while(command != 0xEE){ |
stanislashzc | 1:c2e5e8c9a797 | 168 | if (command == 0x00){ // MAG on |
stanislashzc | 1:c2e5e8c9a797 | 169 | MAG_STATUS = ON; |
stanislashzc | 1:c2e5e8c9a797 | 170 | temp[0] = pc.getc(); |
stanislashzc | 1:c2e5e8c9a797 | 171 | temp[1] = pc.getc(); |
stanislashzc | 1:c2e5e8c9a797 | 172 | temp[2] = pc.getc(); |
stanislashzc | 1:c2e5e8c9a797 | 173 | temp[3] = pc.getc(); |
stanislashzc | 1:c2e5e8c9a797 | 174 | sr = *(float*)temp; |
stanislashzc | 1:c2e5e8c9a797 | 175 | count_mag =(int) 1/sr *1000; |
stanislashzc | 1:c2e5e8c9a797 | 176 | timer_mag.reset(); |
stanislashzc | 1:c2e5e8c9a797 | 177 | } |
stanislashzc | 1:c2e5e8c9a797 | 178 | if (command == 0x01){ // ACC on |
stanislashzc | 1:c2e5e8c9a797 | 179 | ACCL_STATUS = ON; |
stanislashzc | 1:c2e5e8c9a797 | 180 | temp[0] = pc.getc(); |
stanislashzc | 1:c2e5e8c9a797 | 181 | temp[1] = pc.getc(); |
stanislashzc | 1:c2e5e8c9a797 | 182 | temp[2] = pc.getc(); |
stanislashzc | 1:c2e5e8c9a797 | 183 | temp[3] = pc.getc(); |
stanislashzc | 1:c2e5e8c9a797 | 184 | sr = *(float*)temp; |
stanislashzc | 1:c2e5e8c9a797 | 185 | count_acc =(int) 1/sr *1000; |
stanislashzc | 1:c2e5e8c9a797 | 186 | timer_acc.reset(); |
stanislashzc | 1:c2e5e8c9a797 | 187 | } |
stanislashzc | 1:c2e5e8c9a797 | 188 | if (command == 0x02){ // LIGHT on |
stanislashzc | 1:c2e5e8c9a797 | 189 | LIGHT_STATUS = ON; |
stanislashzc | 1:c2e5e8c9a797 | 190 | temp[0] = pc.getc(); |
stanislashzc | 1:c2e5e8c9a797 | 191 | temp[1] = pc.getc(); |
stanislashzc | 1:c2e5e8c9a797 | 192 | temp[2] = pc.getc(); |
stanislashzc | 1:c2e5e8c9a797 | 193 | temp[3] = pc.getc(); |
stanislashzc | 1:c2e5e8c9a797 | 194 | sr = *(float*)temp; |
stanislashzc | 1:c2e5e8c9a797 | 195 | count_light =(int) 1/sr *1000; |
stanislashzc | 1:c2e5e8c9a797 | 196 | timer_light.reset(); |
stanislashzc | 1:c2e5e8c9a797 | 197 | } |
stanislashzc | 1:c2e5e8c9a797 | 198 | if (command == 0x03){ // TOUCH on |
stanislashzc | 1:c2e5e8c9a797 | 199 | TOUCH_STATUS = ON; |
stanislashzc | 1:c2e5e8c9a797 | 200 | temp[0] = pc.getc(); |
stanislashzc | 1:c2e5e8c9a797 | 201 | temp[1] = pc.getc(); |
stanislashzc | 1:c2e5e8c9a797 | 202 | temp[2] = pc.getc(); |
stanislashzc | 1:c2e5e8c9a797 | 203 | temp[3] = pc.getc(); |
stanislashzc | 1:c2e5e8c9a797 | 204 | sr = *(float*)temp; |
stanislashzc | 1:c2e5e8c9a797 | 205 | count_touch =(int) 1/sr *1000; |
stanislashzc | 1:c2e5e8c9a797 | 206 | timer_touch.reset(); |
stanislashzc | 1:c2e5e8c9a797 | 207 | } |
stanislashzc | 1:c2e5e8c9a797 | 208 | if (command == 0x04){ // SIN on |
stanislashzc | 1:c2e5e8c9a797 | 209 | SIN_STATUS = ON; |
stanislashzc | 1:c2e5e8c9a797 | 210 | temp[0] = pc.getc(); |
stanislashzc | 1:c2e5e8c9a797 | 211 | temp[1] = pc.getc(); |
stanislashzc | 1:c2e5e8c9a797 | 212 | temp[2] = pc.getc(); |
stanislashzc | 1:c2e5e8c9a797 | 213 | temp[3] = pc.getc(); |
stanislashzc | 1:c2e5e8c9a797 | 214 | sr = *(float*)temp; |
stanislashzc | 1:c2e5e8c9a797 | 215 | count_sin =(int) 1/sr *1000; |
stanislashzc | 1:c2e5e8c9a797 | 216 | timer_sin.reset(); |
stanislashzc | 1:c2e5e8c9a797 | 217 | } |
stanislashzc | 1:c2e5e8c9a797 | 218 | command = pc.getc(); |
stanislashzc | 1:c2e5e8c9a797 | 219 | } |
stanislashzc | 1:c2e5e8c9a797 | 220 | rled = ON; |
stanislashzc | 1:c2e5e8c9a797 | 221 | START = ON; |
stanislashzc | 1:c2e5e8c9a797 | 222 | |
stanislashzc | 1:c2e5e8c9a797 | 223 | } |
stanislashzc | 1:c2e5e8c9a797 | 224 | |
stanislashzc | 1:c2e5e8c9a797 | 225 | int main(){ |
bmdlh | 0:c8a7071d8692 | 226 | calXY(); |
stanislashzc | 1:c2e5e8c9a797 | 227 | pc.attach(&configure); |
stanislashzc | 1:c2e5e8c9a797 | 228 | while(START == OFF){ |
stanislashzc | 1:c2e5e8c9a797 | 229 | pc.putc(0xFF); |
stanislashzc | 1:c2e5e8c9a797 | 230 | } |
stanislashzc | 1:c2e5e8c9a797 | 231 | pc.putc(0xFE); |
stanislashzc | 1:c2e5e8c9a797 | 232 | |
bmdlh | 0:c8a7071d8692 | 233 | |
stanislashzc | 1:c2e5e8c9a797 | 234 | timer_mag.start(); |
stanislashzc | 1:c2e5e8c9a797 | 235 | timer_acc.start(); |
stanislashzc | 1:c2e5e8c9a797 | 236 | timer_light.start(); |
stanislashzc | 1:c2e5e8c9a797 | 237 | timer_touch.start(); |
stanislashzc | 1:c2e5e8c9a797 | 238 | timer_sin.start(); |
stanislashzc | 1:c2e5e8c9a797 | 239 | while(1) { |
stanislashzc | 1:c2e5e8c9a797 | 240 | if (MAG_STATUS == ON){ |
stanislashzc | 1:c2e5e8c9a797 | 241 | if (timer_mag.read_ms()>count_mag){ |
stanislashzc | 1:c2e5e8c9a797 | 242 | mag_send(); |
stanislashzc | 1:c2e5e8c9a797 | 243 | timer_mag.reset(); |
stanislashzc | 1:c2e5e8c9a797 | 244 | } |
stanislashzc | 1:c2e5e8c9a797 | 245 | } |
stanislashzc | 1:c2e5e8c9a797 | 246 | if (ACCL_STATUS == ON){ |
stanislashzc | 1:c2e5e8c9a797 | 247 | if (timer_acc.read_ms()>count_acc){ |
stanislashzc | 1:c2e5e8c9a797 | 248 | accl_send(); |
stanislashzc | 1:c2e5e8c9a797 | 249 | timer_acc.reset(); |
stanislashzc | 1:c2e5e8c9a797 | 250 | } |
stanislashzc | 1:c2e5e8c9a797 | 251 | } |
stanislashzc | 1:c2e5e8c9a797 | 252 | if (LIGHT_STATUS == ON){ |
stanislashzc | 1:c2e5e8c9a797 | 253 | if (timer_light.read_ms()>count_light){ |
stanislashzc | 1:c2e5e8c9a797 | 254 | light_send(); |
stanislashzc | 1:c2e5e8c9a797 | 255 | timer_light.reset(); |
stanislashzc | 1:c2e5e8c9a797 | 256 | } |
stanislashzc | 1:c2e5e8c9a797 | 257 | } |
stanislashzc | 1:c2e5e8c9a797 | 258 | if (TOUCH_STATUS == ON){ |
stanislashzc | 1:c2e5e8c9a797 | 259 | if (timer_touch.read_ms()>count_touch){ |
stanislashzc | 1:c2e5e8c9a797 | 260 | touch_send(); |
stanislashzc | 1:c2e5e8c9a797 | 261 | timer_touch.reset(); |
stanislashzc | 1:c2e5e8c9a797 | 262 | } |
stanislashzc | 1:c2e5e8c9a797 | 263 | } |
stanislashzc | 1:c2e5e8c9a797 | 264 | if (SIN_STATUS == ON){ |
stanislashzc | 1:c2e5e8c9a797 | 265 | if (timer_sin.read_ms()>count_sin){ |
stanislashzc | 1:c2e5e8c9a797 | 266 | sin_send(); |
stanislashzc | 1:c2e5e8c9a797 | 267 | timer_sin.reset(); |
stanislashzc | 1:c2e5e8c9a797 | 268 | } |
stanislashzc | 1:c2e5e8c9a797 | 269 | } |
bmdlh | 0:c8a7071d8692 | 270 | } |
stanislashzc | 1:c2e5e8c9a797 | 271 | } |