This code is for Embedded System class homework1 use only.

Dependencies:   Useless SB TSI mbed

Fork of Final_Homework1 by Shaojie Wang

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?

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