extension 2
Dependencies: mbed
main.cpp
- Committer:
- benparkes
- Date:
- 2015-10-16
- Revision:
- 0:d1ef26d38f28
File content as of revision 0:d1ef26d38f28:
#include "mbed.h" #define wheelc 0.1759292 #define pi 3.141592654 #define degreel 0.021988888 //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 = 0.100f; //100% float dutyB = 0.100f; //100% //distance measurement float distanceA ; float distanceB ; float speedA ; float speedB ; float pretimerA; float afttimerA; float pretimerB; float afttimerB; float wheel_spacing = 0.128; float lastinterupttimeA = 0.000f; float lastinterupttimeB = 0.000f; //Completed Loop int loop=0; int turn(); void ResetDistanceTimeSpeed() { distanceA=0; distanceB=0; speedA=0; speedB=0; pretimerA=0; pretimerB=0; afttimerA=0; afttimerB=0; timer.reset(); timer.start(); } void stopmotors() { PWMA.write(0.0f); //0% duty cycle PWMB.write(0.0f); //0% duty cycle } int forward(float distance, float speed) { //add forward to input with switch for scalability // Set motor direction forward DIRA = FORWARD; DIRB = FORWARD; //reset distance ResetDistanceTimeSpeed(); // Set motor speed to input speed PWMA.write(0.1f); //Set duty cycle (%) PWMB.write(0.1f); //Set duty cycle (%) //wait for run to complete while (((distanceA+distanceB)/2) < distance) { if (speedA<speed) { dutyA += (float)0.0051; PWMA.write(dutyA); } if( speedA>speed) { dutyA -= (float)0.0051; PWMA.write(dutyA); } if (speedB<speed) { dutyB += (float)0.0051; PWMB.write(dutyB); } if( speedB>speed) { dutyB -= (float)0.0051; PWMB.write(dutyB); } wait(0.05); } return 1; } int turn(float degrees, float speed, 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; // Set Motor Speed for Outside Wheel PWMA.write(0.0f); //Set duty cycle (%) PWMB.write(0.0f); //Set duty cycle (%) // Test for Loop Completion to Enter Victory Spin if(direction==REVERSE) { DIRA = REVERSE; DIRB = FORWARD; PWMB.write(0.0f); //Set duty cycle (%) } // Reset Distance Travelled ResetDistanceTimeSpeed(); // Wait for Turn to Complete while (distanceA < distance) { if (speedA<speed) { dutyA += (float)0.0051; PWMA.write(dutyA); } if( speedA>speed) { dutyA -= (float)0.0051; PWMA.write(dutyA); } if(direction==REVERSE) { if (speedB<(speed/2)) { dutyB += (float)0.0051; PWMB.write(dutyB); } if( speedB>(speed/2)) { dutyB -= (float)0.0051; PWMB.write(dutyB); } } wait(0.1); } return 1; } void set_distanceA() { float time = 0; float interupttime = timer.read_us(); if(interupttime-lastinterupttimeA > 5) { afttimerA = timer.read(); //set latest timer to equal timer distanceA += (wheelc/6); //set distance travelled for this instruction i.e forward/turn etc time = afttimerA - pretimerA; //work out time taken for last 6th of a rotation speedA = 0.166667f/(time); //distance/time = average speed for last 6th rotation pretimerA = afttimerA; //update pretimer for next calculation of time terminal.printf("speedA %f : time %f\n\r", speedA, time); } lastinterupttimeA = interupttime; } void set_distanceB() { float time = 0; float interupttime = timer.read_us(); if(interupttime-lastinterupttimeB > 5) { afttimerB = timer.read(); distanceB += (wheelc/6); time = afttimerB - pretimerB; speedB = 0.166667f/time; pretimerB = afttimerB; terminal.printf("speedB %f : time %f\n\r", speedB, time); } lastinterupttimeB = interupttime; } 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,10); //terminal.printf("turn\n\r"); turn(90,10,0); //terminal.printf("forward\n\r"); forward(7,10); //terminal.printf("turn\n\r"); turn(90,10,0); } stopmotors(); wait(0.5); //victory spin turn(180,40,1); stopmotors(); break; } } } }