![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
pabs
Diff: main.cpp
- Revision:
- 1:3ca91ad8e927
- Parent:
- 0:51c12cc34baf
- Child:
- 4:8249fab4d8d3
--- a/main.cpp Thu Feb 01 12:59:21 2018 +0000 +++ b/main.cpp Fri Dec 14 14:24:52 2018 +0000 @@ -1,24 +1,34 @@ /* -Simple Routine for Nucleo Board for ROCO103PP Buggy Motor COntrol and Microswitches +Simple Routine for Nucleo Board for ROCO104 Buggy Motor Control and Microswitches +Heavy edit from previous ROCO103PP code +Motor Class can now be instansiated with all four pins needed to control the H Bridge +with a member functions as follows + +Motor::Speed(float A, Float B) range -0.1 to +1.0 to give full reverse to full forward for A/B motors +Motor::Stop() STOP +Motor::Fwd(float) Forward but floating point number (range 0.0 to 1.0) +Motor::Rev(float) Reverse but floating point number (range 0.0 to 1.0) + Plymouth University M.Simpson 31st October 2016 -Editted 03/02/2017 +Edited 03/02/2017 +Edited 06/12/2018 */ #include "mbed.h" #include "motor.h" #include "tunes.h" + #define TIME_PERIOD 2 //Constant compiler Values here 2 equates to 2ms or 500Hz base Frequency #define DUTY 0.9 //DUTY of 1.0=100%, 0.4=40% etc., DigitalIn microswitch1(D4); //Instance of the DigitalIn class called 'microswitch1' DigitalIn microswitch2(D3); //Instance of the DigitalIn class called 'microswitch2' -Motor motor_A(D7,D8); //Instances of the Motor Class see motor.h anf motor.cpp -Motor motor_B(D9,D10); //They must be connected to these ports D7,D8 & D9,D10 +Motor Wheel(D13,D11,D9,D10); //Instance of the Motor Class called 'Wheel' see motor.h and motor.cpp DigitalIn myButton(USER_BUTTON); //USER_BUTTON is the Blue Button on the NUCLEO Board -DigitalOut led(LED1); //LED1 is the Green LED on the NUCLEO board +DigitalOut led(LED3); //LED1 is the Green LED on the NUCLEO board //N.B. The RED LED is the POWER Indicator //and the Multicoloured LED indicates status of the ST-LINK Programming cycle @@ -26,121 +36,96 @@ //This is Pseudo RS232 over USB the NUCLEO will appear as a COMx Port see device Manager on PC used //Use PuTTY to monitor check COMx and BAUD rate (115200) -//The Following line is a Function Prototype -int motor(float speedA, float speedB); //call as motor('Speed of MotorA Left','Speed of MotorB Right') - //Where speed ranges from -1.0 to +1.0 inclusive rto give full reverse to full forward - //And of course 0.0 will stop the Motor //Variable 'duty' for programmer to use to vary speed as required set here to #define compiler constant see above float duty=DUTY; // int main () { - pc.baud(115200); //BAUD Rate to 115200 - pc.printf("ROCO103PP Demonstration Robot Buggy Plymouth University 2016/17\n\r"); + pc.baud(115200); //BAUD Rate to 115200 + pc.printf("ROCO104 Demonstration Robot Buggy Plymouth University 2018/19\n\r"); - motor_A.Period_in_ms(TIME_PERIOD); //Set frequency of the PWMs - motor_B.Period_in_ms(TIME_PERIOD); + Wheel.Period_in_ms(TIME_PERIOD);//Set frequency of the PWMs + // //--------------------------- your strategy goes between the two dashed lines --------------------------------------------- // - motor(0.0f,0.0f); // Ensure Motors are stopped - For the curious, this function is defined at the end of this file. + Wheel.Stop(); - close_encounter(1); //tune to play Announce start! - //twinkle(1); //see tunes.h for alternatives or make your own! - //jingle_bells(1); - while(myButton==1) - { //Wait here for USER Button (Blue) on Nucleo Board (goes to zero when pressed) - led=0; //and flash green LED whilst waiting + close_encounter(1); //tune to play Announce start! + //twinkle(1); //see tunes.h for alternatives or make your own! + //jingle_bells(1); + + while(myButton==0) + { //Wait here for USER Button (Blue) on Nucleo Board (goes to zero when pressed) + led=0; //and flash green LED whilst waiting wait(0.1); led=1; wait(0.1); - if(microswitch1==1) - { - pc.printf("Switch1 = %4.2fV\n\r",(float)microswitch1*3.3f);//printing value of microswitch1 in PuTTy window on PC - //NB this is a Digital Input and so returns a Boolean 1 or 0 - //and so 'cast' the result into a 'float' type and multiply by 3.3! - // see the instruction doc on how to install putty. - tone1(); + //Test Microswitches with two different tones see tunes.cpp tunes.h + if(microswitch1==1) + { + pc.printf("Switch1 = %4.2fV\n\r",(float)microswitch1*3.3f); + //printing value of microswitch1 in PuTTy window on PC + //NB this is a Digital Input and so returns a Boolean 1 or 0 + //and so 'cast' the result into a 'float' type and multiply by 3.3! + //to indicate voltage applied to pin. + //see the instruction doc on how to install putty. + tone1(); + } + if(microswitch2==1) + { + pc.printf("Switch 2 pressed\n\r"); //Another example of how to print a message telling about the program workings. + tone2(); + } } - //Test Microswitches with two different tones see tunes.cpp tunes.h - if(microswitch2==1) - { - pc.printf("Switch 2 pressed\n\r"); //Another example of how to print a message telling about the program workings. - tone2(); - } - } - while(true) //Repeat the following forever + while(true) //Repeat the following forever NB always true! { - motor(duty,duty); //Start Moving forward + Wheel.Speed(duty,duty); //Move Foward - while(microswitch1==0&µswitch2==0){wait(0.05);} //short delay for debounce/noise + while(microswitch1==0&µswitch2==0){wait(0.05);}// Loop here till a microswitch activates + // NB short delay for debounce/noise(Electrical) - motor(0,0); //STOP Motors - wait(0.1); //Allow time for motors to stop + Wheel.Stop(); //STOP + wait(0.1); //Allow time for motors to stop - if(microswitch1==1) //Execute the following code if microswitch1 is activated + if(microswitch1==1) //Execute the following code if microswitch1 is activated { - motor(0.0f,0.0f); //Stop the Motors + Wheel.Stop(); //STOP tone1(); - motor(-duty,-duty); + Wheel.Speed(-duty,-duty); //Move Back wait(2.0f); - motor(0,0); - wait(1.0f); - motor(-duty,duty); - wait(2.0f); - motor(0,0); - wait(1.0f); + Wheel.Stop(); //STOP + wait(0.1f); + Wheel.Speed(-duty,duty); //SPIN anti-clockwise + wait(0.75f); + Wheel.Stop(); //STOP + wait(0.1f); } - if(microswitch2==1) //Execute the following code if microswitch2 is activated + if(microswitch2==1) //Execute the following code if microswitch2 is activated { - motor(0.0f,0.0f); //Stop the Motors + Wheel.Stop(); //STOP tone2(); - motor(-duty,-duty); + Wheel.Speed(-duty,-duty); //Move Back wait(2.0f); - motor(0,0); + Wheel.Stop(); //STOP wait(1.0f); - motor(duty,-duty); - wait(2.0f); - motor(0,0); - wait(1.0f); + Wheel.Speed(duty,-duty); //SPIN clockwise + wait(0.75f); + Wheel.Stop(); //STOP + wait(0.1f); } - } + }// go back to start of while loop } // //---------------------------------------------------------------------------------------------- // - -//Small function to control motors use as motor(1.0,-0.5) Motor A full speed forward Motor B half speed reversed -int motor(float speedA, float speedB){ - if(speedA>1.0f||speedA<-1.0f){ //CHECK speedA Value is in Range! - return -1; //return ERROR code -1=speedA Value out of range! EXIT Function - } - if(speedB>1.0f||speedA<-1.0f){ //CHECK speedB Value is in Range! - return -2; //return ERROR code -2=speedB Value out of range! EXIT Function - } - //If speed values have passed the checks above then the following code will be executed - if(speedA<0.0f){ - motor_A.Rev(-speedA); - } - else{ - motor_A.Fwd(speedA); - } - if(speedB<0.0f){ - motor_B.Rev(-speedB); - } - else{ - motor_B.Fwd(speedB); - } - return 0; //Return ERROR code Zero i.e. NO ERROR success! -} - -/* //Consider these lines of code to Accelerate the motors + //Consider these lines of code to Accelerate the motors // for (float i=0.5f; i<=1.0f; i+=0.01f) //Accelerate from 50% to 100% // { -// motor(i,i); +// Wheel.Speed(i,i); // wait(0.1f); // } -*/ +