Robot project.

Dependencies:   HCSR04 PID QEI mbed

Revision:
0:8a066434c28e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Thu Dec 12 17:25:08 2013 +0000
@@ -0,0 +1,247 @@
+#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;
+}
\ No newline at end of file