This application was born after a student trainee, Pedro Vicente, spent his Summer at my company Aliatron and did a technical project with a 8051-based robot “Robo-51” from Inex . Pedro has already published here in this blog, his work that is based on remote control of a robot with bluetooth.
Objectives:
Use Processing sketch to create a virtual gamepad that controls a bluetooth-enabled robot, in this case a Robo-51 from Inex. The virtual gamepad must control the robot using serial communication capabilities of a bluetooth module (ZX-Bluetooth). Voice-enable the gamepad with TTS capabilities of Windows.
Equipment Setup:
A 8051 robot “Robo-51” (could be any other micrcontroller) with ZX-Bluetooth module, running a firmware for bluetooth control (or any other serial control), and PC with Windows and Processing software.

8051-based robot “Robo-51”
Bluemote – Virtual Gamepad:
The sketch in Processing named bluemote has the following code:
import processing.serial.*; //Import serial library
import guru.ttslib.*; //Import tts text-to-voice library
// Based on serial example of Processing 1.2.1. To be used with
// 8051 "Robo-51" from INEX, bluetooth enabled wihZX-Bluetooth
// Sketch by Tayeb tayeb.habib@gmail.com www.redacacia.wordpress.com
// This sketch uses ttslib for sound, library downloadable at
// www.local-guru.net/blog/pages/ttslib
PImage bg; // Create object from PImage class
Serial myPort; // Create object from Serial class
TTS tts; // Create object from Tts class
void setup()
{
size(318, 184); // Sketch of same size as gamepad image
myPort = new Serial(this, "COM5", 9600); // Set comm port
bg = loadImage("bluemote.jpg"); // Load bluemote image
tts = new TTS(); // Create an instance of the TTS class
tts.speak("Hi! I am Robot Fifty-One"); // Call the speak method
tts.speak("I am at your orders! Boss!"); // Call the speak method
}
void draw() {
background(bg); // Load bluemote gamepad image as background
if ((mouseOverForw() == true) && mousePressed) { // If mouse is pressed and over forward button,
cursor(HAND); // Hand cursor
myPort.write("d"); // Send letter d for forward movement of robot
tts.speak("Forward"); // Call the speak method
}
else if ((mouseOverBack() == true) && mousePressed) { // If mouse is pressed and over backward button,
cursor(HAND); // Hand cursor
myPort.write("a"); // Send letter c to turn the robot leftwards
tts.speak("Backward"); // Call the speak method
}
else if ((mouseOverLeft() == true) && mousePressed){ // If mouse is pressed and over left button,
cursor(HAND); // Hand cursor
myPort.write("c"); // Send letter c to turn the robot rightwards
tts.speak("Left"); // Call the speak method
}
else if ((mouseOverRight() == true) && mousePressed) { // If mouse is pressed and over right button,
cursor(HAND); // Hand cursor
myPort.write("b"); // Send letter b to turn the robot rightwards
tts.speak("Right"); // Call the speak method
}
else if ((mouseOverStop() == true) && mousePressed){ // If mouse is pressed and over stop button,
cursor(HAND); // Hand cursor
myPort.write("s"); // Send letter s to stop the robot
tts.speak("Stopping"); // Call the speak method
}
else {
cursor(HAND); // Hand cursor
}
}
boolean mouseOverForw() { // Test if mouse is over control button
return ((mouseX >= 240) && (mouseX <= 256) && (mouseY >= 63) && (mouseY <= 78));
}
boolean mouseOverBack() { // Test if mouse is over control button
return ((mouseX >= 240 ) && (mouseX <= 256) && (mouseY >= 106) && (mouseY <= 121));
}
boolean mouseOverLeft() { // Test if mouse is over control button
return ((mouseX >= 218) && (mouseX <= 228) && (mouseY >= 84) && (mouseY <= 98));
}
boolean mouseOverRight() { // Test if mouse is over control button
return ((mouseX >= 272) && (mouseX <= 287) && (mouseY >= 74) && (mouseY <= 96));
}
boolean mouseOverStop() { // Test if mouse is over stop button
return ((mouseX >= 47) && (mouseX <= 108) && (mouseY >= 78) && (mouseY <= 132));
}
Appropriate changes will be required according to the setup namely:
the serial port: in our case it is COM5, in your case it could be another port
the commands: in our case they are d for forward, a for backwards, c for leftwards, b for rightwards and s for stopping.
The sketch calls a TTS library (link shown within the code) and uploads a background image. The gamepad image that has been used for this sketch is:
Just download it and add to your project folder ususally found within c:/my documents/processing
The 8051-robot firmware and bluetooth:
Pedro Vicente, mentioned above, has published here the whole project envolving the 8051-based robot “Robo-51” and bluetooth. In fact the virtual gamepad can function through any serial connection to any micrcontroller. The commands and the serial port have to be adapted in the sketch.
View a video of Virtual Gamepad and Robo-51:
Conclusions:
Serial communciations library, and other libraries in Processing, offer enormous potential in adding interactivity to electronic projects. Bluemote, the virtual gamepad that has been explained here is an example of how easy it is to make electronic projects to talk and interact with the environment.


Pingback: Controlling a robot with bluetooth-enabled cell phone | RedAcacia