How to Make a Remote Controlled Robot Using Raspberry Pi

In this post, I will show you how to make a remote-controlled robot using Raspberry Pi.

Special shout out to Matt Timmons-Brown for this project idea. He is the author of a really good book on Raspberry Pi robotics: (Learn Robotics with Raspberry Pi). Go check it out!

Video

Here is a video of what we will build in this tutorial.

Requirements

Here are the requirements:

  • Make a remote-controlled robot using Raspberry Pi and the Bluetooth-ready Nintendo Wii remote control.

You Will Need

The following components are used in this project. You will need:

Directions

Familiarizing Yourself with the L293D H-Bridge Motor Driver

You may recall in my post where we constructed the robot’s body that we had four input pins on the L293D motor controller (two for each motor). These input pins control the direction of the motors. For example, for the motor attached to the side of the motor controller connected to Inputs 3 and 4 of the L293D, we have:

Input 3Input 4Motor
HIGHHIGHOFF
HIGHLOWRotation in one direction
LOWHIGHRotation in the other direction
LOWLOWOFF

HIGH = voltage applied; LOW = voltage not applied

The four input pins set their signals from the Raspberry Pi’s GPIO (General Purpose Input/Output) pins.

To make all of this work, under the hood of the L293D motor controller, there is an H-bridge circuit. An H-bridge circuit enables a motor to be driven both forwards and backwards. It is a useful circuit in robotics.

Here is what an H bridge looks like:

h-bridge_diagramPNG

Image Source: Practical and Experimental Robotics

An H-bridge is made from electronically-controlled switches (rather than finger-controlled, such as the wall light switch in your bedroom) known as transistors.

Switch 1 and Switch 2 as well as Switch 3 and Switch 4 can never be closed at the same time. Otherwise, a bad short circuit would be created.

If Switch 3 and Switch 2 close at the same time, the motor spins in one direction. If Switch 1 and Switch 4 are closed (and Switch 2 and Switch 3 remain open), the motor will spin in the other direction because of the change in the path of the electric current.

Testing Your Robot to See If It Can Move

We need to verify that the robot can move properly. We will create a basic program in Python that will make the robot move in a box-shaped pattern three times.

First, power up the Raspberry Pi by connecting it to a wall outlet. Best practice is to connect your Raspberry Pi to a wall outlet (rather than the battery pack) when you are programming it.

Connect to your Raspberry Pi either through Putty or VNC Viewer. I’ll do VNC Viewer.

Open a terminal window. Move to the directory where you are saving your robotics projects.

remote-control-robot-1PNG

In my case, I type:

cd robot
remote-control-robot-2PNG

I then create a program in Python by typing:

nano box_bot.py
remote-control-robot-3PNG

I called the program box_bot.py because the robot will move in a shape that looks like a box.

Here is the Python code for the program:

import gpiozero  # GPIO Zero library
import time  # Time library

# File name: box_bot.py
# Author: Addison Sears-Collins
# Date created: 5/27/2019
# Python version: 3.5.3
# Description: Makes a wheeled robot move in a
# shape that looks like a box.

# Create a Robot object that is attached to 
# GPIO pins 17, 18, 22, and 27 of the 
# Raspberry Pi. These pins are inputs for the
# L293D motor controller.
# Objects have data and behavior that is 
# predefined by the Robot class (i.e. blueprint) 
# declared inside the GPIO Zero library.
# Change the order of the numbers inside
# the parentheses until you get the desired 
# behavior.
robot = gpiozero.Robot(left=(22,27), right=(17,18))

# Repeat this loop three times.
# Robot will make three boxes.
for i in range(3):
  robot.forward() # Move forward for
  time.sleep(1.0) # 1 second
  robot.right()   # Move right for 
  time.sleep(0.4) # 0.4 second
  robot.forward() # Move forward for
  time.sleep(1.0) # 1 second
  robot.right()   # Move right for
  time.sleep(0.4) # 0.4 second
  print("Box completed") # Box completed
remote-control-robot-4PNG-1

Exit the program editor by pressing CTRL-X. Make sure to save it, so press Y, then press ENTER to write (i.e. save) the file to the directory.

Shutdown your Raspberry Pi by typing:

sudo shutdown -h now
remote-control-robot-5PNG

Wait 5 seconds (or when you see the tiny green light on the Raspberry Pi is no longer illuminated), and unplug your Raspberry Pi from the wall.

Now, turn on the 4xAA battery holder.

Connect the Raspberry Pi battery pack to the Raspberry Pi.

Place the robot on a smooth floor in a wide open flat space, away from any object. You could also hold the body in your hand. Grip it by the back of the robot, being careful to keep your hands away from the wheels.

remote-control-robot-1-1
remote-control-robot-2-1

Run the box_bot.py program by opening a terminal window, going to your robot directory (or whatever directory your program is saved in) and typing:

python3 box_bot.py
remote-control-robot-6PNG

Your robot likely won’t make perfect boxes and might not even make fewer than three boxes (due to the weight the motors are pulling). That is fine. The key to this exercise is to just make sure the robot can go forwards and make a right turn.

If you need to stop the robot at any time, you can press CTRL-C.

If you see that your robot is not moving like it should, switch the order of the numbers inside the parentheses on this line:

robot = gpiozero.Robot(left=(22,27), right(17,18))

You can also edit the sleep time in your program. Also check to make sure the wiring is exactly like I indicated in my wheeled robot post.

If your robot isn’t moving at all, don’t worry, robots rarely work as they should the first time around. Keep tinkering with the code until you get the desired result. Take your time. No need to hurry.

Setting up the Nintendo Wii Remote Control

remote-control-robot-3-1

Power up your Raspberry Pi.

Open a terminal window. Type in the following command, and wait while it updates:

sudo apt-get update

The Raspberry Pi has a list of all the software to packages that are available for installation. If you don’t run sudo apt-get update before installing a new software package, you might end up with an outdated piece of software.

Install the Bluetooth package.

Bluetooth is a wireless technology that enables data to be sent back and forth over short distances using radio waves.

sudo apt-get install bluetooth
remote-control-robot-7PNG

Bluetooth might already be installed on your Raspberry Pi. If it is, you will get a message saying so.

Download the open source cwiid Python library that enables the Raspberry Pi to receive information from the remote control.

Type this in the terminal window:

git clone https://github.com/azzra/python3-wiimote
remote-control-robot-8PNG

Install four additional software packages:

sudo apt-get install bison flex automake libbluetooth-dev
remote-control-robot-9PNG

Type Y and press ENTER to continue. Wait while the software installs on your Raspberry Pi.

Move to the python3-wiimote directory.

cd python3-wiimote

Compile the python3-wiimote source code by typing in these commands, one by one in order:

remote-control-robot-10PNG
aclocal
autoconf
./configure
make 
sudo make install

The cwiid library is now installed on your Raspberry Pi.

Move to the robot directory:

cd
cd robot

Create a new Python program.

This program enables the Nintendo Wii remote control to make the robot move forwards (UP button), backwards (DOWN button), to the right (RIGHT button), to the left (LEFT button), and stop (B button).

nano wii_remote.py

Here is the Python code:

import gpiozero  # GPIO Zero library
import cwiid  # Wii library

# File name: wii_remote.py
# Date created: 5/27/2019
# Python version: 3.5.3
# Code source (Matt-Timmons Brown): https://github.com/the-raspberry-pi-guy/raspirobots
# Description: This program enables the
# Nintendo Wii remote control to make a robot
# move forwards (UP), backwards (DOWN), to the
# right (RIGHT), to the left (LEFT), and stop
# (B).

# Create a Robot object that is attached to 
# GPIO pins 17, 18, 22, and 27 of the 
# Raspberry Pi. These pins are inputs for the
# L293D motor controller.
robot = gpiozero.Robot(left=(22,27), right=(17,18))

print("Press down and hold buttons 1 and 2 on",
      " the Nintendo Wii remote.")
print(" ")
print("Hold down until you see a success message.")
print("If unsuccessful, try again.")

# Create a Wiimote object and assign it to the
# variable named wii. Bluetooth handshake
# is performed between the Wii remote
# and the Raspberry Pi
wii = cwiid.Wiimote()

print("Wiimote is Ready!")

# Turn on Wiimote reporting to enable the Python
# code to receive input from the Wiimote.
wii.rpt_mode = cwiid.RPT_BTN

while True:
  # Save the value of the button that was pressed
  # into a variable named buttons
  buttons = wii.state["buttons"]

  # Bit-wise AND operation. Returns 1 in each
  # bit position for which buttons and
  # cwiid.BTN_XXXX are ones.
  if (buttons & cwiid.BTN_LEFT):
      robot.left()
  if (buttons & cwiid.BTN_RIGHT):
      robot.right()
  if (buttons & cwiid.BTN_UP):
      robot.forward()
  if (buttons & cwiid.BTN_DOWN):
      robot.backward()
  if (buttons & cwiid.BTN_B):
      robot.stop() 

Press CTRL-X and save the program.

Run the Program

Make sure you Wii remote control has AA batteries in it.

Turn on the Wii remote control by pressing the Power button.

Power up your Raspberry Pi, and go to a terminal window. Open the robot directory:

cd robot

Run the wii_remote.py program.

python3 wii_remote.py

Press down the 1 and 2 buttons on the Wii remote at the same time and hold until you get a message that a Bluetooth connection has been made between the Raspberry Pi and the Wii remote control.

Bluetooth can be tricky to deal with on the Raspberry Pi, so if you fail to make the Bluetooth connection immediately, try again. Try to press and hold down 1 and 2 as soon as you run the code.

Once a connection has been made and assuming your robot is on the floor, press the arrow buttons on the remote control to drive your robot around.

The B button (trigger finger) enables you to stop the robot.

Typing CTRL – C in the terminal window stops the program.

Typing sudo shutdown – h now shuts off the Raspberry Pi. It is good practice to wait five seconds after you type this command before disconnecting the Rapberry Pi’s power.

To restart the Raspberry Pi, you just need to plug it into a power supply again.

Controlling the Speed of the Robot

You can control the speed of the robot by entering a number between 0 and 1 in the parentheses of the code I presented in the previous section. 0.50, for example, means 50% of full speed.

robot.forward(0.50)

GPIO pins in the Raspberry Pi can only be in two states, ON (+3.3 V) or OFF (0 V). By using a procedure known as pulse-width modulation (PWM), the GPIO pins switch ON and OFF so fast that the motor only perceives the average voltage. This technique enables the motor to have variable speeds as opposed to just two speeds (full speed and no speed at all).

We can also use the accelerometers of the Nintendo Wii remote to control the speed and direction of the robot. An accelerometer measures acceleration. And since the robot moves on only one plane, the x-y plane, we can move the Nintendo Wii remote forwards and backwards, and get the robot to respond to those actions.

For example, we can pitch the Wii remote forward (in the positive x-direction) to get the robot to move faster in the forward direction.

To make this happen, write the following program on your Raspberry Pi, and save it to your robot directory. You can name it wii_remote_variable.py.

import gpiozero  # GPIO Zero library
import cwiid  # Wii library

# File name: wii_remote_variable.py
# Code source (Matt-Timmons Brown): https://github.com/the-raspberry-pi-guy/raspirobots
# Date created: 5/27/2019
# Python version: 3.5.3
# Description: This program enables the
# Nintendo Wii remote control to make a robot
# move forwards, backwards, to the
# right, to the left using the accelerometer.

# Create a Robot object that is attached to 
# GPIO pins 17, 18, 22, and 27 of the 
# Raspberry Pi. These pins are inputs for the
# L293D motor controller.
robot = gpiozero.Robot(left=(22,27), right=(17,18))

print("Press down and hold buttons 1 and 2 on",
      " the Nintendo Wii remote.")
print(" ")
print("Hold down until you see a success message.")
print("If unsuccessful, try again.")

# Create a Wiimote object and assign it to the
# variable named wii. Bluetooth handshake
# is performed between the Wii remote
# and the Raspberry Pi
wii = cwiid.Wiimote()

print("Wiimote is Ready!")

# Turn on Wiimote reporting to enable the Python
# code to receive input from the Wiimote.
wii.rpt_mode = cwiid.RPT_BTN | cwiid.RPT_ACC

while True:
  # Store the x and y values of the accelerometer
  # into variables and scale to a number between
  # 95 and 145 and then -25 and 25. Negative
  # numbers mean backwards movement.
  x = (wii.state["acc"][cwiid.X] - 95) - 25
  y = (wii.state["acc"][cwiid.Y] - 95) - 25

  # Error checking to keep values in the interval
  # -25 to 25
  if x < -25:
    x = -25
  if y < -25:
    y = -25
  if x > 25:
    x = 25
  if y > 25:
    y = 25

  # Calculate a forward and turn value between -1
  # and 1
  forward_value = (float(x)/50)*2
  turn_value = (float(y)/50)*2

  # This code ensures the robot is not impacted
  # by slight movements in the remote control
  if (turn_value < 0.3) and (turn_value > -0.3):
    robot.value = (forward_value, forward_value)
  else:
    robot.value = (-turn_value, turn_value)

By holding the remote control sideways, with the Nintendo Wii’s direction pad (the cross on the remote) on your left, you can tilt and pitch the robot to move like you want it to.

Run the program (make sure the Raspberry Pi is not plugged in to a wall outlet, but rather the battery pack) by typing in the following command while inside your Raspberry Pi’s robot directory:

python3 wii_remote_variable.py

That’s it! At this point, your robot should be responding to your actions on the remote control. Move it forward, pitch it backward, and observe how your robot responds!

Press CTRL-C at any time in the terminal to stop the program.

How to Make a Wheeled Robot Using Raspberry Pi

In this post, I will show you how to make a wheeled robot using Raspberry Pi as the “brain” of the robot.

Special shout out to Matt Timmons-Brown for this project idea. He is the author of a really good book on Raspberry Pi robotics: (Learn Robotics with Raspberry Pi). Go check it out!

Requirements

Here are the requirements:

  • Make a wheeled robot using Raspberry Pi as the “brain” of the robot.

You Will Need

wheeled-robot-rpi-9

The following components are used in this project. You will need:

Directions

Building the Robot’s “Body”

Let’s start by building the body of the robot.

Grab the two 8×16 Lego plates, and place them apart from each other.

wheeled-robot-rpi-10

Connect the two 8×16 Lego plates with the two 2×8 Lego plates. Place them across to form a bridge.

wheeled-robot-rpi-11

Connect the other two 2×8 Lego plates to the underside of the 8×16 Lego plates to form a sandwich.

wheeled-robot-rpi-12
wheeled-robot-rpi-13

Solder male-to-male wires to both terminals of each motor (they might already be soldered). If you need a quick tutorial on how to solder, check out this video, or just Google “How to Solder”:

wheeled-robot-rpi-14
wheeled-robot-rpi-15
wheeled-robot-rpi-16
wheeled-robot-rpi-17

Pop the tires on to the white rod on both motors. Give it a strong push in there. The wheels should be on the other side of the motor terminals.

wheeled-robot-rpi-18

Stick the motor wires up through the gap in the robot body.

Mount the motors with tire to the underside of the robot’s body so that the tires are exactly in the middle of the body. Make sure the tires are exactly parallel to each other.

wheeled-robot-rpi-19

Secure the motors to the body of the robot using your hot glue gun (100W setting). If you don’t want the motors to be permanently stuck to the robot’s body, you can use Velcro or Scotch permanent mounting tape.

wheeled-robot-rpi-20
wheeled-robot-rpi-21
wheeled-robot-rpi-22

Stabilize the robot by adding five 2×4 Lego bricks to both the front of the body.

wheeled-robot-rpi-23

Mount the Raspberry Pi battery pack to the underside of the robot, slightly off-center of the body, using Velcro or Scotch permanent mounting tape. The small cable of the battery pack should face the front of the car.

Mount the 4xAA battery holder to the battery pack. Use Velcro or Scotch permanent mounting tape to secure it into place. Make sure that you are still able to reach the ON/OFF switch of the 4xAA battery pack.

wheeled-robot-rpi-24

Feed the negative (black) and positive (red) leads through the gap in the robot body.

wheeled-robot-rpi-25

Strip 1-2 cm of insulation off the end of the battery pack wires using the wire strippers.

Wrap the red and black wires of the battery pack around male-to-male jumper wires.

Solder the wires together so that they remain in place.

Apply black electrical tape around the connection once it has cooled.

wheeled-robot-rpi-26
wheeled-robot-rpi-27

Giving the Robot a “Brain” by Adding the Raspberry Pi

Our robot needs to have a brain. Otherwise, it is just a bunch of plastic parts that can’t do anything useful. In this project, we’ll use the Raspberry Pi as the robot’s brain.

Grab some Velcro and stick the Raspberry Pi on top of the front end of the robot’s body. Make sure it looks exactly like the image below.

wheeled-robot-rpi-28

Grab some Velcro and stick the 400-point solderless breadboard on the back end of the robot, opposite to where the Raspberry Pi is located. You could also peel off the back of the sticker on the solderless breadboard.

wheeled-robot-rpi-29
wheeled-robot-rpi-30
wheeled-robot-rpi-32

Giving the Robot a “Nervous System”

Now that the robot has a brain (Raspberry Pi mounted on the front of the robot) and a body, it needs a “nervous system,” communication lines that enable the brain to transmit signals to and from different parts of its body. In the context of this project, those communication lines are the wires that we need to connect between the different parts of the robot we’re building.

Setting up the Breadboard

Sink the 16 pins of the L293D motor controller down into the holes of the solderless breadboard so that the controller straddles the gap that runs the length of the breadboard.

Here is the diagram of the L293D.

L293D-with-motors

Put pin 1 (the pin just to the left of the half-circle notch in the L293D into pin e3 of the solderless breadboard. You’ll have to bend the legs a bit of the L293D to get it to sink down. Note: Ignore the AAA on the batteries below. They are actually AA.

pin1
wheeled-robot-rpi-33
wheeled-robot-rpi-34

Here is the pin diagram of the Raspberry Pi.

rpi_pin_diagram_2

Power up one set of positive/negative rails of the solderless breadboard:

  • 5V pin (pin 4) of the Raspberry Pi connects to the red (positive) power rail of the breadboard using a male-to-female jumper wire.
  • Connect the Ground pin (pin 6) of the Raspberry Pi to the blue (negative) power rail of the solderless breadboard.
pin2
wheeled-robot-rpi-36

Power up the other set of positive/negative rails of the solderless breadboard:

  • Connect the blue (negative) power rail to the other blue (negative) power rail using a male-to-male jumper wire.
  • Put the red positive lead of the 4xAA battery holder into a hole on the unused red (positive) rail of the solderless breadboard.
  • Put the black lead of the 4xAA battery holder into the blue (negative) rail of the solderless breadboard.
pin3
wheeled-robot-rpi-38
wheeled-robot-rpi-39

Connecting the 16 Pins of the L293D

Here is the diagram of the L293D motor controller.

L293D-with-motors-1

The L293D motor controller needs a power supply:

  • Connect pin 16 (vss 1) to the 5V red (positive) power rail of the solderless breadboard, the rail that is powered by the Raspberry Pi. This pin is the one that will provide power to the L293D motor controller. You can stick a male-to-male pin in g3 of the solderless breadboard and connect that to the red rail.
  • Connect all the GND pins of the L293D (pins 4, 5, 12, and 13) to the closest blue (ground) power rail of the solderless breadboard.
pin4

The motors need a power supply:

  • Connect a male-to-male wire from the red 6V power rail (the rail connected to the 4xAA battery pack) to pin 8 (vcc) of the L293D integrated chip.
pin5

In order for the motors to accept commands from the Raspberry Pi, we need to connect both enable pins (pins 1 and 9) of the L293D to red (positive) 5V power rails. Here are the steps:

  • Take a male-to-male jumper wire and make a connection between pin 1 of the L293D and the the red (positive) rail of the breadboard (the one connected to the 5V pin of the Raspberry Pi).
  • Take a male-to-male jumper wire and make a connection between pin 9 of the L293D and the the red (positive) rail of the breadboard (the one connected to the 5V pin of the Raspberry Pi).
pin6


We need to connect the motors to the output pins of the L293D.

  • Motor 1 (Right Motor)
    • Connect one of the leads to Output 1 (pin 3) of the L293D.
    • Connect the other lead to Output 2 (pin 6).
  • Motor 2 (Left Motor)
    • Connect one of the leads to Output 3 (pin 11) of the L293D.
    • Connect the other lead to Output 4 (pin 14).
pin8

Now, we need to connect the input pins of the L293D to the Raspberry Pi. There are two input pins for each motor.

  • Connect Pin 11 (GPIO 17) of the Raspberry Pi to pin 2 (Input 1) of the L293D.
  • Connect Pin 12 (GPIO 18) of the Raspberry Pi to pin 7 (Input 2) of the L293D.
  • Connect Pin 13 (GPIO 27) of the Raspberry Pi to pin 10 (Input 3) of the L293D.
  • Connect Pin 15 (GPIO 22) of the Raspberry Pi to Pin 15 (Input 4) of the L293D.
pin7

Insert fresh AA batteries into the 4xAA battery holder.

wheeled-robot-rpi-35

Whew! That was a lot of work. If you made it this far, congratulations! You have completed construction of your Raspberry Pi wheeled robot.

In order for it to do something useful (e.g. move from one place to another), we need to program its brain, the Raspberry Pi. We will tackle this in the next post.

How to Read Input from a Push Button Switch on Raspberry Pi 3 Model B+

In this post, I’ll show you how to read input from a push button switch on Raspberry Pi 3 Model B+. This project shows you how to use the Raspberry Pi’s GPIO pins as an input (instead of an output) to receive information from the outside world.

Requirements

Here are the requirements:

  • Detect if a switch button is pressed.
  • When button is pressed, print “Button is pressed!”.
  • When button is not pressed, print “Button is not pressed!”.

You Will Need

push-button-2

The following components are used in this project. You will need:

Directions

Set up the Raspberry Pi

Set up the Raspberry Pi as explained in this video:

Wire the Push Button Switch to the Breadboard

push-button-3
push-button-4

Write the Program and Execute

Now we need to write a program in Python.

I have a folder in my Home Directory named robot. I get to this directory by opening up a terminal window in Raspberry Pi and typing:

cd robot

Now, we open up the Nano text editor to enable us to write the Python program. We name it push_button.py. Here is the terminal command:

nano push_button.py

We type in this python code:

import gpiozero  # We are using GPIO pins

button = gpiozero.Button(17) # GPIO17 connects to button 

while True:
  if button.is_pressed:
    print("Button is pressed!")
  else:
    print("Button is not pressed!")

We then press CTRL-X, then Y, then press Enter to save the program and return to the terminal.

To run the program, we type:

python3 push_button.py

When you press the push button switch, you should see a message that says “Button is pressed!”. Otherwise, you will see a message that says “Button is not pressed!”.

push-button-5
push-button-1

To stop the program, you press CTRL-C.