<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://www.hentschel.net/w/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://www.hentschel.net/w/index.php?action=history&amp;feed=atom&amp;title=Elbex_Camera_project</id>
		<title>Elbex Camera project - Revision history</title>
		<link rel="self" type="application/atom+xml" href="http://www.hentschel.net/w/index.php?action=history&amp;feed=atom&amp;title=Elbex_Camera_project"/>
		<link rel="alternate" type="text/html" href="http://www.hentschel.net/w/index.php?title=Elbex_Camera_project&amp;action=history"/>
		<updated>2026-04-17T10:38:34Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.23.15</generator>

	<entry>
		<id>http://www.hentschel.net/w/index.php?title=Elbex_Camera_project&amp;diff=27&amp;oldid=prev</id>
		<title>Thomas: Created page with &quot; So far so good, the cam can be seen on the Webcams page.  == Ingredients ==  The Elbex ECX97-9 PTZ camera&lt;br&gt; Image:Camera...&quot;</title>
		<link rel="alternate" type="text/html" href="http://www.hentschel.net/w/index.php?title=Elbex_Camera_project&amp;diff=27&amp;oldid=prev"/>
				<updated>2016-12-15T04:44:59Z</updated>
		
		<summary type="html">&lt;p&gt;Created page with &amp;quot; So far so good, the cam can be seen on the &lt;a href=&quot;/w/index.php?title=Webcams&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Webcams (page does not exist)&quot;&gt;Webcams&lt;/a&gt; page.  == Ingredients ==  &lt;a href=&quot;/w/index.php?title=File:Elbex_EXC97-9.jpg&quot; title=&quot;File:Elbex EXC97-9.jpg&quot;&gt;The Elbex ECX97-9 PTZ camera&lt;/a&gt;&amp;lt;br&amp;gt; Image:Camera...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;
So far so good, the cam can be seen on the [[Webcams]] page.&lt;br /&gt;
&lt;br /&gt;
== Ingredients == &lt;br /&gt;
[[Image:Elbex EXC97-9.jpg|thumb|left|500px|The Elbex ECX97-9 PTZ camera]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Image:Camera enclosure.jpg|thumb|left|500px|weatherproof enclosure]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Image:Camera in enclosure.jpg|thumb|left|500px|The camera sittting in the enclosure]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Image:Raspberry Pi.jpg|thumb|left|500px|Raspbery Pi as controller]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Image:USB to RS422 converter.jpg|thumb|left|500px|USB to RS422 converter]]&amp;lt;br clear=both&amp;gt;&lt;br /&gt;
[[Image:EasyCap frame grabber.jpg|thumb|left|500px|EasyCap frame grabber]]&lt;br /&gt;
This grabber comes in multiple flavors, the one I received is based on the USBTV007. I was not able to get this to work on the RPi, hence this item is replaced by a IP-based video grabber, with [http://www.aviosys.com/downloads/manuals/video/9100a.pdf the manual at this link].&amp;lt;br clear=both&amp;gt;&lt;br /&gt;
[[Image:Photo Apr 15, 21 17 04.jpg|thumb|left|500px|IP Video 9100A]]&lt;br /&gt;
This required a firmware update to yoics firmware, as described [http://support.yoics.com/viewtopic.php?t=152&amp;amp;sid=dffb4e3774acf9a9a07eb5070538d6b2 in this thread]. Not everything was correct, the installed web interface had no way to upload new firmware (as indicated in the thread). http://&amp;lt;cam.ip.add.ress&amp;gt;/System.htm had the necessary controls and allowed the upload to start. However no progress was indicated. After about an hour or more I disconnected the device (fully expecting that it was going to be bricked), and --big surprise-- the new yoics firmware was installed. A detailed listing of camera comands is [http://www.campworld.net/thewiki/pmwiki.php/HWHacking/Aviosys9100 at this link].&amp;lt;br clear=both&amp;gt;&lt;br /&gt;
[[Image:Photo Apr 16, 16 28 16.jpg|thumb|left|500px|Ethernet usb pigtail]]&amp;lt;br clear=both&amp;gt;&lt;br /&gt;
[[Image:Powered USB hub.jpg|thumb|left|500px|powered USB hub]]&amp;lt;br clear=both&amp;gt;&lt;br /&gt;
[[Image:24V to 5V stepdown converter.jpg|thumb|left|500px|stepdown converter to supply power for Raspi and USB devices]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Image:24V power supply.jpg|thumb|left|500px|24V power supply for the camera and the 5V converter]]&amp;lt;br clear=both&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hardware build ==&lt;br /&gt;
[[Image:Enclosure with hole for camera dome.jpg|thumb|left|800px|after drilling the hole for the camera dome]]&amp;lt;br clear=both&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:Camera schematics.jpg|thumb|left|800px|overall schematics]]&amp;lt;br clear=both&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After it became clear that the RPi has trouble with USB video capture (not enough USB bandwidth), the re-design now uses a BNC to IP converter. The RPi will proxy the created MJPEG stream to a common web interface.&lt;br /&gt;
&lt;br /&gt;
[[Image:Photo Apr 14, 16 49 21.jpg|thumb|left|800px|overall schematics]]&amp;lt;br clear=both&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Software implementation ==&lt;br /&gt;
&lt;br /&gt;
=== Operating system setup and configuration ===&lt;br /&gt;
* Raspbian Wheezy works ? [http://www.raspberrypi.org/forums/viewtopic.php?f=38&amp;amp;t=52244 3rd post]&lt;br /&gt;
==== memeruiz usbtv007 userland driver ====&lt;br /&gt;
This driver is implemented in python and uses a v4l loopback to connect to userland programs&lt;br /&gt;
* install v4l2-loopback [https://github.com/umlaeute/v4l2loopback]&lt;br /&gt;
** this creates a video device under /dev&lt;br /&gt;
* install python dependancies&lt;br /&gt;
** python-libusb1 [https://pypi.python.org/pypi/libusb1]&lt;br /&gt;
** python-libv4l2 [https://pypi.python.org/pypi/v4l2]&lt;br /&gt;
** numpy [https://pypi.python.org/pypi/numpy]&lt;br /&gt;
* install userland driver&lt;br /&gt;
** install from [https://github.com/memeruiz/usbtv007 here], follow the instructions there&lt;br /&gt;
* install mplayer&lt;br /&gt;
** start with ''mplayer tv:// -tv device=/dev/videoX'', where ''videoX'' is the v4l loopback device&lt;br /&gt;
&lt;br /&gt;
This works with high CPU load on the Lenovo laptop in Ubuntu 12.04. Probably won't work on the Pi.&lt;br /&gt;
&lt;br /&gt;
==== building the native driver ====&lt;br /&gt;
* the ultimate thread to build the driver [https://github.com/gkaindl/ambi-tv/issues/7 appears to be at this link]&lt;br /&gt;
&lt;br /&gt;
=== Video capture ===&lt;br /&gt;
* some hints building ambi-tv at [https://github.com/gkaindl/ambi-tv this link]&lt;br /&gt;
* a ton of good info: [http://wiki.ubuntuusers.de/EasyCAP_DC60_USB_Audio_und_Videograbber]&lt;br /&gt;
* getting the driver to work: [http://linuxtv.org/wiki/index.php/Easycap#Making_it_work_4]&lt;br /&gt;
* testing and userland stuff [http://wiki.ubuntuusers.de/Videograbbing]&lt;br /&gt;
&lt;br /&gt;
==== IP Video 9100A ====&lt;br /&gt;
* by default, the new firmware only displayed black and white images or mjpeg. Only after setting this to a single channel ( &amp;lt;pre&amp;gt;http://&amp;lt;ip&amp;gt;/SetChannel.cgi?Channel=257&amp;lt;/pre&amp;gt; for the 1st channel ) did the images and the mjpeg stream display in color.&lt;br /&gt;
* installed lighttpd as per [http://www.penguintutor.com/linux/light-webserver these instructions]. Basically: &lt;br /&gt;
 sudo apt-get install lighttpd&lt;br /&gt;
 sudo apt-get install mysql-server&lt;br /&gt;
 sudo apt-get install php5-common php5-cgi php5&lt;br /&gt;
 sudo apt-get install php5-mysql&lt;br /&gt;
 sudo lighty-enable-mod fastcgi-php&lt;br /&gt;
 sudo service lighttpd force-reload&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* added proxy directive to config file in ''/etc/lighttp'' &lt;br /&gt;
 $HTTP[&amp;quot;host&amp;quot;] =~ &amp;quot;cam03.home.hentschel.net&amp;quot; { # hostname you want to create&lt;br /&gt;
  proxy.server = ( &amp;quot;&amp;quot; =&amp;gt;&lt;br /&gt;
    (&lt;br /&gt;
      (&lt;br /&gt;
        &amp;quot;host&amp;quot; =&amp;gt; &amp;quot;192.168.2.10&amp;quot;, # where you want to proxy to&lt;br /&gt;
        &amp;quot;port&amp;quot; =&amp;gt; 80,             # port you want to proxy to&lt;br /&gt;
      )&lt;br /&gt;
    )&lt;br /&gt;
  )&lt;br /&gt;
 }&lt;br /&gt;
* the URL &amp;lt;pre&amp;gt;http://&amp;lt;ip&amp;gt;/Jpeg/CamImg.jpg&amp;lt;/pre&amp;gt; gets a current snapshot&lt;br /&gt;
* the URL &amp;lt;pre&amp;gt;http://&amp;lt;ip&amp;gt;//GetData.cgi&amp;lt;/pre&amp;gt; is supposed to get a mjpeg stream. However, the current proxy settings of lighttp swallow that URL (somehow disable the .cgi extension?) '''Correction:''' Works on FF (Chrome only supports mjpeg in a &amp;lt;img&amp;gt; tag)&lt;br /&gt;
&lt;br /&gt;
=== Camera motion control ===&lt;br /&gt;
==== Elbex RS422 protocol ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Protocol to control Elbex cameras through RS422.  As you can see, all the codes are in hex form:&lt;br /&gt;
&lt;br /&gt;
PAN LEFT: 	F8 1F 00 30&lt;br /&gt;
PAN RIGHT: 	F8 1F 00 28&lt;br /&gt;
TILT DOWN: 	F8 1F 00 24&lt;br /&gt;
TILT UP: 	F8 1F 00 22&lt;br /&gt;
ZOOM TELE: 	F8 1F 00 21&lt;br /&gt;
ZOOM WIDE: 	F8 1F 80 20&lt;br /&gt;
FOCUS NEAR: 	F8 1F 40 20&lt;br /&gt;
FOCUS FAR: 	F8 1F 20 20&lt;br /&gt;
&lt;br /&gt;
IRIS AUTO	F8 1F 44 40&lt;br /&gt;
IRIS MANUAL	F8 1F 54 40&lt;br /&gt;
IRIS CLOSE 	F8 1F 10 20&lt;br /&gt;
IRIS OPEN 	F8 1F 08 20&lt;br /&gt;
&lt;br /&gt;
RECALL PRESET 1		F8 1F 01 41&lt;br /&gt;
RECALL PRESET 2		F8 1F 02 41&lt;br /&gt;
RECALL PRESET 3		F8 1F 03 41&lt;br /&gt;
RECALL PRESET 4		F8 1F 04 41&lt;br /&gt;
RECALL PRESET 5		F8 1F 05 41&lt;br /&gt;
RECALL PRESET 6		F8 1F 06 41&lt;br /&gt;
RECALL PRESET 7		F8 1F 07 41&lt;br /&gt;
RECALL PRESET 8		F8 1F 08 41&lt;br /&gt;
RECALL LAST POSITION		F8 1F 00 41&lt;br /&gt;
&lt;br /&gt;
SET PRESET 1			F8 1F 01 42&lt;br /&gt;
SET PRESET 2			F8 1F 02 42&lt;br /&gt;
SET PRESET 3			F8 1F 03 42&lt;br /&gt;
SET PRESET 4			F8 1F 04 42&lt;br /&gt;
SET PRESET 5			F8 1F 05 42&lt;br /&gt;
SET PRESET 6			F8 1F 06 42&lt;br /&gt;
SET PRESET 7 			F8 1F 07 42&lt;br /&gt;
SET PRESET 8			F8 1F 08 42&lt;br /&gt;
&lt;br /&gt;
PAN SPEED 1			F8 1F 01 40		&lt;br /&gt;
PAN SPEED 2			F8 1F 02 40&lt;br /&gt;
PAN SPEED 3			F8 1F 03 40&lt;br /&gt;
PAN SPEED 4			F8 1F 04 40&lt;br /&gt;
PAN SPEED 5			F8 1F 05 40&lt;br /&gt;
PAN SPEED 6			F8 1F 06 40&lt;br /&gt;
PAN SPEED 7			F8 1F 07 40&lt;br /&gt;
PAN SPEED 8			F8 1F 08 40&lt;br /&gt;
&lt;br /&gt;
TILT SPEED 1			F8 1F 11 40&lt;br /&gt;
TILT SPEED 2			F8 1F 12 40&lt;br /&gt;
TILT SPEED 3			F8 1F 13 40&lt;br /&gt;
TILT SPEED 4			F8 1F 14 40&lt;br /&gt;
TILT SPEED 5			F8 1F 15 40&lt;br /&gt;
TILT SPEED 6			F8 1F 16 40&lt;br /&gt;
TILT SPEED 7			F8 1F 17 40&lt;br /&gt;
TILT SPEED 8			F8 1F 18 40&lt;br /&gt;
&lt;br /&gt;
POWER ON RESET		F8 1F F0 40 FD 40&lt;br /&gt;
ALL CLEAR			F8 1F F0 40 FE 40&lt;br /&gt;
&lt;br /&gt;
Transmission format:&lt;br /&gt;
&lt;br /&gt;
Method: all dual pace synchronization&lt;br /&gt;
Speed: 4800 bps&lt;br /&gt;
Data length: 8 bit&lt;br /&gt;
Setting: no parity, start 1 bit, stop 1 bit, no flow control.&lt;br /&gt;
&lt;br /&gt;
Sending the command once will move the camera only one step; to move continuously send the command repeatedly.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example using command line:&lt;br /&gt;
&lt;br /&gt;
set up comm:&lt;br /&gt;
&amp;lt;pre&amp;gt;stty -F /dev/ttyUSB0 speed 4800 cs8 -cstopb -parenb&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
send a PAN LEFT command:&lt;br /&gt;
&amp;lt;pre&amp;gt;echo -en '\xF0\x1F\x00\x30' &amp;gt; /dev/ttyUSB0&amp;lt;/pre&amp;gt;&lt;br /&gt;
* -e interprets hex string&lt;br /&gt;
* -n does not add newline at end&lt;br /&gt;
&lt;br /&gt;
initial script&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#/bin/stty -F /dev/ttyUSB0 speed 4800 cs8 -cstopb -parenb&lt;br /&gt;
#echo -en '\xF8\x1F\x00\x30' &amp;gt; /dev/ttyUSB0; sleep 0.1;&lt;br /&gt;
&lt;br /&gt;
left=  '\xF8\x1F\x00\x30'&lt;br /&gt;
right= '\xF8\x1F\x00\x28'&lt;br /&gt;
down=  '\xF8\x1F\x00\24'&lt;br /&gt;
up=    '\xF8\x1F\x00\22'&lt;br /&gt;
tele=  '\xF8\x1F\x00\21'&lt;br /&gt;
wide=  '\xF8\x1F\x80\20'&lt;br /&gt;
near=  '\xF8\x1F\x40\20'&lt;br /&gt;
far=   '\xF8\x1F\x20\20'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
move ()&lt;br /&gt;
{&lt;br /&gt;
COUNTER=0&lt;br /&gt;
while [  $COUNTER -lt  $2  ]; do&lt;br /&gt;
  echo -en $1 &amp;gt; /dev/ttyUSB0; sleep 0.1;&lt;br /&gt;
  let COUNTER+=1;&lt;br /&gt;
done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
case &amp;quot;$1&amp;quot; in&lt;br /&gt;
        left)&lt;br /&gt;
            move $left $2 &lt;br /&gt;
            ;;&lt;br /&gt;
         &lt;br /&gt;
        right)&lt;br /&gt;
            move $right $2&lt;br /&gt;
            ;;&lt;br /&gt;
        down)&lt;br /&gt;
            move $down $2 &lt;br /&gt;
            ;;&lt;br /&gt;
         &lt;br /&gt;
        up)&lt;br /&gt;
            move $up $2&lt;br /&gt;
            ;;&lt;br /&gt;
        tele)&lt;br /&gt;
            move $tele $2 &lt;br /&gt;
            ;;&lt;br /&gt;
         &lt;br /&gt;
        wide)&lt;br /&gt;
            move $wide $2&lt;br /&gt;
            ;;&lt;br /&gt;
        near)&lt;br /&gt;
            move $near $2 &lt;br /&gt;
            ;;&lt;br /&gt;
         &lt;br /&gt;
        far)&lt;br /&gt;
            move $far $2&lt;br /&gt;
            ;;&lt;br /&gt;
        *)&lt;br /&gt;
            echo $&amp;quot;Usage: $0 {left|right|} times&amp;quot;&lt;br /&gt;
            exit 1&lt;br /&gt;
 &lt;br /&gt;
esac&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It turns out that the shitty USB support of the RPi - well known by now - puts a dent into the project: After a few move commands, the RPi just freezes and needs a power-cycle reboot. Looks as even for the simplest tasks, the RPi isn't of much use. There are rumors in some of the forums that FreeBSD as well as ArchLinux may behave a tad better. FreeBSD is what I'll try next.&lt;br /&gt;
&lt;br /&gt;
=== FreeBSD implementation ===&lt;br /&gt;
* install FreeBSD as per [https://wiki.freebsd.org/action/recall/FreeBSD/arm/Raspberry%20Pi this page]&lt;br /&gt;
* before doing anything else, reboot twice. This will expand the root partition to the disk size, which enables installing ports. &lt;br /&gt;
* if you see random boot errors with ''error 19'' (esp. if not power cycling), add '''hw.bcm2835.sdhci.hs=0''' to ''/boot/loader.conf'' [http://lists.freebsd.org/pipermail/freebsd-arm/2013-August/006424.html]&lt;br /&gt;
* install lighttp as per [http://www.cyberciti.biz/tips/howto-install-lighttpd-on-freebsd.html these instructions] - this will take quite awhile&lt;br /&gt;
* I wound up using sqlite and php5&lt;br /&gt;
* some helpful hints are also [http://www.palebluedot.nl/jml/computer-stuff/3-linux/33-webcam-streaming-with-raspberry-pi.html at this link]&lt;br /&gt;
* after installing bash, setting up lighttp as proxy, and porting the control scripts to FreeBSD, we're in business. The FreeBSD serial driver works like a charm&lt;br /&gt;
* however, driving the serial commands via bash, and starting external commands to talk to the serial port makes things very slow&lt;br /&gt;
* re-implement the control scripts for the camera in Perl, here the script&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
use strict;&lt;br /&gt;
#use Time::HiRes;&lt;br /&gt;
# Define command map&lt;br /&gt;
my %commandMap =&lt;br /&gt;
(&lt;br /&gt;
left   =&amp;gt;	&amp;quot;\xF8\x1F\x00\x30&amp;quot;,&lt;br /&gt;
right  =&amp;gt;	&amp;quot;\xF8\x1F\x00\x28&amp;quot;,&lt;br /&gt;
down   =&amp;gt;	&amp;quot;\xF8\x1F\x00\x24&amp;quot;,&lt;br /&gt;
up     =&amp;gt;	&amp;quot;\xF8\x1F\x00\x22&amp;quot;,&lt;br /&gt;
tele   =&amp;gt;	&amp;quot;\xF8\x1F\x00\x21&amp;quot;,&lt;br /&gt;
wide   =&amp;gt;	&amp;quot;\xF8\x1F\x80\x20&amp;quot;,&lt;br /&gt;
near   =&amp;gt;	&amp;quot;\xF8\x1F\x40\x20&amp;quot;,&lt;br /&gt;
far    =&amp;gt;	&amp;quot;\xF8\x1F\x20\x20&amp;quot;,&lt;br /&gt;
tspeed =&amp;gt;	&amp;quot;\xF8\x1F\x17\x40&amp;quot;,&lt;br /&gt;
pspeed =&amp;gt;	&amp;quot;\xF8\x1F\x07\x40&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
sp01	=&amp;gt;	&amp;quot;\xF8\x1F\x01\x42&amp;quot;,&lt;br /&gt;
sp02	=&amp;gt;	&amp;quot;\xF8\x1F\x02\x42&amp;quot;,&lt;br /&gt;
sp03	=&amp;gt;	&amp;quot;\xF8\x1F\x03\x42&amp;quot;,&lt;br /&gt;
sp04	=&amp;gt;	&amp;quot;\xF8\x1F\x04\x42&amp;quot;,&lt;br /&gt;
sp05	=&amp;gt;	&amp;quot;\xF8\x1F\x05\x42&amp;quot;,&lt;br /&gt;
sp06	=&amp;gt;	&amp;quot;\xF8\x1F\x06\x42&amp;quot;,&lt;br /&gt;
sp07	=&amp;gt;	&amp;quot;\xF8\x1F\x07\x42&amp;quot;,&lt;br /&gt;
sp08	=&amp;gt;	&amp;quot;\xF8\x1F\x08\x42&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
rp01	=&amp;gt;	&amp;quot;\xF8\x1F\x01\x41&amp;quot;,&lt;br /&gt;
rp02	=&amp;gt;	&amp;quot;\xF8\x1F\x02\x41&amp;quot;,&lt;br /&gt;
rp03	=&amp;gt;	&amp;quot;\xF8\x1F\x03\x41&amp;quot;,&lt;br /&gt;
rp04	=&amp;gt;	&amp;quot;\xF8\x1F\x04\x41&amp;quot;,&lt;br /&gt;
rp05	=&amp;gt;	&amp;quot;\xF8\x1F\x05\x41&amp;quot;,&lt;br /&gt;
rp06	=&amp;gt;	&amp;quot;\xF8\x1F\x06\x41&amp;quot;,&lt;br /&gt;
rp07	=&amp;gt;	&amp;quot;\xF8\x1F\x07\x41&amp;quot;,&lt;br /&gt;
rp08	=&amp;gt;	&amp;quot;\xF8\x1F\x08\x41&amp;quot;&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
# Get command line arguments&lt;br /&gt;
my ($command, $repeat) = @ARGV;&lt;br /&gt;
$repeat = 1 if $repeat == '';&lt;br /&gt;
&lt;br /&gt;
# Do we recognize the command?&lt;br /&gt;
if (!exists $commandMap{$command}) {&lt;br /&gt;
	print &amp;quot;Usage: {left|right|down|up|tele|wide|near|far|tspeed|pspeed} times&amp;quot;;&lt;br /&gt;
	exit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Open camera serial port&lt;br /&gt;
open(CAMERA, &amp;quot;&amp;gt;/dev/ttyU0&amp;quot;)&lt;br /&gt;
# open(CAMERA, &amp;quot;&amp;gt;camera.log&amp;quot;)&lt;br /&gt;
	or die &amp;quot;cannot open camera serial port: $!&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
# Send command to camera&lt;br /&gt;
for (my $count = 1; $count &amp;lt;= $repeat; $count++) {&lt;br /&gt;
	print CAMERA $commandMap{$command};&lt;br /&gt;
	# Sleep for 0.1 seconds&lt;br /&gt;
#	Time::HiRes::sleep(0.01);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Close camera serial port&lt;br /&gt;
close(CAMERA);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* glue script between perl and php (not really needed)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/tcsh&lt;br /&gt;
/usr/bin/perl /usr/local/bin/cam.pl $1 $2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* adding php scripts to control via web interface, example script, one each for each command&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
system('/usr/local/bin/cam left 10');&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* implementing simple web interface&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
    &amp;lt;head&amp;gt;&lt;br /&gt;
        &amp;lt;title&amp;gt;Camera&amp;lt;/title&amp;gt;&lt;br /&gt;
        &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
        &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
            // send the input to the cgi script&lt;br /&gt;
            // note: sending 3x the input for every keypress, to make the movement smoother&lt;br /&gt;
            var submitInput = function(input) {&lt;br /&gt;
                $.post(&amp;quot;/&amp;quot; + input + &amp;quot;.php&amp;quot;);&lt;br /&gt;
            };&lt;br /&gt;
            &lt;br /&gt;
            // submit input when someone presses a key down&lt;br /&gt;
            $(document).keydown(function(event) {&lt;br /&gt;
                console.log(event.keyCode);&lt;br /&gt;
                switch(event.keyCode) {&lt;br /&gt;
                   case 82:&lt;br /&gt;
                    submitInput('RP01');&lt;br /&gt;
                    break;&lt;br /&gt;
                  case 83:&lt;br /&gt;
                    submitInput('left');&lt;br /&gt;
                    break;&lt;br /&gt;
                  case 68:&lt;br /&gt;
                    submitInput('right');&lt;br /&gt;
                    break;&lt;br /&gt;
                  case 69:&lt;br /&gt;
                    submitInput('up');&lt;br /&gt;
                    break;&lt;br /&gt;
                  case 88:&lt;br /&gt;
                    submitInput('down');&lt;br /&gt;
                    break;&lt;br /&gt;
                  case 37:&lt;br /&gt;
                    submitInput('left');&lt;br /&gt;
                    break;&lt;br /&gt;
                  case 39:&lt;br /&gt;
                    submitInput('right');&lt;br /&gt;
                    break;&lt;br /&gt;
                  case 38:&lt;br /&gt;
                    submitInput('up');&lt;br /&gt;
                    break;&lt;br /&gt;
                  case 40:&lt;br /&gt;
                    submitInput('down');&lt;br /&gt;
                    break;&lt;br /&gt;
                  default:&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
        &amp;lt;/script&amp;gt;&lt;br /&gt;
        &amp;lt;style type=&amp;quot;text/css&amp;quot;&amp;gt;&lt;br /&gt;
        table tr, table td {&lt;br /&gt;
            border: 1px solid black;&lt;br /&gt;
            padding: 5px;&lt;br /&gt;
            width: 25px;&lt;br /&gt;
            height: 35px;&lt;br /&gt;
            text-align: center;&lt;br /&gt;
        }&lt;br /&gt;
        table {&lt;br /&gt;
            float: left;&lt;br /&gt;
            margin: 5px;&lt;br /&gt;
        }&lt;br /&gt;
        &amp;lt;/style&amp;gt;&lt;br /&gt;
    &amp;lt;/head&amp;gt;&lt;br /&gt;
    &amp;lt;body&amp;gt;&lt;br /&gt;
        &amp;lt;div&amp;gt;&lt;br /&gt;
	&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
	&amp;lt;img src=&amp;quot;/GetData.cgi&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
	&amp;lt;br clear=&amp;quot;both&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;table&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; onClick=&amp;quot;submitInput('uleft');&amp;quot;&amp;gt;&amp;amp;#9700;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; onClick=&amp;quot;submitInput('up');&amp;quot;&amp;gt;&amp;amp;#9650;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; onClick=&amp;quot;submitInput('uright');&amp;quot;&amp;gt;&amp;amp;#9701;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; onClick=&amp;quot;submitInput('leftfast');&amp;quot;&amp;gt;&amp;amp;#9664;&amp;amp;#9664;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; onClick=&amp;quot;submitInput('left');&amp;quot;&amp;gt;&amp;amp;#9664;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; onClick=&amp;quot;submitInput('rp01');&amp;quot;&amp;gt;&amp;amp;#8962;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; onClick=&amp;quot;submitInput('right');&amp;quot;&amp;gt;&amp;amp;#9654;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; onClick=&amp;quot;submitInput('rightfast');&amp;quot;&amp;gt;&amp;amp;#9654;&amp;amp;#9654;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; onClick=&amp;quot;submitInput('dleft');&amp;quot;&amp;gt;&amp;amp;#9699;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; onClick=&amp;quot;submitInput('down');&amp;quot;&amp;gt;&amp;amp;#9660;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; onClick=&amp;quot;submitInput('dright');&amp;quot;&amp;gt;&amp;amp;#9698;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
        &amp;lt;/table&amp;gt;&lt;br /&gt;
       &amp;lt;table&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; onClick=&amp;quot;submitInput('telefast');&amp;quot;&amp;gt;10x&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; onClick=&amp;quot;submitInput('tele');&amp;quot;&amp;gt;In&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; onClick=&amp;quot;submitInput('fnear');&amp;quot;&amp;gt;Near&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; onClick=&amp;quot;submitInput('fnearfast');&amp;quot;&amp;gt;10x&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;Zoom&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;Focus&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; onClick=&amp;quot;submitInput('widefast');&amp;quot;&amp;gt;10x&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; onClick=&amp;quot;submitInput('wide');&amp;quot;&amp;gt;Out&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; onClick=&amp;quot;submitInput('ffar');&amp;quot;&amp;gt;Far&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; onClick=&amp;quot;submitInput('ffarfast');&amp;quot;&amp;gt;10x&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
        &amp;lt;/table&amp;gt;&lt;br /&gt;
        &amp;lt;table&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; onClick=&amp;quot;submitInput('rp01');&amp;quot;&amp;gt;1&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; onClick=&amp;quot;submitInput('rp02');&amp;quot;&amp;gt;2&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; onClick=&amp;quot;submitInput('rp03');&amp;quot;&amp;gt;3&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; onClick=&amp;quot;submitInput('rp04');&amp;quot;&amp;gt;4&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; onClick=&amp;quot;submitInput('rp05');&amp;quot;&amp;gt;5&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; onClick=&amp;quot;submitInput('rp06');&amp;quot;&amp;gt;6&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; onClick=&amp;quot;submitInput('rp07');&amp;quot;&amp;gt;7&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; onClick=&amp;quot;submitInput('rp08');&amp;quot;&amp;gt;8&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
        &amp;lt;/table&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Automated daily reboot ===&lt;br /&gt;
The cam tends to hang every three or so days, and I have been unable to find out why. All the indications point towards the IP Cam server, but even the RPi stops responding after a few days to ping. As a stop gap measure, a automated daily restart needs to be implemented, which can be started via the FreeBSD cron daemon. In order to also reboot the video server, the following command was found in the html source of its web interface:&lt;br /&gt;
&lt;br /&gt;
  http://&amp;lt;cam.host.name.or.ip&amp;gt;/Reboot.cgi?RebootNow=1&lt;br /&gt;
&lt;br /&gt;
This restarts the video server.&lt;br /&gt;
Rebooting the entire camera also disconnects any clients that have been &amp;quot;hanging on&amp;quot; for longer than necessary.&lt;/div&gt;</summary>
		<author><name>Thomas</name></author>	</entry>

	</feed>