Introduction: Bluetooth Controlled Message Droid --R2Blue2(/What Not to Do)
This is an instructable for a bluetooth controlled Message Droid. I call it R2Blue2. It moves around and displays messages that you type using your phone or computer. Atleast it was supposed to. Due to many problems such as underpowered batteries and bad cable management I wasn't able to extract the performance necessary. I will explain the problems that plagued this build later.
The messages are sent over a bluetooth connection between the sender and the bot. For my usage, I used a HTC WIldfire running the Blueterm application to send serial commands to bot. The bluetooth module I used on the bot is Bluesmirf Gold which has a default baud rate as 115200. I don't have an FTDI cable to change the baud rate. The baud rate setting shouldn't matter much but whatever is the baud rate of the module, you should set up a serial port of the same baud rate in the arduino code. Otherwise you'll get undefined states and the bot won't function as wanted < imagine R2D2 scream >.
The messages are sent over a bluetooth connection between the sender and the bot. For my usage, I used a HTC WIldfire running the Blueterm application to send serial commands to bot. The bluetooth module I used on the bot is Bluesmirf Gold which has a default baud rate as 115200. I don't have an FTDI cable to change the baud rate. The baud rate setting shouldn't matter much but whatever is the baud rate of the module, you should set up a serial port of the same baud rate in the arduino code. Otherwise you'll get undefined states and the bot won't function as wanted < imagine R2D2 scream >.
Step 1: Parts
Arduino Deumilanove
Bluesmirf Gold (or any suitable bluetooth module)
Double line LCD based on the Hitachi HD44780 (most common)
Two 100 rpm geared motors
L298 motor driver
10K potentiometer
Birch strip
Connectors for the birch strip
Ribbon Cable
Lots of single strand wire
General Purpose Board (GPB) ....... if you choose to solder everything
Breadboard
Zip ties
Solder (lots of it if you choose to solder everything)
If you can procure a Arduino shield kit, things will be much easier and more reliable as the present connections to the arduino are not very tight. In India, a shield board is quite expensive and I couldn't find it any where I searched. (if you are from Bangalore and are an electronics geek, you should be familiar with SP Road :P). total cost is about 80 to 100 dollars. The bluesmirf is the most expensive part at 60 dollars.
Bluesmirf Gold (or any suitable bluetooth module)
Double line LCD based on the Hitachi HD44780 (most common)
Two 100 rpm geared motors
L298 motor driver
10K potentiometer
Birch strip
Connectors for the birch strip
Ribbon Cable
Lots of single strand wire
General Purpose Board (GPB) ....... if you choose to solder everything
Breadboard
Zip ties
Solder (lots of it if you choose to solder everything)
If you can procure a Arduino shield kit, things will be much easier and more reliable as the present connections to the arduino are not very tight. In India, a shield board is quite expensive and I couldn't find it any where I searched. (if you are from Bangalore and are an electronics geek, you should be familiar with SP Road :P). total cost is about 80 to 100 dollars. The bluesmirf is the most expensive part at 60 dollars.
Step 2: LCD Wiring
The LCD was wired up as shown in the tutorial on LadyAda. I just soldered everything on to a pcb and made an
extension for it using the ribbon cable to allow it to be flexible. I also used a birch strip to make it easily
detachable.
link for the tutorial: www.ladyada.net/learn/lcd/charlcd.html
The connections are tabulated below for easy reference:
Pins Connections
1 Ground
2 +5V
3 Contrast Adjustment Pot
4 Arduino pin 2
5 Ground (always in write mode)
6 Arduino pin 3
7 No connection
8 No connection
9 No connection
10 No connection
11 Arduino pin 4
12 Arduino pin 5
13 Arduino pin 6
14 Arduino pin 7
15 +5V
16 Ground
Step 3: Motor Driver Wiring
The L298 doesn't come in a standard DIP (dual inline package). Hence you can't mount it on a breadboard. You
have to solder it onto a GPB. This is what I did and drew some wires out of every pin to allow for connection to
the arduino and the bread board.
The pin connections are tabulated below for easy reference:
Pins Connection
1 Ground
2 Pin 1 of motor 1
3 Pin 2 of motor 1
4 9V supply of motor
5 Arduino pin 8
6 +5V from arduino
7 Arduino pin 9
8 Ground
9 +5V from arduino
10 Arduino pin 10
11 +5V from arduino
12 Arduino pin 11
13 Pin 1 of motor 2
14 Pin 2 of motor 2
15 Ground
This is the easiest connection scheme and it uses the least no of arduino pins, 4. I have made the enables always
high by connecting them to +5V and the current sensing always low by connecting to ground. Look at the pin
diagram to find the pin functions.
Step 4: Bluesmirf Prep
The bluesmirf was connected using birch strip pins on both ends to make it easily removable for transport and safe keeping. While connecting the bluesmirf, the RX pin should go to the TX pin (pin 1) of the arduino and the TX pin should go to the RX pin (pin 0) of the arduino. This is very important so make sure your connections are correct. The GND and Vcc go to their respective pins.
Step 5: Arduino Connections:
For this project, I've used pins 0 and 1 for communication (as always), pins 2 to 7 for connecting to the LCD, and pins 8 to 11 for connecting to the motor. I used a 9V battery to power it when not connected to the computer, but for testing purposes I used a wall wart with a USB out. I connected all the components to the bread board and used it as an intermediary for connecting it to the arduino. I used a separate 9V battery for the motor power supply.
Step 6: Arduino Code
char in=0;
#include <LiquidCrystal.h>
int i=0;
int z=0;
//setting up LCD using the LiquidCrystal library
LiquidCrystal lcd(2,3,4,5,6,7);
//motor pins
int m1=8;
int m2=9;
int m3=10;
int m4=11;
void setup()
{
//setting up motor pins as output
pinMode(m1,OUTPUT);
pinMode(m2,OUTPUT);
pinMode(m3,OUTPUT);
pinMode(m4,OUTPUT);
//defining an lcd of 16*2
lcd.begin(16, 2);
//starting serial link
Serial.begin(115200);
}
/*the wires might have gotten interchanged a little so fiddle around with which pin goes high when to get the
proper code for movement in any direction*/
//function for forward movement
void forward()
{
digitalWrite(m1,HIGH);
digitalWrite(m4,HIGH);
digitalWrite(m2,LOW);
digitalWrite(m3,LOW);
}
//function for backward movement
void backward()
{
digitalWrite(m1,LOW);
digitalWrite(m4,LOW);
digitalWrite(m2,HIGH);
digitalWrite(m3,HIGH);
}
//function for turning left on its axis
void left()
{
digitalWrite(m1,LOW);
digitalWrite(m4,HIGH);
digitalWrite(m2,HIGH);
digitalWrite(m3,LOW);
}
//function for turning right on its axis
void right()
{
digitalWrite(m1,HIGH);
digitalWrite(m4,LOW);
digitalWrite(m2,LOW);
digitalWrite(m3,HIGH);
}
//function for stopping all motion
void stop1()
{
digitalWrite(m1,LOW);
digitalWrite(m4,LOW);
digitalWrite(m2,LOW);
digitalWrite(m3,LOW);
}
void move_code(char x)
{
if(x=='w')
forward();
else if(x=='x')
backward();
else if(x=='a')
left();
else if(x=='d')
right();
else if(x=='s')
stop1();
}
//function for displaying message while in motion and controlling the movement of bot
void display_move()
{
if(z==0)
{
lcd.clear();
lcd.print("Moving....");
z++;
}
if(Serial.available())
{
in=Serial.read();
if(in=='w'||in=='s'||in=='a'||in=='d'||in=='x')
move_code(in);
else if(in=='%')
lcd_display();
else
{
lcd.clear();
lcd.print("You typed shit..");
delay(3000);
z=0;
}
}
}
//function for displaying message typed
void lcd_display()
{
lcd.clear();
stop1();
in=0;
i=0;
lcd.cursor();
while(in!='%')
{
if(i>32)
{
lcd.clear();
i=0;
}
if (Serial.available())
{
char in=Serial.read();
i++;
if(i>16&&i<=32&&in!='%')
{
lcd.setCursor((i-17),1);
lcd.print(in);
}
else if(in=='%')
{
z=0;
in=0;
break;
}
else
lcd.print(in);
}
}
}
//main function
void loop()
{
display_move();
}
#include <LiquidCrystal.h>
int i=0;
int z=0;
//setting up LCD using the LiquidCrystal library
LiquidCrystal lcd(2,3,4,5,6,7);
//motor pins
int m1=8;
int m2=9;
int m3=10;
int m4=11;
void setup()
{
//setting up motor pins as output
pinMode(m1,OUTPUT);
pinMode(m2,OUTPUT);
pinMode(m3,OUTPUT);
pinMode(m4,OUTPUT);
//defining an lcd of 16*2
lcd.begin(16, 2);
//starting serial link
Serial.begin(115200);
}
/*the wires might have gotten interchanged a little so fiddle around with which pin goes high when to get the
proper code for movement in any direction*/
//function for forward movement
void forward()
{
digitalWrite(m1,HIGH);
digitalWrite(m4,HIGH);
digitalWrite(m2,LOW);
digitalWrite(m3,LOW);
}
//function for backward movement
void backward()
{
digitalWrite(m1,LOW);
digitalWrite(m4,LOW);
digitalWrite(m2,HIGH);
digitalWrite(m3,HIGH);
}
//function for turning left on its axis
void left()
{
digitalWrite(m1,LOW);
digitalWrite(m4,HIGH);
digitalWrite(m2,HIGH);
digitalWrite(m3,LOW);
}
//function for turning right on its axis
void right()
{
digitalWrite(m1,HIGH);
digitalWrite(m4,LOW);
digitalWrite(m2,LOW);
digitalWrite(m3,HIGH);
}
//function for stopping all motion
void stop1()
{
digitalWrite(m1,LOW);
digitalWrite(m4,LOW);
digitalWrite(m2,LOW);
digitalWrite(m3,LOW);
}
void move_code(char x)
{
if(x=='w')
forward();
else if(x=='x')
backward();
else if(x=='a')
left();
else if(x=='d')
right();
else if(x=='s')
stop1();
}
//function for displaying message while in motion and controlling the movement of bot
void display_move()
{
if(z==0)
{
lcd.clear();
lcd.print("Moving....");
z++;
}
if(Serial.available())
{
in=Serial.read();
if(in=='w'||in=='s'||in=='a'||in=='d'||in=='x')
move_code(in);
else if(in=='%')
lcd_display();
else
{
lcd.clear();
lcd.print("You typed shit..");
delay(3000);
z=0;
}
}
}
//function for displaying message typed
void lcd_display()
{
lcd.clear();
stop1();
in=0;
i=0;
lcd.cursor();
while(in!='%')
{
if(i>32)
{
lcd.clear();
i=0;
}
if (Serial.available())
{
char in=Serial.read();
i++;
if(i>16&&i<=32&&in!='%')
{
lcd.setCursor((i-17),1);
lcd.print(in);
}
else if(in=='%')
{
z=0;
in=0;
break;
}
else
lcd.print(in);
}
}
}
//main function
void loop()
{
display_move();
}
Step 7: Housing and Final Construction:
I used an old plastic box meant for sweets to house the arduino and the breadboard. I cut small holes in the lid to allow the ribbon cable for the LCD, the connector for the bluemsirf, and the wires to the motors go out. I used a rectangular piece of wood to hold the motors and attach it to the base of the box. I wanted to mount the LCD high by using some ice cream sticks, rubber bands and a stationary clip but the lid wasn't stable enough. I used some ice cream sticks for balancing the bot cause i didn't have any castor wheels.
Step 8: Why It Screwed Up
The main reasons for it not working well were:
1. The batteries were not powerful enough, all the pics where the lcd is bright were taken using a USB wall wart. And the wheels barely used to turn when in movement mode.
2. The cable management was not clean so qt every stage I had to keep checking whether any wires had come off. And if they had come off, it was very difficult for my fingers to go through the maze of wires to reconnect the loose wires.
3.The Housing I had chosen was very small and fitting all the components with enough space for arrangement was very difficult.
How one should rectify the above problems:
1.Get a bunch of AA rechargeable batteries and use a 6 pack of them. That should be enough for movement at a relatively controllable speed. These motors were rated for 9V so using lower rated motors could help increase the speed.
2.Get an arduino shield kit and connect all loose wires to the shield. Since the shield fits snugly on an arduino, no wires will come loose during any stage.
3.Get a bigger box or leave all the components out in the open instead of stuffing them into the box. That messes up the chances of the components working properly cause the stresses on the wires can loosen the wires from their original location.
Step 9: Controls and Conclusion
So if you've done everything correctly, you should be able to use the following commands to control your bot.
The controls for the bot are as follows:
Character Function
w Forward
a Turn left
s Stop
d Turn right
x Backwards
% stop and go to display mode
% When in display mode, clear the screen and return to movement mode
It can be controlled as i said before by using any computer or phone running a terminal program which can communicate over bluetooth.
I've been wanting to make this ever since I got my hands on the bluesmirf module 7 months ago and its been a nice experience involving many topics such as motor control, lcd displays and serial communication, even if it didn't turn out as well as I planned. Atleast I have a clean LCD connection system for future endeavours and i established that the Bluesmirf works perfectly. All in all it
took me 3 days to do this. If you have better equipment and a shield kit, it should take even lesser. Basically, it was a lot of fun. I would like to thank my parents for running around with me when I ran out of parts and I had to go buy them when it was raining cats and dogs. Without them I would have been stuck with a fried LCD and wouldn't have been able to finish this. I don't have many pictures as I started the instructable after I had almost finished the bot. Any queries? Please comment.
And I'm entering this in the Microcontrollers and Making Stuff Move contests. I promise that if I win in either of them, I will churn out much better projects and improve this one to make it work perfectly (that robot kit they are giving for the Microcontroller contest is perfect for this :D and a Bus Pirate will be an excellent addition to my non existent set of equipment).So please vote for me if you like my Instructable!!!!
The controls for the bot are as follows:
Character Function
w Forward
a Turn left
s Stop
d Turn right
x Backwards
% stop and go to display mode
% When in display mode, clear the screen and return to movement mode
It can be controlled as i said before by using any computer or phone running a terminal program which can communicate over bluetooth.
I've been wanting to make this ever since I got my hands on the bluesmirf module 7 months ago and its been a nice experience involving many topics such as motor control, lcd displays and serial communication, even if it didn't turn out as well as I planned. Atleast I have a clean LCD connection system for future endeavours and i established that the Bluesmirf works perfectly. All in all it
took me 3 days to do this. If you have better equipment and a shield kit, it should take even lesser. Basically, it was a lot of fun. I would like to thank my parents for running around with me when I ran out of parts and I had to go buy them when it was raining cats and dogs. Without them I would have been stuck with a fried LCD and wouldn't have been able to finish this. I don't have many pictures as I started the instructable after I had almost finished the bot. Any queries? Please comment.
And I'm entering this in the Microcontrollers and Making Stuff Move contests. I promise that if I win in either of them, I will churn out much better projects and improve this one to make it work perfectly (that robot kit they are giving for the Microcontroller contest is perfect for this :D and a Bus Pirate will be an excellent addition to my non existent set of equipment).So please vote for me if you like my Instructable!!!!