Note: This page is out of date. A new page is being developed but is currently incomplete. Visit it in construction if you dare here.
How to set up your very own WEBCAM!
The setup for this webcam operation is remarkably simple, and not terribly
expensive either. The system driving the webcam is a Pentium Pro 200 running Windows 95.
This system will then need a dial-up internet connection or LAN access
which the PC can access the internet through. For hardware, I am using
a US Robotics BigPicture Camera, which I purchased for $249.99. These are
now available for around $159.00, and US Robotics is now owned by 3Com. This
includes a PCI capture card and a small video camera.
Note that this is NOT your only option. There are plenty of other video
solutions available at a variety of prices. This camera has been my
best choice since it will also allow any video input through an RCA
jack and works remarkably well for watching TV. :) This camera also provides
a much crisper image than others I have seen. The computer setup
works well with a Pentium 133 as well, and I would imagine that lower end
models would work also. Cam 2 is a Creative Labs Webcam. Its an older model
of what is currently available, the Webcam II, which I have seen for as low
as $69. The image from this camera isn't as clear in low light, but it
certainly serves its purpose to my satisfaction. It uses the parallel port,
so you don't need any additional pci slots (if that's a concern).
For software, I am using Webcam32. This is a VERY nice webcam program
and the author makes frequent updates, free to anyone paying the one time
registration charge which is $29.95. The homepage for information on this
program is at: www.kolban.com/webcam32.
This program will give you the option of either dialing up the internet and
FTPing a picture to your website, or allowing a web browser to access the
program directly for those of you with dedicated connections.
Although I have tried, I have yet to get this camera working under linux,
even though it is supposed to be supported. When I have some time, I will
put some additional efforts into getting it working and if I'm successful, I'll
post information on what I needed to fix to get it working.
Beyond that, there's not much to it. If you have any questions or want
help setting this up, feel free to email me at firstname.lastname@example.org. However, be warned that I
get a LOT of email and respond to a relativly small portion of it based on
my priorities in life.
How to hook your doorbell up to the internet!
Just in case you're bored and need something to do, why not make your doorbell
The html interface for the doorbell as I have it right now is a simple cgi
script which shows the last 10 lines of a log file. Being directly connected
to the internet at all times makes this whole process easier.
To get from doorbell to logfile has several stages. To emulate my setup,
you will need at least 1 linux machine with a joystick port, a doorbell (duh),
and some way to electronically access the doorbell (access to the chime is
Chances are good that your doorbell chime is different than mine, so I leave
you to figure out your own. I will show you how I mangled mine. There are
3 contacts, all wired together in the chime. One wire goes from the front door,
and one wire connects to the chime (more than likely). I disconnected the
wire to the front door and attached it to the current contact of a relay. The
other contact of the relay then attached to the contact on the chime, completing
the circut. Now, when the doorbell is pressed, it flips the relay switch.
This MIGHT disable the chime on the doorbell if it can't get enough current.
You will see later why this might not be a bad thing, but if you want to hear
the chime ring, you will either need a relay that uses less current or figure
it out some other way. Don't ask me, I'm not an electrician. :)
The joystick port on the linux box is used to detect when the relay gets
switched. What we do is emulate a button being pressed, and detecting the
buttonpress. On the joystick port, leads 2 and 4 connect button #0 on
joystick #0, which is exactly what we want. You also want to cross leads 1,
3, and 6. 1 is +5V and 3 and 6 are resistance inputs to detect the position of
the X and Y coordinates of the stick. We don't care about the stick, but if
we don't show some type of input, then the driver will think the joystick isn't
there. Crossing those 3 leads will emulate a joystick at <0,0>, and makes
the driver happy.
Once you have the relay properly hooked up to the joystick port, you now need
a way to read the data. This is probably a good time to test that your wiring
is correct. An easy way to do this is to get a test program for dos and hook
up to the joystick port on that machine and test it. If you're able to toggle
the button #0 bit when the doorbell is rung, then so far, so good. :)
If you don't plan to use linux to read the joystick port, then the rest of
this document won't be of much use to you. Accessing the joystick is pretty
easy through a single bios call, and writing a program under dos to do so
is pretty simple.
Under linux, you first have to have a joystick driver loaded in the kernel.
If the kernel doesn't have it compiled in straight, then you can load the
module in after you boot the system with no problem. You also have to make
sure that there's a /dev/js0 device present.
The js.c program will test the status of the joystick just like the dos test
program did. If you're able to detect a change in the button #0 bit when you
ring the doorbell, then you're still in business.
The dos test program, the linux joystick driver, and the linux test programs
discussed can be found here.
I've written 2 programs, a client and a server program for the doorbell.
The client program detects a doorbell ring and notifies the server about it.
The server program then logs the event and performs any other actions you
may see fit (Like playing a wav file....this is why disconnecting the chime
might make sense :).
The client/server runs over tcp/ip and may reside on different machines. They
may also reside on the same machine. I chose to dedicate a machine to
constantly poll the doorbell to see when it rings. Since the joystick port
doesn't use interrupts, if you aren't watching the switch when it happens,
you'll miss it. Therefore I decided to dedicate a machine to it. A 486 with
8 megs of ram and a 100 meg harddisk, which is more than ample to run linux,
can be purchased for $30.00 used, which is what I paid for mine. Since you
don't require a monitor for this project (other than for setting it up), its
a cheap enough option to just dedicate a computer to the task. I also plan to
use the same computer for reading other devices as I add them.
However, there's no reason you shouldn't be able to share the machine with
other tasks as well, and running both server and client on the same machine
works great. The advantage of running the server from a different machine is
that you could, for example, while you are at work, set up the server program
there so you will know when someone rings your doorbell at home. Excellent for
knowing when someone comes by your house when nobody's there. Better yet,
if there's an excessive number of doorbell rings in a short period of time,
someone might be having a party (wink wink. :)
The server program also does not have to be run on linux. You can program
a server program on any computer that supports tcp/ip. The server can also
execute any scripts. Setting up a webcam looking at your porch, and doing a
capture and save everytime someone rings the doorbell will give you a visual
log of everyone that visits you, including when you're not home.
Of course, none of this is complete until you post it on the internet for all
to see. :)
Source code for the doorbell server is now available for download. Check the
links at the bottom of this page.
How to set up a computer controlled power switch
This project was relatively easy once I sat down and started it, although
finding parts was a challenge. This page will provide a great deal of
information on the hardware issues, as well as the schematics for building
the switch. It explains it better than I could.
However, as a quick summary, the switch is composed of a relay, a transistor,
a diode, and a resistor. The relay controls the current of a 120 Volt AC
power source. The relay is controlled by a 9 volt power supply, which I
am using a 9 volt battery, which can be easily replaced by a power supply.
The 9 volt current is in turn controlled by a TTL transistor. The
transistor is triggered by the output of one of the parallel port's data
I wrote a client and server program set to control the switch. The server
program recieves a request to turn the switch on or off and then sends the
appropriate value to the parallel port.
As with the doorbell, I have the client and server operating on different
machines. The server program resides on the machine with the parallel
port. Through linux, the parallel port is a standard device, easily
compiled into the kernel, if you don't have it installed already by
default. Programming the port is easy and only takes two lines of code.
The previously mentioned site provides a demonstration program for windows
The client program I wrote will send a packet to the server with a command,
telling it to turn the switch on or off. The client code can be executed on
any linux machine and performed with a single command line. The code I have
provided takes arguments for the IP address, port, and command, but I have
also modified this code for specific operations to make it easier to use
for CGI scripts. You should be able to port this code to any platform
supporting TCP/IP and still be able to talk to the server.
The completed circut and program can now turn on and off any AC appliance
which uses a normal wall socket and can push up to 10 amps of current.
More than 10 amps can be provided, but the relay I'm using provides that
as a maximum, so I'm not planning on plugging in a bunch of power strips.
However, this is more than adaqute to operate a lamp, or a string of
Christmas tree lights, a TV set, a fan, the possibilities are endless.
More so, the parallel port can control up to 8 switches easily, and up to
12 with additional programming. My next project will probably be a
scrolling light display you can send messages to and watch as they scroll
Source code for the power switch server and client is now available. Check
the links at the bottom of the page.
How to interface X10 lamps and appliances
This is almost so simple it defies explaination. Simply put, you take an
X10 module, plug an appliance into it, set the house and unit code, and you're
all set. A small serial port dongle included with a starter kit provides
all the computer interfacing you require. For linux, I'm using the
bottlerocket X10 command line interface program, which I call from the
lampserver program. The lampserver takes commands to turn on and off X10
appliances the same way it takes them to turn on and off the relays.
The only disadvantage to using X10 is the loss of the computer interfacing
experience. Its also slightly more expensive than homebrewed solutions.
However, what you lose in experience you gain in convienence. With X10,
you don't need to run wires throughout your house. You don't need to do any
assembly. You don't need to do any crazy programming. And best of all,
it wins out in astetics. So I feel justified in selling out in this one
How to pan the camera
This contraption is certainly my most interesting so far. Since the camera
itself provides no method of mounting, it was hard to create a simple
adaption to allow for rotation. This is my adventure.
A quick summary: The camera is contained in a self made brace which is
superglued to the shaft of a stepper motor which is connected to a circut
of 4 transistors which are controlled by the parallel port.
I modified the server program I use for the lamp and it now controls both
the lamp and the stepper motor. The lamp required one data line, the motor
required 4. Since the motor can be operating while the lamp is on, and
since both devices are controlled by the same parallel port, it now became
necessary to have a "state" variable which keeps track of which data lines
on the parallel port are currently active, so the lamp doesn't get shut off
during a motor routine.
Each of the 4 transistors for the motor is triggered by one of the data lines
from the parallel port. Each transistor then controls power to one of the 4
stepper motor contacts. Each contact must be given power in sequence to make
the motor turn in one direction or another. So, in addition to remembering
what the parallel port currently looks like, its also important to remember
which contact was touched last. The server controls all of this to make the
circutry as simple as possible.
The power driving the motor is a simple 9V DC power source, provided by an
AC 9V battery adapter.
The motor is built into a radio shack project box, to give it the required
support. The motor was obtained from a dead floppy drive. Floppy drives
are wonderful sources of stepper motors and I'm willing to bet you can obtain
them for free if you look hard enough. The end of the shaft has a gear
well attached, so I decided to simply glue this gear onto the brace I built
rather than trying to get the gear off by force (which won't be happening
The brace is a very high tech contraption I built from my old erector set.
It simply holds the camera and keeps it from twisting around too much. I still
have a problem with the cable leading from the camera, as it tends to pull on the camera if the motor turns it too far. I therefore set a maximum rotation
angle to 90 degrees. This is adaquate to view most of the room and everyone
Your Very Own Computer Controlled RC Car
Before you start, be warned. This project can get EXPENSIVE. At least much
more expensive than the other projects are. However, this project can be
done in stages so you don't have to spend all your money at once.
First of all, a list of equipment you're going to need. The most obvious
of course, is an RC car. To truely be an RC car, it needs a remote. You
WILL be doing some serious surgury on the remote, so consider that fact
before purchasing anything expensive and make sure the remotes can be
replaced easily and inexpensively.
You will also need either 4 SPDT relays or 5 SPST relays. They don't need
to be able to push much current, so any $2 radio shack brand will work just
fine. Of course, you need a computer with a parallel port. If you did
any of the previous projects, the same program that controls the lamp
controls the car as well. You will need a total of 4 data ports from the
parallel port, or more if you have other things you want to control other
than movement, such as headlights. The relay connections to the computer
are the same as used with the lamp circut, so refer to that for instructions,
Now you will have to decide if you want to retain the original use of the
remote control even though you've got it wired to the computer. Wiring
up this puppy will NOT be easy for the inexperienced. Unless you get the
EXACT same model of car that I did, its also likely that the remote
control's insides will look or even possibly work differently. In fact,
you may require an entirely different approach to make it work. For that
reason, and for the fact that I'm currently lazy, I will give an overview
and let you figure it out on your own.
The remote has 2 levers. One will move the car forwards or backwards
and the other turns the wheels left or right. When you take the remote
apart, you will notice that the lever actually is nothing more than a
fancy looking switch. It pushes a small metal slider on a track which
causes it to make contact with the circutboard in different places. When
these contacts are crossed, the transmitter then sends the appropriate
signal to the car and the car does something.
In my remote unit, the slider acts as a Double Pole, Triple Throw switch.
Since its unlikely you're going to find any triple throw relays and since the
center throw position, which is also the default position, is always in a
non-contact state, the same thing can be achieved by two DPST relays.
There are two contact positions for movement (forward and backwards) and
perhaps a third as well for turbo speed (you decide if you want to hook
it up separately. It will require another data port/transistor/relay/etc etc).
There are also two contact positions for steering, left and right. On all
four contact positions one pole is identical. Therefore, you can subsitute
the 4 DPST relays for 4 SPST relays (which are cheaper) and add a fifth SPST
relay to make contact with the other pole position when any of the other
4 relays are triggered.
The next important issue is speed. The RC car is probably quite capable of
achieving adaquate speed to cause damage if it hits a solid surface (a wall
for instance). While the car itself can probably handle it, remember, we
are also mounting a camera on top of the car and the camera is far more
delicate. Therefore, you want to force the car to not go faster than a
certain velocity. The easiest way to do this (and its already in the code)
is to simply put a delay between the time you make the contact and the
time you stop it. A delay of 500 ms is a nice speed. Of course you may
want different speeds. That is completely up to you.
The camera part itself was much easier, although more expensive. First, you'll
need a capture card or a Snappy or some video input device that will take an
RCA jack as input. Then you will need to purchase a transmitter/receiver
kit that can send/recieve video and a small, low powered camera. I purchased
both these items from MatCo. The model
numbers there are CNL-100
and ASK-2000TR. I also
purchased the enclosure for the camera, model number A-300. You may have to browse the pages a bit
to find the actual model numbers. They don't all appear on top.
Please note that I am in no way affiliated with MatCo, I simply found that
their products were the least expensive for what I needed to do and so far
I have had no problems with the products.
The receiver has a female RCA jack for video out. Take any RCA cable and
hook that puppy up to your capture card. Take the camera, which has 4
wires. READ THE INSTRUCTIONS THAT COME WITH THE CAMERA. They are vague,
but they tell you which wires do what. Two of the wires are for power, and
the other two are for the video signal. The video wires can be directly
wired to an RCA plug, which can then be plugged into the transmitter. Then
go to radio shack and find yourself a power adapter plug which fits the
transmitter. Wire the camera's power wires to this plug as well as another
set of wires which will then go to your power source. Plug it into the
transmitter and now you have power to the camera and transmitter. For
a power source, you can either use any 12V power supply (a battery pack
works great), or you can just wire it directly up to the RC Car's battery
pack. If the car isn't moving, this will last about 3 hours. If the car is
larger you can put more battery packs in parallel and get longer lasting
The transmitter and the camera then get attached to the car by this amazing
hi-tech product known as CONTACT TAPE. No, its not really hi-tech, it just
sticks well. Any hardware store or crafts shop should have it. Its also
I will eventually provide schematics and diagrams of the process to make
this process easier. Someday I have to clean up the mess of wires I've
created here and redo the electronics into a nice neat project box which
won't look as pretty but I wont' have to worry about tripping over wires.
This project was exceedingly simple to get working, but took me over 2 years
to implement, mostly due to laziness, but partially due to the unavailability
of equipment. I also kept brooding over the project thinking of the hard
way of doing things and when I finally got done thinking it over, I sat
down and in one hour wrote a 100 line program that did the job. I've done
some revisions since then and added some features, and I'm still developing
it some more, but getting the core system working was simple.
First off, I don't use a Cuecat: or whatever they're called. I'm certain that
these would be viable alternatives to the commercial barcode scanner I'm using,
but since I don't even own one, I wouldn't have the slightest idea how to
use them for this purpose, and I'm not going to pretend that I do. What I
AM using is a barcode scanner that I picked up at First Saturday for $30 one
rainy day several months ago. It daisychains in with a PS/2 keyboard connector,
gets power that way, and feeds the data in through the keyboard.
Software wise, I wrote a little program that accepts a UPC code as input for
each line, then processes that UPC depending on if we're currently in add or
discard mode. When I have the software in a stable state I will be releasing
it as well. Right now, this is all the software does. In the future, I plan
to extract the UPC product information from one of the free online databases,
if that data already exists, and thereby save me the trouble of entering
everything thats already been entered. I could probably go the other direction
as well and feed back the data entered in the event that the UPC code is not
found in that database, thereby adding to it.
Scrolling Marquee Sign
You know what I'm talking about. Those scrolling light displays. Well,
I'm going to build one, and if you want to tag along, so can you. This
project is for novelty purposes and experience more than a means to save
money on a professionally built marquee sign. For the same amount of money
you can get something that works out of the box with a warranty and probably
a self-contained programmable interface. But what fun would all that be?
First things first. Know something about electronics and TTL logic circuity.
I THOUGHT I knew before I started. I learned a lot along the way. I've
had to basically start from scratch 3 times as I encountered various
obstacles, and I'm not finished yet, but I think I've crossed all the major
hurdles now and all that remains is the timeconsuming monotonous work.
First gather your supplies. You'll need a computer with a parallel port (a
linux system if you want to use my code verbatim, although it should be
portable with minimal fuss). I've purchased pre-etched boards that
convienently have 8 columns to work with. Each character is 8x8, so you'll
need 64 LEDs, probably all the same color, but its your sign, so do as
you please. You'll also need one 74LS273 Octal D-Flipflop IC and 8
switching transistors (2n2222 work). Add a 7805 voltage regulator and a
power supply that pushes at least 8 volts DC (a 9V battery can suffice for
a while). The design is modular. To extend the sign, you simply append
another 8x8 array board, minus the regulator.
The theory behind this sign is as follows. Each LED has an anode and a
cathode. Each LED in a column shares the cathode and each LED in a row
shares the anode. The 8 data lines from the parallel port connect to the 8
anode rows. Each cathode column is connected to the collector of a
transistor. These transistors are triggered by the D flipflop which is
wired to ripple a single bit through the 8 bits of that circuit. This way,
one and only one transistor is active at any time. The computer will output
whatever LED's need to be lit on the current column, wait a few microseconds,
turn off the LED's, pulse the 74ls273 then turn on the LED's for the next
column. This process repeats until the end of the sign is reached. The
cycle then repeats. An 8 character sign should be able to refresh about 120
times per second easily.
To create a monochrome effect, some LED's can be lit only every other refresh.
This will result in a LED that appears to be only half the brightness of
the others. Several levels of brightness may be achieved by this effect, but
if a more broad range is required multiple bits per LED will be required and
filtered through resistors to get the desired brightness.
To add additional characters, simply carry over the 8 data lines, the output
from the 8th flipflop, the +/- lines and the clock line. The regulator can
handle up to 1A of current which will be plenty for a sign of any concievable
length since only the flipflops need to be powered at any one time. All the
LED's are powered by the computer itself.
For multiple colors instead of just shades of a single color, take a red,
green, and blue LED, wedge them together, then center a spacer above them.
cover the board except for the spacers so you see the combined light only.
You then need to provide each individual LED the desired shade, instead of
only one LED per position. This means you'll need 3 bits of information for
each position instead of only 1. This isn't bad considering you can get
64 colors easily from those 3 bits. Your mileage may vary.
Take a sharp object and scratch off the contacts on the top and bottom of the
board so that each column is electrically separate from the others
To be continued......
Source Code Now Available
I am now making the source code for the lamp, doorbell, and stepper motor
available for download. You may make any use of this source code you like,
but if you make changes that are useful, please send me updates so I can
incorporate them back into my system as well.
None of the source is complete. Its in a working state, but there's still
a lot I want to do with it, so it will be updated from time to time as I
incorporate those changes.
As for functionality, I only make the following statement: It works for me.
You're welcome to ask questions if you have problems, and I will try to help
if I can. Also, before you even THINK about hooking up some homemade circut
to your computer, consider the fact that its very possible to fry computer
components, especially with the parallel port circuts, if you don't construct
them properly. Therefore, it would be wise not to hook your lamp circut up
to your new PII 400. 486's can be had for less than $30 these days. All
you need is a network card and you can control all the devices from remate.
This software has been written to take advantage of a network.
The basic requirements are a linux system, a joystick port (for the doorbell),
and a parallel port (for the lamp & motor). You also need kernel support
for the joystick port and parallel port. Kernel versions 2.2 and up have
joystick support built in, but I know 2.0.30 did not and needed to be added
separately as a module. I leave you to figure out your configuration issues.
Barcode Files: (Warning, these are a MESS and don't even work right. :)
Text based client
CGI program to generate the Inventory page
Program to generate the individual inventory tracking log