A program designed to run on the microbit. Used for driving a buggy.

Dependencies:   microbit

Committer:
AdrianClarke
Date:
Mon Mar 27 12:14:03 2017 +0000
Revision:
0:4aa6e1498925
Initial Code

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AdrianClarke 0:4aa6e1498925 1 /*********************************************************
AdrianClarke 0:4aa6e1498925 2 *buggy_functions.cpp *
AdrianClarke 0:4aa6e1498925 3 *Author: Elijah Orr & Dan Argust *
AdrianClarke 0:4aa6e1498925 4 * *
AdrianClarke 0:4aa6e1498925 5 *A library of functions that can be used to control the *
AdrianClarke 0:4aa6e1498925 6 *RenBuggy. *
AdrianClarke 0:4aa6e1498925 7 *********************************************************/
AdrianClarke 0:4aa6e1498925 8
AdrianClarke 0:4aa6e1498925 9 #ifndef BUGGY_FUNCTIONS_C
AdrianClarke 0:4aa6e1498925 10 #define BUGGY_FUNCTIONS_C
AdrianClarke 0:4aa6e1498925 11
AdrianClarke 0:4aa6e1498925 12 /* necessary includes */
AdrianClarke 0:4aa6e1498925 13 #include "mbed.h"
AdrianClarke 0:4aa6e1498925 14 #include "buggy_function.h"
AdrianClarke 0:4aa6e1498925 15 #include "Microbit_function.h"
AdrianClarke 0:4aa6e1498925 16
AdrianClarke 0:4aa6e1498925 17 //Trim is an offset that you can adjust to help the buggy drive straight
AdrianClarke 0:4aa6e1498925 18 //Trim = -0.2 is a left trim
AdrianClarke 0:4aa6e1498925 19 //Trim = 0.2 is a right trim
AdrianClarke 0:4aa6e1498925 20 float trim = 0.0;
AdrianClarke 0:4aa6e1498925 21
AdrianClarke 0:4aa6e1498925 22 //Set up PWM on both left and right motor pins.
AdrianClarke 0:4aa6e1498925 23 PwmOut Lmotor(LeftMotorPin);
AdrianClarke 0:4aa6e1498925 24 PwmOut Rmotor(RightMotorPin);
AdrianClarke 0:4aa6e1498925 25
AdrianClarke 0:4aa6e1498925 26 Direction Current_Direction = Up;
AdrianClarke 0:4aa6e1498925 27
AdrianClarke 0:4aa6e1498925 28 //DigitalIn is used as a button
AdrianClarke 0:4aa6e1498925 29 DigitalIn CurrentButtonState(p7);
AdrianClarke 0:4aa6e1498925 30 //This bool is used to store the buttons state (pressed/not pressed)
AdrianClarke 0:4aa6e1498925 31 bool LastButtonState = 0;
AdrianClarke 0:4aa6e1498925 32
AdrianClarke 0:4aa6e1498925 33
AdrianClarke 0:4aa6e1498925 34 /* Functions (listed below) contain the code that runs the buggy.
AdrianClarke 0:4aa6e1498925 35 These functions can be used in the main.cpp file */
AdrianClarke 0:4aa6e1498925 36
AdrianClarke 0:4aa6e1498925 37
AdrianClarke 0:4aa6e1498925 38 extern void hold(float time) //waits for (time) seconds
AdrianClarke 0:4aa6e1498925 39 {
AdrianClarke 0:4aa6e1498925 40 //seg.DisplayDigits(0,0); //Displays the digits 0 and 0
AdrianClarke 0:4aa6e1498925 41 for (float i = time;i>0;i-=0.01){ //For every hundreth of a second, display the time remaining
AdrianClarke 0:4aa6e1498925 42 Display(Current_Direction);
AdrianClarke 0:4aa6e1498925 43 wait(0.01);
AdrianClarke 0:4aa6e1498925 44 }
AdrianClarke 0:4aa6e1498925 45 Display(Clear);
AdrianClarke 0:4aa6e1498925 46 }
AdrianClarke 0:4aa6e1498925 47
AdrianClarke 0:4aa6e1498925 48 extern void forward(float time) //moves forward for (time) seconds
AdrianClarke 0:4aa6e1498925 49 {
AdrianClarke 0:4aa6e1498925 50 Lmotor = 0.7 + trim;
AdrianClarke 0:4aa6e1498925 51 Rmotor = 0.7 - trim; //set the left and right motor to 1.0 (full speed) - the trim offset
AdrianClarke 0:4aa6e1498925 52 Current_Direction = Up;
AdrianClarke 0:4aa6e1498925 53 hold(time); //wait for (time) seconds while the motors are on
AdrianClarke 0:4aa6e1498925 54 stop(); //stops the motors
AdrianClarke 0:4aa6e1498925 55 }
AdrianClarke 0:4aa6e1498925 56
AdrianClarke 0:4aa6e1498925 57 extern void left(float time) //moves left for (time) seconds
AdrianClarke 0:4aa6e1498925 58 {
AdrianClarke 0:4aa6e1498925 59 Lmotor = 0.0; //set the right motor to full speed
AdrianClarke 0:4aa6e1498925 60 Rmotor = 0.7 - trim; //set the left motor to off
AdrianClarke 0:4aa6e1498925 61 Current_Direction = Left;
AdrianClarke 0:4aa6e1498925 62 hold(time); //waits for (time) seconds
AdrianClarke 0:4aa6e1498925 63 stop(); //stops the motors
AdrianClarke 0:4aa6e1498925 64 }
AdrianClarke 0:4aa6e1498925 65
AdrianClarke 0:4aa6e1498925 66 extern void right(float time) //moves right for (time) seconds
AdrianClarke 0:4aa6e1498925 67 {
AdrianClarke 0:4aa6e1498925 68 Lmotor = 0.7 + trim; //set the left motor to full speed
AdrianClarke 0:4aa6e1498925 69 Rmotor = 0.0; //set the right motor to off
AdrianClarke 0:4aa6e1498925 70 Current_Direction = Right;
AdrianClarke 0:4aa6e1498925 71 hold(time); //waits for (time) seconds
AdrianClarke 0:4aa6e1498925 72 stop(); //stops the motors
AdrianClarke 0:4aa6e1498925 73 }
AdrianClarke 0:4aa6e1498925 74
AdrianClarke 0:4aa6e1498925 75 extern void bear_Right(float time) //keeps both motors turning but will turn right
AdrianClarke 0:4aa6e1498925 76 {
AdrianClarke 0:4aa6e1498925 77 Lmotor = 0.7 + trim; //sets the left motor to full speed
AdrianClarke 0:4aa6e1498925 78 Rmotor = 0.1; // sets the right motor to move slowly
AdrianClarke 0:4aa6e1498925 79 Current_Direction = TopRight; //Sets the direction to be top right
AdrianClarke 0:4aa6e1498925 80 hold(time); // wait for (time) seconds.
AdrianClarke 0:4aa6e1498925 81 stop(); // stops both motors.
AdrianClarke 0:4aa6e1498925 82 }
AdrianClarke 0:4aa6e1498925 83
AdrianClarke 0:4aa6e1498925 84 extern void bear_Left(float time) // keeps both motors turning but it should slowly turn left
AdrianClarke 0:4aa6e1498925 85 {
AdrianClarke 0:4aa6e1498925 86 Lmotor = 0.1; // sets the left motor to move slowly
AdrianClarke 0:4aa6e1498925 87 Rmotor = 0.7 - trim; // sets the right motor to move at full speed
AdrianClarke 0:4aa6e1498925 88 Current_Direction = TopLeft; // sets the direction to be the top left.
AdrianClarke 0:4aa6e1498925 89 hold(time); // wait for (time) seconds
AdrianClarke 0:4aa6e1498925 90 stop(); // stops both motors
AdrianClarke 0:4aa6e1498925 91 }
AdrianClarke 0:4aa6e1498925 92 extern void stop() //stops the motors
AdrianClarke 0:4aa6e1498925 93 {
AdrianClarke 0:4aa6e1498925 94 Lmotor = Rmotor = 0; //set the speed of each motor to 0
AdrianClarke 0:4aa6e1498925 95 Current_Direction = Stop;
AdrianClarke 0:4aa6e1498925 96 }
AdrianClarke 0:4aa6e1498925 97
AdrianClarke 0:4aa6e1498925 98 extern void readButton(float time) //checks if the button is pressed for (time) seconds
AdrianClarke 0:4aa6e1498925 99 {
AdrianClarke 0:4aa6e1498925 100 //seg.DisplayDigits(0,0); //displays 0 0 on the seven segment display
AdrianClarke 0:4aa6e1498925 101 for (float i = time;i>0;i-=0.01) //for each hundreth of a seconds check if the button state goes from low to high (eg. pressed)
AdrianClarke 0:4aa6e1498925 102 {
AdrianClarke 0:4aa6e1498925 103 if (CurrentButtonState == 1 and LastButtonState == 0){
AdrianClarke 0:4aa6e1498925 104 rollDice(); //rolls the dice if the button is pressed
AdrianClarke 0:4aa6e1498925 105 }
AdrianClarke 0:4aa6e1498925 106 LastButtonState = CurrentButtonState;
AdrianClarke 0:4aa6e1498925 107 wait(0.01);
AdrianClarke 0:4aa6e1498925 108 }
AdrianClarke 0:4aa6e1498925 109 }
AdrianClarke 0:4aa6e1498925 110
AdrianClarke 0:4aa6e1498925 111 extern int rollDice() //a function that randomly generates a number and displays it on the seven segment display
AdrianClarke 0:4aa6e1498925 112 {
AdrianClarke 0:4aa6e1498925 113 int tens; //declare two variables, tens and units to store the number to be displayed
AdrianClarke 0:4aa6e1498925 114 int units;
AdrianClarke 0:4aa6e1498925 115 for (int i = 20;i>0;i--){
AdrianClarke 0:4aa6e1498925 116 tens = rand()%9; //generate a random number from 0-9 and store it in "tens"
AdrianClarke 0:4aa6e1498925 117 units = rand()%9;
AdrianClarke 0:4aa6e1498925 118 //seg.DisplayDigits(tens,units); //display the numbers stored in tens and units
AdrianClarke 0:4aa6e1498925 119 wait(0.04);
AdrianClarke 0:4aa6e1498925 120 }
AdrianClarke 0:4aa6e1498925 121 return tens*10+units;
AdrianClarke 0:4aa6e1498925 122 }
AdrianClarke 0:4aa6e1498925 123
AdrianClarke 0:4aa6e1498925 124 extern void follow_Line(float time) //a function that uses the built in ADCs to command the buggy to follow a black line for time.
AdrianClarke 0:4aa6e1498925 125 {
AdrianClarke 0:4aa6e1498925 126 int direction_Data; //declares a variable uses to store the direction data.
AdrianClarke 0:4aa6e1498925 127 for (float i = time; i > 0 ; i -= follow_Speed) // will repeat until time is up.
AdrianClarke 0:4aa6e1498925 128 {
AdrianClarke 0:4aa6e1498925 129 direction_Data = left_Sensor() - right_Sensor(); //Compare left sensor and right sensor.
AdrianClarke 0:4aa6e1498925 130 //if direction data is positive then the right sensor is on white.
AdrianClarke 0:4aa6e1498925 131 //if direction data is negative then the left sensor is on white.
AdrianClarke 0:4aa6e1498925 132 if(direction_Data > 100) //data direction is significantly positive.
AdrianClarke 0:4aa6e1498925 133 {
AdrianClarke 0:4aa6e1498925 134 left(follow_Speed); //turns left for follow_Speed.
AdrianClarke 0:4aa6e1498925 135 }
AdrianClarke 0:4aa6e1498925 136 else if (direction_Data < -100 ) //data direction is significantly negative
AdrianClarke 0:4aa6e1498925 137 {
AdrianClarke 0:4aa6e1498925 138 right(follow_Speed); // turns right for follow_Speed
AdrianClarke 0:4aa6e1498925 139 }
AdrianClarke 0:4aa6e1498925 140 else // else if both sensors are within each other.
AdrianClarke 0:4aa6e1498925 141 {
AdrianClarke 0:4aa6e1498925 142 forward(follow_Speed); // heads forward for follow_Speed.
AdrianClarke 0:4aa6e1498925 143 }
AdrianClarke 0:4aa6e1498925 144 }
AdrianClarke 0:4aa6e1498925 145 }
AdrianClarke 0:4aa6e1498925 146
AdrianClarke 0:4aa6e1498925 147 extern void follow_Line() // a functoin that will follow a black line forever.
AdrianClarke 0:4aa6e1498925 148 {
AdrianClarke 0:4aa6e1498925 149 int direction_Data; //declares a variable used to store the direction data.
AdrianClarke 0:4aa6e1498925 150 for (;;) //This creates a loop which will go on forever.
AdrianClarke 0:4aa6e1498925 151 {
AdrianClarke 0:4aa6e1498925 152 direction_Data = left_Sensor() - right_Sensor(); // Combines both sets of direction data into one variable.
AdrianClarke 0:4aa6e1498925 153 if(direction_Data > 100) // if direction data is signficantly positive
AdrianClarke 0:4aa6e1498925 154 {
AdrianClarke 0:4aa6e1498925 155 left(follow_Speed);// Turn left, as the buggy is leaving the black line.
AdrianClarke 0:4aa6e1498925 156 }
AdrianClarke 0:4aa6e1498925 157 else if (direction_Data < -100 ) // if direction data is significantly negative
AdrianClarke 0:4aa6e1498925 158 {
AdrianClarke 0:4aa6e1498925 159 right(follow_Speed); //turn right, as the buggy is leaving the black line.
AdrianClarke 0:4aa6e1498925 160 }
AdrianClarke 0:4aa6e1498925 161 else // if neither other conditions are met then go forward.
AdrianClarke 0:4aa6e1498925 162 {
AdrianClarke 0:4aa6e1498925 163 forward(follow_Speed); // go forward, as the buggy is on the black line.
AdrianClarke 0:4aa6e1498925 164 }
AdrianClarke 0:4aa6e1498925 165 }
AdrianClarke 0:4aa6e1498925 166 }
AdrianClarke 0:4aa6e1498925 167
AdrianClarke 0:4aa6e1498925 168
AdrianClarke 0:4aa6e1498925 169 #endif // BUGGY_FUNCTIONS_C