Workshop 2

Dependencies:   PM2_Libary

main.cpp

Committer:
lupomic
Date:
2022-04-05
Revision:
37:6ac4db3cc57b
Parent:
36:c6961428c1e1
Child:
38:cbad84e4c714

File content as of revision 37:6ac4db3cc57b:

/*this Program acts as a prototype. it dosn't include any PWM modulation nor cours-correcten.
It is built as Step after Step programm, if any step fails the Program feils it shoud proof the concept of the pland roboter
*/
#include "AnalogIn.h"
#include "DigitalIn.h"
#include "DigitalOut.h"
#include "PinNames.h"
#include "mbed.h"
#include "pinmap.h"
#include <cstdint>
#include <cwchar>
#include "PM2_Libary.h"

//------------------------------------general IO and Variables----------------------------------------------------------
// user button on nucleo board
Timer user_button_timer;            // create Timer object which we use to check if user button was pressed for a certain time (robust against signal bouncing)
InterruptIn user_button(PC_13);     // create InterruptIn interface object to evaluate user button falling and rising edge (no blocking code in ISR)
void user_button_pressed_fcn();     // custom functions which gets executed when user button gets pressed and released, definition below
void user_button_released_fcn();


//arbitrary allocation of pins -> for testing this has to be adjusted
AnalogIn ch0(PA_15); //IR TOF sensor at the front
AnalogIn RearSensor(PC_9); //IR TOF sensor at the back facing down

DigitalOut armMotor(PB_15);
// main() runs in its own thread in the OS
// Enable the ADC, 12MHz,  the final term should be (2**BURST_CHANNELS - 1)
float trigerValueRearSensor = 0.0f;
float trigerValueFrontSensor = 0.0f;

 int ToNextFunction = 0 ;


//-----------------------------------------actors Definition----------------------------------------------------
//Encoder pin 
EncoderCounter  encoder_M_right(PA_0, PA_1);
EncoderCounter  encoder_M_left(PA_2, PA_3);  //Pin zuweisung Provisorisch!!!

//motor pin
FastPWM pwm_M_right(PA_10);              
FastPWM pwm_M_left(PA_9); 
// create SpeedController and PositionController objects, default parametrization is for 78.125:1 gear box
float max_voltage = 12.0f;                  // define maximum voltage of battery packs, adjust this to 6.0f V if you only use one batterypack
float counts_per_turn = 20.0f * 78.125f;    // define counts per turn at gearbox end: counts/turn * gearratio
float kn = 180.0f / 12.0f;                  // define motor constant in rpm per V
float k_gear = 100.0f / 78.125f;            // define additional ratio in case you are using a dc motor with a different gear box, e.g. 100:1
float kp = 0.1f;                            // define custom kp, this is the default speed controller gain for gear box 78.125:1

//motors for tracks
PositionController positionController_M_right(counts_per_turn * k_gear, kn / k_gear, kp * k_gear, max_voltage, pwm_M_right, encoder_M_right); // parameters adjusted to 100:1 gear, we need a different speed controller gain here
PositionController positionController_M_left(counts_per_turn * k_gear, kn / k_gear, kp * k_gear, max_voltage, pwm_M_left, encoder_M_left); // parameters adjusted to 100:1 gear, we need a different speed controller gain here

//Arm Motor
PositionController positionController_M_Arm(counts_per_turn * k_gear, kn / k_gear, kp * k_gear, max_voltage, pwm_M_right, encoder_M_right); // parameters adjusted to 100:1 gear, we need a different speed controller gain here


//Platzhalter Variabeln für die Positionierung
int16_t PositionStair    = 20;
int16_t PositionBackOff  = 100;
int16_t degArmStart      = 40;
int16_t degArmLift       = 18;



//-----------------------------------------Functions----------------------------------------------------------
//only moves the arm in to the starting position
int StartPosition(void){
    if(true){
        return 1;
    }
    return NULL;
}

//Drives forward into the next step
int Drive(int16_t dist){
    int8_t i = 0;         //prov condition variable


    int8_t distance = dist; //distance which will be driven in [mm]
    float factor = 1.0f; //factor for calculating the value in to the float which will be given to the setDesiredRotation function
    float distanceValue = float(distance)*factor;

        positionController_M_right.setDesiredRotation(distanceValue);
        positionController_M_left.setDesiredRotation(distanceValue);

    return 0;
    
}

//only turns the arm until the robot is on the next step
//not yet clear if the motor controler function drives to a absolute poition or if it drives the given distance relative to the current position
int LiftUp(int16_t deg){
    int8_t rotation = deg;
    int8_t i = 0;         //prov condition variable
    do{
        positionController_M_Arm.setDesiredRotation(deg);
        
        i++;
    }while(i < 1);
    return 0;
}



    
int main()
{
    // attach button fall and rise functions to user button object
    user_button.fall(&user_button_pressed_fcn);
    user_button.rise(&user_button_released_fcn);


    while (true) {


       
        switch (ToNextFunction) {
        case 1: StartPosition();
                ToNextFunction+=1;
        break;
        case 2: Drive(PositionStair);
                ToNextFunction+=1;
        break;
        case 3: LiftUp(degArmLift);
                ToNextFunction+=1;
        break;
        case 4: Drive(PositionBackOff);
                ToNextFunction+=1;
        break;
        case 5: LiftUp(degArmStart);
                ToNextFunction = 0;
        break;
        default: ToNextFunction = 0;     
        }

        
        thread_sleep_for(10);
    }

}
void user_button_pressed_fcn()
{
    user_button_timer.start();
    user_button_timer.reset();
}

void user_button_released_fcn()
{
    // read timer and toggle do_execute_main_task if the button was pressed longer than the below specified time
    int user_button_elapsed_time_ms = std::chrono::duration_cast<std::chrono::milliseconds>(user_button_timer.elapsed_time()).count();
    user_button_timer.stop();
    if (user_button_elapsed_time_ms > 200) {
        ToNextFunction = 1;
    }




}