The FollowMeBot follows the user based on the color of his or her shirt. The device hosts a webcam on a servo to find the object and orient the robot. The color is chosen through the user interface with push buttons. Currently, the MATLAB code supports red and green detection. The purpose of FollowMeBot is to be able to follow the user in order to be helpful for daily tasks.

Dependencies:   Rectangle Servo TextLCD mbed

Fork of FollowMeBot3 by Rahul Shetty

main.cpp

Committer:
dhamilton31
Date:
2013-11-18
Revision:
1:6c399fc35deb
Parent:
0:3ed56271dd2d
Child:
2:0b362c662997

File content as of revision 1:6c399fc35deb:

#include "mbed.h"
#include "iRobot.h"
#include "Servo.h"
#include "Rectangle.h"

// Macros/Constants
#define MAX_VIEW_X 1024 // maximum X value input from camera
#define MAX_VIEW_Y 1024 // maximum Y value input from camera
#define CENTER_BOX_TOLLERANCE 15 // Size of our box
#define TO_SERVO_DIVISOR 100.0 // Value to divide by to get the amount to move the servo by

// Hardware sensors and devices
DigitalOut myled(LED1);
iRobot followMeBot(p9, p10);
Servo servoHor(p22);
Servo servoVer(p21);
AnalogIn irSensorFront(p20);
AnalogIn irSensorLeft(p19);
AnalogIn irSensorRight(p18);
Serial pc(USBTX, USBRX); // tx, rx

// Software variables
char serial_rx_buffer[128]; // Input buffer for data from the PC
int xpos, ypos; // x and y positions read from matlab
Rectangle centerBox((MAX_VIEW_X/2)+CENTER_BOX_TOLLERANCE, (MAX_VIEW_Y/2)+CENTER_BOX_TOLLERANCE,
                    (MAX_VIEW_X/2)-CENTER_BOX_TOLLERANCE,(MAX_VIEW_Y/2)-CENTER_BOX_TOLLERANCE); // Creates a box to examine if the camera is well enough centered

int main()
{
    followMeBot.start();

    while(1) {
    }
}

void moveCamera()
{
    if(!centerBox.is_touch(xpos, ypos)) {
        float temp;
        temp = servoHor.read() + ((float)centerBox.getCenterX() - (float)xpos)/TO_SERVO_DIVISOR;
        if(temp > 0 && temp <= 1) {
            servoHor = temp;
        }
        temp = servoVer.read() + ((float)centerBox.getCenterY() - (float)ypos)/TO_SERVO_DIVISOR;
        if(temp > 0 && temp <= 1) {
            servoVer = temp;
        }
    }
}