Accelerometer game
Dependencies: 4DGL-uLCD-SE ADXL345 mbed-rtos mbed
Revision 1:54ed477da4d3, committed 2014-03-20
- Comitter:
- yhazrat3
- Date:
- Thu Mar 20 03:33:00 2014 +0000
- Parent:
- 0:c69d1ec4d395
- Commit message:
- Done
Changed in this revision
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/main.cpp Thu Mar 20 03:22:57 2014 +0000
+++ b/main.cpp Thu Mar 20 03:33:00 2014 +0000
@@ -4,48 +4,45 @@
#include "ADXL345.h"
-PwmOut speaker(p21);
+PwmOut speaker(p21); //create a PwmOut object for the speaker
uLCD_4DGL uLCD(p28, p27, p29); // create a global lcd object
-ADXL345 accelerometer(p5, p6, p7, p8);
-Serial pc(USBTX, USBRX);
-Mutex lcd_mutex;
+ADXL345 accelerometer(p5, p6, p7, p8);//create a global accelerometer object
+Serial pc(USBTX, USBRX);// for debugging
+Mutex lcd_mutex;// Create the mutex lock object
int red_car_x, red_car_y,blue_car_x,blue_car_y,frog_x,frog_y,i,j;
int x=0,y=0;
-void thread1(void const *args)
+void thread1(void const *args)//thread 1 moves the red car
{
- while(true) {
-
-
+ while(true) {
+ //check for boundary conditions
if(red_car_x>127){
red_car_x=-16;
red_car_y=32;
}
- lcd_mutex.lock();
- uLCD.filled_rectangle(red_car_x,red_car_y,red_car_x+15,red_car_y+15,0x000000);
+ lcd_mutex.lock();//acquire lock
+ uLCD.filled_rectangle(red_car_x,red_car_y,red_car_x+15,red_car_y+15,0x000000);//erase previous position
red_car_x=red_car_x+16;
for(i=0;i<10;i++){
uLCD.filled_rectangle(red_car_x,red_car_y,red_car_x+15,red_car_y+15,0xFF3300);//change position
- }
-
+ }
- lcd_mutex.unlock();
+ lcd_mutex.unlock();//release the lock
Thread::wait(500);
}
}
-void thread2(void const *args)
+void thread2(void const *args)//thread 1 moves the blue car, code similar to thread 1
{
- while(true) {
-
-
+ while(true) {
+
if(blue_car_x>127){
blue_car_x=-16;
blue_car_y=64;
@@ -58,42 +55,33 @@
uLCD.filled_rectangle(blue_car_x,blue_car_y,blue_car_x+15,blue_car_y+15,BLUE);//change position
}
-
-
+
lcd_mutex.unlock();
Thread::wait(200);
}
}
-void thread3(void const *args)
+void thread3(void const *args)//thread 3 plays the sound effects
{
- while(true) {
-
-
+ while(true) {
+
speaker.period(1.0/150.0); // 500hz period
speaker =0.25; //25% duty cycle - mid range volume
wait(.02);
- speaker=0.0;
-
-
+ speaker=0.0;//stop the speaker
+
Thread::wait(500);
}
}
-
-
-
-
-
-
+
int main()
{
-
-
- A:uLCD.cls();
+
+ A:uLCD.cls();// clear the LCD
uLCD.text_width(2); //2X size text
uLCD.text_height(2);
@@ -101,10 +89,10 @@
uLCD.locate(2,2);
- uLCD.printf("\n Frogger\n");
+ uLCD.printf("\n Frogger-G\n");//display the Title
wait(0.1);
-
+ // Sound effects at the start of the game
for (i=0; i<500; i=i+100) {
speaker.period(1.0/float(i));
speaker=0.25;
@@ -128,16 +116,14 @@
blue_car_y=64;
frog_x=32;
frog_y=96;
+ //initialize the frog position
uLCD.filled_rectangle(frog_x,frog_y,frog_x+15,frog_y+15,0x99FF00);
uLCD.filled_rectangle(red_car_x,red_car_y,red_car_x+15,red_car_y+15,0xff3300);
uLCD.filled_rectangle(blue_car_x,blue_car_y,blue_car_x+15,blue_car_y+15,BLUE);
int readings[3] = {0, 0, 0};
- // pc.printf("Starting ADXL345 test...\n");
- // pc.printf("Device ID is: 0x%02x\n", accelerometer.getDevId());
-
- //Go into standby mode to configure the device.
+ //Go into standby mode to configure the device.
accelerometer.setPowerControl(0x00);
//Full resolution, +/-16g, 4mg/LSB.
@@ -148,17 +134,16 @@
//Measurement mode.
accelerometer.setPowerControl(0x08);
-
- Thread t1(thread1); //start thread1
- Thread t2(thread2);
+ //Initialize all threads
+ Thread t1(thread1);
+ Thread t2(thread2);
Thread t3(thread3);
-
-
-
+
while (1) {
for(i=0;i<5;i++)
+ //average accelerometer readings for accuracy
{
accelerometer.getOutput(readings);
pc.printf("%i, %i, %i ", (int16_t)readings[0], (int16_t)readings[1], (int16_t)readings[2]);
@@ -168,11 +153,12 @@
x=int(x/5);
y=int(y/5);
- //13-bit, sign extended values.
+ //debug
pc.printf("%d, %d ", int(x),int(y) );
- //right
-
-
+
+ //move the frog according to accelerometer readings
+ //thresholds obtained through trial and error
+ //move right
if(y>0){
lcd_mutex.lock();
uLCD.filled_rectangle(frog_x,frog_y,frog_x+15,frog_y+15,0x000000);
@@ -181,7 +167,7 @@
uLCD.filled_rectangle(frog_x,frog_y,frog_x+15,frog_y+15,0x99FF00);
lcd_mutex.unlock();
}
- //up
+ //move up
if(x<70){
lcd_mutex.lock();
uLCD.filled_rectangle(frog_x,frog_y,frog_x+15,frog_y+15,0x000000);
@@ -190,7 +176,7 @@
uLCD.filled_rectangle(frog_x,frog_y,frog_x+15,frog_y+15,0x99FF00);
lcd_mutex.unlock();
}
- //left
+ //move left
if(y<-70){
lcd_mutex.lock();
uLCD.filled_rectangle(frog_x,frog_y,frog_x+15,frog_y+15,0x000000);
@@ -199,7 +185,7 @@
uLCD.filled_rectangle(frog_x,frog_y,frog_x+15,frog_y+15,0x99FF00);
lcd_mutex.unlock();
}
- //down
+ //move down
if(x>180){
lcd_mutex.lock();
uLCD.filled_rectangle(frog_x,frog_y,frog_x+15,frog_y+15,0x000000);
@@ -209,18 +195,17 @@
lcd_mutex.unlock();
}
+ //check collisions
if ((frog_x==red_car_x & frog_y==red_car_y)|(frog_x==blue_car_x & frog_y==blue_car_y))
{
-
lcd_mutex.lock();
uLCD.cls();
-
-
- uLCD.text_width(2); //4X size text
+
+ uLCD.text_width(2); //2X size text
uLCD.text_height(2);
uLCD.color(RED);
uLCD.locate(2,2);
- uLCD.printf("\n GAME \n OVER!\n");
+ uLCD.printf("\n GAME \n OVER!\n");// display message
speaker.period(1.0/500.0); // 500hz period
speaker =0.5; //50% duty cycle - max volume
wait(3);
@@ -228,21 +213,20 @@
wait(2);
lcd_mutex.unlock();
- goto A;
+ goto A;//restart the game
}
-
+ //check if frog has crossed the road
if (frog_y<32)
{
lcd_mutex.lock();
uLCD.cls();
-
-
- uLCD.text_width(2); //4X size text
+
+ uLCD.text_width(2); //2X size text
uLCD.text_height(2);
uLCD.color(0xffff00);
uLCD.locate(2,2);
- uLCD.printf("\n You \n WIN!\n");
+ uLCD.printf("\n You \n WIN!\n");//display message
for (i=0; i<500; i=i+100) {
speaker.period(1.0/float(i));
@@ -251,7 +235,7 @@
}
wait(5);
lcd_mutex.unlock();
- goto A;
+ goto A;//restart the game
}