Build your own Robotic WebCam: Overview
Here's how to build a webcam that can be viewed and controlled from the web:
- user clicks on one of three links: left, center, right
- a script written in PHP makes a socket connection to a listener program (written in C++) running on my home PC, indicating the direction of movement requested.
- the listener program executes one of three scripts (written in Visual Basic), one for each direction of movement.
- the Visual Basic script opens the COM2 serial port and sends one of three signals (L, C, or R).
- the pins of the COM2 port are connected to a Parallax BASIC microcontroller. it is running a small progam (written in Parallax Basic) which listens for signals.
- upon receiving the turn signal on the COM2 port the microcontroller sends a pulse signal to the servo motor. depending on the duration of the positive-going pulse, the servo rotates accordingly.
Required Hardware
|
|
![]() |
|
![]() |
|
![]() |
|
![]() |
|
Hardware Setup |
|
![]() |
|
![]() |
|
Software
Where: webserver
Purpose: opens a socket and sends command to listener
running on PC
Language: PHP
if (isSet($dir))
{
$fp = fsockopen ("YOUR.IP.ADDR", 443, &$errno, &$errstr, 30);
if (!$fp)
die ($errstr);
fputs ($fp, $dir);
fclose ($fp);
}
Where: PC
Purpose: listens for incoming commands from PHP script and
executes VBS scripts
Language: C++
#include "stdafx.h"
#include "afxsock.h"
CWinApp theApp;
using namespace std;
void failure (char *err)
{
AfxMessageBox (err);
exit (-1);
}
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
// initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
failure ("Unable to init MFC!");
// initialize sockets
if (!AfxSocketInit ())
failure ("Unable to init Winsock!");
CSocket in;
if (!in.Create (443))
failure ("Unable to init Socket!");
in.Listen (5);
while (1)
{
// blocks until connection received
CSocket newconn;
BOOL rc = in.Accept (newconn);
if (!rc)
{
printf ("ACCEPT ERROR!\n");
continue;
}
struct tm *newtime;
time_t aclock;
time( &aclock ); /* Get time in seconds */
newtime = localtime( &aclock ); /* Convert time to struct */
// get one byte
char buf;
int num_received = newconn.Receive (&buf, 1);
newconn.Close ();
if (num_received)
{
cout << asctime( newtime );
switch (buf)
{
case 'R':
printf ("RIGHT!\n");
system ("RIGHT.vbs");
break;
case 'L':
printf ("LEFT!\n");
system ("LEFT.vbs");
break;
case 'C':
printf ("CENTER!\n");
system ("CENTER.vbs");
break;
default:
printf ("ERROR!\n");
break;
}
}
}
in.Close ();
return 0;
}
Where: PC
Purpose: send signal "L", "C", or "R" on
COM2 serial port
Language: Visual Basic Script (.vbs) (Why VBS? Because I couldn't
figure out how to do it in Win32.)
' CENTER.vbs
Set com = CreateObject ("MSCommLib.MSComm")
com.CommPort = 2
com.Settings = "9600,N,8,1"
com.PortOpen = True
com.Output = "C"
com.PortOpen = False
' LEFT.vbs
Set com = CreateObject ("MSCommLib.MSComm")
com.CommPort = 2
com.Settings = "9600,N,8,1"
com.PortOpen = True
com.Output = "L"
com.PortOpen = False
' RIGHT.vbs
Set com = CreateObject ("MSCommLib.MSComm")
com.CommPort = 2
com.Settings = "9600,N,8,1"
com.PortOpen = True
com.Output = "R"
com.PortOpen = False
Where: Parallax Basic Stamp 2
Purpose: sends pulse signal to servo motor according to
received signal from serial port
Language: Parallax Basic
counter var byte
revolveWait con 30
letter var byte
counter = 0
read_input:
' get some data on pin 10
serin 10\0, 16468,[letter]
if letter = "L" then start_left
if letter = "R" then start_right
if letter = "C" then start_center
'START LEFT ROTATION
start_left
counter = 0
left:
pulsout 4,1500
pause 20
counter = counter + 1
if counter > revolveWait then read_input
goto left
'START RIGHT ROTATION
start_right:
counter = 0
right:
pulsout 4,1
pause 20
counter = counter + 1
if counter > revolveWait then read_input
goto right
'CENTER SERVO
start_center:
counter = 0
center:
pulsout 4,600
pause 20
counter = counter + 1
if counter > revolveWait then read_input
goto center
Back to software page






