This is our rendition of popular labyrinth games. We use readings from the IMU accelerometer to move a little yellow ball around the screen. We have created a maze of walls and holes that will end the game if the user runs into either of these.

Dependencies:   4DGL-uLCD-SE mbed

Committer:
dbegasse
Date:
Tue Oct 20 18:34:56 2015 +0000
Revision:
1:2250e33823e2
Parent:
0:7b4bbd744f6d
ECE4180 Lab 4 to_publish

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dbegasse 1:2250e33823e2 1 //Daniel Begasse
dbegasse 1:2250e33823e2 2 //Kieth Nga
dbegasse 1:2250e33823e2 3 //ECE 4180 Lab 4
dbegasse 1:2250e33823e2 4 //This game uses reading from the accelerometer on an IMU sensor to move a ball through a maze
dbegasse 1:2250e33823e2 5 //The goal of the game is to move to yellow ball through the maze, avoiding walls and obstacles along the way
dbegasse 1:2250e33823e2 6
dbegasse 0:7b4bbd744f6d 7 #include "LSM9DS0.h"
dbegasse 0:7b4bbd744f6d 8 #include "mbed.h"
dbegasse 0:7b4bbd744f6d 9 #include "uLCD_4DGL.h"
dbegasse 0:7b4bbd744f6d 10 #include <stdio.h>
dbegasse 0:7b4bbd744f6d 11 #include <stdlib.h>
dbegasse 0:7b4bbd744f6d 12
dbegasse 0:7b4bbd744f6d 13 // SDO_XM and SDO_G are both grounded, so our addresses are:
dbegasse 0:7b4bbd744f6d 14 #define LSM9DS0_XM 0x1D // Would be 0x1E if SDO_XM is LOW
dbegasse 0:7b4bbd744f6d 15 #define LSM9DS0_G 0x6B // Would be 0x6A if SDO_G is LOW
dbegasse 0:7b4bbd744f6d 16
dbegasse 0:7b4bbd744f6d 17
dbegasse 0:7b4bbd744f6d 18 LSM9DS0 dof(p9, p10,LSM9DS0_G, LSM9DS0_XM);
dbegasse 0:7b4bbd744f6d 19 uLCD_4DGL uLCD(p28, p27, p30); //create a global lcd project
dbegasse 1:2250e33823e2 20 Serial pc(USBTX, USBRX); // tx, rx
dbegasse 0:7b4bbd744f6d 21
dbegasse 0:7b4bbd744f6d 22 #define PRINT_CALCULATED
dbegasse 0:7b4bbd744f6d 23 #define PRINT_SPEED 500 // 500 ms between prints
dbegasse 0:7b4bbd744f6d 24
dbegasse 0:7b4bbd744f6d 25 //Init Serial port and LSM9DS0 chip
dbegasse 0:7b4bbd744f6d 26 void setup()
dbegasse 0:7b4bbd744f6d 27 {
dbegasse 1:2250e33823e2 28 pc.baud(9600);//Had to update the baud rate to match tera term
dbegasse 0:7b4bbd744f6d 29 uint16_t status = dof.begin();
dbegasse 0:7b4bbd744f6d 30
dbegasse 0:7b4bbd744f6d 31 }
dbegasse 0:7b4bbd744f6d 32
dbegasse 0:7b4bbd744f6d 33
dbegasse 1:2250e33823e2 34
dbegasse 1:2250e33823e2 35 void drawMaze(){
dbegasse 1:2250e33823e2 36
dbegasse 1:2250e33823e2 37 uLCD.filled_rectangle(20, 0, 23, 40 , 0x00FF00); //Wall 1
dbegasse 1:2250e33823e2 38 uLCD.filled_rectangle(0, 105, 40, 108 , 0x00FF00); //Wall 2
dbegasse 1:2250e33823e2 39 uLCD.filled_rectangle(25, 70, 127, 73 , 0x00FF00); //Wall 3
dbegasse 1:2250e33823e2 40 uLCD.filled_rectangle(45, 40, 48, 70 , 0x00FF00); //Wall 4
dbegasse 1:2250e33823e2 41 uLCD.filled_rectangle(45, 40, 75, 43 , 0x00FF00); //Wall 5
dbegasse 1:2250e33823e2 42 uLCD.filled_rectangle(75, 73, 78, 108 , 0x00FF00); //Wall 6
dbegasse 1:2250e33823e2 43 uLCD.filled_rectangle(90, 15, 127, 18 , 0x00FF00); //Wall 7
dbegasse 1:2250e33823e2 44 uLCD.filled_circle(100, 100, 5, BLUE);//End destination
dbegasse 1:2250e33823e2 45 uLCD.filled_circle(100, 50, 7, DGREY); //Hole #1
dbegasse 1:2250e33823e2 46 uLCD.filled_circle(60, 90, 7, DGREY); //Hole #2
dbegasse 1:2250e33823e2 47
dbegasse 1:2250e33823e2 48 }
dbegasse 1:2250e33823e2 49
dbegasse 1:2250e33823e2 50 void displayRules(){
dbegasse 1:2250e33823e2 51
dbegasse 1:2250e33823e2 52 uLCD.printf(" Labyrinth Danger!\n\n\n");
dbegasse 1:2250e33823e2 53 wait(3);
dbegasse 1:2250e33823e2 54 uLCD.locate(5,3);
dbegasse 1:2250e33823e2 55 uLCD.printf("THE RULES\n");
dbegasse 1:2250e33823e2 56 wait(1.5);
dbegasse 1:2250e33823e2 57 uLCD.printf("1.)Avoid the walls\n");
dbegasse 1:2250e33823e2 58 wait(1.5);
dbegasse 1:2250e33823e2 59 uLCD.printf("2.)Avoid the holes\n");
dbegasse 1:2250e33823e2 60 wait(1.5);
dbegasse 1:2250e33823e2 61 uLCD.printf("3.)Get the yellow ball in the blue hole to win");
dbegasse 1:2250e33823e2 62 wait(6);
dbegasse 1:2250e33823e2 63 uLCD.cls();
dbegasse 1:2250e33823e2 64
dbegasse 1:2250e33823e2 65 }
dbegasse 1:2250e33823e2 66
dbegasse 1:2250e33823e2 67 void youLose(){
dbegasse 1:2250e33823e2 68
dbegasse 1:2250e33823e2 69 uLCD.cls();
dbegasse 1:2250e33823e2 70 uLCD.locate(1,4);
dbegasse 1:2250e33823e2 71 uLCD.text_width(2);
dbegasse 1:2250e33823e2 72 uLCD.text_height(2);
dbegasse 1:2250e33823e2 73 uLCD.printf("YOU LOSE\n");
dbegasse 1:2250e33823e2 74 }
dbegasse 1:2250e33823e2 75
dbegasse 1:2250e33823e2 76 void youWin(){
dbegasse 1:2250e33823e2 77
dbegasse 1:2250e33823e2 78 uLCD.cls();
dbegasse 1:2250e33823e2 79 uLCD.locate(1,4);
dbegasse 1:2250e33823e2 80 uLCD.text_width(2);
dbegasse 1:2250e33823e2 81 uLCD.text_height(2);
dbegasse 1:2250e33823e2 82 uLCD.printf("YOU WIN!\n");
dbegasse 1:2250e33823e2 83 }
dbegasse 1:2250e33823e2 84
dbegasse 0:7b4bbd744f6d 85 int main()
dbegasse 0:7b4bbd744f6d 86 {
dbegasse 1:2250e33823e2 87 displayRules();//Show the rules before the start of the game
dbegasse 0:7b4bbd744f6d 88 setup(); //Setup sensor and Serial
dbegasse 1:2250e33823e2 89 drawMaze(); //Draw the maze
dbegasse 0:7b4bbd744f6d 90
dbegasse 0:7b4bbd744f6d 91 int circlex = 0;
dbegasse 1:2250e33823e2 92 int circley = 0;
dbegasse 1:2250e33823e2 93 int circler = 3;
dbegasse 1:2250e33823e2 94 int last_circlex = 64;
dbegasse 1:2250e33823e2 95 int last_circley = 64;
dbegasse 1:2250e33823e2 96 float accelx;
dbegasse 1:2250e33823e2 97 float accely;
dbegasse 0:7b4bbd744f6d 98
dbegasse 0:7b4bbd744f6d 99
dbegasse 0:7b4bbd744f6d 100
dbegasse 0:7b4bbd744f6d 101 while (true)
dbegasse 0:7b4bbd744f6d 102 {
dbegasse 0:7b4bbd744f6d 103
dbegasse 0:7b4bbd744f6d 104 dof.readAccel();
dbegasse 1:2250e33823e2 105 accelx = dof.calcAccel(dof.ax) - dof.abias[0];
dbegasse 1:2250e33823e2 106 accely = dof.calcAccel(dof.ay) - dof.abias[1];
dbegasse 0:7b4bbd744f6d 107 //pc.printf("%2f\n", accel);
dbegasse 0:7b4bbd744f6d 108 wait(0.05);
dbegasse 0:7b4bbd744f6d 109
dbegasse 1:2250e33823e2 110
dbegasse 1:2250e33823e2 111 //Get rid of the old circle
dbegasse 1:2250e33823e2 112 uLCD.filled_circle(last_circlex, last_circley, circler, BLACK);
dbegasse 1:2250e33823e2 113
dbegasse 1:2250e33823e2 114 circlex = 128 - ((1 + accelx) * 64);
dbegasse 1:2250e33823e2 115 circley = (1 + accely) * 64;
dbegasse 1:2250e33823e2 116
dbegasse 1:2250e33823e2 117
dbegasse 1:2250e33823e2 118 //This checks if the game has been won
dbegasse 1:2250e33823e2 119 if( (circlex >= 96 && circlex <= 104) && (circley >= 96 && circley <= 104) ){
dbegasse 1:2250e33823e2 120
dbegasse 1:2250e33823e2 121 youWin();
dbegasse 1:2250e33823e2 122 break;
dbegasse 1:2250e33823e2 123 }
dbegasse 1:2250e33823e2 124
dbegasse 0:7b4bbd744f6d 125
dbegasse 1:2250e33823e2 126 //This checks if the ball has hit wall number 1
dbegasse 1:2250e33823e2 127 if( (circlex >= 18 && circlex <= 25) && (circley >= 0 && circley <=42) ){
dbegasse 1:2250e33823e2 128
dbegasse 1:2250e33823e2 129 youLose();
dbegasse 1:2250e33823e2 130 break;
dbegasse 1:2250e33823e2 131 }
dbegasse 1:2250e33823e2 132 //This checks if the ball has hit wall number 2
dbegasse 1:2250e33823e2 133 if( (circlex >= 0 && circlex <= 42) && (circley >= 103 && circley <= 110) ){
dbegasse 1:2250e33823e2 134
dbegasse 1:2250e33823e2 135 youLose();
dbegasse 1:2250e33823e2 136 break;
dbegasse 1:2250e33823e2 137 }
dbegasse 1:2250e33823e2 138
dbegasse 1:2250e33823e2 139 //This checks if the ball has hit wall number 3
dbegasse 1:2250e33823e2 140 if( (circlex >= 23 && circlex <= 129) && (circley >= 68 && circley <=75) ){
dbegasse 1:2250e33823e2 141
dbegasse 1:2250e33823e2 142 youLose();
dbegasse 1:2250e33823e2 143 break;
dbegasse 1:2250e33823e2 144 }
dbegasse 1:2250e33823e2 145
dbegasse 1:2250e33823e2 146 //This checks if the ball has hit wall number 4
dbegasse 1:2250e33823e2 147 if( (circlex >= 43 && circlex <= 50) && (circley >= 38 && circley <= 72) ){
dbegasse 1:2250e33823e2 148
dbegasse 1:2250e33823e2 149 youLose();
dbegasse 1:2250e33823e2 150 break;
dbegasse 1:2250e33823e2 151 }
dbegasse 1:2250e33823e2 152
dbegasse 1:2250e33823e2 153 //This checks if the ball has hit wall number 5
dbegasse 1:2250e33823e2 154 if( (circlex >= 43 && circlex <= 77) && (circley >= 38 && circley <= 45) ){
dbegasse 1:2250e33823e2 155
dbegasse 1:2250e33823e2 156 youLose();
dbegasse 1:2250e33823e2 157 break;
dbegasse 1:2250e33823e2 158 }
dbegasse 1:2250e33823e2 159
dbegasse 1:2250e33823e2 160 //This checks if the ball has hit wall number 6
dbegasse 1:2250e33823e2 161 if( (circlex >= 73 && circlex <= 80) && (circley >= 72 && circley <= 110) ){
dbegasse 1:2250e33823e2 162
dbegasse 1:2250e33823e2 163 youLose();
dbegasse 1:2250e33823e2 164 break;
dbegasse 1:2250e33823e2 165 }
dbegasse 1:2250e33823e2 166
dbegasse 1:2250e33823e2 167 //This checks if the ball has hit wall number 7
dbegasse 1:2250e33823e2 168 if( (circlex >= 88 && circlex <= 129) && (circley >= 13 && circley <= 20) ){
dbegasse 1:2250e33823e2 169
dbegasse 1:2250e33823e2 170 youLose();
dbegasse 1:2250e33823e2 171 break;
dbegasse 1:2250e33823e2 172 }
dbegasse 1:2250e33823e2 173
dbegasse 1:2250e33823e2 174 //This checks if the ball fell into hole #1
dbegasse 1:2250e33823e2 175 if( (circlex >= 95 && circlex <= 105) && (circley >= 45 && circley <= 55) ){
dbegasse 1:2250e33823e2 176
dbegasse 1:2250e33823e2 177 youLose();
dbegasse 1:2250e33823e2 178 break;
dbegasse 1:2250e33823e2 179 }
dbegasse 1:2250e33823e2 180
dbegasse 1:2250e33823e2 181 //This checks if the ball fell into hole #2
dbegasse 1:2250e33823e2 182 if( (circlex >= 55 && circlex <= 65) && (circley >= 85 && circley <= 95) ){
dbegasse 1:2250e33823e2 183
dbegasse 1:2250e33823e2 184 youLose();
dbegasse 1:2250e33823e2 185 break;
dbegasse 1:2250e33823e2 186 }
dbegasse 1:2250e33823e2 187
dbegasse 1:2250e33823e2 188 //If the player has not won or hit a wall, update the location of the ball
dbegasse 1:2250e33823e2 189 else{
dbegasse 1:2250e33823e2 190
dbegasse 0:7b4bbd744f6d 191 last_circlex = circlex;
dbegasse 1:2250e33823e2 192 last_circley = circley;
dbegasse 0:7b4bbd744f6d 193 uLCD.filled_circle(circlex, circley, circler, 0xFFFF00);
dbegasse 1:2250e33823e2 194 }
dbegasse 0:7b4bbd744f6d 195
dbegasse 0:7b4bbd744f6d 196 }
dbegasse 0:7b4bbd744f6d 197
dbegasse 1:2250e33823e2 198
dbegasse 0:7b4bbd744f6d 199 }
dbegasse 0:7b4bbd744f6d 200