Introduction: DIY Wireless Hovercraft (Team OZ)

This manual will teach you how to build a DIY Arduino-based remote-control hovercraft that can hover on the ground and move in different direction. The hovercraft is built mainly of poly-foam board, and consists of a ducted fan, two propellers, a PS2® controller module, and an Arduino Uno board. You can use a PS2® controller to run the hovercraft on the ground.

Building the hovercraft requires the basic knowledge of Arduino programming and electrical circuit. This project is moderately difficult and requires about three-to-six-hours’ work. The materials are easy to acquire on the Internet.

The ducted fan and the batteries are dangerous if manipulated improperly. Kids below 13 should not build the project without adult’s help.

Step 1: Prepare the Materials

First purchase and prepare the materials below.

a. One piece of polyfoam with the size of 30cm * 30cm * 5cm (Length * Width * Height).

b. One piece of dishcloth with the size of 30cm * 30cm (Length * Width).

c. One Arduino Uno board with a USB cable.

d. At least sixty DuPont line wires: twenty male – male, twenty male – female, and twenty female – female.

e. One wireless PS2® controller with a receiver.

f. One L298N motor driver module.

g. Two brush 370 motors.

h. Two fans with a diameter of 5cm and a bore diameter of 3mm.

i. One XL6009 4A voltage regulator module.

j. One 20A brushless electronic speed controller.

k. One 64mm brushless ducted fan.

l. One 12V 6800mAh lithium battery.

m. One 11.1V 2200mAh lithium battery.

Also prepare the tools below.

a. One hot melting glue gun and three glue gun sticks.

b. One electrical tape, one double-faced adhesive tape, one screwdriver and one cutter knife.

c. One electric iron, a reel of tin wire, and a bottle of soldering paste.

Step 2: Make the Deck of the Hovercraft

Use the cutter knife to cut the poly-foam board to make the deck of the hovercraft. The shape and size is shown in the three-view drawing. You can use a file to make the edges smooth, but it’s not necessary. The hole in the middle is left for the ducted fan.

Step 3: Make the Bottom of the Hovercraft

Use a cutter knife to cut a cone-shaped hollow at the bottom of the deck. The hollow will hold the air as an air cushion. Then cut and glue a piece of dishcloth onto the bottom around the hollow. The cloth will help hold the air and make the hovercraft stable. The size and shape of the hollow and the cloth is shown in the picture.

Step 4: Fit the Ducted Fan on the Deck

Use the hot melting glue gun to fit the ducted fan on the deck. Remember to wait till the glue is cooler and then glue the fan. If the glue is too hot, the foam board will be damaged.

Warning – Hot equipment

The glue gun will be very hot when heated. Be careful not to burn your hands when using it. If your hands get burned, wash your hands with cold water as soon as possible.

Step 5: Assemble the Propellers

Combine the two fans with the two brushed motors.

Cut two small pieces of poly-foam into the size of 3cm * 3cm * 5cm (Length * Width * Height). Glue them onto the deck beside the ducted fan.

Finally, glue the two propellers onto the two pieces of polyfoam bases.

Step 6: Join the Propeller Circuit

This circuit controls the two propellers.

The voltage regulator module regulates the voltage from the battery to 6V and powers the driver circuit. The driver circuit then processes the signals from the arduino board and adjusts the speed of two motors.

Components in the circuit:

  • Two brush motors
  • One L298N Driver circuit
  • One Voltage Regulator Module (VRM)
  • One 12V 6800mAh lithium battery

Attach the wires to the slots as the diagram below.

Connect the ENA, IN1, IN2, IN3, IN4, ENB ports of the driver module to the Arduino board pins 5, 4, 6, 7, 8, 9.

Step 7: Join the Ducted Fan Circuit

This circuit controls and powers the ducted fan. The ducted fan ejects air to the ground and makes the hovercraft hover on the ground. The circuit enables you to remotely control the power of the fan so that the hovercraft can move on different surfaces.

Warning – Electric shock

The battery is easy to discharge. You’d better wear insulating gloves to avoid the electric shock.

Components in the circuit:

  • One Electronic speed controller (ESC)
  • One 11.1V 2200 mAh lithium battery
  • One 64mm brushless ducted fan

Attach the wires to the slots as the diagram shows.

Notice about the electronic speed controller (ESC):

  • The speed controller has two pairs of positive-ground wires. Do not reverse them.
  • The three “OUT” wires have no order. You can attach them to the ducted fan in any order.

Step 8: Join the Remote Control Circuit

This circuit connects the PS2® controller with the Arduino so that the hovercraft can be remotely controlled. The PS2® controller module is an integrated circuit. It can be combined with Arduino controller without extra configuration.

Warning – Vulnerable parts

There is no voltage regulator in the receiver. Do not input voltages higher than 5V. High voltage will damage the receiver permanently.

Components in the circuit:

  • A PS2 wireless receiver

Connect the receiver to the arduino board as shown.

After Steps 6-8, the complete circuit of the hovercraft should be completed. A picture of all components in the circuit is shown.

Step 9: Fix the Electrical Components

Use the electrical tape to fix the electrical components onto the deck of the hovercraft. The wires should be away from the propellers’ blades.

Step 10: Upload the Arduino Program

Use a USB cable to connect the Arduino to a computer, and use an Arduino software to upload the codes. You may also download the code from Github: https://github.com/susanxie123/hovercraft.git

<p>#include <PS2X_lib.h>
<ps2x_lib.h>  //for v1.6<br>#include <Servo.h><servo.h>
PS2X ps2x; // create PS2 Controller Class
Servo ser;
//right now, the library does NOT support hot pluggable controllers, meaning 
//you must always either restart your Arduino after you conect the controller, 
//or call config_gamepad(pins) again after connecting the controller.
int error = 0; 
byte type = 0;
byte vibrate = 0;
int oil = 0;
float ls=0;
float rs=0;
void setup(){
  ser.attach(3);
  Serial.begin(57600);
  pinMode(4,OUTPUT);  
  pinMode(5,OUTPUT);  
  pinMode(6,OUTPUT);  
  pinMode(7,OUTPUT);  
  pinMode(8,OUTPUT);  
  pinMode(9,OUTPUT);  
   digitalWrite(4,HIGH);
  digitalWrite(6,LOW);
  digitalWrite(7,HIGH);
  digitalWrite(8,LOW);
  analogWrite(5,0);
  analogWrite(9,0);
 //CHANGES for v1.6 HERE!!! **************PAY ATTENTION*************
  
 error = ps2x.config_gamepad(13,11,10,12, true, true);   //setup pins and settings:  GamePad(clock, command, attention, data, Pressures?, Rumble?) check for error
 
 if(error == 0){
   Serial.println("Found Controller, configured successful");
   Serial.println("Try out all the buttons, X will vibrate the controller, faster as you press harder;");
  Serial.println("holding L1 or R1 will print out the analog stick values.");
  Serial.println("Go to www.billporter.info for updates and to report bugs.");
 }
   
  else if(error == 1)
   Serial.println("No controller found, check wiring, see readme.txt to enable debug. visit www.billporter.info for troubleshooting tips");
   
  else if(error == 2)
   Serial.println("Controller found but not accepting commands. see readme.txt to enable debug. Visit www.billporter.info for troubleshooting tips");
   
  else if(error == 3)
   Serial.println("Controller refusing to enter Pressures mode, may not support it. ");
   
   //Serial.print(ps2x.Analog(1), HEX);
   
   type = ps2x.readType(); 
     switch(type) {
       case 0:
         Serial.println("Unknown Controller type");
       break;
       case 1:
         Serial.println("DualShock Controller Found");
       break;
       case 2:
         Serial.println("GuitarHero Controller Found");
       break;
     }
}</servo.h></ps2x_lib.h></p><p>void loop(){
  digitalWrite(4,HIGH);
  digitalWrite(6,LOW);
  digitalWrite(7,HIGH);
  digitalWrite(8,LOW);
   /* You must Read Gamepad to get new values
   Read GamePad and set vibration values
   ps2x.read_gamepad(small motor on/off, larger motor strenght from 0-255)
   if you don't enable the rumble, use ps2x.read_gamepad(); with no values
   you should call this at least once a second
   */
   
 if(error == 1) //skip loop if no controller found
  return; 
  
 if(type == 2){ //Guitar Hero Controller
   
   ps2x.read_gamepad();          //read controller 
  
   if(ps2x.ButtonPressed(GREEN_FRET))
     Serial.println("Green Fret Pressed");
   if(ps2x.ButtonPressed(RED_FRET))
     Serial.println("Red Fret Pressed");
   if(ps2x.ButtonPressed(YELLOW_FRET))
     Serial.println("Yellow Fret Pressed");
   if(ps2x.ButtonPressed(BLUE_FRET))
     Serial.println("Blue Fret Pressed");
   if(ps2x.ButtonPressed(ORANGE_FRET))
     Serial.println("Orange Fret Pressed");
    if(ps2x.ButtonPressed(STAR_POWER))
     Serial.println("Star Power Command");
    if(ps2x.Button(UP_STRUM))          //will be TRUE as long as button is pressed
     Serial.println("Up Strum");
    if(ps2x.Button(DOWN_STRUM))
     Serial.println("DOWN Strum");
  
    if(ps2x.Button(PSB_START))                   //will be TRUE as long as button is pressed
         Serial.println("Start is being held");
    if(ps2x.Button(PSB_SELECT))
         Serial.println("Select is being held");</p><p>    if(ps2x.Button(ORANGE_FRET)) // print stick value IF TRUE
    {
        Serial.print("Wammy Bar Position:");
        Serial.println(ps2x.Analog(WHAMMY_BAR), DEC); 
    } 
 }</p><p> else { //DualShock Controller
   float  leftspeed = 0;
   float rightspeed = 0;
   if(ps2x.Button(PSB_L2))
   {
    digitalWrite(4,LOW);
    digitalWrite(6,HIGH);
   }
   if(ps2x.Button(PSB_R2))
   {
    digitalWrite(7,LOW);
    digitalWrite(8,HIGH);
   }
   if(ps2x.Button(PSB_L1))
   {
    leftspeed=255;
   }
   else
   {
     leftspeed=0;
   }
   if(ps2x.Button(PSB_R1))
   {
    rightspeed=255;
   }
    else
    {
      rightspeed=0;
    }
  
   if(ps2x.Analog(PSS_LY)>130)
   {
     leftspeed=abs((ps2x.Analog(PSS_LY)-128.0)/128.0*255.0);
     digitalWrite(4,LOW);
     digitalWrite(6,HIGH);
   }
   if(ps2x.Analog(PSS_LY)<110)
   {
     leftspeed=abs((ps2x.Analog(PSS_LY)-128.0)/128.0*255.0);
     digitalWrite(4,HIGH);
     digitalWrite(6,LOW);
   }
   if(ps2x.Analog(PSS_RY)>130)
   {
     rightspeed=abs((ps2x.Analog(PSS_RY)-128.0)/128.0*255.0);
     digitalWrite(7,LOW);
     digitalWrite(8,HIGH);
   }
   if(ps2x.Analog(PSS_RY)<110)
   {
     rightspeed=abs((ps2x.Analog(PSS_RY)-128.0)/128.0*255.0);
     digitalWrite(7,HIGH);
     digitalWrite(8,LOW);
   }
   analogWrite(5,(int)leftspeed);
   ls=leftspeed;
   if(rightspeed>250.0){rightspeed=255.0;}
   analogWrite(9,(int)rightspeed);
   rs=rightspeed;
   ps2x.read_gamepad(false, vibrate);     //read controller and set large motor to spin at 'vibrate' speed
   if(ps2x.Button(PSB_START))                   //will be TRUE as long as button is pressed
     Serial.println("Start is being held");
   if(ps2x.Button(PSB_SELECT))
     Serial.println("Select is being held");    
   if(ps2x.Button(PSB_PAD_UP)) {         //will be TRUE as long as button is pressed
     Serial.print("Up held this hard: ");
       leftspeed=255;rightspeed=255;
       Serial.println(ps2x.Analog(PSAB_PAD_UP), DEC);   
       if(abs(leftspeed - ls)>10)
    {
    analogWrite(5,leftspeed);
    ls=leftspeed;
    }
    if(abs(rightspeed-rs)>10)
    {
      rs=rightspeed;
    }
     }  
      if(ps2x.Button(PSB_PAD_RIGHT)){
       Serial.print("Right held this hard: ");
       Serial.println(ps2x.Analog(PSAB_PAD_RIGHT), DEC);
      }
      if(ps2x.Button(PSB_PAD_LEFT)){
       Serial.print("LEFT held this hard: ");
        Serial.println(ps2x.Analog(PSAB_PAD_LEFT), DEC);
      }
      if(ps2x.Button(PSB_PAD_DOWN)){
       Serial.print("DOWN held this hard: ");
     Serial.println(ps2x.Analog(PSAB_PAD_DOWN), DEC);
      }   
   
      vibrate = ps2x.Analog(PSAB_BLUE);        //this will set the large motor vibrate speed based on 
    if (ps2x.NewButtonState())               //will be TRUE if any button changes state (on to off, or off to on)
    {
        if(ps2x.Button(PSB_L3))
         Serial.println("L3 pressed");
        if(ps2x.Button(PSB_R3))
         Serial.println("R3 pressed");
        if(ps2x.Button(PSB_L2))
         Serial.println("L2 pressed");
        if(ps2x.Button(PSB_R2))
         Serial.println("R2 pressed");
        if(ps2x.Button(PSB_GREEN))
         Serial.println("Triangle pressed");
}  
    if(ps2x.ButtonPressed(PSB_RED))     {        //will be TRUE if butt  on was JUST pressed
         Serial.println("Circle just pressed");
			oil=oil+10;
			}  
       if(ps2x.ButtonPressed(PSB_PINK))  {    //will be TRUE if button was JUST pressed
         Serial.println("square just pressed");
         oil=oil-10; 
       }
       if(ps2x.ButtonPressed(PSB_GREEN))     {        //will be TRUE if button was JUST pressed
         Serial.println("Circle just pressed");
         oil=oil+1;
		}         
       if(ps2x.ButtonPressed(PSB_BLUE))  {           //will be TRUE if button was JUST pressed
         Serial.println("square just pressed");
         oil=oil-1;
          }    </p><p>       if(ps2x.Button(PSB_L3) || ps2x.Button(PSB_R3))
    {
       ser.write(oil-3);
    }
    else
    {
       ser.write(oil);
}
    if(ps2x.ButtonReleased(PSB_PINK))           
         Serial.println("Square just released");      
    if(ps2x.NewButtonState(PSB_BLUE))           
         Serial.println("X just changed");         
    if(ps2x.Button(PSB_L1) || ps2x.Button(PSB_R1)) // print stick values if either is TRUE  {
        Serial.print("Stick Values:");
        Serial.print(ps2x.Analog(PSS_LY), DEC); //Left stick, Y axis. Other options: LX, RY, RX  
        Serial.print(",");
        Serial.print(ps2x.Analog(PSS_LX), DEC); 
        Serial.print(",");
        Serial.print(ps2x.Analog(PSS_RY), DEC); 
        Serial.print(",");
        Serial.println(ps2x.Analog(PSS_RX), DEC); 
    }    
 } 
 delay(50);     
 
 }</p>

Step 11: Test the Hovercraft and Adjust the Center of Gravity

Test the hovercraft on the ground.

The hovercraft might rotate in a certain direction due to the deviation of the center of gravity. Adjust the position of the electrical components on the deck to centralize the gravity. Adjust several times until the hovercraft can move straight.

Team OZ Creation. Team members: Liu Yuxuan, Mao Chongzhao, Xie Yulin, Xu Dapeng, Zhang Yang.

Remote Control Contest

Participated in the
Remote Control Contest