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: ESP8266 Motor mbed-rtos mbed
Revision 0:4dde9bd69a61, committed 2016-12-12
- Comitter:
- boalinlai
- Date:
- Mon Dec 12 15:17:09 2016 +0000
- Commit message:
- final project
Changed in this revision
diff -r 000000000000 -r 4dde9bd69a61 ESP8266.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ESP8266.lib Mon Dec 12 15:17:09 2016 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/quevedo/code/ESP8266/#77388e8f0697
diff -r 000000000000 -r 4dde9bd69a61 Motor.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Motor.lib Mon Dec 12 15:17:09 2016 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/simon/code/Motor/#f265e441bcd9
diff -r 000000000000 -r 4dde9bd69a61 main.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Mon Dec 12 15:17:09 2016 +0000
@@ -0,0 +1,468 @@
+/*
+ ECE 4180 Final project Real Time tracking system.
+ Boa-Lin Lai, Samuel Choi IoT
+*/
+#define M_PI 3.14159265358979323846
+#include "Motor.h"
+#include "rtos.h"
+#include <string>
+#include "mbed.h"
+#include "math.h"
+#include "GPS.h"
+Serial pc(USBTX, USBRX);
+Serial esp(p28, p27); // tx, rx
+DigitalOut reset(p29);
+DigitalOut led1(LED1); DigitalOut led2(LED2); DigitalOut led3(LED3); DigitalOut led4(LED4);
+Timer t;
+InterruptIn lenc(p26); //left encoder
+InterruptIn renc(p25); //right encoder
+Motor mr(p22, p12, p11); // pwm, fwd, rev
+Motor ml(p21, p16, p15);
+volatile int ticksR = 0; //Number of times right registered
+const float robot_speed_r = 0.513;
+const float robot_speed_l = 0.5;
+const double robot_body = 6.25;
+volatile double angle = -M_PI/2.0;
+volatile int ticksL = 0; //Number of times left registered
+volatile int moving = 0;
+const int cmd_length = 10;
+volatile bool robotReady = true;
+volatile bool robotIdle = true;
+struct Point{
+ double x;
+ double y;
+};
+volatile Point p;
+volatile Point real_p;
+enum Dir{n,e,s,w};
+volatile Dir curDir = e;
+int maskx[4] = {0,1,0,-1};
+int masky[4] = {1,0,-1,0};
+int rot = 0;
+int state = 0;
+Ticker Sampler;
+float sL = 0.8;
+float sR = 0.8;
+int input[] = {1,0};
+int size = sizeof(input);
+volatile int botcmd = 0;
+bool condmet = 0;
+void cl () { ticksL++;}
+void cr () { ticksR++; }
+char data[2000];
+char myCMD[cmd_length];
+int count,ended,timeout;
+char buf[2024];
+char snd[1024];
+void SendCMD(),getreply(),ESPconfig(),ESPsetbaudrate(), getCMD();
+void getPt(){
+ float dis = ((ticksR + ticksL)/2)/25;
+ pc.printf("====\nCur direction %d ==== \n", curDir);
+ p.x += maskx[curDir]*dis;
+ p.y += masky[curDir]*dis;
+ char tmp[50];
+ sprintf(tmp,"%0.2f,%0.2f<br>",p.x,p.y);
+ pc.printf("\nfinal data:%s\n", tmp);
+ strcat(data,tmp);
+ memset(tmp,0,sizeof(tmp));
+}
+/*
+* Send data to http server
+*/
+void update_httpserver(){
+ pc.printf("\n---------- updating up http server ----------\r\n");
+ strcpy(snd, "srv=net.createServer(net.TCP)\r\n");
+ SendCMD();
+ wait(0.2);
+ strcpy(snd, "srv:listen(80,function(conn)\r\n");
+ SendCMD();
+ wait(0.2);
+ strcpy(snd, "conn:on(\"receive\",function(conn,payload)\r\n");
+ SendCMD();
+ wait(0.2);
+ strcpy(snd, "print(payload)\r\n");
+ SendCMD();
+ wait(0.2);
+ strcpy(snd, "conn:send(\"<!DOCTYPE html>\")\r\n");
+ SendCMD();
+ wait(0.2);
+ strcpy(snd, "conn:send(\"<html>\")\r\n");
+ SendCMD();
+ wait(0.2);
+ strcpy(snd, "conn:send(\"<h1>Robot data Logs</h1>\")\r\n");
+ SendCMD();
+ char tmp[500];
+ sprintf(tmp, "conn:send(\"<p>%s</p>\")\r\n", data);
+ wait(0.2);
+ pc.printf("\n === data put in server %s === \n", data);
+ esp.printf("%s", tmp); // same as
+ wait(2);
+ //memset(data,0,sizeof(data)); // clean the data buffer
+ strcpy(snd, "conn:send(\"</html>\")\r\n");
+ SendCMD();
+ wait(0.2);
+ strcpy(snd, "end)\r\n");
+ SendCMD();
+ wait(0.2);
+ strcpy(snd, "conn:on(\"sent\",function(conn) conn:close() end)\r\n");
+ SendCMD();
+ wait(0.2);
+ strcpy(snd, "end)\r\n");
+ SendCMD();
+ wait(0.2);
+ timeout=5;
+ getreply();
+ getCMD();
+ pc.printf(buf);
+ wait(0.2);
+ pc.printf("\r\nfinished setting up http server\n");
+ wait(0.2);
+ memset(tmp,0,sizeof(tmp)); // clear data
+}
+Ticker robotCMD;
+Ticker update;
+Ticker led_ticker;
+volatile int r = 100;
+void getCMD(){
+ char * substr1 = "CMDSTART";
+ char * substr2 = "CMDEND";
+ char* cmdStart = strstr(buf, substr1);
+ if(cmdStart)
+ {
+ char* cmdEnd = strstr(buf, substr2);
+ char tmpCMD[cmd_length];
+ int size = cmdEnd - cmdStart - 8;
+ memcpy(tmpCMD, cmdStart + 8 , size);
+ pc.printf("\n===find the command %s === \n", tmpCMD);
+ robotIdle = false;
+ pc.printf("\n== size %d === \n", size);
+ for(int i = 0; i < cmd_length; i++){
+ if(i > size-1){
+ myCMD[i] = '0';
+ }
+ else{
+ myCMD[i] = tmpCMD[i];
+ }
+ }
+ }
+}
+void changeDir(bool isLeft){
+ if(isLeft){
+ if(curDir == n){
+ curDir = w;
+ }
+ else if(curDir == w){
+ curDir = s;
+ }
+ else if(curDir == s){
+ curDir = e;
+ }
+ else{
+ curDir = n;
+ }
+ }else
+ {
+ if(curDir == n){
+ curDir = e;
+ }
+ else if(curDir == w){
+ curDir = n;
+ }
+ else if(curDir == s){
+ curDir = w;
+ }
+ else{
+ curDir = s;
+ }
+ }
+}
+Point rotate(double ang, double c){
+ Point tmp;
+ tmp.x = -c*sin(ang);
+ tmp.y = c*cos(ang);
+ //formula = [cos(angle), -sin(angle);sin(angle),cos(angle)];
+ return tmp;
+}
+void forward(){
+ ticksL = 0;
+ ticksR = 0;
+ while((ticksL < 400*moving) && (ticksR < 400*moving)){
+ pc.printf("==\nL:%d, R: %d", ticksL,ticksR);
+ ml.speed(robot_speed_l);
+ mr.speed(robot_speed_r);
+ }
+ ml.speed(0);
+ mr.speed(0);
+ int diff = abs(ticksL-ticksR);
+ if(diff == 0) diff = 1;
+ double offset = (diff/25.0)/robot_body;
+ double r = min(ticksL,ticksR)/25.0/offset;
+ double a = r+3.25-cos(offset)*(r+3.25);
+ double b = sin(offset) *(r+3.25);
+ double c = hypot(a,b);
+ printf("\n\n=== a:%.2f, b:%.2f, c:%0.2f, r:%0.2f === \n\n ",a,b,c,r);
+ double phi;
+ if(ticksL < ticksR){
+ phi = atan(a/b) + angle;
+ angle += offset;
+ }else{
+ phi = atan(a/b) + angle;
+ angle -= offset;
+ }
+ Point new_p = rotate(phi, c);
+ real_p.x = real_p.x + new_p.x;
+ real_p.y = real_p.y + new_p.y;
+ char tmp[50];
+ sprintf(tmp,"%0.2f,%0.2f<br>",real_p.x,real_p.y);
+ pc.printf("\n foward data :%s\n", tmp);
+ strcat(data,tmp);
+ memset(tmp,0,sizeof(tmp));
+ ticksL = 0;
+ ticksR = 0;
+}
+void ledflash() {
+ led1 = 0; led2 = 0; led3 = 0;
+ static int i = 0;
+ if(robotReady){
+ // mathcing the function with hash
+ char c = myCMD[i%cmd_length];
+ if(c > 'a' && c <= 'z') {
+ //myCMD[i%cmd_length] = c-1;
+ moving = c - 'a';
+ myCMD[i%cmd_length] = '0';
+ led3= 1;
+ botcmd = 3;
+ robotReady = false;
+ i++;
+ }
+ else if(c == 'a' || c == 'A'){
+ // reach the base go to next cmd
+ myCMD[i%cmd_length] = '0';
+ i++;
+ robotReady = false;
+ }
+ if(c > 'A' && c <= 'Z') {
+ led3= 1;
+ myCMD[i%cmd_length] = c-1;
+ ml.speed(-robot_speed_l);
+ mr.speed(-robot_speed_r);
+ }
+ else if(c=='1'){
+ //left turn
+ myCMD[i%cmd_length] = '0';
+ i++;
+ //angle += M_PI/2.0;
+ botcmd = 1;
+ robotReady = false;
+ led1 = 1;
+ }else if (c=='2'){
+ // right turn
+ myCMD[i%cmd_length] = '0';
+ i++;
+ //angle -= M_PI/2.0;
+ botcmd = 2;
+ robotReady = false;
+ led2 = 1;
+ }
+ else if(c == '0' && robotReady){
+ led4 = !led4;
+ ml.speed(0.0);
+ mr.speed(0.0);
+ robotIdle = true;
+ }
+ }
+}
+void createServer();
+void turn(bool isLeft)
+{
+ ml.speed(0); mr.speed(0);
+ int limit;
+ float turn_speed;
+ if(isLeft){
+ limit = 116;
+ turn_speed = 0.22;
+ }else{
+ turn_speed = 0.22;
+ limit = 116;
+ }
+ ticksR = 0; ticksL = 0;
+ while(1){
+ if (ticksL < limit) {
+ if(isLeft){
+ ml.speed(-turn_speed);
+ }else{
+ ml.speed(turn_speed);
+ }
+ }
+ if (ticksR < limit) {
+ if(isLeft){
+ mr.speed(turn_speed);
+ }else{
+ mr.speed(-turn_speed);
+ }
+ }
+ if(ticksR >= limit || ticksL >= limit ) {
+ double t = ((ticksL+ticksR)/50.0)/(robot_body/2.0);
+ printf("\n\n=== Turning angle %0.2f ===\n\n ", t);
+ if(isLeft){
+ angle+=M_PI/2.0;
+ }else{
+ angle-=M_PI/2.0;
+ }
+ mr.speed(0);
+ ml.speed(0);
+ wait(0.2);
+ break;
+ }
+ }
+}
+int main(){
+ renc.rise(&cr);
+ lenc.rise(&cl);
+ real_p.x += 8.0;
+ real_p.y += 8.0;
+ reset=0; //hardware reset for 8266
+ pc.baud(9600); // set what you want here depending on your terminal program speed
+ pc.printf("\f\n\r-------------ESP8266 Hardware Reset-------------\n\r");
+ wait(0.5);
+ reset=1;
+ timeout=2;
+ getreply();
+ esp.baud(9600); // change this to the new ESP8266 baudrate if it is changed at any time.
+ createServer();
+ for(int i =0; i < cmd_length; i++) myCMD[i] = '0';
+ led_ticker.attach(&ledflash, 1);
+ p.x = 0;
+ p.y = 0;
+ while(1){
+ wait(0.2);
+ if(!robotReady){
+ ml.speed(0); mr.speed(0);
+ // print ticker
+ pc.printf("\n---- ticks L: %d-----\n", ticksL);
+ pc.printf("\n---- ticks R: %d-----\n", ticksR);
+ update_httpserver();
+ if(botcmd == 1){
+ pc.printf("====\nLeft turn\n====");
+ turn(true);
+ changeDir(true);
+ botcmd = 0;
+ robotReady = true;
+ }
+ else if(botcmd == 2){
+ pc.printf("====\nRight turn\n====");
+ turn(false);
+ changeDir(false);
+ botcmd = 0;
+ robotReady = true;
+ }else if(botcmd == 3){
+ pc.printf("====\n Foward \n====");
+ forward();
+ botcmd = 0;
+ robotReady = true;
+ }
+
+ }else if(robotIdle){
+ // waiting for commad;
+ timeout=5;
+ getreply();
+ getCMD();
+ pc.printf(buf);
+ wait(0.2);
+ }
+ }
+}
+void SendCMD(){
+ esp.printf("%s", snd);
+}
+void getreply(){
+ memset(buf, '\0', sizeof(buf));
+ t.start();
+ ended=0;
+ count=0;
+ while(!ended) {
+ if(esp.readable()) {
+ buf[count] = esp.getc();
+ count++;
+ }
+ if(t.read() > timeout) {
+ ended = 1;
+ t.stop();
+ t.reset();
+ }
+ }
+}
+/*
+* send init the server
+*/
+void createServer()
+{
+ pc.printf("\n---------- Setting up http server for first time ----------\r\n");
+ strcpy(snd, "srv=net.createServer(net.TCP)\r\n");
+ SendCMD();
+ wait(0.2);
+ strcpy(snd, "srv:listen(80,function(conn)\r\n");
+ SendCMD();
+ wait(0.2);
+ strcpy(snd, "conn:on(\"receive\",function(conn,payload)\r\n");
+ SendCMD();
+ wait(0.2);
+ strcpy(snd, "print(payload)\r\n");
+ SendCMD();
+ wait(0.2);
+ strcpy(snd, "conn:send(\"<!DOCTYPE html>\")\r\n");
+ SendCMD();
+ wait(0.2);
+ strcpy(snd, "conn:send(\"<html>\")\r\n");
+ SendCMD();
+ wait(0.2);
+ strcpy(snd, "conn:send(\"<p>0.0,0.0</p>\")\r\n");
+ SendCMD();
+ wait(0.2);
+ strcpy(snd, "conn:send(\"</html>\")\r\n");
+ SendCMD();
+ wait(0.2);
+ strcpy(snd, "end)\r\n");
+ SendCMD();
+ wait(0.2);
+ strcpy(snd, "conn:on(\"sent\",function(conn) conn:close() end)\r\n");
+ SendCMD();
+ wait(0.2);
+ strcpy(snd, "end)\r\n");
+ SendCMD();
+ wait(0.2);
+ timeout=1;
+ getreply();
+ pc.printf(buf);
+ pc.printf("\n---------- Get IP's ----------\r\n");
+ strcpy(snd, "print(wifi.sta.getip())\r\n");
+ SendCMD();
+ timeout=3;
+ getreply();
+ pc.printf(buf);
+ wait(1);
+ pc.printf("\r\nDONE\n");
+}
+/*
+void getGPS()
+{
+ int i = 2;
+ static float j = 1.0;
+ char final_data[200];
+ while(i>0){
+ if(gps.sample()) {
+ i--;
+ j++;
+ //pc.printf("%f;%c;%f;%c", gps.longitude, gps.ns, gps.latitude, gps.ew);
+ char tmp[50];
+ sprintf(tmp,"%0.6f,%0.6f<br>",j,j);
+ //sprintf(tmp,"%0.6f,%0.6f<br>",gps.longitude,gps.latitude);
+ strcat(final_data,tmp);
+ }
+ }
+ pc.printf("\nfinal data:%s\n", final_data);
+ strcpy(data,final_data);
+ memset(final_data,0,sizeof(final_data));
+}
+*/
+
diff -r 000000000000 -r 4dde9bd69a61 mbed-rtos.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-rtos.lib Mon Dec 12 15:17:09 2016 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed-rtos/#58563e6cba1e
diff -r 000000000000 -r 4dde9bd69a61 mbed.bld --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Mon Dec 12 15:17:09 2016 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/d75b3fe1f5cb \ No newline at end of file