chong wang
/
AutoMapGuidedRobot
A final design project for embedded system class
main.cpp
- Committer:
- cwang365
- Date:
- 2013-04-26
- Revision:
- 0:c2c6f1a295f4
File content as of revision 0:c2c6f1a295f4:
//#include "HMC6352.h" //compass #include "mbed.h" //HMC6352 compass(p28, p27); Serial pc(USBTX, USBRX); AnalogIn Rdist(p19); // right sonar AnalogIn Ldist(p20);// left sonar AnalogIn Fdist(p18);// front sonar AnalogIn range(p17); // right range finder Serial device(p9, p10); // tx, rx DigitalOut leftlight(LED1); DigitalOut rightlight(LED3); DigitalOut straightlight(LED2); // Definitions of iRobot Create OpenInterface Command Numbers // See the Create OpenInterface manual for a complete list // Create Command // Arguments const char Start = 128; const char SafeMode = 131; const char FullMode = 132; const char Drive = 137; // 4: [Vel. Hi] [Vel Low] [Rad. Hi] [Rad. Low] const char DriveDirect = 145; // 4: [Right Hi] [Right Low] [Left Hi] [Left Low] const char Demo = 136; // 2: Run Demo x const char Sensors = 142; // 1: Sensor Packet ID const char CoverandDock = 143; // 1: Return to Charger const char SensorStream = 148; // x+1: [# of packets requested] IDs of requested packets to stream const char QueryList = 149; // x+1: [# of packets requested] IDs of requested packets to stream const char StreamPause = 150; // 1: 0 = stop stream, 1 = start stream const char PlaySong = 141; const char Song = 140; /* iRobot Create Sensor IDs */ const char BumpsandDrops = 7; const char Distance = 19; const char Angle = 20; static int speed_left = 200; static int speed_right = 200; static int state=0; //static int arr[10];//0=forwatd, 1=right,2=left,3=finish; void start(); void forward(); void reverse(); void left(); void right(); void stop(); void playsong(); void charger(); float curveR=0.02; float curveL=0.02; float Hsouth=98; float Hnorth=68; float Hwest=80; float Heast=77; // Demo to move around using basic commands int main() { int arr[5]= {0,1,0,1,40};//0=forwatd, 1=right,2=left,3=finish; float time=0; // wait for Create to power up to accept serial commands wait(3); //compass.setOpMode(HMC6352_CONTINUOUS, 1, 20); // set baud rate for Create factory default device.baud(57600); // Start command mode and select sensor data to send back start(); wait(.5); // Move around with motor commands while(1) { if((Rdist>0.49 || Ldist>0.49)&&(arr[state]<3)) { leftlight=1; rightlight=1; straightlight=1; if(float(Fdist)<0.12 ) { stop(); wait(1); if(float(Fdist)<0.13 ) { state++; if(arr[state]==1) { //right turn speed_right=200; speed_left=200; right(); wait(1.0); } else if(arr[state]==2) { speed_right=200; speed_left=200; left(); wait(1.0); }//left stop(); wait(0.2); forward(); wait(6); state++; } } // else { // speed_right=200; // speed_left=200; //} } else if((float(Ldist)-float(Rdist))>curveL ) { speed_right++; leftlight=1; rightlight=0; straightlight=0; if(speed_right>206) { speed_right=206; } } else if ( (float(Rdist)-float(Ldist))>curveR ) { speed_left++; leftlight=0; rightlight=1; straightlight=0; if(speed_left>206) { speed_left=206; } } else if (((float(Ldist)-float(Rdist))<curveL) && ( (float(Rdist)-float(Ldist))<curveR )) { speed_left=200; speed_right=200; leftlight=0; rightlight=0; straightlight=1; } if(arr[state]>2) { time=time+0.1; if(time>arr[state]) { break;//while } } //pc.printf("Left: %f ", float(Ldist)); pc.printf("Right: %f ", float(Rdist)); pc.printf("range: %f ", float(range)); //pc.printf("front: %f ", float(Fdist)); //pc.printf("Diff: %f\n", (float(Rdist)-float(Ldist))); forward(); wait(0.1); } // Play a song stop(); playsong(); wait(10); // Search for battery charger IR beacon // charger(); } // Start - send start and safe mode, start streaming sensor data void start() { // device.printf("%c%c", Start, SafeMode); device.putc(Start); device.putc(SafeMode); wait(.5); // device.printf("%c%c%c", SensorStream, char(1), BumpsandDrops); device.putc(SensorStream); device.putc(1); device.putc(BumpsandDrops); wait(.5); } // Stop - turn off drive motors void stop() { device.printf("%c%c%c%c%c", DriveDirect, char(0), char(0), char(0), char(0)); } // Forward - turn on drive motors void forward() { device.printf("%c%c%c%c%c", DriveDirect, char((speed_right>>8)&0xFF), char(speed_right&0xFF), char((speed_left>>8)&0xFF), char(speed_left&0xFF)); } // Reverse - reverse drive motors void reverse() { device.printf("%c%c%c%c%c", DriveDirect, char(((-speed_right)>>8)&0xFF), char((-speed_right)&0xFF), char(((-speed_left)>>8)&0xFF), char((-speed_left)&0xFF)); } // Left - drive motors set to rotate to left void left() { device.printf("%c%c%c%c%c", DriveDirect, char((speed_right>>8)&0xFF), char(speed_right&0xFF), char(((-speed_left)>>8)&0xFF), char((-speed_left)&0xFF)); } // Right - drive motors set to rotate to right void right() { device.printf("%c%c%c%c%c", DriveDirect, char(((-speed_right)>>8)&0xFF), char((-speed_right)&0xFF), char((speed_left>>8)&0xFF), char(speed_left&0xFF)); } // Charger - search and return to charger using IR beacons (if found) void charger() { device.printf("%c%c", Demo, char(1)); } // Play Song - define and play a song void playsong() // Send out notes & duration to define song and then play song { device.printf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c", Song, char(0), char(16), char(91), char(24), char(89), char(12), char(87), char(36), char(87), char(24), char(89), char(12), char(91), char(24), char(91), char(12), char(91), char(12), char(89), char(12),char(87), char(12), char(89), char(12), char(91), char(12), char(89), char(12), char(87), char(24), char(86), char(12), char(87), char(48)); wait(.2); device.printf("%c%c", PlaySong, char(0)); }