Revision 0:178a07cd3e39, committed 2011-12-16
- Comitter:
- gsulc
- Date:
- Fri Dec 16 03:45:52 2011 +0000
- Commit message:
Changed in this revision
diff -r 000000000000 -r 178a07cd3e39 Motor.lib
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Motor.lib Fri Dec 16 03:45:52 2011 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/simon/code/Motor/#f265e441bcd9
diff -r 000000000000 -r 178a07cd3e39 bees.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bees.cpp Fri Dec 16 03:45:52 2011 +0000
@@ -0,0 +1,138 @@
+#include "bees.h"
+
+int find_pollen() {
+ return 1;
+}
+int return_home() {
+ return 1;
+}
+int send_directions() {
+ //while(!xbee.readable()) {}
+ //read header
+
+ //read contents
+ int i = 0;
+ while(1){
+ xbee.putc(directions[i] + 2);
+ if(DEBUG)
+ pc.printf("Sending %d\n\r", directions[i]);
+ if(directions[i] == TERMINATE_CHAR) {
+ if (DEBUG)
+ pc.printf("Successfully transfered directions.\n\r");
+ return 1;
+ }
+ i++;
+ }
+
+ if (DEBUG)
+ pc.printf("Error writing directions.\n\r");
+ return 0;
+}
+
+/*********************************************************
+ Name: get_directions
+ inputs:
+ void
+ outputs:
+ int: 1 = completed sucessfully; 0 = unsuccessful
+ Purpose: gets directions on where to move
+*********************************************************/
+int get_directions() {
+ //int buff[DIRECTIONS];
+ int i;
+ // wait until the xbee can be read
+ //while(!xbee.readable()) {}
+ //read header
+
+ //read contents
+ i = 0;
+ while(1){
+ directions[i] = xbee.getc() - 2;
+ if (DEBUG)
+ pc.printf("dir %d\n\r", directions[i]);
+ if(directions[i] == TERMINATE_CHAR)
+ return 1; //successfully transfered directions
+ i++;
+ }
+
+ if (DEBUG)
+ pc.printf("Error reading directions.\n\r");
+ return 0;
+}
+
+int gather() {
+ return 1;
+}
+
+int goto_pollen() {
+ return 1;
+}
+
+void blaze() {
+ int i;
+ for (i = 0; i < (2*DIRECTIONS); i++) {
+ directions[i] = rand() % 3 - 1;
+ directions[++i] = rand() % 20 + 51;
+ if(DEBUG){
+ pc.printf("Directions: %d, %d\n\r", directions[i-1], directions[i]);
+ }
+ }
+ directions[i] = TERMINATE_CHAR;
+ if(DEBUG)
+ pc.printf("Temrinate\n\r");
+}
+
+int copy() {
+ static int direct = 0;
+ static int state = 0;
+
+ /*if(dotype == GetMove) {
+ current_move = directions[direct];
+
+ }*/
+
+ //else if (dotype == DoMove) {
+
+ static int current_move;
+
+ if(state == 0) {
+ current_move = directions[direct];
+ if(DEBUG)
+ pc.printf("Oh! got the Move! %d\n\r", current_move);
+ state = 1;
+ }
+ else if (state == 2) {
+ if(move_state == Stopped)
+ state = 0;
+ if(DEBUG)
+ pc.printf("Waiting for Next Move\n\r");
+ }
+
+ else if (state == 1) {
+ if (current_move == TERMINATE_CHAR) {
+ l_motor.speed(NEUTRAL);
+ r_motor.speed(NEUTRAL);
+ move_state = Stopped;
+ return 1;
+ }
+ else if (current_move <= 1) {
+ if(DEBUG)
+ pc.printf("I like to rotate! \n\r");
+ rotate(current_move);
+ //if((r_tics >= r_goal) || (l_tics >= l_goal))
+ direct++;
+ }
+ else if (current_move >= 20) {
+ if(DEBUG)
+ pc.printf("I like to move it move it! \n\r");
+
+ move(0.5, current_move);
+ //if((r_tics >= r_goal) || (l_tics >= l_goal))
+ direct++;
+ }
+ state = 2;
+ }
+
+ return 0;
+}
+
diff -r 000000000000 -r 178a07cd3e39 bees.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bees.h Fri Dec 16 03:45:52 2011 +0000
@@ -0,0 +1,34 @@
+#ifndef _BEES_H
+#define _BEES_H
+
+#include "mbed.h"
+#include "move.h"
+
+#define DEBUG 1
+#define TERMINATE_CHAR 253
+#define DIRECTIONS 4
+
+typedef enum {Leader, Follower} Bee_Type;
+typedef enum {Blaze, SendDirections, GetDirections, Copy} Operation_Mode;
+//typedef enum {GetMove, DoMove} DoType;
+
+extern Serial pc;
+extern Serial xbee;
+extern MovementState move_state;
+//int current_move;
+
+//static int direct = 0;
+
+extern int directions[2*DIRECTIONS+1];
+
+int find_pollen();
+int return_home();
+int send_directions();
+int get_directions();
+int gather();
+int goto_pollen();
+void blaze();
+int copy();
+
+
+#endif
\ No newline at end of file
diff -r 000000000000 -r 178a07cd3e39 main.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Fri Dec 16 03:45:52 2011 +0000
@@ -0,0 +1,213 @@
+#include "mbed.h"
+#include "bees.h"
+
+#define DEBUG 1
+#define V_PER_IN 0.0098 // mV/in
+
+#ifdef DEBUG
+Serial pc(USBTX, USBRX); // tx, rx
+#endif
+
+DigitalOut myled(LED1);
+
+AnalogIn srf(p20);
+Serial xbee(p9, p10);
+DigitalOut xbee_reset(p11);
+
+
+///
+AnalogIn r_encoder(p15);
+AnalogIn l_encoder(p16);
+
+DigitalOut r_charge(p5);
+DigitalOut l_charge(p6);
+
+Motor r_motor(p21,p30,p29);
+Motor l_motor(p22,p7,p8);
+
+volatile int prev_r_enc = 0;
+volatile int prev_l_enc = 0;
+
+volatile int r_tics = 0;
+volatile int l_tics = 0;
+
+volatile int r_goal = 0;
+volatile int l_goal = 0;
+
+volatile float r_C = -1;
+volatile float l_C = -1;
+
+Ticker charge_period;
+Ticker discharge_period;
+
+int directions[2*DIRECTIONS+1];
+
+MovementState move_state = Stopped;
+///
+//DoType dotype;
+
+
+int main() {
+ Bee_Type type;
+ Operation_Mode mode;
+ float distance;
+
+ QTIsensor_init();
+ charge_period.attach(&QTIsensor_charge,0.02);
+ wait_ms(0.5);
+ discharge_period.attach(&QTIsensor_discharge,0.02);
+
+ // init
+ xbee_reset = 0;
+ wait_ms(1);
+ xbee_reset = 1;
+ // set the type of robot
+ type = Leader;
+ if(type == Leader)
+ mode = Blaze;
+ else if (type == Follower)
+ mode = GetDirections;
+
+ //calibrate(0.5, 40);
+ //move(100);
+
+ //wait(2);
+ //move_state = Moving;
+
+ //move(0.5, 80);
+
+ distance = 10000 * srf;
+ srand((int)distance);
+
+ while(1) {
+ if(DEBUG) {
+ pc.printf("Left : %d Goal: %d\n\r", l_tics, l_goal);
+ pc.printf("Right: %d Goal: %d\n\r", r_tics, r_goal);
+ }
+
+ //wait(0.2);
+ distance = (254 - 6) * srf;
+
+ if (DEBUG)
+ pc.printf("Range: %f\n\r", distance);
+
+ if(distance <= 8)
+ rotate(1);
+
+ //distance = srf / V_PER_IN;
+ //if(DEBUG)
+ // pc.printf("Distance: %f in\n\r", distance);
+
+ //if(xbee.readable())
+ // directions[1] = xbee.getc();
+
+ /*
+ This state machine swithces between the operating
+ modes of the robot and calls the appropriate
+ function in bees.cpp
+ */
+
+ //calibrate(0.5,50);
+
+ /*switch(mode) {
+ case Seek:
+ if(DEBUG)
+ pc.printf("Seeking Pollen\n\r");
+ if(find_pollen())
+ mode = Return;
+ break;
+ case Return:
+ if(DEBUG)
+ pc.printf("Returning to Base\n\r");
+ if(return_home()) {
+ if(type == Seeker)
+ mode = SendDirections;
+ else if(type == Gatherer)
+ mode = Gather;
+ }
+ break;
+ case SendDirections:
+ if(DEBUG)
+ pc.printf("Sending Directions\n\r");
+ if(send_directions())
+ mode = Seek;
+ break;
+ case GetDirections:
+ if(DEBUG)
+ pc.printf("Waiting for Directions\n\r");
+ if(get_directions())
+ mode = Gather;
+ break;
+ case Gather:
+ if(DEBUG)
+ pc.printf("Gathering Pollen\n\r");
+ if(goto_pollen())
+ mode = Gather;
+ break;
+ default:
+ if(DEBUG)
+ pc.printf("Broken :(\n\r");
+ }*/
+
+ switch(mode) {
+ case Blaze:
+ if(DEBUG)
+ pc.printf("Creating Path\n\r");
+ blaze();
+ //pc.printf("now exiting blaze\n\r");
+ mode = Copy;
+ break;
+ case SendDirections:
+ if(DEBUG)
+ pc.printf("Sending Directions\n\r");
+ send_directions();
+ break;
+ case GetDirections:
+ if(DEBUG)
+ pc.printf("Waiting for Directions\n\r");
+ if(get_directions())
+ mode = Copy;
+ break;
+ case Copy:
+ if(DEBUG)
+ pc.printf("Moving\n\r");
+ if(copy()) {
+ if(type == Leader)
+ mode = SendDirections;
+ }
+ break;
+ default:
+ if(DEBUG)
+ pc.printf("Broken :(\n\r");
+ }
+ //pc.printf("now checking move_state\n\r");
+ switch(move_state) {
+ case Stopped:
+ //do nothing
+ r_motor.speed(NEUTRAL);
+ l_motor.speed(NEUTRAL);
+ break;
+ /*case Stop:
+ //stop the motors
+ r_motor.stop();
+ l_motor.stop();
+ mov_state = Stopped;*/
+ case Moving:
+ //sample encoders
+ //update_movement(0.5);
+ //pc.printf("now checking encoders right = %d goal = %d, left = %d goal = %d\n\r",r_tics,r_goal,l_tics,l_goal);
+ if ((r_tics >= r_goal) || (l_tics >= l_goal)) {
+ r_motor.speed(NEUTRAL);
+ l_motor.speed(NEUTRAL);
+ move_state = Stopped;
+ }
+
+ break;
+ }
+
+ myled = 1;
+ wait(0.2);
+ myled = 0;
+ wait(0.2);
+ }
+}
diff -r 000000000000 -r 178a07cd3e39 mbed.bld
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld Fri Dec 16 03:45:52 2011 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/63bcd7ba4912
diff -r 000000000000 -r 178a07cd3e39 move.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/move.cpp Fri Dec 16 03:45:52 2011 +0000
@@ -0,0 +1,193 @@
+#include "move.h"
+
+//void accelerate(Motor m, float distance) {
+
+//}
+
+//void move(int x, int y) {
+
+//}
+
+//void move_line(float distance) {
+ /*while (distance > 0) {
+ //distance -= distance_traveled();
+ left_motor.speed(LEFT_C*FULL_FOWARD);
+ right_motor.speed(RIGHT_C*FULL_FOWARD);
+ }
+ left_motor.stop();
+ right_motor.stop();*/
+//}
+/*
+void rotate(int degrees) {
+}
+
+void rotate(float time, int direction) {
+ //left_motor.speed(0.5);
+ //right_motor.speed(0.5);
+}
+*/
+//void move_arc(int radius, int length, int x, int y) {
+//}
+
+// Shahan
+
+void moveforward(Motor wheel,float speed){
+ wheel.speed(speed);
+}
+
+void movebackward(Motor wheel,float speed){
+ wheel.speed(-speed);
+}
+
+void move(float speed, int tics){
+ /*r_goal = abs(distance)/TICS_PER_MM;
+ l_goal = abs(distance)/TICS_PER_MM;
+ if(distance > 0){
+ r_motor.speed(r_C);
+ l_motor.speed(l_C);
+ }
+ else if(distance < 0){
+ r_motor.speed(-r_C);
+ l_motor.speed(-l_C);
+ }*/
+ float distance = (248) * srf;
+ if(distance <= 14)
+ rotate(1);
+
+ l_goal = l_tics + tics;
+ r_goal = r_tics + tics;
+
+ l_motor.speed(speed * l_C);
+ r_motor.speed(speed * r_C);
+ move_state = Moving;
+}
+
+
+void QTIsensor_init(){
+ r_charge = 0;
+ l_charge = 0;
+}
+
+void QTIsensor_charge(){
+ r_charge = 1;
+ l_charge = 1;
+}
+
+void QTIsensor_discharge(){
+ int r_enc_bin = 1, l_enc_bin = 1;
+ if(r_encoder < QTI_THRESH) {
+ r_enc_bin = 0;
+ }
+ r_charge = 0;
+ if(l_encoder < QTI_THRESH) {
+ l_enc_bin = 0;
+ }
+ l_charge = 0;
+
+ if(prev_r_enc != r_enc_bin)
+ r_tics++;
+ if(prev_l_enc != l_enc_bin)
+ l_tics++;
+
+ prev_r_enc = r_enc_bin;
+ prev_l_enc = l_enc_bin;
+}
+
+void motors_stop(){
+ r_motor.speed(0);
+ l_motor.speed(0);
+}
+
+
+
+void calibrate(float speed, int rots) {
+ float l_corr = -1, r_corr = -1;
+
+ do {
+ l_goal = l_tics + rots;
+ r_goal = r_tics + rots;
+
+ wait(4);
+
+ l_motor.speed(speed * l_C);
+ r_motor.speed(speed * r_C);
+
+ while (r_tics < r_goal && l_tics < l_goal) {
+ pc.printf("Left : %d Goal: %d\n\r", l_tics, l_goal);
+ pc.printf("Right: %d Goal: %d\n\r", r_tics, r_goal);
+ //wait();
+ }
+
+ r_motor.speed(NEUTRAL);
+ l_motor.speed(NEUTRAL);
+
+ if(r_tics < r_goal) {
+ //slow l down
+ l_corr += 0.02;
+ }
+ else if(l_tics < l_goal) {
+ //slow r down
+ r_corr += 0.02;
+ }
+ else {
+ break;
+ }
+
+ wait(2);
+
+ l_goal = l_tics + rots;
+ r_goal = r_tics + rots;
+
+ l_motor.speed(-speed * l_C);
+ r_motor.speed(-speed * r_C);
+
+ while (r_tics < r_goal && l_tics < l_goal) {
+ pc.printf("Left : %d Goal: %d\n\r", l_tics, l_goal);
+ pc.printf("Right: %d Goal: %d\n\r", r_tics, r_goal);
+ //wait(1);
+ }
+
+ r_motor.speed(NEUTRAL);
+ l_motor.speed(NEUTRAL);
+
+ l_C = l_corr;
+ r_C = r_corr;
+ } while( abs(r_goal - r_tics) > 2 || abs(l_goal - l_tics) > 2);
+}
+
+void rotate(int angle){
+ float speed = 0.2;
+ if(angle != 0) {
+ r_goal = r_tics + 3;
+ l_goal = l_tics + 3;
+ pc.printf("now turning at angle %d\n\r",angle);
+ r_motor.speed(angle*speed*r_C);
+ l_motor.speed(-1*angle*speed*l_C);
+ pc.printf("************ Speed: %f", speed);
+ move_state = Moving;
+ }
+ else {
+ r_goal = r_tics;
+ l_goal = l_tics;
+ move_state = Moving;
+ }
+
+
+}
+
+void update_movement(float speed) {
+ int r_diff = r_goal - r_tics;
+ int l_diff = l_goal - l_tics;
+
+ if (r_diff > l_diff) {
+ l_motor.speed(speed / 1.2 *l_C);
+ wait_us(1 * (r_diff - l_diff));
+ l_motor.speed(speed*l_C);
+ }
+
+ else if (r_diff < l_diff) {
+ r_motor.speed(speed / 1.2 *r_C);
+ wait_us(1 * (l_diff - r_diff));
+ r_motor.speed(speed*r_C);
+ }
+}
diff -r 000000000000 -r 178a07cd3e39 move.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/move.h Fri Dec 16 03:45:52 2011 +0000
@@ -0,0 +1,72 @@
+#ifndef _MOVE_H
+#define _MOVE_H
+
+#include "mbed.h"
+#include "Motor.h"
+
+#define LEFT_C -1
+#define RIGHT_C 1
+#define FULL_FOWARD 1
+#define FULL_REVERSE -1
+#define NEUTRAL 0
+#define LEFT -1
+#define RIGHT 1
+
+
+#define QTI_THRESH 0.48
+
+#define TICS_PER_MM 40.8407045
+
+typedef enum {Stopped, Moving} MovementState;
+extern MovementState move_state;
+
+extern AnalogIn r_encoder;
+extern AnalogIn l_encoder;
+extern AnalogIn srf;
+volatile extern int prev_r_enc;
+volatile extern int prev_l_enc;
+
+extern DigitalOut r_charge;
+extern DigitalOut l_charge;
+
+extern DigitalOut motor_reset;
+extern Motor r_motor;
+extern Motor l_motor;
+
+extern Serial pc;
+
+volatile extern int r_tics;
+volatile extern int l_tics;
+
+volatile extern int r_goal;
+volatile extern int l_goal;
+
+volatile extern float r_C;
+volatile extern float l_C;
+
+void moveforward(Motor right,float speed);
+void movebackward(Motor right,float speed);
+void move(float speed, int tics);
+void motors_stop();
+void rotate(int);
+
+
+void QTIsensor_init();
+void QTIsensor_charge();
+void QTIsensor_discharge();
+
+//Mine
+//extern MovementState move_state;
+
+//void accelerate(Motor m, float distance);
+//void move(int x, int y);
+//void move_line(float distance);
+//void rotate_deg(int degrees);
+//void rotate_t(float time);
+//void move_arc(int radius, int length, int x, int y);
+
+void calibrate(float speed, int rots);
+void update_movement(float speed);
+
+#endif
+
\ No newline at end of file
diff -r 000000000000 -r 178a07cd3e39 sensors.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sensors.h Fri Dec 16 03:45:52 2011 +0000
@@ -0,0 +1,8 @@
+#ifndef _SENSORS_H
+#define _SENSORS_H
+
+#include "mbed.h"
+
+
+
+#endif
\ No newline at end of file