Accelerometer game
Dependencies: 4DGL-uLCD-SE ADXL345 mbed-rtos mbed
main.cpp@0:c69d1ec4d395, 2014-03-20 (annotated)
- Committer:
- yhazrat3
- Date:
- Thu Mar 20 03:22:57 2014 +0000
- Revision:
- 0:c69d1ec4d395
- Child:
- 1:54ed477da4d3
done
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
yhazrat3 | 0:c69d1ec4d395 | 1 | #include "mbed.h" |
yhazrat3 | 0:c69d1ec4d395 | 2 | #include "rtos.h" |
yhazrat3 | 0:c69d1ec4d395 | 3 | #include "uLCD_4DGL.h" |
yhazrat3 | 0:c69d1ec4d395 | 4 | #include "ADXL345.h" |
yhazrat3 | 0:c69d1ec4d395 | 5 | |
yhazrat3 | 0:c69d1ec4d395 | 6 | |
yhazrat3 | 0:c69d1ec4d395 | 7 | PwmOut speaker(p21); |
yhazrat3 | 0:c69d1ec4d395 | 8 | uLCD_4DGL uLCD(p28, p27, p29); // create a global lcd object |
yhazrat3 | 0:c69d1ec4d395 | 9 | ADXL345 accelerometer(p5, p6, p7, p8); |
yhazrat3 | 0:c69d1ec4d395 | 10 | Serial pc(USBTX, USBRX); |
yhazrat3 | 0:c69d1ec4d395 | 11 | Mutex lcd_mutex; |
yhazrat3 | 0:c69d1ec4d395 | 12 | |
yhazrat3 | 0:c69d1ec4d395 | 13 | int red_car_x, red_car_y,blue_car_x,blue_car_y,frog_x,frog_y,i,j; |
yhazrat3 | 0:c69d1ec4d395 | 14 | int x=0,y=0; |
yhazrat3 | 0:c69d1ec4d395 | 15 | void thread1(void const *args) |
yhazrat3 | 0:c69d1ec4d395 | 16 | { |
yhazrat3 | 0:c69d1ec4d395 | 17 | |
yhazrat3 | 0:c69d1ec4d395 | 18 | while(true) { |
yhazrat3 | 0:c69d1ec4d395 | 19 | |
yhazrat3 | 0:c69d1ec4d395 | 20 | |
yhazrat3 | 0:c69d1ec4d395 | 21 | if(red_car_x>127){ |
yhazrat3 | 0:c69d1ec4d395 | 22 | red_car_x=-16; |
yhazrat3 | 0:c69d1ec4d395 | 23 | red_car_y=32; |
yhazrat3 | 0:c69d1ec4d395 | 24 | |
yhazrat3 | 0:c69d1ec4d395 | 25 | } |
yhazrat3 | 0:c69d1ec4d395 | 26 | lcd_mutex.lock(); |
yhazrat3 | 0:c69d1ec4d395 | 27 | uLCD.filled_rectangle(red_car_x,red_car_y,red_car_x+15,red_car_y+15,0x000000); |
yhazrat3 | 0:c69d1ec4d395 | 28 | red_car_x=red_car_x+16; |
yhazrat3 | 0:c69d1ec4d395 | 29 | |
yhazrat3 | 0:c69d1ec4d395 | 30 | for(i=0;i<10;i++){ |
yhazrat3 | 0:c69d1ec4d395 | 31 | uLCD.filled_rectangle(red_car_x,red_car_y,red_car_x+15,red_car_y+15,0xFF3300);//change position |
yhazrat3 | 0:c69d1ec4d395 | 32 | |
yhazrat3 | 0:c69d1ec4d395 | 33 | } |
yhazrat3 | 0:c69d1ec4d395 | 34 | |
yhazrat3 | 0:c69d1ec4d395 | 35 | |
yhazrat3 | 0:c69d1ec4d395 | 36 | lcd_mutex.unlock(); |
yhazrat3 | 0:c69d1ec4d395 | 37 | Thread::wait(500); |
yhazrat3 | 0:c69d1ec4d395 | 38 | |
yhazrat3 | 0:c69d1ec4d395 | 39 | } |
yhazrat3 | 0:c69d1ec4d395 | 40 | } |
yhazrat3 | 0:c69d1ec4d395 | 41 | |
yhazrat3 | 0:c69d1ec4d395 | 42 | |
yhazrat3 | 0:c69d1ec4d395 | 43 | void thread2(void const *args) |
yhazrat3 | 0:c69d1ec4d395 | 44 | { |
yhazrat3 | 0:c69d1ec4d395 | 45 | |
yhazrat3 | 0:c69d1ec4d395 | 46 | while(true) { |
yhazrat3 | 0:c69d1ec4d395 | 47 | |
yhazrat3 | 0:c69d1ec4d395 | 48 | |
yhazrat3 | 0:c69d1ec4d395 | 49 | if(blue_car_x>127){ |
yhazrat3 | 0:c69d1ec4d395 | 50 | blue_car_x=-16; |
yhazrat3 | 0:c69d1ec4d395 | 51 | blue_car_y=64; |
yhazrat3 | 0:c69d1ec4d395 | 52 | |
yhazrat3 | 0:c69d1ec4d395 | 53 | } |
yhazrat3 | 0:c69d1ec4d395 | 54 | lcd_mutex.lock(); |
yhazrat3 | 0:c69d1ec4d395 | 55 | uLCD.filled_rectangle(blue_car_x,blue_car_y,blue_car_x+15,blue_car_y+15,0x000000); |
yhazrat3 | 0:c69d1ec4d395 | 56 | blue_car_x=blue_car_x+16; |
yhazrat3 | 0:c69d1ec4d395 | 57 | for(i=0;i<5;i++){ |
yhazrat3 | 0:c69d1ec4d395 | 58 | uLCD.filled_rectangle(blue_car_x,blue_car_y,blue_car_x+15,blue_car_y+15,BLUE);//change position |
yhazrat3 | 0:c69d1ec4d395 | 59 | |
yhazrat3 | 0:c69d1ec4d395 | 60 | } |
yhazrat3 | 0:c69d1ec4d395 | 61 | |
yhazrat3 | 0:c69d1ec4d395 | 62 | |
yhazrat3 | 0:c69d1ec4d395 | 63 | lcd_mutex.unlock(); |
yhazrat3 | 0:c69d1ec4d395 | 64 | Thread::wait(200); |
yhazrat3 | 0:c69d1ec4d395 | 65 | |
yhazrat3 | 0:c69d1ec4d395 | 66 | } |
yhazrat3 | 0:c69d1ec4d395 | 67 | } |
yhazrat3 | 0:c69d1ec4d395 | 68 | |
yhazrat3 | 0:c69d1ec4d395 | 69 | void thread3(void const *args) |
yhazrat3 | 0:c69d1ec4d395 | 70 | { |
yhazrat3 | 0:c69d1ec4d395 | 71 | |
yhazrat3 | 0:c69d1ec4d395 | 72 | |
yhazrat3 | 0:c69d1ec4d395 | 73 | while(true) { |
yhazrat3 | 0:c69d1ec4d395 | 74 | |
yhazrat3 | 0:c69d1ec4d395 | 75 | |
yhazrat3 | 0:c69d1ec4d395 | 76 | speaker.period(1.0/150.0); // 500hz period |
yhazrat3 | 0:c69d1ec4d395 | 77 | speaker =0.25; //25% duty cycle - mid range volume |
yhazrat3 | 0:c69d1ec4d395 | 78 | wait(.02); |
yhazrat3 | 0:c69d1ec4d395 | 79 | speaker=0.0; |
yhazrat3 | 0:c69d1ec4d395 | 80 | |
yhazrat3 | 0:c69d1ec4d395 | 81 | |
yhazrat3 | 0:c69d1ec4d395 | 82 | Thread::wait(500); |
yhazrat3 | 0:c69d1ec4d395 | 83 | |
yhazrat3 | 0:c69d1ec4d395 | 84 | } |
yhazrat3 | 0:c69d1ec4d395 | 85 | } |
yhazrat3 | 0:c69d1ec4d395 | 86 | |
yhazrat3 | 0:c69d1ec4d395 | 87 | |
yhazrat3 | 0:c69d1ec4d395 | 88 | |
yhazrat3 | 0:c69d1ec4d395 | 89 | |
yhazrat3 | 0:c69d1ec4d395 | 90 | |
yhazrat3 | 0:c69d1ec4d395 | 91 | |
yhazrat3 | 0:c69d1ec4d395 | 92 | int main() |
yhazrat3 | 0:c69d1ec4d395 | 93 | { |
yhazrat3 | 0:c69d1ec4d395 | 94 | |
yhazrat3 | 0:c69d1ec4d395 | 95 | |
yhazrat3 | 0:c69d1ec4d395 | 96 | A:uLCD.cls(); |
yhazrat3 | 0:c69d1ec4d395 | 97 | |
yhazrat3 | 0:c69d1ec4d395 | 98 | uLCD.text_width(2); //2X size text |
yhazrat3 | 0:c69d1ec4d395 | 99 | uLCD.text_height(2); |
yhazrat3 | 0:c69d1ec4d395 | 100 | |
yhazrat3 | 0:c69d1ec4d395 | 101 | |
yhazrat3 | 0:c69d1ec4d395 | 102 | uLCD.locate(2,2); |
yhazrat3 | 0:c69d1ec4d395 | 103 | |
yhazrat3 | 0:c69d1ec4d395 | 104 | uLCD.printf("\n Frogger\n"); |
yhazrat3 | 0:c69d1ec4d395 | 105 | wait(0.1); |
yhazrat3 | 0:c69d1ec4d395 | 106 | |
yhazrat3 | 0:c69d1ec4d395 | 107 | |
yhazrat3 | 0:c69d1ec4d395 | 108 | for (i=0; i<500; i=i+100) { |
yhazrat3 | 0:c69d1ec4d395 | 109 | speaker.period(1.0/float(i)); |
yhazrat3 | 0:c69d1ec4d395 | 110 | speaker=0.25; |
yhazrat3 | 0:c69d1ec4d395 | 111 | wait(.1); |
yhazrat3 | 0:c69d1ec4d395 | 112 | } |
yhazrat3 | 0:c69d1ec4d395 | 113 | wait(2); |
yhazrat3 | 0:c69d1ec4d395 | 114 | uLCD.cls(); |
yhazrat3 | 0:c69d1ec4d395 | 115 | uLCD.text_width(2); //2X size text |
yhazrat3 | 0:c69d1ec4d395 | 116 | uLCD.text_height(2); |
yhazrat3 | 0:c69d1ec4d395 | 117 | uLCD.locate(0,0); |
yhazrat3 | 0:c69d1ec4d395 | 118 | uLCD.color( 0xFF00FF); |
yhazrat3 | 0:c69d1ec4d395 | 119 | uLCD.printf("\n Help the frog \n cross \nthe road!\n"); |
yhazrat3 | 0:c69d1ec4d395 | 120 | wait (2); |
yhazrat3 | 0:c69d1ec4d395 | 121 | |
yhazrat3 | 0:c69d1ec4d395 | 122 | uLCD.cls(); |
yhazrat3 | 0:c69d1ec4d395 | 123 | |
yhazrat3 | 0:c69d1ec4d395 | 124 | |
yhazrat3 | 0:c69d1ec4d395 | 125 | red_car_x=0; |
yhazrat3 | 0:c69d1ec4d395 | 126 | red_car_y=32; |
yhazrat3 | 0:c69d1ec4d395 | 127 | blue_car_x=0; |
yhazrat3 | 0:c69d1ec4d395 | 128 | blue_car_y=64; |
yhazrat3 | 0:c69d1ec4d395 | 129 | frog_x=32; |
yhazrat3 | 0:c69d1ec4d395 | 130 | frog_y=96; |
yhazrat3 | 0:c69d1ec4d395 | 131 | uLCD.filled_rectangle(frog_x,frog_y,frog_x+15,frog_y+15,0x99FF00); |
yhazrat3 | 0:c69d1ec4d395 | 132 | uLCD.filled_rectangle(red_car_x,red_car_y,red_car_x+15,red_car_y+15,0xff3300); |
yhazrat3 | 0:c69d1ec4d395 | 133 | uLCD.filled_rectangle(blue_car_x,blue_car_y,blue_car_x+15,blue_car_y+15,BLUE); |
yhazrat3 | 0:c69d1ec4d395 | 134 | |
yhazrat3 | 0:c69d1ec4d395 | 135 | int readings[3] = {0, 0, 0}; |
yhazrat3 | 0:c69d1ec4d395 | 136 | |
yhazrat3 | 0:c69d1ec4d395 | 137 | // pc.printf("Starting ADXL345 test...\n"); |
yhazrat3 | 0:c69d1ec4d395 | 138 | // pc.printf("Device ID is: 0x%02x\n", accelerometer.getDevId()); |
yhazrat3 | 0:c69d1ec4d395 | 139 | |
yhazrat3 | 0:c69d1ec4d395 | 140 | //Go into standby mode to configure the device. |
yhazrat3 | 0:c69d1ec4d395 | 141 | accelerometer.setPowerControl(0x00); |
yhazrat3 | 0:c69d1ec4d395 | 142 | |
yhazrat3 | 0:c69d1ec4d395 | 143 | //Full resolution, +/-16g, 4mg/LSB. |
yhazrat3 | 0:c69d1ec4d395 | 144 | accelerometer.setDataFormatControl(0x0B); |
yhazrat3 | 0:c69d1ec4d395 | 145 | |
yhazrat3 | 0:c69d1ec4d395 | 146 | //3.2kHz data rate. |
yhazrat3 | 0:c69d1ec4d395 | 147 | accelerometer.setDataRate(ADXL345_3200HZ); |
yhazrat3 | 0:c69d1ec4d395 | 148 | |
yhazrat3 | 0:c69d1ec4d395 | 149 | //Measurement mode. |
yhazrat3 | 0:c69d1ec4d395 | 150 | accelerometer.setPowerControl(0x08); |
yhazrat3 | 0:c69d1ec4d395 | 151 | |
yhazrat3 | 0:c69d1ec4d395 | 152 | Thread t1(thread1); //start thread1 |
yhazrat3 | 0:c69d1ec4d395 | 153 | Thread t2(thread2); |
yhazrat3 | 0:c69d1ec4d395 | 154 | Thread t3(thread3); |
yhazrat3 | 0:c69d1ec4d395 | 155 | |
yhazrat3 | 0:c69d1ec4d395 | 156 | |
yhazrat3 | 0:c69d1ec4d395 | 157 | |
yhazrat3 | 0:c69d1ec4d395 | 158 | while (1) { |
yhazrat3 | 0:c69d1ec4d395 | 159 | |
yhazrat3 | 0:c69d1ec4d395 | 160 | |
yhazrat3 | 0:c69d1ec4d395 | 161 | for(i=0;i<5;i++) |
yhazrat3 | 0:c69d1ec4d395 | 162 | { |
yhazrat3 | 0:c69d1ec4d395 | 163 | accelerometer.getOutput(readings); |
yhazrat3 | 0:c69d1ec4d395 | 164 | pc.printf("%i, %i, %i ", (int16_t)readings[0], (int16_t)readings[1], (int16_t)readings[2]); |
yhazrat3 | 0:c69d1ec4d395 | 165 | x=x+int16_t(readings[0]); |
yhazrat3 | 0:c69d1ec4d395 | 166 | y=y+int16_t(readings[1]); |
yhazrat3 | 0:c69d1ec4d395 | 167 | } |
yhazrat3 | 0:c69d1ec4d395 | 168 | x=int(x/5); |
yhazrat3 | 0:c69d1ec4d395 | 169 | y=int(y/5); |
yhazrat3 | 0:c69d1ec4d395 | 170 | |
yhazrat3 | 0:c69d1ec4d395 | 171 | //13-bit, sign extended values. |
yhazrat3 | 0:c69d1ec4d395 | 172 | pc.printf("%d, %d ", int(x),int(y) ); |
yhazrat3 | 0:c69d1ec4d395 | 173 | //right |
yhazrat3 | 0:c69d1ec4d395 | 174 | |
yhazrat3 | 0:c69d1ec4d395 | 175 | |
yhazrat3 | 0:c69d1ec4d395 | 176 | if(y>0){ |
yhazrat3 | 0:c69d1ec4d395 | 177 | lcd_mutex.lock(); |
yhazrat3 | 0:c69d1ec4d395 | 178 | uLCD.filled_rectangle(frog_x,frog_y,frog_x+15,frog_y+15,0x000000); |
yhazrat3 | 0:c69d1ec4d395 | 179 | frog_x=frog_x+16; |
yhazrat3 | 0:c69d1ec4d395 | 180 | |
yhazrat3 | 0:c69d1ec4d395 | 181 | uLCD.filled_rectangle(frog_x,frog_y,frog_x+15,frog_y+15,0x99FF00); |
yhazrat3 | 0:c69d1ec4d395 | 182 | lcd_mutex.unlock(); |
yhazrat3 | 0:c69d1ec4d395 | 183 | } |
yhazrat3 | 0:c69d1ec4d395 | 184 | //up |
yhazrat3 | 0:c69d1ec4d395 | 185 | if(x<70){ |
yhazrat3 | 0:c69d1ec4d395 | 186 | lcd_mutex.lock(); |
yhazrat3 | 0:c69d1ec4d395 | 187 | uLCD.filled_rectangle(frog_x,frog_y,frog_x+15,frog_y+15,0x000000); |
yhazrat3 | 0:c69d1ec4d395 | 188 | frog_y=frog_y-16; |
yhazrat3 | 0:c69d1ec4d395 | 189 | |
yhazrat3 | 0:c69d1ec4d395 | 190 | uLCD.filled_rectangle(frog_x,frog_y,frog_x+15,frog_y+15,0x99FF00); |
yhazrat3 | 0:c69d1ec4d395 | 191 | lcd_mutex.unlock(); |
yhazrat3 | 0:c69d1ec4d395 | 192 | } |
yhazrat3 | 0:c69d1ec4d395 | 193 | //left |
yhazrat3 | 0:c69d1ec4d395 | 194 | if(y<-70){ |
yhazrat3 | 0:c69d1ec4d395 | 195 | lcd_mutex.lock(); |
yhazrat3 | 0:c69d1ec4d395 | 196 | uLCD.filled_rectangle(frog_x,frog_y,frog_x+15,frog_y+15,0x000000); |
yhazrat3 | 0:c69d1ec4d395 | 197 | frog_x=frog_x-16; |
yhazrat3 | 0:c69d1ec4d395 | 198 | |
yhazrat3 | 0:c69d1ec4d395 | 199 | uLCD.filled_rectangle(frog_x,frog_y,frog_x+15,frog_y+15,0x99FF00); |
yhazrat3 | 0:c69d1ec4d395 | 200 | lcd_mutex.unlock(); |
yhazrat3 | 0:c69d1ec4d395 | 201 | } |
yhazrat3 | 0:c69d1ec4d395 | 202 | //down |
yhazrat3 | 0:c69d1ec4d395 | 203 | if(x>180){ |
yhazrat3 | 0:c69d1ec4d395 | 204 | lcd_mutex.lock(); |
yhazrat3 | 0:c69d1ec4d395 | 205 | uLCD.filled_rectangle(frog_x,frog_y,frog_x+15,frog_y+15,0x000000); |
yhazrat3 | 0:c69d1ec4d395 | 206 | frog_y=frog_y+16; |
yhazrat3 | 0:c69d1ec4d395 | 207 | |
yhazrat3 | 0:c69d1ec4d395 | 208 | uLCD.filled_rectangle(frog_x,frog_y,frog_x+15,frog_y+15,0x99FF00); |
yhazrat3 | 0:c69d1ec4d395 | 209 | lcd_mutex.unlock(); |
yhazrat3 | 0:c69d1ec4d395 | 210 | } |
yhazrat3 | 0:c69d1ec4d395 | 211 | |
yhazrat3 | 0:c69d1ec4d395 | 212 | if ((frog_x==red_car_x & frog_y==red_car_y)|(frog_x==blue_car_x & frog_y==blue_car_y)) |
yhazrat3 | 0:c69d1ec4d395 | 213 | { |
yhazrat3 | 0:c69d1ec4d395 | 214 | |
yhazrat3 | 0:c69d1ec4d395 | 215 | lcd_mutex.lock(); |
yhazrat3 | 0:c69d1ec4d395 | 216 | uLCD.cls(); |
yhazrat3 | 0:c69d1ec4d395 | 217 | |
yhazrat3 | 0:c69d1ec4d395 | 218 | |
yhazrat3 | 0:c69d1ec4d395 | 219 | uLCD.text_width(2); //4X size text |
yhazrat3 | 0:c69d1ec4d395 | 220 | uLCD.text_height(2); |
yhazrat3 | 0:c69d1ec4d395 | 221 | uLCD.color(RED); |
yhazrat3 | 0:c69d1ec4d395 | 222 | uLCD.locate(2,2); |
yhazrat3 | 0:c69d1ec4d395 | 223 | uLCD.printf("\n GAME \n OVER!\n"); |
yhazrat3 | 0:c69d1ec4d395 | 224 | speaker.period(1.0/500.0); // 500hz period |
yhazrat3 | 0:c69d1ec4d395 | 225 | speaker =0.5; //50% duty cycle - max volume |
yhazrat3 | 0:c69d1ec4d395 | 226 | wait(3); |
yhazrat3 | 0:c69d1ec4d395 | 227 | speaker=0.0; // turn off audio |
yhazrat3 | 0:c69d1ec4d395 | 228 | |
yhazrat3 | 0:c69d1ec4d395 | 229 | wait(2); |
yhazrat3 | 0:c69d1ec4d395 | 230 | lcd_mutex.unlock(); |
yhazrat3 | 0:c69d1ec4d395 | 231 | goto A; |
yhazrat3 | 0:c69d1ec4d395 | 232 | } |
yhazrat3 | 0:c69d1ec4d395 | 233 | |
yhazrat3 | 0:c69d1ec4d395 | 234 | if (frog_y<32) |
yhazrat3 | 0:c69d1ec4d395 | 235 | { |
yhazrat3 | 0:c69d1ec4d395 | 236 | |
yhazrat3 | 0:c69d1ec4d395 | 237 | lcd_mutex.lock(); |
yhazrat3 | 0:c69d1ec4d395 | 238 | uLCD.cls(); |
yhazrat3 | 0:c69d1ec4d395 | 239 | |
yhazrat3 | 0:c69d1ec4d395 | 240 | |
yhazrat3 | 0:c69d1ec4d395 | 241 | uLCD.text_width(2); //4X size text |
yhazrat3 | 0:c69d1ec4d395 | 242 | uLCD.text_height(2); |
yhazrat3 | 0:c69d1ec4d395 | 243 | uLCD.color(0xffff00); |
yhazrat3 | 0:c69d1ec4d395 | 244 | uLCD.locate(2,2); |
yhazrat3 | 0:c69d1ec4d395 | 245 | uLCD.printf("\n You \n WIN!\n"); |
yhazrat3 | 0:c69d1ec4d395 | 246 | |
yhazrat3 | 0:c69d1ec4d395 | 247 | for (i=0; i<500; i=i+100) { |
yhazrat3 | 0:c69d1ec4d395 | 248 | speaker.period(1.0/float(i)); |
yhazrat3 | 0:c69d1ec4d395 | 249 | speaker=0.25; |
yhazrat3 | 0:c69d1ec4d395 | 250 | wait(.1); |
yhazrat3 | 0:c69d1ec4d395 | 251 | } |
yhazrat3 | 0:c69d1ec4d395 | 252 | wait(5); |
yhazrat3 | 0:c69d1ec4d395 | 253 | lcd_mutex.unlock(); |
yhazrat3 | 0:c69d1ec4d395 | 254 | goto A; |
yhazrat3 | 0:c69d1ec4d395 | 255 | } |
yhazrat3 | 0:c69d1ec4d395 | 256 | |
yhazrat3 | 0:c69d1ec4d395 | 257 | |
yhazrat3 | 0:c69d1ec4d395 | 258 | Thread::wait(50); // wait 0.5s |
yhazrat3 | 0:c69d1ec4d395 | 259 | } |
yhazrat3 | 0:c69d1ec4d395 | 260 | |
yhazrat3 | 0:c69d1ec4d395 | 261 | |
yhazrat3 | 0:c69d1ec4d395 | 262 | |
yhazrat3 | 0:c69d1ec4d395 | 263 | } |