Vacuum Cleaner
Introduction
This project using an shadow robot to simulate Vacuum cleaner with bluetooth remote control. The robot will move counter clockwise with the (v^0.5) for one wheel and (v) for another one, and it has a circular movement. With this speed function , robot can achieve different radius and cover all the targeted areas.
Features
Edge Detection
Using IR sensor to detect the edge and turn the robot to avoid falling.
Wall Detection
Using IR sensor to detect the close objects and turn the robot to avoid collision.
Remote Control
Implemented the bluetooth buttons functions to control the robots
button 1
Increase the robot speed and the radius of current move circle .
button 2
Decrease the robot speed and the radius of current move circle .
button 3
Complete Stop
button 4
Start moving the robot.
Sensors
| Downward Sensor | Front Sensor | mbed |
|---|---|---|
| signal | -- | p20 |
| -- | signal | p19 |
H-bridge
| mbed | =Hbridge |
|---|---|
| p23 | PWMA |
| p24 | PWMB |
| p11 | Ain2 |
| p12 | Ain1 |
| p13 | Bin1 |
| p14 | Bin2 |
| -- | STBY( pulled up to 1) |
Motor
| Left | Right | Hbridge |
|---|---|---|
| + | -- | AO1 |
| - | -- | AO2 |
| -- | + | BO1 |
| -- | - | BO2 |
Bluetooth
| Bluetooth | =mbed |
|---|---|
| TXD | P28 |
| RXI | P27 |
| CTS | gnd |
| gnd | gnd |
Code
Import programrobot
ECE4180 LAB4 main code
main.cpp
/*
ECE 4180 GATECH Fall 2016
Boa-Lin Lai, Sameual Choi
*/
#include "mbed.h"
#include "Motor.h"
#include "ble.h"
#include <stdlib.h>
#include <algorithm>
DigitalOut myled1(LED1);
DigitalOut myled2(LED2);
DigitalOut myled3(LED3);
DigitalOut myled4(LED4);
AnalogIn wallSensor(p19);
AnalogIn edgeSensor(p20);
PwmOut speaker(p21);
Serial pc(USBTX, USBRX);
Motor ml(p23, p12, p11); // pwm, fwd, rev
Motor mr(p24, p14, p13); // pwm, fwd, rev
//Interrupt routine to parse message with one new character per serial RX interrupt
volatile bool isOn = false;
volatile bool edge = false;
volatile bool wall = false;
volatile double speed = 0.0;
volatile double wallDis = 0.0;
volatile double edgeDis = 0.0;
Ticker edge_detector;
Ticker wall_detector;
void edgeMove()
{
ml.speed(-0.3);
mr.speed(-0.3);
for (int i=0; i<10; i=i+2) {
speaker.period(1.0/969.0);
speaker = float(i)/50.0;
wait(.25);
speaker.period(1.0/800.0);
wait(.25);
}
edge = false;
wall = false;
speaker = 0;
ml.speed(-0.5);
mr.speed(0.5);
wait(0.5);
}
void isEdge() {
if(edgeDis > 2.5)
{
speed = 0;
edge = true;
}
else
{
edge = false;
}
}
void isWall() {
if(wallDis > 0.7)
{
speed = 0;
wall = true;
}
else
{
wall = false;
}
}
void BLE_action()
{
if(button_ready && (bnum=='1')) { // button 4 changed
if(isOn == true)
{
speed += 0.1;
if(speed > 0.7) speed = 0.7;
}
myled1 = bhit - '0'; //turn led4 on/off
button_ready = 0; //reset flag after reading button message
}
else if(button_ready && (bnum=='2')) { // button 4 changed
if(isOn == true)
{
speed -= 0.1;
if(speed < 0.3 ) speed = 0.3;
}
myled2 = bhit - '0'; //turn led4 on/off
button_ready = 0; //reset flag after reading button message
}
else if(button_ready && (bnum=='3')) { // button 4 changed
speed = 0;
isOn = false;
myled3 = bhit - '0'; //turn led4 on/off
button_ready = 0; //reset flag after reading button message
}
else if(button_ready && (bnum=='4')) { // button 4 changed
isOn = true;
speed = 0.3;
myled4 = bhit - '0'; //turn led4 on/off
button_ready = 0; //reset flag after reading button message
}
}
void print_speed()
{
pc.printf("%-76s%0.2f\n",speed);
}
int main()
{
//attach interrupt function for each new Bluetooth serial character
Blue.attach(&parse_message,Serial::RxIrq);
edge_detector.attach(&isEdge, 0.02);
wall_detector.attach(&isWall , 0.02);
while(1) {
//check for a new button message ready
BLE_action();
//do other tasks in main - interrupts will process button message characters
myled4 = 1;
wallDis = wallSensor;
edgeDis = 1/edgeSensor;
wait(0.05);
myled4 = 0;
wait(0.05);
ml.speed(speed);
mr.speed(pow(speed,0.2));
if((edge == true) || (wall == true))
{
edgeMove();
}
//pc.printf("IR sensor reads %2.2f\n ", a);
//pc.printf("\rDistance is %2.2f cm \n ", a);
//pc.printf("%0.5f\n",dis);
}
}
Demo Videos
Please log in to post comments.
