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: HCSR04 PID QEI mbed
main.cpp
- Committer:
- srsmitherman
- Date:
- 2013-12-12
- Revision:
- 0:8a066434c28e
File content as of revision 0:8a066434c28e:
#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;
}