MBED Labyrinth Danger
Overview
This is our take on the popular labyrinth games commonly found in cereal boxes and cheap vending machines! Our design incorporates the uLCD screen as well as the LSM9DS0 IMU sensors to produce our rendition of the game. The IMU accelerometer detects the general tilt of the board, resulting in the yellow ball moving in the direction of the tilt. The more you tilt the board, the farther the yellow ball moves. The user then has to move the ball throughout the maze, making sure not to fall into either of the two dark grey holes and also making sure not to bump into any of the walls. If the user falls into a hole or bumps into a wall, they lose. If the user can move the yellow ball into the blue hole, they win!
- by Daniel Begasse and Keith Ng
Pictures and Videos
Components
- uLCD http://developer.mbed.org/users/4180_1/notebook/ulcd-144-g2-128-by-128-color-lcd
- IMU http://developer.mbed.org/cookbook/LMS9DS0-IMU
Circuit PinOuts
uLCD PinOut
MBED | uLCD |
p27 | TX |
p28 | RX |
p30 | RES |
VU | +5V |
GND | GND |
IMU PinOut
MBED | IMU |
p9 | SDA |
p10 | SCL |
VOUT | VDD |
GND | GND |
Code
main.cpp
//Daniel Begasse //Kieth Nga //ECE 4180 Lab 4 //This game uses reading from the accelerometer on an IMU sensor to move a ball through a maze //The goal of the game is to move to yellow ball through the maze, avoiding walls and obstacles along the way #include "LSM9DS0.h" #include "mbed.h" #include "uLCD_4DGL.h" #include <stdio.h> #include <stdlib.h> // SDO_XM and SDO_G are both grounded, so our addresses are: #define LSM9DS0_XM 0x1D // Would be 0x1E if SDO_XM is LOW #define LSM9DS0_G 0x6B // Would be 0x6A if SDO_G is LOW LSM9DS0 dof(p9, p10,LSM9DS0_G, LSM9DS0_XM); uLCD_4DGL uLCD(p28, p27, p30); //create a global lcd project Serial pc(USBTX, USBRX); // tx, rx #define PRINT_CALCULATED #define PRINT_SPEED 500 // 500 ms between prints //Init Serial port and LSM9DS0 chip void setup() { pc.baud(9600);//Had to update the baud rate to match tera term uint16_t status = dof.begin(); } void drawMaze(){ uLCD.filled_rectangle(20, 0, 23, 40 , 0x00FF00); //Wall 1 uLCD.filled_rectangle(0, 105, 40, 108 , 0x00FF00); //Wall 2 uLCD.filled_rectangle(25, 70, 127, 73 , 0x00FF00); //Wall 3 uLCD.filled_rectangle(45, 40, 48, 70 , 0x00FF00); //Wall 4 uLCD.filled_rectangle(45, 40, 75, 43 , 0x00FF00); //Wall 5 uLCD.filled_rectangle(75, 73, 78, 108 , 0x00FF00); //Wall 6 uLCD.filled_rectangle(90, 15, 127, 18 , 0x00FF00); //Wall 7 uLCD.filled_circle(100, 100, 5, BLUE);//End destination uLCD.filled_circle(100, 50, 7, DGREY); //Hole #1 uLCD.filled_circle(60, 90, 7, DGREY); //Hole #2 } void displayRules(){ uLCD.printf(" Labyrinth Danger!\n\n\n"); wait(3); uLCD.locate(5,3); uLCD.printf("THE RULES\n"); wait(1.5); uLCD.printf("1.)Avoid the walls\n"); wait(1.5); uLCD.printf("2.)Avoid the holes\n"); wait(1.5); uLCD.printf("3.)Get the yellow ball in the blue hole to win"); wait(6); uLCD.cls(); } void youLose(){ uLCD.cls(); uLCD.locate(1,4); uLCD.text_width(2); uLCD.text_height(2); uLCD.printf("YOU LOSE\n"); } void youWin(){ uLCD.cls(); uLCD.locate(1,4); uLCD.text_width(2); uLCD.text_height(2); uLCD.printf("YOU WIN!\n"); } int main() { displayRules();//Show the rules before the start of the game setup(); //Setup sensor and Serial drawMaze(); //Draw the maze int circlex = 0; int circley = 0; int circler = 3; int last_circlex = 64; int last_circley = 64; float accelx; float accely; while (true) { dof.readAccel(); accelx = dof.calcAccel(dof.ax) - dof.abias[0]; accely = dof.calcAccel(dof.ay) - dof.abias[1]; //pc.printf("%2f\n", accel); wait(0.05); //Get rid of the old circle uLCD.filled_circle(last_circlex, last_circley, circler, BLACK); circlex = 128 - ((1 + accelx) * 64); circley = (1 + accely) * 64; //This checks if the game has been won if( (circlex >= 96 && circlex <= 104) && (circley >= 96 && circley <= 104) ){ youWin(); break; } //This checks if the ball has hit wall number 1 if( (circlex >= 18 && circlex <= 25) && (circley >= 0 && circley <=42) ){ youLose(); break; } //This checks if the ball has hit wall number 2 if( (circlex >= 0 && circlex <= 42) && (circley >= 103 && circley <= 110) ){ youLose(); break; } //This checks if the ball has hit wall number 3 if( (circlex >= 23 && circlex <= 129) && (circley >= 68 && circley <=75) ){ youLose(); break; } //This checks if the ball has hit wall number 4 if( (circlex >= 43 && circlex <= 50) && (circley >= 38 && circley <= 72) ){ youLose(); break; } //This checks if the ball has hit wall number 5 if( (circlex >= 43 && circlex <= 77) && (circley >= 38 && circley <= 45) ){ youLose(); break; } //This checks if the ball has hit wall number 6 if( (circlex >= 73 && circlex <= 80) && (circley >= 72 && circley <= 110) ){ youLose(); break; } //This checks if the ball has hit wall number 7 if( (circlex >= 88 && circlex <= 129) && (circley >= 13 && circley <= 20) ){ youLose(); break; } //This checks if the ball fell into hole #1 if( (circlex >= 95 && circlex <= 105) && (circley >= 45 && circley <= 55) ){ youLose(); break; } //This checks if the ball fell into hole #2 if( (circlex >= 55 && circlex <= 65) && (circley >= 85 && circley <= 95) ){ youLose(); break; } //If the player has not won or hit a wall, update the location of the ball else{ last_circlex = circlex; last_circley = circley; uLCD.filled_circle(circlex, circley, circler, 0xFFFF00); } } }
Import programECE4180_lab4
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.
Please log in to post comments.