The IoTBot is a WiFi-enabled rover built from the Shadow Robot kit. It is controlled from a web interface running on the Adafruit Huzzah ESP8266 WiFi module and implements a pair of Hall-effect sensors on the motors to keep the wheels spinning at the same speed. Additionally, it uses a Sharp IR sensor to detect walls in front of the robot and prevent it from crashing.
Dependencies: mbed-dev mbed-rtos
Fork of huzzah_helloWorld by
Diff: main.cpp
- Revision:
- 1:046dd94c57ce
- Parent:
- 0:57cec3469a80
- Child:
- 2:2d87957b577b
--- a/main.cpp Thu Oct 22 16:18:21 2015 +0000
+++ b/main.cpp Mon Oct 31 07:33:45 2016 +0000
@@ -1,227 +1,30 @@
#include "mbed.h"
+#include "rtos.h"
-Serial pc(USBTX, USBRX);
-Serial esp(p28, p27); // tx, rx
-DigitalOut reset(p26);
+RawSerial pc(USBTX, USBRX);
+RawSerial dev(p28,p27);
DigitalOut led1(LED1);
DigitalOut led4(LED4);
+
+// Set up the motor pins
+PwmOut motorACtrl(p21);
+PwmOut motorBCtrl(p22);
+DigitalOut backA(p20);
+DigitalOut fwdA(p19);
+DigitalOut stby(p18);
+DigitalOut fwdB(p17);
+DigitalOut backB(p16);
Timer t;
-
-int count,ended,timeout;
-char buf[2024];
-char snd[1024];
-
-char ssid[32] = "SwagInABag"; // enter WiFi router ssid inside the quotes
-char pwd [32] = "yoloswag"; // enter WiFi router password inside the quotes
-
-void SendCMD(),getreply(),ESPconfig(),ESPsetbaudrate();
- void dev_recv()
-{
- led1 = !led1;
- while(esp.readable()) {
- pc.putc(esp.getc());
- }
-}
-
-void pc_recv()
-{
- led4 = !led4;
- while(pc.readable()) {
- esp.putc(pc.getc());
- }
-}
-
-
-int main()
-{
- 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.
-
- //ESPsetbaudrate(); //****************** include this routine to set a different ESP8266 baudrate ******************
-
- ESPconfig(); //****************** include Config to set the ESP8266 configuration ***********************
-
-
-
- pc.attach(&pc_recv, Serial::RxIrq);
- esp.attach(&dev_recv, Serial::RxIrq);
-
- // continuosly get AP list and IP
- while(1) {
- sleep();
- }
-
-}
-
-// Sets new ESP8266 baurate, change the esp.baud(xxxxx) to match your new setting once this has been executed
-void ESPsetbaudrate()
-{
- strcpy(snd, "AT+CIOBAUD=115200\r\n"); // change the numeric value to the required baudrate
- SendCMD();
-}
-
-// +++++++++++++++++++++++++++++++++ This is for ESP8266 config only, run this once to set up the ESP8266 +++++++++++++++
-void ESPconfig()
-{
+float speed = 0.9f;
- wait(5);
- pc.printf("\f---------- Starting ESP Config ----------\r\n\n");
- strcpy(snd,".\r\n.\r\n");
- SendCMD();
- wait(1);
- pc.printf("---------- Reset & get Firmware ----------\r\n");
- strcpy(snd,"node.restart()\r\n");
- SendCMD();
- timeout=5;
- getreply();
- pc.printf(buf);
-
- wait(2);
-
- pc.printf("\n---------- Get Version ----------\r\n");
- strcpy(snd,"print(node.info())\r\n");
- SendCMD();
- timeout=4;
- getreply();
- pc.printf(buf);
-
- wait(3);
-
- // set CWMODE to 1=Station,2=AP,3=BOTH, default mode 1 (Station)
- pc.printf("\n---------- Setting Mode ----------\r\n");
- strcpy(snd, "wifi.setmode(wifi.STATION)\r\n");
- SendCMD();
- timeout=4;
- getreply();
- pc.printf(buf);
-
- wait(2);
-
-
+float timeout = 0.05f;
+int count,ended;
+char buf[256];
+char motorCmd[] = "fwrd";
- pc.printf("\n---------- Listing Access Points ----------\r\n");
- strcpy(snd, "function listap(t)\r\n");
- SendCMD();
- wait(1);
- strcpy(snd, "for k,v in pairs(t) do\r\n");
- SendCMD();
- wait(1);
- strcpy(snd, "print(k..\" : \"..v)\r\n");
- SendCMD();
- wait(1);
- strcpy(snd, "end\r\n");
- SendCMD();
- wait(1);
- strcpy(snd, "end\r\n");
- SendCMD();
- wait(1);
- strcpy(snd, "wifi.sta.getap(listap)\r\n");
- SendCMD();
- wait(1);
- timeout=15;
- getreply();
- pc.printf(buf);
-
- wait(2);
-
- pc.printf("\n---------- Connecting to AP ----------\r\n");
- pc.printf("ssid = %s pwd = %s\r\n",ssid,pwd);
- strcpy(snd, "wifi.sta.config(\"");
- strcat(snd, ssid);
- strcat(snd, "\",\"");
- strcat(snd, pwd);
- strcat(snd, "\")\r\n");
- SendCMD();
- timeout=10;
- getreply();
- pc.printf(buf);
-
- wait(5);
-
- 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("\n---------- Get Connection Status ----------\r\n");
- strcpy(snd, "print(wifi.sta.status())\r\n");
- SendCMD();
- timeout=5;
- getreply();
- pc.printf(buf);
-
- pc.printf("\n\n\n If you get a valid (non zero) IP, ESP8266 has been set up.\r\n");
- pc.printf(" Run this if you want to reconfig the ESP8266 at any time.\r\n");
- pc.printf(" It saves the SSID and password settings internally\r\n");
- wait(10);
-
-
- pc.printf("\n---------- Setting up http server ----------\r\n");
- strcpy(snd, "srv=net.createServer(net.TCP)\r\n");
- SendCMD();
- wait(1);
- strcpy(snd, "srv:listen(80,function(conn)\r\n");
- SendCMD();
- wait(1);
- strcpy(snd, "conn:on(\"receive\",function(conn,payload)\r\n");
- SendCMD();
- wait(1);
- strcpy(snd, "print(payload)\r\n");
- SendCMD();
- wait(1);
-
- strcpy(snd, "conn:send(\"<!DOCTYPE html>\")\r\n");
- SendCMD();
- wait(1);
-
- strcpy(snd, "conn:send(\"<html>\")\r\n");
- SendCMD();
- wait(1);
-
- strcpy(snd, "conn:send(\"<h1> Hi James, NodeMcu.</h1>\")\r\n");
- SendCMD();
- wait(1);
-
- strcpy(snd, "conn:send(\"<h2> test</h2>\")\r\n");
- SendCMD();
- wait(1);
-
- strcpy(snd, "conn:send(\"</html>\")\r\n");
- SendCMD();
- wait(1);
-
- strcpy(snd, "end)\r\n");
- SendCMD();
- wait(1);
-
- strcpy(snd, "conn:on(\"sent\",function(conn) conn:close() end)\r\n");
- SendCMD();
- wait(1);
- strcpy(snd, "end)\r\n");
- SendCMD();
- wait(1);
- timeout=17;
- getreply();
- pc.printf(buf);
- pc.printf("\r\nDONE");
-}
-
-void SendCMD()
-{
- esp.printf("%s", snd);
-}
-
+/**
+ * Get the reply string from the WiFi module
+ */
void getreply()
{
memset(buf, '\0', sizeof(buf));
@@ -229,8 +32,8 @@
ended=0;
count=0;
while(!ended) {
- if(esp.readable()) {
- buf[count] = esp.getc();
+ if(dev.readable()) {
+ buf[count] = dev.getc();
count++;
}
if(t.read() > timeout) {
@@ -240,5 +43,103 @@
}
}
}
+
+/**
+ *
+ */
+void getMotorCommand() {
+ int index = 3;
+ // iterate backwards through the message buffer
+ for (int i = sizeof(buf) - 1; i > 2; i--){
+ // Check if the current character is a null
+ if (buf[i] != '\0') {
+ motorCmd[index] = buf[i - 2]; // Copy the character
+ if (index == 0){
+ break; // Break if we have completed getting the command
+ } else {
+ index--; // Decrement otherwise
+ }
+ }
+ }
+}
+
+/**
+ * Run the motor based on the command passed through the serial interface.
+ */
+void runMotor(){
+ if (strcmp(motorCmd, (char *)"fwrd") == 0) {
+ stby = 1; // Start H-bridge driver
+ fwdA = 1;
+ fwdB = 1;
+ backA = 0;
+ backB = 0;
+ motorACtrl = speed;
+ motorBCtrl = speed;
+ } else if (strcmp(motorCmd, (char *)"back") == 0) {
+ stby = 1; // Start H-bridge driver
+ fwdA = 0;
+ fwdB = 0;
+ backA = 1;
+ backB = 1;
+ motorACtrl = speed;
+ motorBCtrl = speed;
+ } else if (strcmp(motorCmd, (char *)"left") == 0) {
+ stby = 1; // Start H-bridge driver
+ fwdA = 1;
+ fwdB = 0;
+ backA = 0;
+ backB = 1;
+ motorACtrl = speed;
+ motorBCtrl = speed;
+ } else if (strcmp(motorCmd, (char *)"rght") == 0) {
+ stby = 1; // Start H-bridge driver
+ fwdA = 0;
+ fwdB = 1;
+ backA = 1;
+ backB = 0;
+ motorACtrl = speed;
+ motorBCtrl = speed;
+ } else if (strcmp(motorCmd, (char *)"stop") == 0) {
+ stby = 1; // Start H-bridge driver
+ fwdA = 0;
+ fwdB = 0;
+ backA = 0;
+ backB = 0;
+ motorACtrl = 0.0f; // Set speed to 0
+ motorBCtrl = 0.0f;
+ stby = 0; // Turn off H-bridge driver
+ }
+}
+
+void dev_recv()
+{
+ led1 = !led1;
+ getreply(); // Get the serial message
+ getMotorCommand(); // Extract the motor command from the message
+ runMotor(); // Run the motor based on the command
+}
-
\ No newline at end of file
+void pc_recv()
+{
+ led4 = !led4;
+ while(pc.readable()) {
+ dev.putc(pc.getc());
+ }
+}
+
+int main()
+{
+ pc.baud(115200);
+ dev.baud(115200);
+
+ pc.attach(&pc_recv, Serial::RxIrq);
+ dev.attach(&dev_recv, Serial::RxIrq);
+
+ // Initialize the motors
+ motorACtrl.period(0.01f);
+ motorBCtrl.period(0.01f);
+
+ while(1) {
+ sleep();
+ }
+}
\ No newline at end of file
