A program designed to run on the microbit. Used for driving a buggy.
buggy_function.cpp@0:4aa6e1498925, 2017-03-27 (annotated)
- Committer:
- AdrianClarke
- Date:
- Mon Mar 27 12:14:03 2017 +0000
- Revision:
- 0:4aa6e1498925
Initial Code
Who changed what in which revision?
User | Revision | Line number | New 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 |