For 1st Year ROCO104

Dependencies:   mbed motor

main.cpp

Committer:
martinsimpson
Date:
2018-12-14
Revision:
1:3ca91ad8e927
Parent:
0:51c12cc34baf
Child:
4:8249fab4d8d3

File content as of revision 1:3ca91ad8e927:

/*
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
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 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(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

Serial pc(USBTX,USBRX);           //Instance of the Serial class to enable much faster BAUD rates then standard 9600 i.e. 115200
                                  //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)


//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("ROCO104 Demonstration Robot Buggy Plymouth University 2018/19\n\r");

  Wheel.Period_in_ms(TIME_PERIOD);//Set frequency of the PWMs

  //
  //--------------------------- your strategy goes between the two dashed lines ---------------------------------------------   
  //
    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==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);
        //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();
        }
    }
  
    while(true)                             //Repeat the following forever NB always true!
    {
        Wheel.Speed(duty,duty);             //Move Foward
    
        while(microswitch1==0&&microswitch2==0){wait(0.05);}// Loop here till a microswitch activates
                                                            // NB short delay for debounce/noise(Electrical)

        Wheel.Stop();                       //STOP
        wait(0.1);                          //Allow time for motors to stop
      
            if(microswitch1==1)             //Execute the following code if microswitch1 is activated
            { 
                Wheel.Stop();               //STOP
                tone1();
                Wheel.Speed(-duty,-duty);   //Move Back
                wait(2.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
            {
                Wheel.Stop();               //STOP
                tone2();
                Wheel.Speed(-duty,-duty);   //Move Back
                wait(2.0f);
                Wheel.Stop();               //STOP
                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
}
//
//----------------------------------------------------------------------------------------------
//
        //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%
//      { 
//        Wheel.Speed(i,i);
//        wait(0.1f);
//      }