Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed mbed-rtos MotionSensor EthernetInterface
Revision 5:b0af0cfb678e, committed 2016-04-17
- Comitter:
- drelliak
- Date:
- Sun Apr 17 00:58:06 2016 +0000
- Parent:
- 3:e213c44a9f6c
- Child:
- 10:6735a8309f62
- Commit message:
- BRAKE TEST
Changed in this revision
| MotionSensor.lib | Show annotated file Show diff for this revision Revisions of this file |
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/MotionSensor.lib Mon Apr 11 21:24:52 2016 +0000 +++ b/MotionSensor.lib Sun Apr 17 00:58:06 2016 +0000 @@ -1,1 +1,1 @@ -http://mbed.org/teams/components/code/MotionSensor/#226520fc09bf +http://mbed.org/teams/components/code/MotionSensor/#4d6e28d4a18a
--- a/main.cpp Mon Apr 11 21:24:52 2016 +0000
+++ b/main.cpp Sun Apr 17 00:58:06 2016 +0000
@@ -7,15 +7,18 @@
#define PI 3.141592653589793238462
#define Ts 0.02 // Seconds
+#define PWM_PERIOD 13.5 // ms
#define INITIAL_P 0.452531214933414
#define INITIAL_I 5.45748932024049
#define INITIAL_D 0.000233453623255507
#define INITIAL_N 51.0605584484153
-#define BRAKE_CONSTANT 30
+#define BRAKE_CONSTANT 40
+#define BRAKE_WAIT 0.3
#define GYRO_OFFSET 0.0152
#define END_THRESH 4
#define START_THRESH 10
#define MINIMUM_VELOCITY 15
+
Serial ser(USBTX, USBRX); // Initialize Serial port
PwmOut motor(PTD1); // Motor connected to pin PTD1
PwmOut servo(PTD3); // Servo connected to pin PTD3
@@ -45,39 +48,66 @@
void magCal();
// State variables
-float sensor, velocity;
+float feedback, velocity = 0;
void readProtocol();
void brakeMotor();
+void reverseMotor(int speed);
+void setVelocity(int new_velocity);
+
// Test functions
void debug();
int main(){
- // Initializing serial communication
- ser.baud(9600);
- ser.format(8, SerialBase::None, 1);
- // Initializing controller
- printf("Initializing controller....\r\n\r\n");
- initializeController();
- printf("Controller Initialized. \r\n");
- // Calibrating magnetometer and setting the initial position
- magCal();
- gyro_angle = processMagAngle();
- // Start moving the robot and integrating the gyroscope
- velocity = MINIMUM_VELOCITY;
- setMotorPWM(velocity,motor);
- startGyro();
- // main loop
- while (true){
- processGyroAngle();
- controlAnglePID(P,I,D,N);
- //debug();
- if(t.read_us() < Ts*1000000)
- wait_us(Ts*1000000 - t.read_us());
- if(ser.readable())
- readProtocol();
- }
+ int teste = 0;
+ setVelocity(0);
+ switch(teste){
+ case 0: // vai para tras duas vezes
+ brakeMotor();
+ wait(1);
+ setVelocity(-1);
+ setVelocity(0);
+ setVelocity(-30);
+ wait(2);
+ brakeMotor();
+ wait(2);
+ setVelocity(-1);
+ setVelocity(0);
+ setVelocity(-30);
+ break;
+ case 1: // vai para a frente e depois para tras
+ brakeMotor();
+ wait(1);
+ setVelocity(20);
+ wait(2);
+ brakeMotor();
+ wait(2);
+ setVelocity(-1);
+ setVelocity(0);
+ setVelocity(-30);
+ break;
+ case 2: // vai para tras e depois para frente
+ brakeMotor();
+ wait(1);
+ setVelocity(-1);
+ setVelocity(0);
+ setVelocity(-30);
+ wait(2);
+ brakeMotor();
+ wait(2);
+ setVelocity(20);
+ break;
+ case 3: // vai para frente duas vezes
+ brakeMotor();
+ wait(1);
+ setVelocity(20);
+ wait(2);
+ brakeMotor();
+ wait(2);
+ setVelocity(20);
+ break;
+ }
+ while(1);
}
-
void readProtocol(){
char msg = ser.getc();
switch(msg)
@@ -146,18 +176,18 @@
gyro_angle = gyro_angle + (gyro_data[2] + GYRO_OFFSET)*(double)(t.read_us())/1000000;
t.reset();
t.start();
- sensor = gyro_angle;
- if(sensor > 180)
- sensor = sensor - 360;
- if(sensor < -180)
- sensor = sensor + 360;
+ feedback = gyro_angle;
+ if(feedback > 180)
+ feedback = feedback - 360;
+ if(feedback < -180)
+ feedback = feedback + 360;
}
/* PID controller for angular position */
void controlAnglePID(float P, float I, float D, float N){
/* Getting error */
e[1] = e[0];
- e[0] = reference - (sensor*PI/180);
+ e[0] = reference - (feedback*PI/180);
if(e[0] > PI)
e[0]= e[0] - 2*PI;
if(e[0] < -PI)
@@ -182,19 +212,52 @@
}
/* Brake function, braking while the gyroscope is still integrating will cause considerably error in the measurement. */
void brakeMotor(){
- if(velocity > 0)
+ if(velocity >= 0){
setMotorPWM(-BRAKE_CONSTANT, motor);
- else if(velocity < 0)
- setMotorPWM(BRAKE_CONSTANT, motor);
- wait(0.5);
- setMotorPWM(0,motor);
+ wait(BRAKE_WAIT);
+ velocity = 0;
+ setMotorPWM(velocity,motor);
+ }
+ else {
+ setVelocity(0);
+ }
+}
+void reverseMotor(int speed){
+ for(int i=0 ; i >= -speed; i--){
+ setMotorPWM((float)i,motor);
+ wait_ms(13.5);
+ }
+ for(int i=-speed ; i <= 0; i++){
+ setMotorPWM((float)i,motor);
+ wait_ms(13.5);
+ }
+ for(int i=0 ; i >= -speed; i--){
+ setMotorPWM((float)i,motor);
+ wait_ms(13.5);
+ }
+}
+void setVelocity(int new_velocity){
+ if( velocity > new_velocity){
+ for(; velocity >= new_velocity; velocity--){
+ setMotorPWM(velocity,motor);
+ wait_ms(PWM_PERIOD);
+ }
+ velocity++;
+ }
+ else if(velocity < new_velocity){
+ for(; velocity <= new_velocity; velocity++){
+ setMotorPWM(velocity,motor);
+ wait_ms(PWM_PERIOD);
+ }
+ velocity--;
+ }
}
/* Debug functions that prints the sensor and control inputs values. Since it's time consuming it should not be used */
/* in the main loop or the controller performance may be affected. */
void debug(){
//printf("ERROR: %f Up: %f Ui: %f Ud: %f U: %f \r\n", e[0]*180/3.1415, up[0]*100/(3.1415/8), ui[0]*100/(3.1415/8), ud[0]*100/(3.1415/8),u*100/(3.1415/8));
//printf("Erro: %f Sensor: %f Magnetometer: %f \r\n",e[0]*180/PI,sensor,processMagAngle(0)*180/PI);
- printf(" %f \r\n",sensor);
+ printf(" %f \r\n",feedback);
}
/* Function to normalize the magnetometer reading */