- added headlights to the car
I have used the Raspberry Pi in this project to control the toy car. I
have a long history of remotely controlling stuff. Almost thirty years ago, I have made a board with
relays to remotely control the toy car using ZX Spectrum 48 computer. At that time, I have purchased Z80
PIO chip, made a PCB board and soldered transistors, resistors and relays so I could drive the
wired-controled toy car.
Last couple of years I was thinking of doing the same, but with the
wirelessly-controlled car. I didn't want to use existing electronics and remote control that came with
the toy car. I wanted to control the car using my computer.
I was looking at the old remotely
controlled car which my kids used to play with. All the electronics was either broke, or missing. I just
had the chassis with two motors: front to steer the car left/right and the back one to move the car
forward/back. I figured out that I could use that car to play with. All I had to do was to get some
controller and to wire that controller to some small computer that could be placed on the car. I was
thinking of putting the smart phone on the car, but then the Rapspberry Pi came. Pi is much better
choice, since it already has GPIO ports, while smart phones need some extra hardware (for example, the
Android has IOIO hardware for that purpose).
So, this was my initial plan: get the Pi, get the
controller, mount both on the car and make some software which would allow me to drive the car using my
PC, or smart phone, by sending commands via WiFi. If I could mount some USB web cams on the car, even
better.
This is the initial result:
The first car
I have purchased the controller based on the L298HN chip and placed that on the chassis:
It is quite easy to control the car using this
piece of electronics. There are four pins at the lower right corner and they are used to control two
motors: first two pins control the left/right motor, while next two pins control the forward/back motor.
The second car
I have
purchased a Raspberry Pi to control the car. When it arrived, I have placed it on the car, but the car
could not drive on carpets because the wheels were too small. So I bought a new toy car with bigger
wheels and stripped all the electronics:
This was the initial configuration:
There is a LiFePo4 battery, voltage converter to 5V, with two female USB
connectors, a Pi, and a driver. The battery has three cells, and gives 9.9V. I have put three diodes in
series to lower the voltage for the motors (quick&dirty solution).
I have plugged the USB
WiFi dongle into the Pi, so could I connect it to my home network. That way, I could send commands from my
PC or smartphone and therefore control both motors (drive the car).
The first thing I did was to copy
the Python test program to the Pi to see if I could control motors using the Python
code:
#!/usr/bin/env python
import RPi.GPIO as
GPIOimport time
PORT_BACK =
26PORT_FORWARD = 19PORT_LEFT = 13PORT_RIGHT =
6GPIO.setmode(GPIO.BCM)GPIO.setup(PORT_FORWARD,
GPIO.OUT)GPIO.setup(PORT_BACK, GPIO.OUT)GPIO.setup(PORT_LEFT,
GPIO.OUT)GPIO.setup(PORT_RIGHT,
GPIO.OUT) GPIO.output(PORT_FORWARD,
1)time.sleep(1)GPIO.output(PORT_FORWARD,
0)
GPIO.output(PORT_BACK,
1)time.sleep(1)GPIO.output(PORT_BACK,
0)
GPIO.output(PORT_LEFT,
1)time.sleep(1)GPIO.output(PORT_LEFT,
0)
GPIO.output(PORT_RIGHT,
1)time.sleep(1)GPIO.output(PORT_RIGHT,
0)GPIO.cleanup()
As you can see, it is quite easy to control motors using Python code on
Pi. All you have to do is to send 1 to the port to turn on the motor, and 0 to turn it off.
The
next thing was to make a Python application that would be a TCP/IP server. It would wait clients to
connect and then would wait for commands, in form of strings. Clients would be either PCs, or
smartphones. I have created a simple protocol to control the car. It is text-based and clients just send
short strings which Python server receives, parses and executes. Here is the list:
- F - turn on the forward/reverse motor to go Forward,
- B - turn on the forward/reverse motor to go Back,
- x - turn off the forward/reverse motor,
- L - turn on the left/right motor to go Left,
- R - turn on the lett/right motor to go Right,
- X - turn off the left/right motor,
- exit - client disconnects,
- shutdown - shutdown the Pi,
- reboot - reboot the Pi.
The client application can send combinations like: 'FL', or 'BL', meaning 'move forward and left',
or 'move backwards and left'.
Then I have added two web cams: one
for the front view, and the other one for the rear view:
I have installed the
mjpegstreamer application which
streams live webcam videos from both cams on the web server (two ports:8080 and 8081).
Then I have upgraded my client applications (both Android and Java Swing)
to work with live streaming coming form the Pi. Both applications can connect to the Python server and
mjpegstreamer at the same time. They show the live video stream from both cams, and send commands
from the keyboard, or gamepad to the Python server:
Android app
Java Swing app
Schematics
Here is a simplified schematics:
Very simplified schematics
WiFi dongle problem
The USB WiFi dongle which people usually buy for the Pi has very small
antenna (Realtek RTL8188CUS chipset). That antena is so small, that my car used to lose the WiFi
connection in rooms not close to the home WiFi access point. That is why I have purchased another WiFi
dongle, but with the bigger antena on it. However, this one had the Ralink chipsed, instead of Realtek.
That was the problem since there was no support for the Ralink-based WiFi dongles in the Linux kernel
prior to v4.0 (all this happened last year). So I had to make&install Linux kernel driver for it...
Not the fun stuff. When the support for the Ralink dongles finally arrived (with the 4.0 kernel), I was
able to use the dongle without building kernel drivers. Currently I have a Linux kernel v4.0 on my Pi,
and the dongle works out of the box.
USB and Power problem
On my Pi I had three USB ports filled with devices (one WiFi dongle and
two webcams). Pi cannot provide enough power on its four USB ports for all the devices I plugged in, so
I had to put the powered USB hub. I had a spare female USB connector from the 5V voltage converter (the
first one was used to power up the Pi). I have connected the power input of the USB hub to that other
female USB connector:
The powered hub is below the webcam (the blue box). All USB devices
are now plugged in it.
The current configuration looks like this: