Introduction: BloonDuino - an Arduino and Xbee Based Blimp


Photo and video documentation is essential for many important events

Quadcopter drones have proven themselves cost efficient in comparison to giant film crane arms and full scale helicopters, but are still extremely noisy just to maintain a steady altitude. Quadcopters also have very limited flight times, which for some is only a few minutes.

All of the code is available at

To control the blimp, I first read the rotation value of each of the potentiometers. I send this data from the Arduino Mega through the Xbee radio connected to it, to the Arduino Uno on the flying part of the blimp which also has an Xbee connected. The Arduino Uno then parses these received integer values and sets the corresponding left and right motor speeds accordingly.

Parts List

For the Blimp:

  • Arduino Uno Rev 3
  • Seeed Studio Dual Motor Shield V2.
  • Sainsmart Xbee shield
  • Xbee Series One

For the Remote Control Panel:

  • Arduino Mega 2560
  • Mega Ultimate shield (has multiple Xbee header sections, and a microSD sniffer
  • 2 Potentiometers
  • 2 Potentiometer Caps/Dials
  • LCD Display

Step 1: Making a Remote Control

Building and Programming a Remote Control for the Blimp

I used my Arduino Mega with a DFRobot Mega Sensor Shield V2.4, which has 3 pairs of Xbee headers on it.

Note that the Xbee cannot be connected to the Mega Sensor Shield while trying to upload code to the Arduino Mega or it wont work. Simply upload the code without the Xbee connected, remove the USB cable, connect the Xbee, then reconnect the power source (USB cable). I obtained 2 10K Ohm potentiometers and some plastic dials that fit on them to indicate their rotation position. The potentiometers are connected to 5V, Ground, and Analog Pins A1 and A2. Rotation can be detected by doing analogRead(pin_number). I soldered the potentiometers to a piece of PCB, since the connection was unreliable just using a breadboard.

Arduino Code:

int leftKnob = A1; // select the input pin for the potentiometer
 int leftKnobValue = 0; // variable to store the value coming from the sensor
 int rightKnob = A2; // select the input pin for the potentiometer 
int rightKnobValue = 0; // variable to store the value coming from the sensor 
void setup() { 
void loop() { 
leftKnobValue = analogRead(leftKnob); 
 rightKnobValue = analogRead(rightKnob);  

Step 2: Powering the Blimp

I'm using a Sparkfun Powercell LiPo Charger/Booster and a 500mAh LiPo battery to power the blimp.

I connected the Powercell's VCC (voltage out) pin to the Arduino's VIN (voltage input) where it was accessible on the Motor Shield header.

I connected the Powercell's GND (ground) pin to one of the Arduino's ground pins, also where it was accessible on the Motor Shield headers.

Step 3: The Flying Part

Assembling and Programming the Flying Part of the Blimp

  1. Connect an Arduino Uno to your computer and open the Arduino IDE
  2. Clone the GitHub Repo and open the file "uno_and_dc_motors_with_xbee.ino"
  3. Make sure you have the correct board and port selected in the Arduino IDE then upload the code.
  4. Stack the Motor Driver Shield onto the Uno
  5. Stack the Xbee Shield on top of the Motor Driver. Note that when the Xbee shield is connected, the Arduino IDE will not allow you to upload code to the Arduino unless you move the headers on the shield where it says "Xbee/USB" from the Xbee to the USB side.

Arduino Code:

int incomingByte;                        // a variable to read incoming serial data into
int leftmotorForward = 8; // pin 8 --- left motor (+) green wire
int leftmotorBackward = 11; // pin 11 --- left motor (-) black wire
int leftMotorSpeedPin = 9; // pin 9 --- left motor speed signal
int rightmotorForward = 12; // pin 12 --- right motor (+) green wire
int rightmotorBackward = 13; // pin 13 --- right motor (-) black
int rightMotorSpeedPin = 10; // pin 10 --- right motor speed signal
int leftMotorSpeed = 0;
int rightMotorSpeed = 0;
int turnPotVal = 255; // variable to store the value coming from the sensor
int turnPotVal2 = 255;
void setup()  {    
pinMode(leftmotorForward, OUTPUT);
pinMode(leftmotorBackward, OUTPUT);
pinMode(leftMotorSpeedPin, OUTPUT);
pinMode(rightmotorForward, OUTPUT);
pinMode(rightmotorBackward, OUTPUT);
pinMode(rightMotorSpeedPin, OUTPUT);
void loop() {
	while (Serial.available() > 0) {
// look for the next valid integer in the incoming serial stream:
turnPotVal = Serial.parseInt();
turnPotVal2 = Serial.parseInt();
rightMotorSpeed = (1023-turnPotVal)/4;
leftMotorSpeed = turnPotVal2/4;
analogWrite(leftMotorSpeedPin,leftMotorSpeed); //Enable left motor
analogWrite(rightMotorSpeedPin,rightMotorSpeed); //Enable right motor
digitalWrite(leftmotorBackward,LOW); // Drives LOW outputs down first

Step 4: Connecting Motors and Headlights

Step 5: Helium Vs. Gravity

  • Helium has a lifting force of 1 gram per liter.
  • The Blimp ended up weighing 173.8 grams.
  • Therefore, we needed approximately 174 Liters of helium (not including the weight of balloons) to achieve "neutral buoyancy."

Step 6: Live Demo at the Atlas Expo

The Atlas Expo takes place in the Blackbox theater at the end of every semester at CU Boulder.