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.
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
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();
}
#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
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
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>
<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