The Internet Controlled RC Car allows you to remotely drive around a small rc car from wherever you may be and see where it is going. This is fun because you can remote explore whatever space you leave it in, or hand over the keys – so to speak – and allow someone to drive around your space. This is also a great building block for a telepresence robot.
This project is also a great beginner project for someone who has made a few simple things and is looking to get slightly deeper into the world of microcontrollers. It starts to incorporate more advanced skills like circuit building and networking, but is not dauntingly complex.
Step 1: Materials
You will need:
(x1) RC car (RadioShack #60-875)
(x1) Wireless camera (RadioShack #55056398 – web only)
(x1) Arduinio Uno (RadioShack #276-128)
(x1) Seeed Ethernet Shield (RadioShack #276-241)
(x1) Rectangular PCB (RadioShack #276-150)
(x1) 1″ round PCB (RadioShack #276-004)
(x1) 7805 5V regulator (RadioShack #276-1770)
(x1) 10uF capacitor (RadioShack #272-1013)
(x1) 0.1uF capacitor (RadioShack #272-135)
(x1) M-type jack (RadioShack #274-1582)
(x1) K-type plug (RadioShack #274-1567)
(x4) 5V SPST relays (RadioShack #275-232)
(x1) 6″ x 4″ x 2″ project enclosure (RadioShack #270-1806)
(x1) 7.2V rechargeable battery (RadioShack #23-2183)
(x5) AA batteries (RadioShack #23-2212)
(x1) Ethernet cable (RadioShack #55058573 – web only)
(x1) USB cable (RadioShack #26-713)
(x1) Assorted zip ties (RadioShack #55066143 – web only)
(x1) Shrink tube (RadioShack #278-1627)
(x1) M3 nut, bolt and washer
Step 2: Insert the Shield
Insert the shield’s male header pins in the matching female header pins on the Arduino.
Step 3: Remove the Cover
Remove the four screws from the bottom of the RC car keeping the top plastic cover in place, and put the screws aside for later reassembly.
Remove the top cover.
Step 4: Power Conversion Circuit
Build the circuit to convert 7.2V to 5V on the 1″ round PCB as specified in the schematic.
Step 5: Plug
Attach a red wire between the 5V output on the power conversion PCB and the K-type plug’s center pin.
Attach a black wire between ground and the outer jack connection.
Twist the cover on the jack shut to insulate it.
Step 6: M-type Socket
Connect a black wire between ground on the round power conversion PCB to the center pin on the M-type jack.
Connect another black wire to the pinon the M-type jack to the left of center.
Connect two red wires to the pin to the right of center. Connect one of these red wires to the power input pin of the LM7805 voltage regulator.
Step 7: Connect a Battery
Cut the power connector off of the 7.2V rechargeable battery.
Solder the red wire from the battery to the unused red wire from the M-type jack.
Solder the black wire from the battery to the unsused black wire from the M-type jack.
Insulate any exposed connections with shrink tube.
Step 8: Remove the Circuit Board
Remove the screws from the remote control and open the case.
Next, remove the screw securing the circuit board in place, and cut the wires going to the battery compartment to free it from the case.
Step 9: Clean the Contacts
Use a Q-tip covered in rubbing alcohol to clean any grease that may be on the contacts for the joystick controls.
Step 10: Solder Wires
Solder wires to each of the contact pads for the remote control’s joysticks.
Step 11: Relays
Solder four relays to the rectangular PCB board.
Step 12: Wire it Up
Wire the remote control board to the relay board as specified in the wiring diagram.
Step 13: Connect the Arduino
Connect the Arduino to the relay board as specified in the circuit diagram.
Step 14: Program
Setting up the wifi camera could be an Instructable unto itself, and I am not going to go over it here. That said, it comes with a pretty thorough instruction booklet for getting it configured. To get it running, just follow along with the instruction booklet that came with the camera.
What I will go over is the Arduino program.
Fortunately, there is not much to cover. The Arduino will be used to load a website at specific IP address. When you click on the links on this website, it will send HTTP requests back to the Arduino. These requests are then processed by the Arduino to trigger the relays connected to the car’s remote control. When the relays are toggled high, the remote is activated and the car moves around. You can then see where it moves by loading the web interface for the IP camera in the background.
To prepare the Arduino, simply program it with the following code:
/********************************* Internet Controlled RC Car For more info visit: <a href="http://www.instructables.com/Internet-Controlled-RC-Car/"> http://www.instructables.com/Internet-Controlled-...</a> Code is in the public domain ***********************************/ //include necessary libraries #include <SPI.h> #include <Ethernet.h> //mac address does not change byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //change this to your IP address //this can be found by running the program //File --> Examples --> Ethernet --> DhcpAddressPrinter IPAddress ip(192,168,2, 7); // Initialize the Ethernet server library // with the IP address and port you want to use // (port 80 is default for HTTP): EthernetServer server(80); String webClickRequest; void setup(){ // initialize the digital pin as an output. pinMode(4, OUTPUT); pinMode(5, OUTPUT); pinMode(6, OUTPUT); pinMode(7, OUTPUT); // Open serial communications and wait for port to open: Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for Leonardo only } // start the Ethernet connection and the server: Ethernet.begin(mac, ip); server.begin(); Serial.print("server is at "); Serial.println(Ethernet.localIP()); } void loop(){ // Create a client connection EthernetClient client = server.available(); if (client) { while (client.connected()) { if (client.available()) { char c = client.read(); //read the incoming HTTP request if (webClickRequest.length() < 100) { //store the request to a string webClickRequest += c; } //check to see if the request has come to an end if (c == '\n') { //Begin drawing out the website using //using basic HTML formatting with some CSS client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println(); client.println("<HTML>"); client.println("<HEAD>"); client.println("<TITLE>Internet Controlled RC Car</TITLE>"); client.println("<STYLE>"); client.println("body{margin:50px 0px; padding:0px; text-align:center;}"); client.println("h1{text-align: center; font-family:\"Trebuchet MS\",Arial, Helvetica, sans-serif; font-size:24px;}"); client.println("a{text-decoration:none; width:75px; height:50px; border-color:black; font-family:\"Trebuchet MS\",Arial, Helvetica, sans-serif; padding:6px; background-color:#aaaaaa; text-align:center; border-radius:10px 10px 10px; font-size:24px;}"); client.println("a:link {color:white;}"); client.println("a:visited {color:white;}"); client.println("a:hover {color:red;}"); client.println("a:active {color:white;}"); client.println("</STYLE>"); client.println("</HEAD>"); client.println("<BODY>"); client.println("<H1>Internet Controlled RC Car</H1>"); client.println("<br />"); client.println("<br />"); client.println("<a href=\"/?left\"\">LEFT</a>"); client.println(" "); client.println("<a href=\"/?forward\"\">FORWARD</a>"); client.println(" "); client.println("<a href=\"/?right\"\">RIGHT</a>"); client.println("<br />"); client.println("<br />"); client.println("<br />"); client.println("<a href=\"/?backleft\"\">BACK LEFT</a>"); client.println(" "); client.println("<a href=\"/?back\"\">BACK</a>"); client.println(" "); client.println("<a href=\"/?backright\"\">BACK RIGHT</a>"); client.println("</BODY>"); client.println("</HTML>"); //Stop loading the website delay(1); client.stop(); //check to see if any of the drive commands have been sent //from the webpage to the Arduino if(webClickRequest.indexOf("?left") > 0){ Serial.println("hello"); left(); delay(1000); brake(); } else if(webClickRequest.indexOf("?forward") >0){ forward(); delay(1000); brake(); } else if(webClickRequest.indexOf("?right") >0){ right(); delay(1000); brake(); } else if(webClickRequest.indexOf("?backleft") >0){ left(); reverse(); delay(1000); brake(); } else if(webClickRequest.indexOf("?back") >0){ reverse(); delay(1000); brake(); } else if(webClickRequest.indexOf("?backright") >0){ right(); reverse(); delay(1000); brake(); } //clear the string for the new incoming data webClickRequest=""; } } } } } //drive functions //here on down void reverse(){ digitalWrite(4, LOW); digitalWrite(5, HIGH); } void forward(){ digitalWrite(4, HIGH); digitalWrite(5, LOW); } void right(){ digitalWrite(6, HIGH); digitalWrite(7, LOW); } void left(){ digitalWrite(6, LOW); digitalWrite(7, HIGH); } void brake(){ digitalWrite(4, LOW); digitalWrite(5, LOW); digitalWrite(6, LOW); digitalWrite(7, LOW); }
Step 15: Reattach the Antenna
Attach the antenna back to the appropriate part of the remote control board using a nut, bolt and washer.
For more detail: Internet-Controlled RC Car using Arduino