Ready to be uploaded
Dependencies: mbed
main.cpp
- Committer:
- ABentley
- Date:
- 2015-10-15
- Revision:
- 0:735ec5eb58d0
File content as of revision 0:735ec5eb58d0:
#include "mbed.h" #define wheelc 0.1759292 // Circumference of Wheel #define pi 3.141592654 #define degreel 0.021988888 // Distance Travelled in 1 Degree // Status LED DigitalOut led(LED1); // Motor PWM (speed) PwmOut PWMA(PA_8); PwmOut PWMB(PB_4); // Motor Direction DigitalOut DIRA(PA_9); DigitalOut DIRB(PB_10); // Hall-Effect Sensor Inputs InterruptIn HEA1(PB_2); DigitalIn HEA2(PB_1); InterruptIn HEB1(PB_15); DigitalIn HEB2(PB_14); // On board Switch DigitalIn SW1(USER_BUTTON); // Use the Serial Object so we can use Higher Speeds Serial terminal(USBTX, USBRX); // Timer Used for Measuring Speeds Timer timer; // Enumerated Types enum DIRECTION {FORWARD=0, REVERSE}; enum PULSE {NOPULSE=0, PULSE}; enum SWITCHSTATE {PRESSED=0, RELEASED}; // Debug GPIO DigitalOut probe(D10); // Duty Cycles float dutyA = 1.0f; //100% float dutyB = 1.0f; //100% // Distance Measurement float distanceA ; float distanceB ; float speedA ; float speedB ; float wheel_spacing = 0.128; // Completed Loop int loop = 0; void stopmotors() // Stop Motors Spinning { PWMA.write(0.0f); //0% duty cycle PWMB.write(0.0f); //0% duty cycle } void set_distanceA() { // Hall Effect Measuring Distance for Motor A distanceA += (wheelc/6); terminal.printf("A =%f\n\r",distanceA); //Print to terminal } void set_distanceB() { // Hall Effect Measuring Distance for Motor B distanceB += (wheelc/6); terminal.printf("B =%f\n\r",distanceB); // Print to Terminal Distance Moved so Far } int forward(float distance, float duty) // Move Forwards (distance,speed) { // Set Motor Direction Forward DIRA = FORWARD; DIRB = FORWARD; // Set Motor Speed to Input Speed PWMA.write(duty); //Set Duty Cycle (%) PWMB.write(duty); //Set Duty Cycle (%) // Reset Total Distance Travelled distanceA = 0; distanceB = 0; timer.reset(); timer.start(); // Wait for Set Distance to be Reached while (((distanceA+distanceB)/2) < distance) { } // Using Average Distance for More Accurate Result return 1; } int turn(float degrees, float duty, int direction) // (Degrees of Turn, Speed, (Anti/Clock)wise) { // Calculate Turn Distance float distance=0; distance=((float)degreel*degrees); //Set Initial Motor Direction DIRA = FORWARD; DIRB = FORWARD; // Test for Loop Completion to Enter Victory Spin if(direction==REVERSE) { DIRA = REVERSE; DIRB = REVERSE; } // Set Motor Speed for Outside Wheel PWMA.write(duty); //Set duty cycle (%) PWMB.write(0.0f); //Set duty cycle (%) // Reset Distance Travelled distanceA = 0; distanceB = 0; timer.reset(); timer.start(); // Wait for Turn to Complete while (distanceA < distance) { } return 1; } int main() { // Configure the Terminal to High Speed terminal.baud(115200); HEA1.rise(set_distanceA); HEB1.rise(set_distanceB); // Set Initial Motor Speed to Stop stopmotors(); PWMA.period_ms(10); PWMB.period_ms(10); while(1) { // Wait for Switch Press while (SW1 == PRESSED) { wait(0.01); while(SW1 == RELEASED) { // Navigate Course for (int i = 0; i<2; i++) { forward(12,50); // Move Forward 1.2m (extra .2 to avoid cones) turn(90,50,1); // Turn 90° forward(6,50); // Move Forward .6m (extra .1 to avoid cones) turn(90,50,1); // Turn 90° } stopmotors(); wait(0.5); //Victory Spin turn(360,50,0); //Turn 360 degrees in Reverse stopmotors(); break; // End Program, Prevents Looping } } } }