Program to control an accelerometer, motors and a rangefinder using the ScmRTOS ported to mbed. (Work in progress and buggy)
Hexacopter/Motor_control.h
- Committer:
- jberry
- Date:
- 2010-11-01
- Revision:
- 0:9b057566f9ee
File content as of revision 0:9b057566f9ee:
#pragma once #ifndef MOTOR_CONTROL_H #define MOTOR_CONTROL_H #include <cmath> #include <processes.h> //Motor_controller M_cont_process; enum direction{CLOCKWISE,ANTICLOCKWISE}; //PwmOut Out1(p23); //motor1 //PwmOut Out2(p24); //PwmOut Out3(p25); //PwmOut Out4(p26); class motor_control { public: motor_control(PinName OUT1, PinName OUT2) :Out1(OUT1),Out2(OUT2),Output(&Out1) { //Output = &Out1; set_direction(CLOCKWISE); SPEED = 0.0; Out1.pulsewidth_ms(1); // pulsewidth should be 1ms Out1.write(0.0); //set initial duty cycle to 0 (i.e. off) Out2.write(0.0); //set initial duty cycle to 0 (i.e. off) } void set_direction(direction D) { if( D == CLOCKWISE ) { *Output = 0; Output = &Out2; } else { *Output = 0; Output = &Out1; } DIR = D; //set_speed(get_speed()); } direction get_direction() { return DIR; } void set_speed(float speed) { SPEED = speed; if(speed >= -1 && speed < 0) { if(get_direction() == CLOCKWISE) //ALLOW SOME TIME for the motor to change direction { *Output = 0; //wait_ms(500); } set_direction(ANTICLOCKWISE); *Output = speed; } else if(speed >= 0 && speed <= 1) { if(get_direction() == CLOCKWISE) //ALLOW SOME TIME for the motor to change direction { *Output = 0; //wait_ms(500); } set_direction(CLOCKWISE); *Output = speed; } } float get_speed() { return SPEED; } void speed_inc() { if( (get_speed() + 0.1) <= 1) set_speed(SPEED + 0.1); else if( get_speed() + 0.1 > 1) set_speed(1); } void speed_dec() { if( (get_speed() - 0.1) >= 0) set_speed(SPEED - 0.1); else if( get_speed() - 0.1 < 0) set_speed(0); } void change_direction() { if (get_direction() == CLOCKWISE) set_direction(ANTICLOCKWISE); else set_direction(CLOCKWISE); } private: //int PIN1,PIN2; direction DIR; PwmOut Out1; PwmOut Out2; PwmOut* Output; float SPEED; }; char MOT_Return_chars[100]; //defined in accelerometer.h char Motor_command[100] = ""; byte Motor_number = 0; extern BusOut leds; template<> OS_PROCESS void Motor_controller::Exec() //motor control handling process { Motor_command[99] = '\0'; motor_control Motor1(p23,p24); motor_control Motor2(p25,p26); motor_control *M = &Motor1; float motor_percentage = -1, motor_direction = 0.5, motor_strength = 0; //motor direction is a float from 0-1 which indicates the relative strength of one motor to the other the strength is the PWM output of the strongest motor as dictated by direction direction PREV_DIR = CLOCKWISE; char* pEND, *pEND2; //MOT_channel for (;;) { //OS::message<byte> MOTOR_message; for(byte i = 0; i<100; i++) { MOT_channel.pop(Motor_command[i]); //if data is available, pop, else wait leds = 0x5; if(Motor_command[i] == '\0') //keep popping chars until a delimiter is found break; else if(Motor_command[i] != '\0' && i == 99) Motor_command[i] = '\0'; } //sprintf(MOT_Return_chars, "a command was received.\n"); //TX_Channel.write(MOT_Return_chars, strlen(MOT_Return_chars)+1); //output the command for debugging //TX_Channel.write(Motor_command, strlen(Motor_command) +1); //which motor? //if (strlen(Servo_Command) >= 20 && strstr(Servo_Command,":Calibrate")) if(strstr(Motor_command, "MOT:") != NULL) { Motor_number = strtod(1+strstr(Motor_command, ":"), &pEND); // motor_percentage = -1; //sprintf(output_chars, "motor number is: %d\n", Motor_number); //TX_Channel.write(output_chars, strlen(output_chars)+1); //output the command for debugging if(Motor_number < 2) // valid conversion { if(Motor_number == 0) M = &Motor1; else M = &Motor2; motor_percentage = strtod(1+pEND, &pEND2); //sprintf(output_chars, "percentage is: %f\n", motor_percentage); //TX_Channel.write(output_chars, strlen(output_chars)+1); //output the command for debugging M->set_speed(motor_percentage*(-1)); } //end valid conversion check } //end single MOT: command else if(strstr(Motor_command, "MO2:") != NULL) { motor_direction = strtod(&Motor_command[4], &pEND); if(motor_direction >= -1 && motor_direction <= 1) { motor_strength = strtod(1+pEND, &pEND2); if(motor_strength >= -1 && motor_strength <= 1) { //sprintf(output_chars, "Motor direction is: %f Motor strength is:%f\n", motor_direction, motor_strength); //TX_Channel.write(output_chars, strlen(output_chars)+1); //output the command for debugging if(motor_direction < 0) { Motor1.set_speed(motor_strength); Motor2.set_speed(motor_strength*abs(motor_direction)*2); } else if(motor_direction>0) { Motor2.set_speed(motor_strength); Motor1.set_speed(motor_strength*abs(motor_direction)*2); } } } } leds = 0x5; } } #endif