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
main.cpp
- Committer:
- tanmaybangalore
- Date:
- 2016-10-31
- Revision:
- 1:046dd94c57ce
- Parent:
- 0:57cec3469a80
- Child:
- 2:2d87957b577b
File content as of revision 1:046dd94c57ce:
#include "mbed.h"
#include "rtos.h"
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;
float speed = 0.9f;
float timeout = 0.05f;
int count,ended;
char buf[256];
char motorCmd[] = "fwrd";
/**
* Get the reply string from the WiFi module
*/
void getreply()
{
memset(buf, '\0', sizeof(buf));
t.start();
ended=0;
count=0;
while(!ended) {
if(dev.readable()) {
buf[count] = dev.getc();
count++;
}
if(t.read() > timeout) {
ended = 1;
t.stop();
t.reset();
}
}
}
/**
*
*/
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
}
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();
}
}
