![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
This code operates the backup robot for the Multi-Robot Security System designed for IUPUI's ECE 59500 Embedded Systems Design course.
Dependencies: ESP8266 HCSR04_0 mbed
main.cpp
- Committer:
- Jakschwa
- Date:
- 2016-05-02
- Revision:
- 0:72c099aedf8e
File content as of revision 0:72c099aedf8e:
/* Robot 2 Project 3: Autonomous Multi-Robot Security Alert System Notes: 1. Code checks entry id from the PostToSever results 2. Sends two xvalue and yvalue to server 3. Wall-following routine */ #include "mbed.h" #include "ESP8266.h" #define IP "184.106.153.149" // IP Address of "api.thingspeak.com\" #include <iostream> // std::cout #include <string> // std::string, std::stoi #include <sstream> #include "HCSR04.h" //Ultrasonic distance sensor lib #include <math.h> //Subfunctions void EncoderCount(void); void Forward(void); void Stop(void); void Right90(void); void Left90(void); int GetFrontDistance(void); int GetRightDistance(void); void ConnectToServer(void); void GetCurrentEntryID(void); void CloseConnection(void); unsigned int Wifi(void); //Pin Setup DigitalOut right_cont1(A2), right_cont2(A3), left_cont1(A0), left_cont2(A1); DigitalOut red(LED_RED), blue(LED_BLUE), green(LED_GREEN); DigitalIn sw2(SW2); //Interrupt Setup InterruptIn EncoderIn(D7); //External Interrupt //PWM Setup PwmOut right_pwm(A5); PwmOut left_pwm(A4); Serial pc(USBTX,USBRX); //Uart connection for TeraTerm ESP8266 wifi(PTC17, PTC16, 115200); // tx, rx, baud rate for wifi //Public variables int frontDistance = 0, rightDistance = 0, setDistance = 0, lastRightDistance = 0; int xvalue = 0, yvalue = 0; unsigned int entryID = 0; float leftSpeed = 0, rightSpeed = 0; float ileftSpeed = 0, irightSpeed = 0; float bleftSpeed = 0, brightSpeed = 0; float inc = 0; int main() { red = 1; //off blue = 1; //off green = 1; //off while(sw2); unsigned int go = 0; pc.baud(9600); pc.printf("starting\r\n"); //go = 1; while(go != 1) { blue = 0; wait(1); //wait 1 sec blue = 1; go = Wifi(); pc.printf("go = %d\r\n", go); } red = 0; //on pc.printf("\r\n\r\nRecieved Threat Alert\r\n Proceeding to Coordinate: %d", xvalue); wait(10); //set motor period right_pwm.period(0.007f); left_pwm.period(0.007f); //motor speed leftSpeed = 0.50f; rightSpeed = 0.70f; ileftSpeed = 0.50f; irightSpeed = 0.70f; left_pwm.write(ileftSpeed); right_pwm.write(irightSpeed); Forward(); setDistance = GetRightDistance(); //check right distance distance lastRightDistance = setDistance; pc.printf("setDistance:%d\r\n", setDistance); while(1) { EncoderIn.rise(NULL); //disable EncoderIn inturrpt rightDistance = GetRightDistance(); //check distance if( rightDistance > (lastRightDistance + 20) || rightDistance < (lastRightDistance - 20)) { pc.printf("Old righDistance:%d, lastRightDistance: %d\r\n", rightDistance, lastRightDistance); rightDistance = lastRightDistance -10; pc.printf("New righDistance:%d\r\n", rightDistance); } else lastRightDistance = rightDistance; frontDistance = GetFrontDistance(); //check distance //pc.printf("Right:%d , Front: %d\r\n", rightDistance, frontDistance); if(rightDistance >=1000) { rightDistance = 1; } else rightDistance = rightDistance; //***turn right if( rightDistance > setDistance + 1 ) { inc = 0.2f; leftSpeed = leftSpeed + inc; if(leftSpeed > .55f) leftSpeed = .55f; left_pwm.write(leftSpeed); rightSpeed = rightSpeed - inc; if(rightSpeed < 0.30f) rightSpeed = 0.30f; right_pwm.write(rightSpeed); pc.printf("Turn Right,right distance:%d, %d\r\n", rightDistance, setDistance); pc.printf("leftSpeed:%f, rightSpeed:%f\r\n\r\n", leftSpeed, rightSpeed); //Stop(); //while(sw2); //wait(1); //Forward(); } //****turn left //else ( rightDistance < (setDistance - 1)) else { inc = 0.2f; leftSpeed = leftSpeed - inc; if(leftSpeed < 0.25f) leftSpeed = 0.25f; left_pwm.write(leftSpeed); rightSpeed = rightSpeed + inc; if(rightSpeed > 0.65f) rightSpeed = 0.65f; right_pwm.write(rightSpeed); pc.printf("Turn Left,right distance:%d, %d\r\n", rightDistance, setDistance); pc.printf("leftSpeed:%f, rightSpeed:%f\r\n\r\n", leftSpeed, rightSpeed); //Stop(); //while(sw2); //wait(1); //Forward(); } /*else { left_pwm.write(ileftSpeed); right_pwm.write(irightSpeed); pc.printf("Go Straight,right distance:%d, %d\r\n", rightDistance, setDistance); pc.printf("leftSpeed:%f, rightSpeed:%f\r\n\r\n", ileftSpeed, irightSpeed); //Stop(); //while(sw2); //wait(1); //Forward(); } */ EncoderIn.rise(&EncoderCount); /*Interrupt: On rising edge of encoder tick*/ wait(.05); }//end of while(1) }//end of main() unsigned int Wifi(void) { unsigned int go = 0; pc.printf("\r\n******************Wifi Begin*********************************\r\n"); entryID = 0; while(entryID == 0) { ConnectToServer(); GetCurrentEntryID(); CloseConnection(); } if(xvalue != 0 || yvalue != 0) go = 1; else go = 0; pc.printf("\r\n******************Wifi Completed*********************************\r\n"); return go; }//end of Wifi() void GetCurrentEntryID(void) { unsigned int i = 0, len = 0, lastEntryID = 0,diff = 0, xvalue1 = 0, yvalue1 = 0, dash = 0, end =0, k = 0; char snd[255],rcv1[1000]; const int size = sizeof(rcv1); //Get values from ThinkSpeak pc.printf("\r\nGet Values from ThingSpeak\r\n"); strcpy(snd,"GET http://api.thingspeak.com/channels/104257/fields/1.json?key=1YAN0O31ADCV9MEP HTTP/1.0\r\n\r\n");//97 //strcpy(snd,"GET http://api.thingspeak.com/channels/104257/status.json?key=1YAN0O31ADCV9MEP HTTP/1.0\r\n\r\n");//97 //send //pc.printf("\r\nSending: %s",snd); wifi.SendCMD(snd); wifi.RcvReply(rcv1, 750); pc.printf("\r\nSent Status: %s", rcv1); //send again //pc.printf("\r\nSending: %s",snd); wifi.SendCMD(snd); wifi.RcvReply(rcv1, 750); pc.printf("\r\nSent Status: %s", rcv1); for(i = 0; i <= size - 1; i++) { if(rcv1[i-1]==121 && rcv1[i]==95 && rcv1[i+1]==105 && rcv1[i+2]==100 && rcv1[i+6]<=57 && rcv1[i+6]>=44) //check for "_id" entry_id { if(rcv1[i+6] ==44) { len = 0; entryID = rcv1[i+5]-48; } else { len = 1; entryID = (rcv1[i+5]-48)*10+(rcv1[i+6]-48); } dash = 0; end = 0; for(k = 1;k<=20;k++) { if(rcv1[i+17+len+k] == 45) //look for "-" { dash = k; k = 21; } } for(k = 1;k<=20;k++) { if(rcv1[i+17+len+k] == 34) { end = k - 1; diff = end - dash; k = 21; } } xvalue1 = 0; yvalue1 = 0; for(k=1;k<=dash;k++) { xvalue1 = xvalue1 + (rcv1[i+16+len+k]-48)*pow(10,float(dash - k)); } for(k=1;k<=diff;k++) { yvalue1 = yvalue1 + (rcv1[i+17+len+dash+k]-48)*pow(10,float(diff-k)); } }//if(entry_id) else i=i; if(entryID <=99 && entryID > lastEntryID) { lastEntryID = entryID; xvalue = xvalue1; yvalue = yvalue1; } else { lastEntryID = lastEntryID; xvalue = xvalue; yvalue = yvalue; } } //end of For loop pc.printf("\r\nfinal:: lastEntry_id= %d, xvalue = %d, yvalue = %d",lastEntryID, xvalue, yvalue); } //end of GetCurrentEntryID void ConnectToServer(void) { char snd[255],rcv[500]; pc.printf("\r\n\r\n*************Sending WiFi information*************\r\n"); //Set Wifi to Single Channel Mode pc.printf("\r\nSet WiFi into Single Channel mode\r\n"); strcpy(snd,"AT+CIPMUX=0");//Setting WiFi into single Channel mode wifi.SendCMD(snd); //pc.printf(snd); wifi.RcvReply(rcv, 750); pc.printf("\r\nSingle Channel Mode Status: %s", rcv); //wait(1); //Initiate connection with THINGSPEAK server pc.printf("\r\nInitiating connection with ThinkSpeak sever\r\n"); strcpy(snd,"AT+CIPSTART=\"TCP\",\"api.thingspeak.com\",80"); //pc.printf("\r\nsending: %s", snd); wifi.SendCMD(snd); wifi.RcvReply(rcv, 750); pc.printf("\r\nConnection Status: %s", rcv); //Send Number of Characters to be sent pc.printf("\r\nSending Number of Characters to be sent"); strcpy(snd,"AT+CIPSEND=110"); //Send Number of open connections,Characters to send wifi.SendCMD(snd); //pc.printf(snd); wifi.RcvReply(rcv, 750); pc.printf("\r\nSent Status: %s", rcv); } //end of ConnectToServer() void CloseConnection(void) { char snd[255],rcv[500]; //close connection pc.printf("\r\nClose the Connection\r\n"); strcpy(snd,"AT+CIPCLOSE"); //closing the connection with thingspeak server wifi.SendCMD(snd); //pc.printf("\r\nSending: %s",snd); wifi.RcvReply(rcv, 750); pc.printf("\r\nClose Connection Status: %s", rcv); pc.printf("\r\nEnd of Closed Connection Response\r\n\r\n"); }//void connection void EncoderCount() { static int xval = 0, yval = 0; xval++; //yval++; pc.printf("\r\nX: %d, Y: %d\r\n\r\n", xval, yval); if(xval >= xvalue) { EncoderIn.rise(NULL); Stop(); green = 0; //on while(1); } } int GetFrontDistance(void) { int distance = 0; HCSR04 sensor(D4, D5); distance = sensor.distance(); return distance; } int GetRightDistance(void) { int distance = 0; HCSR04 sensor(D2, D3); distance = sensor.distance(); return distance; } void Forward(void) { right_cont1=0; right_cont2=1; left_cont1=0; left_cont2=1; } void Stop(void) { right_cont1=0; right_cont2=0; left_cont1=0; left_cont2=0; } void Right90(void) { right_cont1=0; right_cont2=0; left_cont1=0; left_cont2=1; } void Left90(void) { right_cont1=0; right_cont2=1; left_cont1=0; left_cont2=0; }