Accelerometer game

Dependencies:   4DGL-uLCD-SE ADXL345 mbed-rtos mbed

Committer:
yhazrat3
Date:
Thu Mar 20 03:22:57 2014 +0000
Revision:
0:c69d1ec4d395
Child:
1:54ed477da4d3
done

Who changed what in which revision?

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