Introduction: Internet Controlled Car
Internet controlled Destroyer is essential in all civil and military cars. Military can use this technology to decrease the loose of soldiers by sending machines to fight while they are safe in the control room.
Controlling over internet opens a whole new window for everything not just only cars you can control your home machines, control garage which ease our life
The Arduino UNO will work as a microcontroller
The car should be fully controlled by the internet over 3G, wifi, or any other internet provider.
Step 1: Parts
Equipments used
Arduino Uno
Ethernet Shield
3G wireless portable Router
Handmade Motor Controller
Wireless camera
minicar toy
servo
dongle
Step 2: Programming the Arduino
connect the board to the pc and upload the code to have access to the internet
#include <EEPROM.h>
#include <Servo.h>
#include <Wire.h>
#include <SERVER328.h>
#include <SPI.h>
#include <Ethernet.h>
// User configurable variables
byte useDhcp = true;
byte useDns = true;
byte mac[] = { 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX };
char serverName[] = "us01.proxy.SERVER.org"; // Only if useDns is true
unsigned int serverPort = 5353; // Can be set to either 53 or 5353
byte statusLedPin = 8;
// User configurable key, this is used to authenticate with the proxy server
// This is checked against the EEPROM on boot and written if necessary
// The proxy server retreives the key from the EEPROM
byte key[] = { 0xXX, 0xXX, 0xXX, 0xXX,
0xXX, 0xXX, 0xXX, 0xXX,
0xXX, 0xXX, 0xXX, 0xXX,
0xXX, 0xXX, 0xXX, 0xXX };
// Other required variables
byte data[257];
byte dataLength;
byte hexStage;
unsigned long lastInstruction = 0;
unsigned long lastRefresh = 0;
byte stage = 0;
// Declare client object
EthernetClient Client;
void setup()
{
// Load presets
SERVER.loadPresets();
// Set status LED pin
SERVER.setStatusLedPin(statusLedPin);
SERVER.setStatusLed(1); // Initialisation
// Check the EEPROM header and check to see if the key is correct
// This is to ensure the key is not cleared from the EEPROM
if(EEPROM.read(0) != '#')
{
EEPROM.write(0, '#');
}
if(EEPROM.read(1) != 0)
{
EEPROM.write(1, 0);
}
if(EEPROM.read(2) != '#')
{
EEPROM.write(2, '#');
}
if(EEPROM.read(160) != '#')
{
EEPROM.write(160, '#');
}
for(byte i = 0; i < 16; i++)
{
if(EEPROM.read(161 + i) != key[i])
{
EEPROM.write(161 + i, key[i]);
}
}
if(EEPROM.read(177) != '#')
{
EEPROM.write(177, '#');
}
// Start network and attempt to connect to proxy server
SERVER.setStatusLed(2); // Network configuration
if(useDhcp)
{
if(!Ethernet.begin(mac))
{
SERVER.setStatusLed(2, false, 10000);
SERVER.reset();
}
}
delay(1000);
SERVER.setStatusLed(3); // Connect to server
if(useDns && !Client.connect(serverName, serverPort))
{
SERVER.setStatusLed(3, false, 10000);
SERVER.reset();
}
lastInstruction = millis();
}
void loop()
{
if(Client.connected())
{
// What we need to do depends on which 'stage' we are at
switch(stage)
{
case 0: // Wait for start byte
if(Client.available())
{
char c = Client.read();
if(c == '?')
{
stage++;
}
}
break;
case 1: // Reset variables
dataLength = 0;
hexStage = 0;
stage++;
break;
case 2: // Instruction byte
if(Client.available())
{
char c = Client.read();
if(c == '?')
{
stage = 1;
break;
}
else if(c == '\r' || c == '\n' || c == '.')
{
stage = 0;
break;
}
if(!hexStage)
{
data[0] = SERVER.hexDecode(c) * 16;
}
else
{
data[0] += SERVER.hexDecode(c);
}
hexStage = !hexStage;
if(!hexStage)
{
stage++;
}
}
break;
case 3: // Data length byte
if(Client.available())
{
char c = Client.read();
if(c == '?')
{
stage = 1;
break;
}
else if(c == '\r' || c == '\n' || c == '.')
{
stage = 0;
break;
}
if(!hexStage)
{
data[1] = SERVER.hexDecode(c) * 16;
}
else
{
data[1] += SERVER.hexDecode(c);
}
hexStage = !hexStage;
if(!hexStage)
{
stage++;
}
}
break;
case 4: // Data
if(Client.available())
{
char c = Client.read();
if(c == '?')
{
stage = 1;
break;
}
else if(c == '\r' || c == '\n' || c == '.')
{
if(dataLength == data[1])
{
stage++;
break;
}
else
{
stage = 0;
break;
}
}
if(!hexStage)
{
data[2 + dataLength] = SERVER.hexDecode(c) * 16;
}
else
{
data[2 + dataLength] += SERVER.hexDecode(c);
}
hexStage = !hexStage;
if(!hexStage)
{
dataLength++;
}
}
break;
case 5: // Execute instruction and return result
SERVER.instruction(data);
Client.write('!');
for(int i = 0; i < data[1] + 2; i++)
{
Client.write(SERVER.hexEncode(data[i] / 16));
Client.write(SERVER.hexEncode(data[i] % 16));
}
Client.write('\n');
lastInstruction = millis();
stage = 0;
break;
}
}
else
{
SERVER.setStatusLed(10);
SERVER.reset();
}
// Has the instruction timeout been reached?
if(millis() - lastInstruction > 30000)
{
Client.flush();
Client.stop();
SERVER.setStatusLed(9);
SERVER.reset();
}
// Process refreshes every 50ms
if(millis() - lastRefresh >= 50)
{
SERVER.pinTimers();
SERVER.shiftRegisterTimers();
SERVER.shiftRegisters();
lastRefresh = millis();
}
// Check to see if reset has been requested
SERVER.checkReset();
}
Step 3: Voltage Regulator
I have used the 7806 which have the attached pic specs.
But I couldn’t use it alone since it can handle up to 1A at the output while I need 3A and I don’t want to use 3 regulators to get to that result therefore i implemented the following way which allow you to have what you need and even more if you requested
The main idea is that am collecting the Ampere from the 2N0355 power transistor and the voltage from the regulator which gives the perfect match for my component
Step 4: Motor Controller
There are many ways to control a motor but my problem was that I needed Tristate way which allow me to control the motor on standby mode, forward and backward and with high power therefore I used a handmade circuit done by myself which gave me the privilege to have full control of my motor.
The Motor need
Voltage = 6V
Iload(max) = 1.25A
In general, we use both PNP or NPN transistors as switches. However,
First we need to make sure that the transistor can safely handle the worst current we might draw. The parameter we are looking for is the maximum collector current, Ic(max).
Next we have to verify that the transistor can safely handle the supply voltage we plan to use. The parameter we are looking for is the maximum collector emitter voltage, Vceo(max).
Now we need to calculate whether we can provide sufficient base current to keep the transistor in saturation. First we need to find what the base current will be when the transistor is carrying the worst-case current of 1.25 A. Arduino, can deliver (safely) at most 40 mA.
Therefore the TIP120 is used after looking to its specifications.
First, we see that Ic(max) = 5 A, and that Vceo(max) is 60, 80, or 100 V, so we are fine so far.
Next we check the base current. Ic=250 * Ib or our collector current of 1.25 A requires a base current of 5 mA (5 * 250 = 1250), which is well below the maximum of 40 mA the Arduino can put out.
Finally we need to select a base resistor which will be low enough to ensure that the TIP120 remains saturated, but high enough to prevent the Arduino from trying to deliver more current than it should. We want a current between 5 mA and 40 mA, so let’s pick a midway point of 20 mA.
When the collector current is 1 A, Vbe(sat) is about 1.5 V. Now if the Arduino is putting out 5 V, and Vbe is 1.5 V, that means that the resistor has a voltage drop of (5 – 1.5) or 3.5 V across it. Using Ohm’s law, R = V/I = 3.5/(20 mA)= 175 Ohms
Step 5: Webpage
The webpage code is:
<html>
<body>
<p align="center">title</p>
<table>
<tr>
<td>
<html>
<head>
<link rel="stylesheet" rev="stylesheet" href="dlink.css?cidx=1.022011-11-07" type="text/css">
<title>Camera</title>
<META content="text/html; charset=windows-1252" http-equiv=Content-Type>
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Expires" CONTENT="-1">
<script language="Javascript" SRC="function.js?cidx=1.022011-11-07"></script>
<script language="Javascript">
function Init() {
cvcs.RemoteHost = "192.168.10.30"
cvcs.RemoteWeb = 800
cvcs.Timeout = 5
cvcs.AuthType = 1
cvcs.PreviewFrameRate = 1
cvcs.PreviewWidth = 640
cvcs.PreviewHeight = 480
cvcs.DeviceSerialNo = "YWRtaW46"
window.setInterval("ShowFrameRate()", 1000)
if (1) {
audioon.disabled = false;
audiooff.disabled = false;
} else {
audioon.disabled = true;
audiooff.disabled = true;
}
if (0 == 1) {
nightmodeon.disabled = false;
nightmodeoff.disabled = false;
} else {
nightmodeon.disabled = true;
nightmodeoff.disabled = true;
}
}
function ShowFrameRate() {
if (1)
{
var fFrameRate = cvcs.FrameRate
window.status = "Frame:" + fFrameRate.toString() + " fps"
if (0)
CurrentFrame.innerHTML = "Frame:" + fFrameRate.toString() + " fps"
}
cvcs.Play()
CurrentTime.innerHTML = cvcs.TimeString
}
function SubmitAudioOn()
{
cvcs.Mute(0);
javascript:document.forms[0].submit();
}
function SubmitAudioOff()
{
cvcs.Mute(1);
javascript:document.forms[1].submit();
}
function SubmitNightModeOn()
{
javascript:document.forms[2].submit();
}
function SubmitNightModeOff()
{
javascript:document.forms[3].submit();
}
</script>
</head>
<body topmargin="1" leftmargin="0" rightmargin="0" onload="Init()" onunload="cvcs.Stop()">
<table border="0" cellpadding="0" cellspacing="0" width="838" align="center" bgcolor="#FFFFFF" bordercolordark="#FFFFFF">
<tr><td>
<table border="0" cellpadding="0" cellspacing="0" width="838" align="center" bgcolor="#FFFFFF" bordercolordark="#FFFFFF">
<tr>
<td valign="top" id="maincontent_container" height="420">
<table height="420" width=100% border="0" cellpadding="0" cellspacing="0" bgcolor="white">
<tr><td>
<div id="maincontent">
<!-- === BEGIN MAINCONTENT === -->
<div class="box">
<table cellpadding="2" cellspacing="1" border="0" width="534" bgcolor="white" bordercolor="#FFFFFF">
<tr><td align="center">
<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr>
<td bgcolor=black><font color=white><BR></font></td>
<td bgcolor=black align=right valign=top> <font color=white><SPAN id="CurrentTime"></SPAN></font></td>
</tr>
<tr>
<td colspan=2 align=center bgcolor="white">
<OBJECT ID="cvcs" WIDTH=640 HEIGHT=480
CLASSID="CLSID:7191F0AC-D686-46A8-BFCC-EA61778C74DD"
CODEBASE="aplugLiteDL.cab#version=2,3,2,22">
</OBJECT>
</td>
</tr>
</TABLE>
</td></tr>
</table>
</div>
<!-- === END MAINCONTENT === -->
</div>
</td></tr>
<tr height=100%><td></td></tr>
</table>
</td>
</tr>
</table>
</td></tr></table>
</body>
<form action="/audiocontrol.cgi" method="POST">
<INPUT type="hidden" name="AudioMute" value="0">
</form>
<form action="/audiocontrol.cgi" method="POST">
<INPUT type="hidden" name="AudioMute" value="1">
</form>
<form action="/nightmodecontrol.cgi" method="POST">
<INPUT type="hidden" name="IRLed" value="1">
</form>
<form action="/nightmodecontrol.cgi" method="POST">
<INPUT type="hidden" name="IRLed" value="0">
</form>
</html>
</td>
<td>
<table width="300">
<tr>
<td colspan="2" align="center"><a href="http://us01.proxy.SERVER.org/api/1.0/328.php?k={9AA615BA7DA56B88DD093F23F6E0F56E}&r=setDigitalOutput&pin=5&output=2" target="frame"><img src="forward.jpg" border="0"/></a></td>
</tr>
<tr>
<td width="50%" align="center"><a href="http://us01.proxy.SERVER.org/api/1.0/328.php?k={9AA615BA7DA56B88DD093F23F6E0F56E}&r=setDigitalOutput&pin=9&output=2" target="frame"><img src="left.jpg" border="0"/></a></td>
<td align="center"><a href="http://us01.proxy.SERVER.org/api/1.0/328.php?k={9AA615BA7DA56B88DD093F23F6E0F56E}&r=setDigitalOutput&pin=10&output=2" target="frame"><img src="right.jpg" border="0"/></a></td>
</tr>
<tr>
<td colspan="2" align="center"><a href="http://us01.proxy.SERVER.org/api/1.0/328.php?k={9AA615BA7DA56B88DD093F23F6E0F56E}&r=setDigitalOutput&pin=6&output=2" target="frame"><img src="backward.jpg" border="0"/></a></td>
</tr>
</table>
<br/><br/>
<table width="400" height="300" border="0">
<tr>
<td align="center" valign="center" height="50%"><a href="http://us01.proxy.SERVER.org/api/1.0/328.php?k={9AA615BA7DA56B88DD093F23F6E0F56E}&r=setServo&servo=0&position=45" target="frame"><font color="red" size="5"><b>45</b></font></a></td>
<td align="center" valign="top"><a href="http://us01.proxy.SERVER.org/api/1.0/328.php?k={9AA615BA7DA56B88DD093F23F6E0F56E}&r=setServo&servo=0&position=90" target="frame"><font color="red" size="5"><b>90</b></font></a><br/><br/><br/><br/><br/>
<a href="http://us01.proxy.SERVER.org/api/1.0/328.php?k={9AA615BA7DA56B88DD093F23F6E0F56E}&r=setDigitalOutput&pin=12&output=2" target="frame"><font color="blue" size="4"><b>FIRE</b></font></a></td>
<td align="center" valign="center"><a href="http://us01.proxy.SERVER.org/api/1.0/328.php?k={9AA615BA7DA56B88DD093F23F6E0F56E}&r=setServo&servo=0&position=135" target="frame"><font color="red" size="5"><b>135</b></font></a></td>
</tr>
<tr>
<td align="left" valign="top"><a href="http://us01.proxy.SERVER.org/api/1.0/328.php?k={9AA615BA7DA56B88DD093F23F6E0F56E}&r=setServo&servo=0&position=10" target="frame"><font color="red" size="5"><b>10</b></font></a></td>
<td></td>
<td align="right" valign="top"><a href="http://us01.proxy.SERVER.org/api/1.0/328.php?k={9AA615BA7DA56B88DD093F23F6E0F56E}&r=setServo&servo=0&position=170" target="frame"><font color="red" size="5"><b>170</b></font></a></td>
</tr>
</table>
</td>
</tr>
</table>
<iframe width="0" height="0" framborder="0" name="frame"></iframe>
</body>
</html>
Step 6: The End
in the end you will get something like this :D

Participated in the
Arduino Contest
8 Comments
5 years ago on Step 4
Hi
Why didn't you use the l298d module as motor driver instead of implementing the circuit shown in step 4?
6 years ago
Hello!
Hope all is well.
This is Jim from WIZnet.
As you might already know, WIZnet is well known for its hardwired TCP/IP chip and its W5100 being used in Arduino’s official Ethernet shield.
We also partnered with ARM as mbed silicon partners, and plan to offer more platforms for makers.
To help makers grow the open source hardware community, we are having an IoT design contest, titled ‘Curation is Creation.’
Come up with any IoT project idea and take advantage of this contest since we’re offering our ARM mbed-enabled WIZwiki-W7500 platform & WizFi310 shield at sample pricing.
To start, register your account at www.CyberMakerSpace.com
This contest will be held from May to August, with 16 prizes totaling $15,000.
We expect and hope that many makers, including members of WIZnet Museum www.wiznetmuseum.com, will participate and share their knowledge.
As this is a contest for the open source community, WIZnet wants to give back the power of the vote to all participants.
Hence, you can vote and provide feedback of other projects from September to October.
More details of the contest are available at www.CyberMakerSpace.com and technical questions are answered at https://forum.wiznet.io/
Hopefully, you’ll find interest in this contest and we look forward to your next creative IoT project!
Sincerely,
Best Regards,
Jim
8 years ago on Introduction
This is good.
I have been searching some application references in which WIZnet solution is applied, and found your project using Ethernet Shield.
In the Ethernet Shield WIZnet's W5100 chip is embedded.
If you are O.K. I'd like to post this article in WIZnet Museum (http://wiznetmuseum.com) for others.
9 years ago on Introduction
what does servo and dongle used for ?
9 years ago on Introduction
hi sir, I am a beginner in arduino, can anw explain what is "#include <SERVER328.h>" and char serverName[] = "us01.proxy.SERVER.org";
And how can I make my own server plz and thanks
9 years ago on Introduction
Hey nice robot!
How do I view the webpage?...should I just save it as an html file and run it in chrome?
Thanks
Reply 9 years ago on Introduction
if you dont have a server yes you can do that but the camera frame wont work unless the camera is connected
Thanks
9 years ago on Introduction
thank you chris :D