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