<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>some random text about funky things &#187; Hardware</title>
	<atom:link href="http://janpaulposma.nl/category/hardware/feed" rel="self" type="application/rss+xml" />
	<link>http://janpaulposma.nl</link>
	<description>by Jan Paul Posma</description>
	<lastBuildDate>Sun, 08 Jan 2012 22:01:54 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Simple home automation system</title>
		<link>http://janpaulposma.nl/simple-home-automation-system</link>
		<comments>http://janpaulposma.nl/simple-home-automation-system#comments</comments>
		<pubDate>Thu, 11 Mar 2010 18:09:39 +0000</pubDate>
		<dc:creator>JP</dc:creator>
				<category><![CDATA[Hardware]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://janpaulposma.nl/?p=430</guid>
		<description><![CDATA[Last time I talked about my photoframe and room control setup. It was a laptop modification, and some hacking around in cheap remote controlled switches and simple scripts. I rebuilt most of the system now: a silent PC with normal screen serves the photos, it can control the lights and devices using a commercial product, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://janpaulposma.nl/photoframe">Last time</a> I talked about my photoframe and room control setup. It was a laptop modification, and some hacking around in cheap remote controlled switches and simple scripts. I rebuilt most of the system now: a silent PC with normal screen serves the photos, it can control the lights and devices using a commercial product, there are cameras in the room and on the street, it&#8217;s all being shown and controlled by a slick webinterface, and my grandparents are quite happy with my old photoframe in their living room. :-)</p>
<p><img src="http://janpaulposma.nl/wp-content/uploads/2010/03/IMG_0001-300x224.jpg" alt="New setup" title="New setup" width="300" height="224" class="alignnone size-medium wp-image-431" /></p>
<p><span id="more-430"></span></p>
<p>Let&#8217;s get into details! The system is running on <a href="http://www.aleutia.com/products/t1">Aleutia T1</a>, which is a really nice, silent PC-ish thing. PC-ish, because the performance is not really up to todays standards, but on the other hand it&#8217;s quite cheap, really silent and comes pre-installed with Ubuntu. Cool! <span style="font-size: 80%; color: #AAA">(However, I installed Windows XP&#8230;)</span> I got mine with a <abbr title="Solid State Drive">SSD</abbr>, which means that there are no moving parts whatsoever, therefore it can stay on 24/7.</p>
<p>Using a simple <a href="http://www.apachefriends.org/en/xampp.html">XAMPP</a> setup, it runs my photoframed software mentioned in the previous post (<a href="http://janpaulposma.nl/photoframed">demo</a>, <a href="http://github.com/janpaul123/photoframed">source</a>).</p>

<a href='http://janpaulposma.nl/simple-home-automation-system-photos-photoframe/img_0002' title='Photoframed software'><img width="150" height="111" src="http://janpaulposma.nl/wp-content/uploads/2010/03/IMG_0002-150x111.jpg" class="attachment-thumbnail" alt="Photoframed software" title="Photoframed software" /></a>
<a href='http://janpaulposma.nl/simple-home-automation-system-photos-photoframe/img_0001-2' title='Current setup'><img width="150" height="112" src="http://janpaulposma.nl/wp-content/uploads/2010/03/IMG_00011-150x112.jpg" class="attachment-thumbnail" alt="Current setup" title="Current setup" /></a>
<a href='http://janpaulposma.nl/simple-home-automation-system-photos-photoframe/img_0010' title='Webcams'><img width="150" height="112" src="http://janpaulposma.nl/wp-content/uploads/2010/03/IMG_0010-150x112.jpg" class="attachment-thumbnail" alt="Webcams" title="Webcams" /></a>
<a href='http://janpaulposma.nl/simple-home-automation-system-photos-photoframe/img_0008' title='Aleutia T1'><img width="150" height="112" src="http://janpaulposma.nl/wp-content/uploads/2010/03/IMG_0008-150x112.jpg" class="attachment-thumbnail" alt="Aleutia T1" title="Aleutia T1" /></a>

<p>The webcam setup is quite interesting. First I tried to plug the webcams using some <abbr title="Universal Serial Bus">USB</abbr> extension cords. It was highly unstable, so now the PC is actually positioned in a cardboard box, lifted from the ground, so all the cables fit exactly.</p>
<p>Another issue with the webcams is having it stream, but also have it stream securely. A promising format seemed to be <abbr title="Motion JPEG">MJPEG</abbr>: this is just like sending out JPEG frames as fast as the connection can manage. I run the following code to generate a MJPEG stream using <abbr title="VideoLan Client">VLC</abbr>. The stream is only accessible from localhost for security reasons.</p>
<p><code><br />
vlc.exe dshow:// :dshow-vdev="USB Video Device"    :dshow-adev=none :dshow-size=640x480 --no-sout-audio --sout=#transcode{vcodec=mjpg, vb=512, fps=1, width=640, height=480}:standard{access=http{mime="multipart/x-mixed-replace; boundary=7b3cc56e5f51db803f790dad720ed50a"}, mux=mpjpeg, dst=127.0.0.1:8080/cam.mjpg}<br />
</code></p>
<p>The boundary thing is a code required for modern browsers to correctly recognize the data type. If you remove the IP-address at the end, you&#8217;ll allow anyone to watch the stream. Now the next proxy is to make sure only authenticated people are able to see the stream. I tried this using a PHP script which simply read the stream and echo&#8217;ed it (and some other variants). I also tried using the Apache proxy module. But both options have the same problem: as I have a terrible internet connection, I really need the last frame. Once a frame is transmitted, the new frame must be the most recent frame possible. However, all options I tried seem to cache the data, so you&#8217;ll see 1 second of recording spread out on, like, half a minute on the client.</p>
<p>In the end I just went with a simple script I found online somewhere, that reads exactly one MJPEG frame and spits it out as ordinary JPEG:</p>
<p><code><br />
$boundary="\n--";</p>
<p>$f = fopen($_GET['url'],"r") ;</p>
<p>if($f)<br />
{<br />
        while (substr_count($r,"Content-Length") != 2) $r.=fread($f,512);</p>
<p>        $start = strpos($r,'Ø');<br />
        $end   = strpos($r,$boundary,$start)-1;<br />
        $frame = substr("$r",$start,$end - $start);</p>
<p>        header("Content-type: image/jpeg");<br />
        echo $frame;<br />
}</p>
<p>fclose($f);<br />
</code></p>
<p>Now you have to refresh the image using for example Javascript, so that&#8217;s fine too. The webinterface I&#8217;ve written for this purpose also features a slider to set refresh interval, which is pretty handy if you&#8217;ve got a shitty connection like myself. Also, this brings me to the home automation part, which is actually pretty brief. All devices in my room are plugged into a <a href="http://klikaanklikuit.nl">KlikAanKlikUit</a> unit, and the PC&#8217;s got a <a href="http://klikaanklikuit.nl/product_detail.asp?id=25">TPC-200</a> interface plugged in, and a little bit of software does the trick (<a href="http://janpaulposma.nl/kakurc">demo</a>, <a href="http://github.com/janpaul123/kakurc">source</a>).</p>
<p>The TPC-200 interface comes with a <abbr title="Dynamic Link Library">DLL</abbr> which has one single command: <em>Send(id, value)</em>, with <em>id</em> being an integer and <em>value</em> a boolean. A simple executable wrapper, hacked together in <abbr title="Visual Basic">VB</abbr>, makes it easy to send commands from PHP, using <em>exec</em>.</p>

<a href='http://janpaulposma.nl/simple-home-automation-system-photos-webcams/mac_screenshot' title='Room control interface'><img width="150" height="84" src="http://janpaulposma.nl/wp-content/uploads/2010/03/mac_screenshot-150x84.png" class="attachment-thumbnail" alt="Room control interface" title="Room control interface" /></a>
<a href='http://janpaulposma.nl/simple-home-automation-system-photos-webcams/img_0003' title='Webcam inside'><img width="150" height="112" src="http://janpaulposma.nl/wp-content/uploads/2010/03/IMG_0003-150x112.jpg" class="attachment-thumbnail" alt="Webcam inside" title="Webcam inside" /></a>
<a href='http://janpaulposma.nl/simple-home-automation-system-photos-webcams/img_0005' title='Webcam outside'><img width="150" height="112" src="http://janpaulposma.nl/wp-content/uploads/2010/03/IMG_0005-150x112.jpg" class="attachment-thumbnail" alt="Webcam outside" title="Webcam outside" /></a>

<p>The first room control breach has happened already: I used the inferior Apache Basic Authentication for the login procedure, and it turns out that sessions can keep open for a long period of time. Even when the server restarts during that time. I logged on the system on the laptop of a friend of mine, and 3 days later, he scared the crap out of me by playing with my lights. ;-) The PC restarts every night at 5am, so I&#8217;m still amazed that the session lasted that long. </p>
<p>Anyway, I quickly tracked him down using the access logs and we had a good laugh about it, but I still don&#8217;t trust the security anymore: the inside camera is pointed at the ceiling now&#8230; <abbr title="Secure Sockets Layer">SSL</abbr> and stuff like that will probably be secure enough, but if you&#8217;re considering building the same setup, don&#8217;t plug in your nuclear power plant.</p>
]]></content:encoded>
			<wfw:commentRss>http://janpaulposma.nl/simple-home-automation-system/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Photoframe(d)</title>
		<link>http://janpaulposma.nl/photoframe</link>
		<comments>http://janpaulposma.nl/photoframe#comments</comments>
		<pubDate>Mon, 18 Jan 2010 00:05:17 +0000</pubDate>
		<dc:creator>JP</dc:creator>
				<category><![CDATA[Hardware]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://janpaulposma.nl/?p=306</guid>
		<description><![CDATA[In 2007 I decided it would be cool to build a digital photo frame, out of a broken laptop. I bought the laptop from a friend of mine, as it was pretty old and useless, considering the keyboard didn&#8217;t work. With some help of my grandpa and his tools, I built it. Later, I added [...]]]></description>
			<content:encoded><![CDATA[<p>In 2007 I decided it would be cool to build a digital photo frame, out of a broken laptop. I bought the laptop from a <a href="http://www.brouwer-varenhorst.nl">friend</a> of mine, as it was pretty old and useless, considering the keyboard didn&#8217;t work. With some help of my grandpa and his tools, I built it. Later, I added speech recognition and control of the lights in my room. </p>
<p>Most of the original source code is lost, and the system doesn&#8217;t work well anymore, so I&#8217;m redesigning it. In a few months you can expect another blog post on this, but I thought a writeup of the old design would be nice.</p>
<p><img src="http://janpaulposma.nl/wp-content/uploads/2010/01/IMG_0104-300x225.jpg" alt="Photoframe" title="Photoframe" width="300" height="225" class="alignnone size-medium wp-image-307" /></p>
<p><span id="more-306"></span></p>
<p>It started with an old laptop. In an impulse I decided to see how quickly I was able to strip it until only the bare essentials were left. It was quite easy to disassemble it, and the wires were long enough to separate the display from the other components.</p>

<a href='http://janpaulposma.nl/photoframed-photos-laptop/dsc00222' title='Removed some casings'><img width="150" height="112" src="http://janpaulposma.nl/wp-content/uploads/2010/01/DSC00222-150x112.jpg" class="attachment-thumbnail" alt="Removed some casings" title="Removed some casings" /></a>
<a href='http://janpaulposma.nl/photoframed-photos-laptop/dsc00223' title='Different components'><img width="150" height="112" src="http://janpaulposma.nl/wp-content/uploads/2010/01/DSC00223-150x112.jpg" class="attachment-thumbnail" alt="Different components" title="Different components" /></a>
<a href='http://janpaulposma.nl/photoframed-photos-laptop/dsc00224' title='Disassembled!'><img width="150" height="112" src="http://janpaulposma.nl/wp-content/uploads/2010/01/DSC00224-150x112.jpg" class="attachment-thumbnail" alt="Disassembled!" title="Disassembled!" /></a>

<p>Once the laptop was disassembled, it was easy enough to go to the DIY store and buy some materials. With some careful measuring, patience and painting twice, the job was done in a few evenings.</p>

<a href='http://janpaulposma.nl/photoframed-photos-building-the-frame/dsc00225' title='Assembling the casing'><img width="150" height="112" src="http://janpaulposma.nl/wp-content/uploads/2010/01/DSC00225-150x112.jpg" class="attachment-thumbnail" alt="Assembling the casing" title="Assembling the casing" /></a>
<a href='http://janpaulposma.nl/photoframed-photos-building-the-frame/dsc00227' title='Assembling the casing'><img width="150" height="112" src="http://janpaulposma.nl/wp-content/uploads/2010/01/DSC00227-150x112.jpg" class="attachment-thumbnail" alt="Assembling the casing" title="Assembling the casing" /></a>
<a href='http://janpaulposma.nl/photoframed-photos-building-the-frame/dsc00228' title='Assembling the casing'><img width="150" height="112" src="http://janpaulposma.nl/wp-content/uploads/2010/01/DSC00228-150x112.jpg" class="attachment-thumbnail" alt="Assembling the casing" title="Assembling the casing" /></a>
<a href='http://janpaulposma.nl/photoframed-photos-building-the-frame/dsc00231' title='Assembling the casing'><img width="150" height="112" src="http://janpaulposma.nl/wp-content/uploads/2010/01/DSC00231-150x112.jpg" class="attachment-thumbnail" alt="Assembling the casing" title="Assembling the casing" /></a>
<a href='http://janpaulposma.nl/photoframed-photos-building-the-frame/dsc00232' title='Assembling the casing'><img width="150" height="112" src="http://janpaulposma.nl/wp-content/uploads/2010/01/DSC00232-150x112.jpg" class="attachment-thumbnail" alt="Assembling the casing" title="Assembling the casing" /></a>
<a href='http://janpaulposma.nl/photoframed-photos-building-the-frame/dsc00233' title='The screen fits!'><img width="150" height="112" src="http://janpaulposma.nl/wp-content/uploads/2010/01/DSC00233-150x112.jpg" class="attachment-thumbnail" alt="The screen fits!" title="The screen fits!" /></a>
<a href='http://janpaulposma.nl/photoframed-photos-building-the-frame/dsc00234' title='Adding the borders'><img width="150" height="112" src="http://janpaulposma.nl/wp-content/uploads/2010/01/DSC00234-150x112.jpg" class="attachment-thumbnail" alt="Adding the borders" title="Adding the borders" /></a>
<a href='http://janpaulposma.nl/photoframed-photos-building-the-frame/dsc00235' title='Adding the borders'><img width="150" height="112" src="http://janpaulposma.nl/wp-content/uploads/2010/01/DSC00235-150x112.jpg" class="attachment-thumbnail" alt="Adding the borders" title="Adding the borders" /></a>
<a href='http://janpaulposma.nl/photoframed-photos-building-the-frame/dsc00236' title='First paintjob'><img width="150" height="112" src="http://janpaulposma.nl/wp-content/uploads/2010/01/DSC00236-150x112.jpg" class="attachment-thumbnail" alt="First paintjob" title="First paintjob" /></a>
<a href='http://janpaulposma.nl/photoframed-photos-building-the-frame/dsc00238' title='First paintjob'><img width="150" height="112" src="http://janpaulposma.nl/wp-content/uploads/2010/01/DSC00238-150x112.jpg" class="attachment-thumbnail" alt="First paintjob" title="First paintjob" /></a>
<a href='http://janpaulposma.nl/photoframed-photos-building-the-frame/dsc00239' title='Flattening the surface'><img width="150" height="112" src="http://janpaulposma.nl/wp-content/uploads/2010/01/DSC00239-150x112.jpg" class="attachment-thumbnail" alt="Flattening the surface" title="Flattening the surface" /></a>
<a href='http://janpaulposma.nl/photoframed-photos-building-the-frame/dsc00240' title='Second paintjob'><img width="150" height="112" src="http://janpaulposma.nl/wp-content/uploads/2010/01/DSC00240-150x112.jpg" class="attachment-thumbnail" alt="Second paintjob" title="Second paintjob" /></a>
<a href='http://janpaulposma.nl/photoframed-photos-building-the-frame/dsc00241' title='Assembling internals'><img width="150" height="112" src="http://janpaulposma.nl/wp-content/uploads/2010/01/DSC00241-150x112.jpg" class="attachment-thumbnail" alt="Assembling internals" title="Assembling internals" /></a>
<a href='http://janpaulposma.nl/photoframed-photos-building-the-frame/dsc00248' title='Assembling internals'><img width="150" height="112" src="http://janpaulposma.nl/wp-content/uploads/2010/01/DSC00248-150x112.jpg" class="attachment-thumbnail" alt="Assembling internals" title="Assembling internals" /></a>
<a href='http://janpaulposma.nl/photoframed-photos-building-the-frame/dsc00249' title='Assembling internals'><img width="150" height="112" src="http://janpaulposma.nl/wp-content/uploads/2010/01/DSC00249-150x112.jpg" class="attachment-thumbnail" alt="Assembling internals" title="Assembling internals" /></a>
<a href='http://janpaulposma.nl/photoframed-photos-building-the-frame/dsc00243' title='It works!'><img width="150" height="112" src="http://janpaulposma.nl/wp-content/uploads/2010/01/DSC00243-150x112.jpg" class="attachment-thumbnail" alt="It works!" title="It works!" /></a>
<a href='http://janpaulposma.nl/photoframed-photos-building-the-frame/dsc00244' title='It works!'><img width="150" height="112" src="http://janpaulposma.nl/wp-content/uploads/2010/01/DSC00244-150x112.jpg" class="attachment-thumbnail" alt="It works!" title="It works!" /></a>

<p>To display the photos, a clock, and some RSS feeds, I used a <a href="http://gathering.tweakers.net/forum/list_message/27709204#27709204">PHP script</a> by <a href="http://tommy.ech-wel.nl/vaio-fotolijst">Tommy van der Vorst</a>, running in a fullscreen Firefox window. It worked pretty well. After some modifications, it was used by myself and others for 3 years.</p>

<a href='http://janpaulposma.nl/photoframed-photos-script-by-misterdata/dsc00245' title='The script'><img width="150" height="112" src="http://janpaulposma.nl/wp-content/uploads/2010/01/DSC00245-150x112.jpg" class="attachment-thumbnail" alt="The script" title="The script" /></a>
<a href='http://janpaulposma.nl/photoframed-photos-script-by-misterdata/dsc00246' title='The script'><img width="150" height="112" src="http://janpaulposma.nl/wp-content/uploads/2010/01/DSC00246-150x112.jpg" class="attachment-thumbnail" alt="The script" title="The script" /></a>
<a href='http://janpaulposma.nl/photoframed-photos-script-by-misterdata/dsc00247' title='The script'><img width="150" height="112" src="http://janpaulposma.nl/wp-content/uploads/2010/01/DSC00247-150x112.jpg" class="attachment-thumbnail" alt="The script" title="The script" /></a>
<a href='http://janpaulposma.nl/photoframed-photos-script-by-misterdata/dsc00258' title='The script'><img width="150" height="112" src="http://janpaulposma.nl/wp-content/uploads/2010/01/DSC00258-150x112.jpg" class="attachment-thumbnail" alt="The script" title="The script" /></a>
<a href='http://janpaulposma.nl/photoframed-photos-script-by-misterdata/dsc00257' title='The script'><img width="150" height="112" src="http://janpaulposma.nl/wp-content/uploads/2010/01/DSC00257-150x112.jpg" class="attachment-thumbnail" alt="The script" title="The script" /></a>
<a href='http://janpaulposma.nl/photoframed-photos-script-by-misterdata/dsc00256' title='The script'><img width="150" height="112" src="http://janpaulposma.nl/wp-content/uploads/2010/01/DSC00256-150x112.jpg" class="attachment-thumbnail" alt="The script" title="The script" /></a>

<p>A few months later I stumbled upon <a href="http://gathering.tweakers.net/forum/list_messages/1077675">this post</a> on a forum, which describes how to easily hack a cheap home automation remote control to hook it up to a computer. There were sets available for about €20 to control lights and devices with a remote control. So I bought two of these sets. The first hack was to hook it up to ordinary lights that are directly connected to a power source, without a wall socket in between. The setup wasn&#8217;t very safe, but it worked.</p>

<a href='http://janpaulposma.nl/photoframed-photos-receiver-hacks/dsc00259' title='A receiver'><img width="150" height="112" src="http://janpaulposma.nl/wp-content/uploads/2010/01/DSC00259-150x112.jpg" class="attachment-thumbnail" alt="A receiver" title="A receiver" /></a>
<a href='http://janpaulposma.nl/photoframed-photos-receiver-hacks/dsc00262' title='Receiver, disassembled'><img width="150" height="112" src="http://janpaulposma.nl/wp-content/uploads/2010/01/DSC00262-150x112.jpg" class="attachment-thumbnail" alt="Receiver, disassembled" title="Receiver, disassembled" /></a>
<a href='http://janpaulposma.nl/photoframed-photos-receiver-hacks/dsc00264' title='Original wiring'><img width="150" height="112" src="http://janpaulposma.nl/wp-content/uploads/2010/01/DSC00264-150x112.jpg" class="attachment-thumbnail" alt="Original wiring" title="Original wiring" /></a>
<a href='http://janpaulposma.nl/photoframed-photos-receiver-hacks/dsc00265' title='Wiring with receiver'><img width="150" height="112" src="http://janpaulposma.nl/wp-content/uploads/2010/01/DSC00265-150x112.jpg" class="attachment-thumbnail" alt="Wiring with receiver" title="Wiring with receiver" /></a>
<a href='http://janpaulposma.nl/photoframed-photos-receiver-hacks/dsc00267' title='It works!'><img width="150" height="112" src="http://janpaulposma.nl/wp-content/uploads/2010/01/DSC00267-150x112.jpg" class="attachment-thumbnail" alt="It works!" title="It works!" /></a>

<p>Next, I followed the instructions on the forum post: hook up the remote control to the serial port, detect commands using <a href="http://www.lirc.org/">LIRC</a>, and send them back to the remote control. It worked fine on the computer, but the problem is that on laptops the serial port is weaker: it usually won&#8217;t give a <a href="http://hackaday.com/2007/05/19/serial-port-power-booster/">nice and strong 12 volt signal</a>.</p>

<a href='http://janpaulposma.nl/photoframed-photos-serial-hack/dsc00268' title='Remote control'><img width="150" height="112" src="http://janpaulposma.nl/wp-content/uploads/2010/01/DSC00268-150x112.jpg" class="attachment-thumbnail" alt="Remote control" title="Remote control" /></a>
<a href='http://janpaulposma.nl/photoframed-photos-serial-hack/dsc00271' title='Remote control, disassembled'><img width="150" height="112" src="http://janpaulposma.nl/wp-content/uploads/2010/01/DSC00271-150x112.jpg" class="attachment-thumbnail" alt="Remote control, disassembled" title="Remote control, disassembled" /></a>
<a href='http://janpaulposma.nl/photoframed-photos-serial-hack/dsc00272' title='Original wiring'><img width="150" height="112" src="http://janpaulposma.nl/wp-content/uploads/2010/01/DSC00272-150x112.jpg" class="attachment-thumbnail" alt="Original wiring" title="Original wiring" /></a>
<a href='http://janpaulposma.nl/photoframed-photos-serial-hack/dsc00278' title='Added sending and receiving wiring'><img width="150" height="112" src="http://janpaulposma.nl/wp-content/uploads/2010/01/DSC00278-150x112.jpg" class="attachment-thumbnail" alt="Added sending and receiving wiring" title="Added sending and receiving wiring" /></a>
<a href='http://janpaulposma.nl/photoframed-photos-serial-hack/dsc00277' title='Signal on the scope'><img width="150" height="112" src="http://janpaulposma.nl/wp-content/uploads/2010/01/DSC00277-150x112.jpg" class="attachment-thumbnail" alt="Signal on the scope" title="Signal on the scope" /></a>

<p>The solution was rather simple: by hooking up transistors to every button, you can simulate a press of that button simply by putting a small voltage on the transistor. The easiest way to do this is by using the parallel port. Fortunately, the laptop was pretty old so this was no problem.</p>
<p><img src="http://janpaulposma.nl/wp-content/uploads/2010/01/IMG_0186-300x225.jpg" alt="Transistor hack" title="Transistor hack" width="300" height="225" class="alignnone size-medium wp-image-409" /></p>
<p>With some Visual Basic programming, the <a href="http://www.microsoft.com/speech/default.aspx">Microsoft Speech API</a> and some PHP scripts it was possible to control the lights by voice and over the internet. Which is pretty cool. Unfortunately, I lost most of the source code, so I won&#8217;t be able to share it here. Right now I&#8217;m building a new version, and when it&#8217;s done I&#8217;ll share the code!</p>
<p>For now, I&#8217;ve started <a href="http://janpaulposma.nl/photoframed">improving</a> the PHP script that shows the photos, which I&#8217;ve dubbed <em>photoframed</em>. It&#8217;s pretty nice already, you can download and contribute to it on <a href="http://github.com/janpaul123/photoframed">my github page</a>. It even works perfectly fine in an iframe like the one below.</p>
<p><iframe src="http://janpaulposma.nl/photoframed" width="600" height="450"></iframe></p>
<p>In a few months the new system should be up and running, so I&#8217;ll probably write another blog post then. Meanwhile, I invite everyone to look at the source code of photoframed and contribute. Or you can just leave a message in the form below. ;-)</p>
]]></content:encoded>
			<wfw:commentRss>http://janpaulposma.nl/photoframe/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>PimpMyBike: biking at night &#8211; with style</title>
		<link>http://janpaulposma.nl/pimpmybike-biking-at-night-with-style</link>
		<comments>http://janpaulposma.nl/pimpmybike-biking-at-night-with-style#comments</comments>
		<pubDate>Thu, 10 Sep 2009 20:40:43 +0000</pubDate>
		<dc:creator>JP</dc:creator>
				<category><![CDATA[Art]]></category>
		<category><![CDATA[Hardware]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[SCN]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://janpaulposma.nl/?p=48</guid>
		<description><![CDATA[One of the coolest projects I have worked on resulted in the turning of heads when biking through the city, and was also a great challenge as it involves some tricky hardware and software. The result was pretty darn amazing though. So this was a really cool project that took a lot of my time [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://janpaulposma.nl/wp-content/uploads/2009/09/DSC_0042-300x199.jpg" alt="Nice." title="Nice." width="300" height="199" class="alignnone size-medium wp-image-99" /></p>
<p>One of the coolest projects I have worked on resulted in the turning of heads when biking through the city, and was also a great challenge as it involves some tricky hardware and software. The result was pretty darn amazing though.</p>
<p><span id="more-48"></span></p>
<p>So this was a really cool project that took a lot of my time when I was seventeen years old. Do you know <a href="http://www.thinkgeek.com/gadgets/lights/81ff/">these</a> <a href="http://www.youtube.com/watch?v=gklBWwGyreM">gadgets</a> that write text in the air? Ever wondered how they work?</p>
<p>It&#8217;s pretty simple, actually. There is a row of <acronym title="light emitting diode">LED</acronym>-lights that you swing through the air. Those leds alternate very quickly between on and off, in a very specific pattern. When you move the leds at exactly the right velocity, the pattern will become visible to the human eye, and you can actually read text or see an image.</p>
<p>You are able to see this text because your mind will stitch the images together, like when watching TV. It all happens so fast, that you won&#8217;t see the individual frames, but you see the image as a whole. Or in case of the TV, it looks like you&#8217;re watching an actual moving scene. This phenomena is called <a href="http://en.wikipedia.org/wiki/Persistence_of_vision">Persistence of Vision</a> (POV), and quite useful when making awesome things. :-)</p>
<p>In theory it&#8217;s possible to attach a row of leds to the side your bike, and get the same effect as swinging it through the air. The problem with that is that you have to go fast. Very, very fast. Instead, there is something on the bike that has a much higher velocity than your forward velocity: the angular velocity of the weels.</p>
<p>Depending on the size of the weel and your forward velocity, you&#8217;ll get a fair number of rotations per second, enough to make it blurry to the eye. So why not take the row of leds, and put it in the wheel. Sure, you have to do some funky math to get a nice image, but it looks cool, right?!</p>
<p>But of course, it already exists: <a href="http://www.ladyada.net/make/spokepov/">SpokePOV</a> by the artist/engineer <a href="http://ladyada.net/">Ladyada</a> (who, by the way, makes very cool things!). Lucky for me, those kits only come in one color. What could be cooler than making a full-color SpokePOV?</p>
<p>After carefully selecting parts &#8211; <abbr title="red, green, blue">RGB</abbr>-leds are expensive! &#8211; the drawing began. For this I usually use <a href="http://www.lis.inpg.fr/realise_au_lis/kicad/">KiCAD</a>, an awesome open-source electronics <acronym title="computer-aided design">CAD</acronym> program. </p>
<p>Designing the circuit board was a devilish job. The routing of all the lines to the leds took a lot of time to perfect, not to mention fitting it on a board that is as small as possible. A cool thing about Kicad is that you have an awesome 3d viewer. But a 3d model with missing components kinda sucks, so I drew a few models myself in <a href="http://en.wikipedia.org/wiki/Autodesk_3ds_Max">3ds Max</a>.</p>

<a href='http://janpaulposma.nl/pimpmybike-photos-schematics/prototype-1-schematic' title='Schematic'><img width="150" height="105" src="http://janpaulposma.nl/wp-content/uploads/2009/09/Prototype-1-Schematic-150x105.png" class="attachment-thumbnail" alt="Schematic" title="Schematic" /></a>
<a href='http://janpaulposma.nl/pimpmybike-photos-schematics/prototype-1-sheet' title='Sheet design'><img width="54" height="150" src="http://janpaulposma.nl/wp-content/uploads/2009/09/Prototype-1-Sheet-54x150.png" class="attachment-thumbnail" alt="Sheet design" title="Sheet design" /></a>
<a href='http://janpaulposma.nl/pimpmybike-photos-schematics/prototype-1-3d-model' title='3d model'><img width="60" height="150" src="http://janpaulposma.nl/wp-content/uploads/2009/09/Prototype-1-3d-model-60x150.PNG" class="attachment-thumbnail" alt="3d model" title="3d model" /></a>

<p>All that done, the schematics were sent to Niels at <a href="http://makepcb.com/">MakePCB</a>, who also supplied most of the components. And how awesome, a few weeks later an envelope with the circuit boards arrived. A few hours of soldering later, and the hardware was finished.</p>

<a href='http://janpaulposma.nl/pimpmybike-photos-boards/dsc00317' title='Circuit board'><img width="150" height="112" src="http://janpaulposma.nl/wp-content/uploads/2009/09/DSC00317-150x112.jpg" class="attachment-thumbnail" alt="Circuit board" title="Circuit board" /></a>
<a href='http://janpaulposma.nl/pimpmybike-photos-boards/dsc00319' title='Circuit board'><img width="150" height="112" src="http://janpaulposma.nl/wp-content/uploads/2009/09/DSC00319-150x112.jpg" class="attachment-thumbnail" alt="Circuit board" title="Circuit board" /></a>
<a href='http://janpaulposma.nl/pimpmybike-photos-boards/dsc00318' title='Closeup'><img width="150" height="112" src="http://janpaulposma.nl/wp-content/uploads/2009/09/DSC00318-150x112.jpg" class="attachment-thumbnail" alt="Closeup" title="Closeup" /></a>
<a href='http://janpaulposma.nl/pimpmybike-photos-boards/dsc00315' title='Closeup'><img width="150" height="112" src="http://janpaulposma.nl/wp-content/uploads/2009/09/DSC00315-150x112.jpg" class="attachment-thumbnail" alt="Closeup" title="Closeup" /></a>
<a href='http://janpaulposma.nl/pimpmybike-photos-boards/dsc00322' title='Microcontroller soldering points'><img width="150" height="112" src="http://janpaulposma.nl/wp-content/uploads/2009/09/DSC00322-150x112.jpg" class="attachment-thumbnail" alt="Microcontroller soldering points" title="Microcontroller soldering points" /></a>

<p>But the hardest part was yet to come: the software. Luckily Microchip supplied an excellent USB bootloader, which I tweaked a bit to use the leds as status indicators. The embedded software is all about performance: it has to be able to keep up with the speed of the weel. Therefore it was necessary to supply the program with an image in a format that is easy to decode, and small at the same time.</p>
<p>First, a computer program in Java converted a normal image to a rotational image using some simple trigonometry. Normally, when composing images, pixel data consists of 3 bytes per pixel: one for each color. Uncompressed, this took way too much space for a small <acronym title="Peripheral Interface Controller">PIC</acronym> microcontroller. JPEG or PNG compression was not an option: way to complex to decode. So the color data was reduced to 1 byte per pixel: 3 bits for red, 3 bits for green and 2 bits for blue. Why the reduced count for blue? Well, there are 8 bits to the byte, so some color has to go down, and blue is the best choice as the eye is the least sensitive to that primary color.</p>

<a href='http://janpaulposma.nl/pimpmybike-photos-software/biertje' title='Image (Heineken logo)'><img width="150" height="139" src="http://janpaulposma.nl/wp-content/uploads/2009/09/biertje-150x139.PNG" class="attachment-thumbnail" alt="Image (Heineken logo)" title="Image (Heineken logo)" /></a>
<a href='http://janpaulposma.nl/pimpmybike-photos-software/program' title='Conversion to radial image'><img width="150" height="115" src="http://janpaulposma.nl/wp-content/uploads/2009/09/program-150x115.PNG" class="attachment-thumbnail" alt="Conversion to radial image" title="Conversion to radial image" /></a>
<a href='http://janpaulposma.nl/pimpmybike-photos-software/multiplexing' title='Multiplexing'><img width="150" height="84" src="http://janpaulposma.nl/wp-content/uploads/2009/09/multiplexing-150x84.PNG" class="attachment-thumbnail" alt="Multiplexing" title="Multiplexing" /></a>

<p>To display the colors some standard techniques are used such as <a href="http://jallib.blogspot.com/2009/02/step-by-step-having-fun-with-pwm-and.html">pulse-width modulation</a> (PWM) and LED-multiplexing, which I won&#8217;t cover in detail. However, the decoding of the pixel data to 3 bytes is kinda interesting. The C implementation was too slow, so it had to be done by hand, in assembly. Using assembly for this critical piece of code (which is only a few lines long) improved the speed of the whole program by a factor 6.</p>
<pre name="code">TBLRDPOSTINC
MOVF TABLAT, 0, ACCESS			// Read TABLAT to WREG; WREG = RRRGGGBB
MOVWF CurrentPixel, BANKED		// Put WREG in CP (CurrentPixel)
RLNCF CurrentPixel, 1, BANKED		// Shift CP to left;    WREG = RRGGGBBR
MOVF CurrentPixel, 0, BANKED 		// Put CP in WREG
ANDLW 0x06				// AND WREG with 0x06;  WREG = 00000BB0
MOVWF PWM2_0, BANKED			// Put WREG in blue channel

RLNCF CurrentPixel, 1, BANKED		// Shift CP to left;    CP   = RGGGBBRR
RLNCF CurrentPixel, 1, BANKED		// Shift CP to left;    CP   = GGGBBRRR
MOVF CurrentPixel, 0, BANKED 		// Put CP in WREG
ANDLW 0x07				// AND WREG with 0x07;  WREG = 00000RRR
MOVWF PWM0_0, BANKED			// Put WREG in red channel

RLNCF CurrentPixel, 1, BANKED		// Shift CP to left;    CP   = GGBBRRRG
RLNCF CurrentPixel, 1, BANKED		// Shift CP to left;    CP   = GBBRRRGG
RLNCF CurrentPixel, 1, BANKED		// Shift CP to left;    CP   = BBRRRGGG
MOVF CurrentPixel, 0, BANKED 		// Put CP in WREG
ANDLW 0x07				// AND WREG with 0x07;  WREG = 00000GGG
MOVWF PWM1_0, BANKED			// Put WREG in green channel
</pre>
<p>The algorithm of the program is pretty simple: take the time of one complete cycle (360 degrees). This time is measured by using a magnetic switch, with a magnet on the frame on the bike. The time is divided by 256, and a timer is set to fire a function. This function will take the next pixels, decode the colors for all the leds (on the front and on the back of the device), and feed this color to the leds using <abbr title="pulse-width modulation">PWM</abbr> and multiplexing. Result: people watching you as you go down the street at night. Mission accomplished.</p>

<a href='http://janpaulposma.nl/pimpmybike-biking-at-night-with-style/dsc_0038' title='Two boards mounted'><img width="150" height="99" src="http://janpaulposma.nl/wp-content/uploads/2009/09/DSC_0038-150x99.jpg" class="attachment-thumbnail" alt="Two boards mounted" title="Two boards mounted" /></a>
<a href='http://janpaulposma.nl/pimpmybike-biking-at-night-with-style/dsc_0043' title='Nice.'><img width="150" height="99" src="http://janpaulposma.nl/wp-content/uploads/2009/09/DSC_0043-150x99.jpg" class="attachment-thumbnail" alt="Nice." title="Nice." /></a>
<a href='http://janpaulposma.nl/pimpmybike-biking-at-night-with-style/dsc_0042' title='Nice.'><img width="150" height="99" src="http://janpaulposma.nl/wp-content/uploads/2009/09/DSC_0042-150x99.jpg" class="attachment-thumbnail" alt="Nice." title="Nice." /></a>
<a href='http://janpaulposma.nl/pimpmybike-biking-at-night-with-style/dsc_0041' title='Nice.'><img width="150" height="99" src="http://janpaulposma.nl/wp-content/uploads/2009/09/DSC_0041-150x99.jpg" class="attachment-thumbnail" alt="Nice." title="Nice." /></a>
<a href='http://janpaulposma.nl/pimpmybike-biking-at-night-with-style/dsc_0040' title='Nice.'><img width="150" height="99" src="http://janpaulposma.nl/wp-content/uploads/2009/09/DSC_0040-150x99.jpg" class="attachment-thumbnail" alt="Nice." title="Nice." /></a>
<a href='http://janpaulposma.nl/pimpmybike-biking-at-night-with-style/dsc_0037' title='Funky effect when moving the camera'><img width="150" height="99" src="http://janpaulposma.nl/wp-content/uploads/2009/09/DSC_0037-150x99.jpg" class="attachment-thumbnail" alt="Funky effect when moving the camera" title="Funky effect when moving the camera" /></a>

<p>As you can see on the photos, I ended up mounting two boards on the wheel. Otherwise you had to drive quite fast.. The synchronization of the two boards happens automatically, because they will both align to the magnet. Except when accelerating or slowing down, both boards remain in sync quite well.</p>
<p>I managed to get this project approved as an assignment for school (&#8216;profielwerkstuk&#8217;), so the documentation is quite extensive. It can provide an interesting read if you like to know more about the used components, programs and techniques. You&#8217;ll also read about some major design decisions. It&#8217;s only available in Dutch though.. <a href="http://janpaulposma.nl/wp-content/uploads/2009/09/Profielwerkstuk.pdf">Download</a>.</p>
<p>There are still a few un-soldered boards laying around here, as well as all the hardware designs and software code. However, I won&#8217;t post it here as many things are unfinished and not at all ready for production. Also, the parts are pretty expensive, especially when taking into consideration you need at least two boards per wheel. If you&#8217;re interested though to take this to the next level though, feel free to contact me and we can talk about it. But be warned: a lot of work needs to be done to have it work really well.</p>
<p><strong>Update</strong>: it seems that around the time I built this, <a href="http://www.monkeylectric.com/">some other guys</a> also got the idea and commercialized it. Their simple version does not support images or synchronization of the units, but looks awesome nevertheless. Their pro version is very cool and even supports animations and on-the-fly wireless programming but is priced at thousands of dollars. It seems though, they have done a great job! :-)</p>
]]></content:encoded>
			<wfw:commentRss>http://janpaulposma.nl/pimpmybike-biking-at-night-with-style/feed</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
	</channel>
</rss>

