Updated OCE 360 Assignment 4

Dependencies:   4DGL-uLCD-SE MMA8452Q mbed physics_ball

Committer:
Kaitlyn_Barros
Date:
Thu Dec 07 23:34:36 2017 +0000
Revision:
5:5b888a1a3b98
Parent:
4:241bf0f0e626
Assignment 6

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Kaitlyn_Barros 0:2067ba6c5e74 1 //Kaitlyn Barros
Kaitlyn_Barros 0:2067ba6c5e74 2 //OCE 360 Fall 2017
Kaitlyn_Barros 0:2067ba6c5e74 3
Kaitlyn_Barros 2:8085bd89612b 4 //Last Revised: Nov 16 2017
Kaitlyn_Barros 0:2067ba6c5e74 5
Kaitlyn_Barros 2:8085bd89612b 6 //Software Exercise 4:
Kaitlyn_Barros 0:2067ba6c5e74 7 //1. Update the software system by creating a new library, which includes
Kaitlyn_Barros 0:2067ba6c5e74 8 // a class that defines the behavior of a bouncing ball on the LCD screen.
Kaitlyn_Barros 0:2067ba6c5e74 9 //2. Demonstrate the system with two or more bouncing balls on the screen.
Kaitlyn_Barros 0:2067ba6c5e74 10 //3. Show that the system resets the ball locations when you hold the
Kaitlyn_Barros 0:2067ba6c5e74 11 // accelerometer upside down.
Kaitlyn_Barros 0:2067ba6c5e74 12
Kaitlyn_Barros 2:8085bd89612b 13 //Software Exercise 5:
Kaitlyn_Barros 2:8085bd89612b 14 //1. Update the ball postion using the accelerometer's data at 50Hz. Update the LCD display w/ ball postions at 11HZ.
Kaitlyn_Barros 5:5b888a1a3b98 15 //2. Use a buttom interrupt to turn data recording on/off. Use an onboard LED to indicate recording.
Kaitlyn_Barros 5:5b888a1a3b98 16
Kaitlyn_Barros 5:5b888a1a3b98 17 //Software Exercise 6:
Kaitlyn_Barros 5:5b888a1a3b98 18 //Install a button to freeze the balls for 2 seconds when pressed.
Kaitlyn_Barros 5:5b888a1a3b98 19 //Configure a freefall into the accel that freezes the balls when sensed.
Kaitlyn_Barros 2:8085bd89612b 20
Kaitlyn_Barros 2:8085bd89612b 21 #include "mbed.h" //Mbed Header
Kaitlyn_Barros 2:8085bd89612b 22 #include "physics_ball.h" // Physics Ball Behavior Header
Kaitlyn_Barros 2:8085bd89612b 23 #include "uLCD_4DGL.h" // LCD Header
Kaitlyn_Barros 2:8085bd89612b 24 #include "MMA8452Q.h" // Accelerometer Header
Kaitlyn_Barros 0:2067ba6c5e74 25
Kaitlyn_Barros 2:8085bd89612b 26 Serial pc(USBTX, USBRX); // USB Serial (tx, rx)
Kaitlyn_Barros 2:8085bd89612b 27
Kaitlyn_Barros 2:8085bd89612b 28 DigitalOut led1(LED1); //Onboard LED 1
Kaitlyn_Barros 2:8085bd89612b 29 DigitalOut led2(LED2); //Onboard LED 2
Kaitlyn_Barros 0:2067ba6c5e74 30
Kaitlyn_Barros 2:8085bd89612b 31
Kaitlyn_Barros 4:241bf0f0e626 32 DigitalIn switchinput(p18); //Digital switch set in Pin 18
Kaitlyn_Barros 4:241bf0f0e626 33 DigitalIn AccelInter(p17); //Digital switch caused by accelerometer INT1 pin
Kaitlyn_Barros 2:8085bd89612b 34
Kaitlyn_Barros 2:8085bd89612b 35 // Call out classes (For Ball 1 & 2)
Kaitlyn_Barros 2:8085bd89612b 36 physics_ball ball1;
Kaitlyn_Barros 2:8085bd89612b 37 physics_ball ball2;
Kaitlyn_Barros 2:8085bd89612b 38
Kaitlyn_Barros 0:2067ba6c5e74 39 // Graphic LCD - TX, RX, and RES pins
Kaitlyn_Barros 0:2067ba6c5e74 40 uLCD_4DGL uLCD(p9,p10,p11);
Kaitlyn_Barros 0:2067ba6c5e74 41
Kaitlyn_Barros 0:2067ba6c5e74 42 // Accelerometer - SDA, SCL, and I2C address
Kaitlyn_Barros 0:2067ba6c5e74 43 MMA8452Q accel(p28, p27, 0x1D);
Kaitlyn_Barros 0:2067ba6c5e74 44
Kaitlyn_Barros 2:8085bd89612b 45 // Call out Tickers
Kaitlyn_Barros 2:8085bd89612b 46 Ticker BallUpdate;
Kaitlyn_Barros 2:8085bd89612b 47 Ticker LCDUpdate;
Kaitlyn_Barros 2:8085bd89612b 48
Kaitlyn_Barros 2:8085bd89612b 49 //Ticker Function 1: Ball_Update_Pos
Kaitlyn_Barros 2:8085bd89612b 50 void BUP(){
Kaitlyn_Barros 2:8085bd89612b 51 //Update Ball Postion
Kaitlyn_Barros 2:8085bd89612b 52 ball1.update(accel);
Kaitlyn_Barros 2:8085bd89612b 53 ball2.update(accel);
Kaitlyn_Barros 2:8085bd89612b 54 }
Kaitlyn_Barros 2:8085bd89612b 55
Kaitlyn_Barros 2:8085bd89612b 56 //Ticker Function 2: LCD_Update_Pos
Kaitlyn_Barros 2:8085bd89612b 57 void LCDUP(){
Kaitlyn_Barros 4:241bf0f0e626 58 if (switchinput == 0 || AccelInter == 1){
Kaitlyn_Barros 2:8085bd89612b 59 // Draw new circle
Kaitlyn_Barros 2:8085bd89612b 60 uLCD.filled_circle(ball1.posx, ball1.posy, ball1.radius, BLUE);
Kaitlyn_Barros 2:8085bd89612b 61 uLCD.filled_circle(ball2.posx, ball2.posy, ball2.radius, RED);
Kaitlyn_Barros 2:8085bd89612b 62 led1 = 1;
Kaitlyn_Barros 2:8085bd89612b 63 // Erase old circle (For Ball 1 & 2)
Kaitlyn_Barros 2:8085bd89612b 64 uLCD.filled_circle(ball1.old_posx, ball1.old_posy, ball1.radius, BLACK);
Kaitlyn_Barros 2:8085bd89612b 65 uLCD.filled_circle(ball2.old_posx, ball2.old_posy, ball2.radius, BLACK);
Kaitlyn_Barros 2:8085bd89612b 66 led1= 0;
Kaitlyn_Barros 2:8085bd89612b 67 }
Kaitlyn_Barros 4:241bf0f0e626 68 else if (switchinput ==1 || AccelInter == 0){
Kaitlyn_Barros 4:241bf0f0e626 69 // Draw new circle
Kaitlyn_Barros 4:241bf0f0e626 70 uLCD.filled_circle(ball1.posx, ball1.posy, ball1.radius, BLUE);
Kaitlyn_Barros 4:241bf0f0e626 71 uLCD.filled_circle(ball2.posx, ball2.posy, ball2.radius, RED);
Kaitlyn_Barros 4:241bf0f0e626 72 led1 = 1;
Kaitlyn_Barros 4:241bf0f0e626 73 wait(2);
Kaitlyn_Barros 4:241bf0f0e626 74 // Erase old circle (For Ball 1 & 2)
Kaitlyn_Barros 4:241bf0f0e626 75 uLCD.filled_circle(ball1.old_posx, ball1.old_posy, ball1.radius, BLACK);
Kaitlyn_Barros 4:241bf0f0e626 76 uLCD.filled_circle(ball2.old_posx, ball2.old_posy, ball2.radius, BLACK);
Kaitlyn_Barros 4:241bf0f0e626 77 led1= 0;
Kaitlyn_Barros 2:8085bd89612b 78 }
Kaitlyn_Barros 2:8085bd89612b 79 }
Kaitlyn_Barros 2:8085bd89612b 80
Kaitlyn_Barros 0:2067ba6c5e74 81 int main() {
Kaitlyn_Barros 0:2067ba6c5e74 82 // Initialize uLCD
Kaitlyn_Barros 0:2067ba6c5e74 83 uLCD.baudrate(115200);
Kaitlyn_Barros 0:2067ba6c5e74 84 uLCD.background_color(BLACK);
Kaitlyn_Barros 0:2067ba6c5e74 85 uLCD.cls();
Kaitlyn_Barros 0:2067ba6c5e74 86
Kaitlyn_Barros 0:2067ba6c5e74 87 // Initialize accelerometer
Kaitlyn_Barros 0:2067ba6c5e74 88 accel.init();
Kaitlyn_Barros 2:8085bd89612b 89
Kaitlyn_Barros 4:241bf0f0e626 90 //Intial Ball Conditions & Reset Conditiosn
Kaitlyn_Barros 0:2067ba6c5e74 91 ball1.define_space(ball1.width, ball1.height);
Kaitlyn_Barros 0:2067ba6c5e74 92 ball2.define_space(ball2.width, ball2.height);
Kaitlyn_Barros 0:2067ba6c5e74 93
Kaitlyn_Barros 0:2067ba6c5e74 94 ball1.set_param(ball1.radius, BLUE);
Kaitlyn_Barros 2:8085bd89612b 95 ball2.set_param(ball2.radius, RED);
Kaitlyn_Barros 0:2067ba6c5e74 96
Kaitlyn_Barros 2:8085bd89612b 97 //Tickers
Kaitlyn_Barros 2:8085bd89612b 98 BallUpdate.attach(&BUP, 0.02); //50 Hz
Kaitlyn_Barros 4:241bf0f0e626 99 LCDUpdate.attach(&LCDUP, 0.09);//11 Hz
Kaitlyn_Barros 4:241bf0f0e626 100
Kaitlyn_Barros 4:241bf0f0e626 101 while (1) { }
Kaitlyn_Barros 4:241bf0f0e626 102 }