Robot project.
Dependencies: HCSR04 PID QEI mbed
main.cpp
- Committer:
- srsmitherman
- Date:
- 2013-12-12
- Revision:
- 1:82463f25fd3c
- Parent:
- 0:8a066434c28e
File content as of revision 1:82463f25fd3c:
#include "mbed.h" #include "HCSR04.h" #include "DRV8833.h" #include "QEI.h" #include "PID.h" #include "stdio.h" #include "LPC17xx.h" #define PIN_TRIGGER (p12) #define PIN_ECHO (p11) #define PULSE_PER_REV (1192) #define WHEEL_CIRCUM (12.56637) #define DIST_PER_PULSE (0.01054225722682) #define MTRS_TO_INCH (39.3701) #define MAX_SPEED (0.8) //Hardware Initilization Serial bt(p28,p27); Serial pc(USBTX,USBRX); HCSR04 rangeFinder( PIN_TRIGGER, PIN_ECHO ); DRV8833 leftMotors(p21,p22); DRV8833 rightMotors(p23,p24); //QEI leftEncoder(p5,p6,NC,1192,QEI::X4_ENCODING); //QEI rightEncoder(p7,p8,NC,1192,QEI::X4_ENCODING); PID pid1(1.0,0.0,0.0,0.1); InterruptIn encoder(p29); //Prototypes float getUltraSonic(void); void UARTIntHandler(void); void start(void); void stop(void); void forward(void); void reverse(void); void left(void); void right(void); void us_distance(void); void wall_follow(void); void bad_command(void); void encoderIntHandler(void); void encoderReset(void); float encoderDistance(void); int command_int(char *command); //Variables const int num_commands = 9; float range, echo; char inputString[12]; int commandNumber = 0; unsigned long temp1; unsigned long temp2; float pid_return; int pulses=0; typedef struct { char command[12]; void (*fnctPtr)(void); }CommandListType; CommandListType CommandTable[num_commands]={ {"g", &start}, {"s", &stop}, {"f", &forward}, {"b", &reverse}, {"l", &left}, {"r", &right}, {"u", &us_distance}, {"w", &wall_follow}, {"error", &bad_command} }; int main(void) { bt.baud(115200); bt.attach(&UARTIntHandler,Serial::RxIrq); NVIC_SetPriority(UART2_IRQn, 2); NVIC_SetPriority(EINT3_IRQn, 0); bt.printf("Start Main\n"); encoder.rise(&encoderIntHandler); while(1) { } } float encoderDistance(void) { return ((float)pulses*DIST_PER_PULSE); } void encoderReset(void) { pulses = 0; return; } void encoderIntHandler(void) { pulses++; return; } float getUltraSonic(void) { return 0; } void UARTIntHandler(void) { bt.scanf("%s",inputString); while(bt.readable()){ bt.getc(); } bt.printf("%s\n\r", inputString); commandNumber = command_int(inputString); CommandTable[commandNumber].fnctPtr(); return; } void start(void) { bt.printf("Move a foot.\n\r"); encoderReset(); forward(); while(encoderDistance()<12.0){ //bt.printf("%f\n\r",encoderDistance()); } //bt.printf("%d\n\r",pulses); stop(); return; } void stop(void) { bt.printf("Stop\n"); leftMotors.speed(0); rightMotors.speed(0); bt.printf("%d\n\r",pulses); return; } void forward(void) { //bt.printf("Move Forward\n"); leftMotors.speed(0.25); rightMotors.speed(0.25); } void reverse(void) { bt.printf("Move Backward\n"); leftMotors.speed(-0.25); rightMotors.speed(-0.25); } void left(void) { bt.printf("Move Left\n"); leftMotors.speed(0.5); rightMotors.speed(-0.5); } void right(void) { bt.printf("Move Right\n"); leftMotors.speed(-0.7); rightMotors.speed(0.7); } void us_distance(void) { bt.printf("Ultra Sonic\n\r"); rangeFinder.startMeas(); wait_ms(10); if ( (rangeFinder.getMeas(range) == RANGE_MEAS_VALID) && (range < 100.0) && (range > 3.0)) { bt.printf("Range = %f\n", range); } } void wall_follow(void) { while(1){ pid1.setInputLimits(4.0, 20.0); pid1.setOutputLimits( -0.6, 0.6); pid1.setSetPoint(20.0); rangeFinder.startMeas(); wait_ms(100); if ( (rangeFinder.getMeas(range) == RANGE_MEAS_VALID) && (range < 100.0) && (range > 3.0)) { //bt.printf("Range = %f\n", range); } pid1.setProcessValue(range); pid_return = pid1.compute(); bt.printf("Range: %f\n PID: %f", range, pid_return); if(pid_return > 0){ leftMotors.speed(MAX_SPEED - pid_return); rightMotors.speed(MAX_SPEED); }else if(pid_return < 0){ leftMotors.speed(MAX_SPEED); rightMotors.speed(MAX_SPEED + pid_return); }else{ leftMotors.speed(MAX_SPEED); rightMotors.speed(MAX_SPEED); } } } void bad_command(void) { } int command_int(char *command) { int i = 0; for(i=0;i<num_commands-1;i++) { if(strncmp(command,CommandTable[i].command,strlen(CommandTable[i].command))==0) { return i; } } return num_commands-1; }