<?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>Modprobe</title>
	<atom:link href="http://modprobe.complex.ch/feed/" rel="self" type="application/rss+xml" />
	<link>http://modprobe.complex.ch</link>
	<description>Funky laboratories</description>
	<lastBuildDate>Thu, 22 Jul 2010 19:52:46 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>RECYCLING: a spoon against XDCAM Transfert</title>
		<link>http://modprobe.complex.ch/2010/07/22/recycling-a-spoon-against-xdcam-transfert/</link>
		<comments>http://modprobe.complex.ch/2010/07/22/recycling-a-spoon-against-xdcam-transfert/#comments</comments>
		<pubDate>Thu, 22 Jul 2010 19:11:37 +0000</pubDate>
		<dc:creator>TO</dc:creator>
				<category><![CDATA[Stupids]]></category>
		<category><![CDATA[arduino]]></category>
		<category><![CDATA[robots]]></category>

		<guid isPermaLink="false">http://modprobe.complex.ch/?p=851</guid>
		<description><![CDATA[Tonight a friend came with her brand new Mac and a lot of files to import using XDCAM Transfert. It seams that this software was made by tired developers, so we had to generate previews on every clip before importing. Well, the real problem isn&#8217;t that you have to select the folder, but the fact [...]]]></description>
			<content:encoded><![CDATA[<p>Tonight a friend came with her brand new Mac and a lot of files to import using XDCAM Transfert.<br />
It seams that this software was made by tired developers, so we had to generate previews on every clip before importing.<br />
Well, the real problem isn&#8217;t that you have to select the folder, but the fact that you have wait about one second for previews generation (no, there is no &#8220;group function&#8221;).</p>
<p>With about 3&#8217;500 folder, we would have been quickly mad.</p>
<p>And of course, moving all files in one folder isn&#8217;t possible, because they already are sorted.<br />
There is probably many other (programmatic and smarter) solutions, but the punk-ier still is the funn-ier, no ?</p>
<p>So my solution is to recycle an <a href="http://modprobe.complex.ch/2009/03/21/a-spoon-to-feed-proto/">old project</a>, writing this post and going for a nice diner, while the mechanism goes by it-self&#8230;</p>
<p><object width="484" height="388"><param name="movie" value="http://www.youtube.com/v/jnt6BHdk7Os&amp;hl=en_US&amp;fs=1?rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/jnt6BHdk7Os&amp;hl=en_US&amp;fs=1?rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="484" height="388"></embed></object></p>
<p>PS: I guess it&#8217;s a good way to test keyboards&#8230;</p>
<pre name='code' class='c'>
#include <Servo.h>

Servo servo;

int servo_pin = 9;

void setup ()
{
  servo.attach(servo_pin);
  Serial.begin(57600);
  Serial.println ("Finished setup\n");
}

void loop ()
{
  servo.write(115);
  delay(250);
  servo.write(80);
  delay (1000);
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://modprobe.complex.ch/2010/07/22/recycling-a-spoon-against-xdcam-transfert/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Makerbot, long story short</title>
		<link>http://modprobe.complex.ch/2010/07/19/makerbot-long-story-short/</link>
		<comments>http://modprobe.complex.ch/2010/07/19/makerbot-long-story-short/#comments</comments>
		<pubDate>Mon, 19 Jul 2010 15:36:01 +0000</pubDate>
		<dc:creator>TO</dc:creator>
				<category><![CDATA[makerbot]]></category>
		<category><![CDATA[robots]]></category>

		<guid isPermaLink="false">http://modprobe.complex.ch/?p=815</guid>
		<description><![CDATA[Voilà, I received a makerbot in the beginning of February. The following is the story of my adventures with this great, but at times frustrating, piece of technology. When I ordered the printer, I was expecting a tool and not a toy. I strongly hoped that I would be able to print my own parts [...]]]></description>
			<content:encoded><![CDATA[<p>Voilà, I received a <a href="http://www.makerbot.com/">makerbot</a> in the beginning of February. The following is the story of my adventures with this great, but at times frustrating, piece of technology.</p>
<p>When I ordered the printer, I was expecting a tool and not a toy. I strongly hoped that I would be able to print my own parts for bots, prototype and so on. I believe I will now be able to use it as a tool, but it took some work and tinkering to get there.</p>
<p>When the package arrived, I had to wait 2 more days before starting to build the machine. But then, I forgot all my duties and dove deep in the assembly for what turned out to be a long evening of happiness. I can easily relate this moment with my child memories: spending days and night with legos, mekanos and computers, where the conscience is a perfect mix of dreams and reality.</p>
<p>Building the printer was easy. It&#8217;s pretty well explained on <em>wiki.makerbot.com</em>. The parts are precise and well designed.<br />
Except for some details with the plastruder and the inversion of two motor axis, everything worked out of the box.<br />
However, I experienced pain with the software. <em>Skeinforge</em> is a complicated software, because 3D printing by extrusion is something complicated. But <em>Skeinforge</em> is also a bit immature and performances are not that good.</p>
<p>Anyways, finally I was able to print little pieces. However,  when I tried larger pieces or more complicated forms, the plastruder jammed. It took me a while to understand the multiple origins of this problem:</p>
<h3>1. the plastruder</h3>
<p>Assembling the extruder isn&#8217;t that difficult as long as you understand what really matters !<br />
It is well documented on the internet, but I think it&#8217;s worth telling again.<br />
Two mechanism are fundamental :<br />
<strong>1. the ABS filament propulsion</strong><br />
The force which causes the extrusion has to be powerful and constant. Makerbot industries produced a <a href="http://store.makerbot.com/toolheads/plastruder/mk5-drive-gear.html">new pulley gear</a> which improves this aspect.<br />
It turns out after a short while that the idler bearing brike because of the excessive forces bearing on it.<br />
To make it push &#8216;like a charm&#8217; I had to check the following points twice :<br />
- the idler pulley is stable and well aligned with the motor pulley (which is not so easy, I used spare washers)<br />
- the motor pulley used should be the MK5 model, the new one<br />
- washers around the idler bearing should be oriented to produce as little friction as possible<br />
- the gad between both pulleys is tight and correct (use the calibration tool to check)<br />
- everything is well tightened</p>
<p>It should be very difficult (and not recommended) to keep the filament from going forward through the pinch system. </p>
<p><strong>2. the linearity of the filament&#8217;s path through the insulator to the heater barrel</strong><br />
When the heat is on, it happens that the PTFE insulator expands with the effect to let ABS matter leak between the insulator and the heating barrel. The more material leaks, the wider the gap grows.<br />
When the insulator inflates it becomes impossible to extrude.<br />
Digging the web I found two solutions :<br />
- Using <a href="http://www.makergear.com/products/plastruder-replacement-parts">PEEK insulator</a> instead of PTFE seams to improve durability (I haven&#8217;t tried this yet, my parts have just arrived)<br />
- Tighten the insulator with a hose clamp (which I did on my old defunct PTFE insulator)</p>
<h3>3. the heating platform</h3>
<p>A heating platform is a good choice. Mine is made of 3 8ohm resistors setup in serial.</p>
<p>With theses two adaptations, I&#8217;ve been able to print almost everything.</p>
<h3>ReplicatorG</h3>
<p>Working with skeinforge&#8217;s configuration was a bad adventure. Fighting with parameters and struggling with weak performances isn&#8217;t easy at all.<br />
Hopefully the new <a href="http://replicat.org/">ReplicatorG</a> can hide all those details for beginners and grumpy guys like me.</p>

<a href='http://modprobe.complex.ch/2010/07/19/makerbot-long-story-short/img_0637/' title='Dynamo wheel'><img width="150" height="150" src="http://modprobe.complex.ch/wp-content/uploads/2010/07/IMG_0637-150x150.jpg" class="attachment-thumbnail" alt="Dynamo wheel" title="Dynamo wheel" /></a>
<a href='http://modprobe.complex.ch/2010/07/19/makerbot-long-story-short/img_0638/' title='Dynamo wheel'><img width="150" height="150" src="http://modprobe.complex.ch/wp-content/uploads/2010/07/IMG_0638-150x150.jpg" class="attachment-thumbnail" alt="Dynamo wheel" title="Dynamo wheel" /></a>
<a href='http://modprobe.complex.ch/2010/07/19/makerbot-long-story-short/file0014/' title='extruder with hose clamp'><img width="150" height="150" src="http://modprobe.complex.ch/wp-content/uploads/2010/07/FILE0014-150x150.jpg" class="attachment-thumbnail" alt="extruder with hose clamp" title="extruder with hose clamp" /></a>
<a href='http://modprobe.complex.ch/2010/07/19/makerbot-long-story-short/file0269/' title='FILE0269'><img width="150" height="150" src="http://modprobe.complex.ch/wp-content/uploads/2010/07/FILE0269-150x150.jpg" class="attachment-thumbnail" alt="FILE0269" title="FILE0269" /></a>
<a href='http://modprobe.complex.ch/2010/07/19/makerbot-long-story-short/file0260/' title='Geko print'><img width="150" height="150" src="http://modprobe.complex.ch/wp-content/uploads/2010/07/FILE0260-150x150.jpg" class="attachment-thumbnail" alt="Geko print" title="Geko print" /></a>
<a href='http://modprobe.complex.ch/2010/07/19/makerbot-long-story-short/img_0356/' title='Heating platform, bottom view'><img width="150" height="150" src="http://modprobe.complex.ch/wp-content/uploads/2010/07/IMG_0356-150x150.jpg" class="attachment-thumbnail" alt="Heating platform, bottom view" title="Heating platform, bottom view" /></a>
<a href='http://modprobe.complex.ch/2010/07/19/makerbot-long-story-short/img_0358/' title='Heating platform, build'><img width="150" height="150" src="http://modprobe.complex.ch/wp-content/uploads/2010/07/IMG_0358-150x150.jpg" class="attachment-thumbnail" alt="Heating platform, build" title="Heating platform, build" /></a>
<a href='http://modprobe.complex.ch/2010/07/19/makerbot-long-story-short/img_0362/' title='Heating platform, in the makerbot'><img width="150" height="150" src="http://modprobe.complex.ch/wp-content/uploads/2010/07/IMG_0362-150x150.jpg" class="attachment-thumbnail" alt="Heating platform, in the makerbot" title="Heating platform, in the makerbot" /></a>
<a href='http://modprobe.complex.ch/2010/07/19/makerbot-long-story-short/img_0357/' title='Heating platform, sandwich'><img width="150" height="150" src="http://modprobe.complex.ch/wp-content/uploads/2010/07/IMG_0357-150x150.jpg" class="attachment-thumbnail" alt="Heating platform, sandwich" title="Heating platform, sandwich" /></a>
<a href='http://modprobe.complex.ch/2010/07/19/makerbot-long-story-short/img_0269/' title='IMG_0269'><img width="150" height="150" src="http://modprobe.complex.ch/wp-content/uploads/2010/07/IMG_0269-150x150.jpg" class="attachment-thumbnail" alt="IMG_0269" title="IMG_0269" /></a>
<a href='http://modprobe.complex.ch/2010/07/19/makerbot-long-story-short/img_0270/' title='IMG_0270'><img width="150" height="150" src="http://modprobe.complex.ch/wp-content/uploads/2010/07/IMG_0270-150x150.jpg" class="attachment-thumbnail" alt="IMG_0270" title="IMG_0270" /></a>
<a href='http://modprobe.complex.ch/2010/07/19/makerbot-long-story-short/img_0636/' title='Large piece (dynamo wheel)'><img width="150" height="150" src="http://modprobe.complex.ch/wp-content/uploads/2010/07/IMG_0636-150x150.jpg" class="attachment-thumbnail" alt="Large piece (dynamo wheel)" title="Large piece (dynamo wheel)" /></a>
<a href='http://modprobe.complex.ch/2010/07/19/makerbot-long-story-short/img_0639/' title='Makerbot : limbless woman'><img width="150" height="150" src="http://modprobe.complex.ch/wp-content/uploads/2010/07/IMG_0639-150x150.jpg" class="attachment-thumbnail" alt="Makerbot : limbless woman" title="Makerbot : limbless woman" /></a>

<p>Tonight is the first time I could print in peace and reliably, without worries, which explains my motivation in writing this post. I&#8217;m happy and looking forward to finding lots of real use for my printer. Thanks to makerbot industries and thanks to all the makerbot owners who helped me find a solution.</p>
<p><object width="484" height="364"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=13450854&amp;server=vimeo.com&amp;show_title=0&amp;show_byline=0&amp;show_portrait=0&amp;color=bababa&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=13450854&amp;server=vimeo.com&amp;show_title=0&amp;show_byline=0&amp;show_portrait=0&amp;color=bababa&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="484" height="364"></embed></object></p>
<h3>links</h3>
<p>STL-> gcode improvement witch CUDA : <a href="http://pleasantsoftware.com/developer/3d/">http://pleasantsoftware.com/developer/3d/</a><br />
Interesting experiments : <a href="http://hydraraptor.blogspot.com/">http://hydraraptor.blogspot.com/</a><br />
hose clamp solution on makerbot blog : <a href="http://blog.makerbot.com/2010/07/14/barriers-barrels-ptfe-oh-my/">http://blog.makerbot.com/2010/07/14/barriers-barrels-ptfe-oh-my/</a><br />
hose clamp solution on makerbot forums : <a href="http://wiki.makerbot.com/forum/t-250421">http://wiki.makerbot.com/forum/t-250421</a></p>
]]></content:encoded>
			<wfw:commentRss>http://modprobe.complex.ch/2010/07/19/makerbot-long-story-short/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>pololu 3pi ir tracking and control V2</title>
		<link>http://modprobe.complex.ch/2010/06/07/pololu-3pi-ir-tracking-and-control-v2/</link>
		<comments>http://modprobe.complex.ch/2010/06/07/pololu-3pi-ir-tracking-and-control-v2/#comments</comments>
		<pubDate>Mon, 07 Jun 2010 12:24:32 +0000</pubDate>
		<dc:creator>david</dc:creator>
				<category><![CDATA[c++]]></category>
		<category><![CDATA[openframeworks]]></category>
		<category><![CDATA[robots]]></category>
		<category><![CDATA[3pi]]></category>
		<category><![CDATA[pololu]]></category>

		<guid isPermaLink="false">http://modprobe.complex.ch/?p=807</guid>
		<description><![CDATA[I made some progress with the pololu tracking and control project. To allow for better control, I updated the communication protocol between the desktop program and the robot. The previous version supported a minimal set of commands (stop, forwards, spin left, spin right). This set has been replaced by a tuple of values directly controlling [...]]]></description>
			<content:encoded><![CDATA[<p>I made some progress with the pololu tracking and control project. </p>
<p>To allow for better control, I updated the communication protocol between the desktop program and the robot. The previous version supported a minimal set of commands (stop, forwards, spin left, spin right). This set has been replaced by a tuple of values directly controlling the speed of the left and right motors. This allows us to write a more &#8220;ambitious&#8221; target following algorithm.</p>
<p>The new heuristic is in two steps, speed and direction. We first determine the distance between the tracked robot and the target, and set the speed component as a proportion to distance (close = slow, far = fast). The direction is calculated in a similar fashion: we turn in the direction of the target,  the bigger the angle difference between the current heading of the 3pi and the target, the stronger the turn. This remains a simple algorithm, but I a kind of like the behavior. There is more life to it. The following video illustrates (the white dot represents the position of target, the orange dot represents the position of the tracked 3pi robot).</p>
<p><object width="484" height="364"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=12361385&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=12361385&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="484" height="364"></embed></object>
<p><a href="http://vimeo.com/12361385">3pi pololu robot controlled via ir tracking: second test</a> from <a href="http://vimeo.com/user1467461">david hodgetts</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://modprobe.complex.ch/2010/06/07/pololu-3pi-ir-tracking-and-control-v2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>pololu 3pi robot controlled via computer vision: first test</title>
		<link>http://modprobe.complex.ch/2010/05/23/pololu-3pi-robot-controlled-via-computer-vision-first-test/</link>
		<comments>http://modprobe.complex.ch/2010/05/23/pololu-3pi-robot-controlled-via-computer-vision-first-test/#comments</comments>
		<pubDate>Sat, 22 May 2010 22:00:11 +0000</pubDate>
		<dc:creator>david</dc:creator>
				<category><![CDATA[c++]]></category>
		<category><![CDATA[openframeworks]]></category>
		<category><![CDATA[robots]]></category>

		<guid isPermaLink="false">http://modprobe.complex.ch/?p=772</guid>
		<description><![CDATA[I was recently working on some boid like procedural animations and I was thinking it would be fun to transpose such a system in the physical space. Theo recently received a collection of 5 pololu 3pi robots, and I decided they would be ideal candidates for such a project. The 3pi pololu robots are fairly [...]]]></description>
			<content:encoded><![CDATA[<p>I was recently working on some <a href="http://www.demainlalune.ch/2010/05/19/scolu-aquatic-creatures-on-mobile-screens/">boid</a> like procedural animations and I was thinking it would be fun to transpose such a system in the physical space. Theo recently received a collection of 5 pololu 3pi <a href="http://www.pololu.com/catalog/product/975">robots</a>, and I decided they would be ideal candidates for such a project. </p>
<p>The 3pi pololu robots are fairly simple, so I figured it would be easier to consider the robots as brainless and blind particles under the control of an all-seeing &#8220;smart&#8221; desktop computer. </p>
<p>The first problem was remote communication with the 3pi. Thankfully, Theo was kind enough to mount an xbee module on one of the bots. This allows remote communication via a serial port abstraction. </p>
<p><img src="http://modprobe.complex.ch/wp-content/uploads/2010/05/3piWithXbee.jpg" alt="" title="3piWithXbee" width="485" height="364" class="alignleft size-full wp-image-779" /></p>
<p>The second problem was vision, the desktop controller needs to know the position of the 3pi. As I wanted to create a test environment quickly I fired up <a href="http://ccv.nuigroup.com/">CCV</a> instead of written custom tracking code. This is an open source tracker usually used for multitouch surfaces. </p>
<p>I thought it would be interesting to track the 3pi with Infrared light, this would allow for a overhead projection to be added later without influencing the tracking. I used an IR sensitive ps3 eye webcam and Theo added an infrared led to the 3pi to make it visible to the camera (it&#8217;s the led on top of the mast on the 3pi picture). The setup was ready to track and send the position of the 3pi to the main desktop program. Now that I knew the position of the 3pi, it was time to make it find and move to a new arbitrary position (target).</p>
<p>For a first test, I opted for a very naive strategy. The situation is the following:<br />
 1. we know the position of the 3pi via tracking but not its orientation (visually tracking the orientation is too big of a problem for this first test).<br />
 2. we can control the motors of the 3pi, make it move forwards and turn, but we can&#8217;t tell it to move or turn a known distance (for instance you can&#8217;t tell it to turn 30 degrees).</p>
<p>However, if we tell the bot to move forwards, and we track the movement, we get a new position, which we can compare to the starting position and transpose as a vector, and now we have a direction. </p>
<p>The next step was to decide for a simple vocabulary of movements for the 3pi. I decided that it could either be moving forwards, or spinning to the right, or spinning to the left or, finally, it could be immobile. The heuristic is then quite simple:</p>
<p>1. move forwards</p>
<p>2.  are we close enough to the target to be considered the final position?<br />
if yes<br />
   stop all done.<br />
else<br />
   are we getting closer to the target?<br />
      if yes<br />
              continue forwards<br />
      else<br />
             decide if target is to the left or to the right of 3pi and spin in the corresponding direction, then goto 1</p>
<p>Granted this is very naive, but fine for a proof of concept stage.<br />
I used <a href="http://www.openframeworks.cc/">openframeworks</a> to read the tracking information and to communicate serially (xbee) with the 3pi. </p>
<p>You can see the first result in the following video. On the screen, the white dot represents the target and the blue dot is the tracked position of the 3pi.</p>
<p><object width="485" height="364"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=11952953&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=11952953&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="484" height="364"></embed></object></p>
<p>As you can see the basic system is in place, but there is still a lot of work to get a more fluid experience : )</p>
]]></content:encoded>
			<wfw:commentRss>http://modprobe.complex.ch/2010/05/23/pololu-3pi-robot-controlled-via-computer-vision-first-test/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>post tenebras labs&#8217; arduino workshop</title>
		<link>http://modprobe.complex.ch/2010/04/25/post-tenebras-labs-arduino-workshop/</link>
		<comments>http://modprobe.complex.ch/2010/04/25/post-tenebras-labs-arduino-workshop/#comments</comments>
		<pubDate>Sun, 25 Apr 2010 19:48:24 +0000</pubDate>
		<dc:creator>david</dc:creator>
				<category><![CDATA[News]]></category>

		<guid isPermaLink="false">http://modprobe.complex.ch/?p=758</guid>
		<description><![CDATA[Theo, Julien and myself went to the arduino workshop organised by the guys at post tenebras labs. The workshop was interesting and fun. It&#8217;s always nice to meet fellow geeks : ) Hope we will have another occasion to get together and work on some cool projects.]]></description>
			<content:encoded><![CDATA[<p>Theo, Julien and myself went to the arduino workshop organised by the guys at <a href="http://www.posttenebraslab.ch/wiki/">post tenebras labs</a>.<br />
The workshop was interesting and fun. It&#8217;s always nice to meet fellow geeks : )<br />
Hope we will have another occasion to get together and work on some cool projects.</p>

<a href='http://modprobe.complex.ch/2010/04/25/post-tenebras-labs-arduino-workshop/img_0495/' title='IMG_0495'><img width="150" height="150" src="http://modprobe.complex.ch/wp-content/uploads/2010/04/IMG_0495-150x150.jpg" class="attachment-thumbnail" alt="IMG_0495" title="IMG_0495" /></a>
<a href='http://modprobe.complex.ch/2010/04/25/post-tenebras-labs-arduino-workshop/img_0496/' title='IMG_0496'><img width="150" height="150" src="http://modprobe.complex.ch/wp-content/uploads/2010/04/IMG_0496-150x150.jpg" class="attachment-thumbnail" alt="IMG_0496" title="IMG_0496" /></a>
<a href='http://modprobe.complex.ch/2010/04/25/post-tenebras-labs-arduino-workshop/img_0497/' title='IMG_0497'><img width="150" height="150" src="http://modprobe.complex.ch/wp-content/uploads/2010/04/IMG_0497-150x150.jpg" class="attachment-thumbnail" alt="IMG_0497" title="IMG_0497" /></a>
<a href='http://modprobe.complex.ch/2010/04/25/post-tenebras-labs-arduino-workshop/img_0499/' title='IMG_0499'><img width="150" height="150" src="http://modprobe.complex.ch/wp-content/uploads/2010/04/IMG_0499-150x150.jpg" class="attachment-thumbnail" alt="IMG_0499" title="IMG_0499" /></a>

]]></content:encoded>
			<wfw:commentRss>http://modprobe.complex.ch/2010/04/25/post-tenebras-labs-arduino-workshop/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Blender in fullscreen under OSX</title>
		<link>http://modprobe.complex.ch/2010/03/14/blender-in-fullscreen-under-osx/</link>
		<comments>http://modprobe.complex.ch/2010/03/14/blender-in-fullscreen-under-osx/#comments</comments>
		<pubDate>Sat, 13 Mar 2010 23:08:56 +0000</pubDate>
		<dc:creator>TO</dc:creator>
				<category><![CDATA[blender]]></category>

		<guid isPermaLink="false">http://modprobe.complex.ch/?p=734</guid>
		<description><![CDATA[Running blender with the argument &#8220;-W&#8221; starts it in fullscreen mode. But under OSX, users applications stored in the folder /Applications are not ran like command line tools. In a terminal windows, using CLI, you are supposed to run the command open to invoke users applications. Then, you can add an argument to open to [...]]]></description>
			<content:encoded><![CDATA[<p>Running blender with the argument &#8220;-W&#8221; starts it in fullscreen mode.<br />
But under OSX, users applications stored in the folder <i>/Applications</i> are not ran like command line tools.<br />
In a terminal windows, using CLI, you are supposed to run the command <i>open</i> to invoke users applications.<br />
Then, you can add an argument to <i>open</i> to append arguments to your executable!</p>
<pre name="code" class="script">
open /Applications/Blender/blender.app --args -W
</pre>
<p>I tried to put it directly in Info.plist which wasn&#8217;t possible.</p>
<p>Using <i>automator</i> I have been able to build another user application (kind of script) that runs Blender with the fullscreen parameter.<br />
All through the <i>Finder</i> so it&#8217;s easy, even for newbs and lazy creatures.</p>

<a href='http://modprobe.complex.ch/2010/03/14/blender-in-fullscreen-under-osx/screen-shot-2010-03-13-at-11-35-17-pm/' title='Automator window'><img width="150" height="150" src="http://modprobe.complex.ch/wp-content/uploads/2010/03/Screen-shot-2010-03-13-at-11.35.17-PM-150x150.png" class="attachment-thumbnail" alt="Automator window" title="Automator window" /></a>
<a href='http://modprobe.complex.ch/2010/03/14/blender-in-fullscreen-under-osx/screen-shot-2010-03-14-at-12-05-29-am/' title='Screen shot 2010-03-14 at 12.05.29 AM'><img width="150" height="150" src="http://modprobe.complex.ch/wp-content/uploads/2010/03/Screen-shot-2010-03-14-at-12.05.29-AM-150x150.png" class="attachment-thumbnail" alt="Screen shot 2010-03-14 at 12.05.29 AM" title="Screen shot 2010-03-14 at 12.05.29 AM" /></a>

<p>Finally you can shortcut it to your <i>dock</i> or anywhere else.</p>
<p><a href='http://modprobe.complex.ch/wp-content/uploads/2010/03/blender_fullscreen.app_.zip'>blender_fullscreen.app</a></p>
<p><b>ERRATA</b><br />
I had some strange issues using the <i>-W</i> switch. Use the command below instead :</p>
<pre name="code" class="script">
open /Applications/Blender/blender.app --args -p 0 900 1440 900
</pre>
<p>Where 1440 and 900 are X &#038; Y of your resolution.</p>
<p>Open the package using <i>open package content</i> of your <i>Automator script</i> and edit Info.plist. Add:</p>
<pre name="code" class="script">
&lt;key&gt;LSUIPresentationMode&lt;/key&gt;
&lt;real&gt;4&lt;/real&gt;
</pre>
<p><b>/ERRATA</b></p>
]]></content:encoded>
			<wfw:commentRss>http://modprobe.complex.ch/2010/03/14/blender-in-fullscreen-under-osx/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hello RS485 with Arduino</title>
		<link>http://modprobe.complex.ch/2010/03/13/hello-rs485-arduino/</link>
		<comments>http://modprobe.complex.ch/2010/03/13/hello-rs485-arduino/#comments</comments>
		<pubDate>Sat, 13 Mar 2010 00:38:06 +0000</pubDate>
		<dc:creator>reno</dc:creator>
				<category><![CDATA[Embarquée]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[RS485]]></category>

		<guid isPermaLink="false">http://modprobe.complex.ch/?p=719</guid>
		<description><![CDATA[Nothing fancy here, just trying to get started with RS485 and Arduino. So here we go for a basic setup with one master that only emits and one slave that just listens. See the comments for the wiring: /* RS 485 V1 Master, using a SN75176BP ------- RO -&#124; &#124;- VCC [connect to 5v] &#124; [...]]]></description>
			<content:encoded><![CDATA[<p>Nothing fancy here, just trying to get started with <a title="RS 485" href="http://en.wikipedia.org/wiki/RS-485">RS485</a> and <a href="http://www.arduino.cc/">Arduino</a>. So here we go for a basic setup with one master that only emits and one slave that just listens. See the comments for the wiring:</p>
<pre name="code" class="c">/* RS 485 V1 Master, using a SN75176BP

                              -------
                          RO -|     |- VCC [connect to 5v]
                              |     |
                          RE -|     |- B--------------&gt;   [connect to Slave's B]
                              |     |        | 120R (parallel resistor)
          connect to 5V   DE -|     |- A--------------&gt;   [connect to Slave's A]
                              |     |
   connect to pin 1 (TX)  DI -|     |- GND [connect to GND]
                              -------

*/
const int ledPin = 13;      // the pin that the LED is attached to

void setup() {
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT);
}

void loop() {

  byte b = 0;

  Serial.write(b);
  analogWrite(ledPin, b);
  delay(1000);

  b=255;

  Serial.write(b);
  analogWrite(ledPin, b);
  delay(1000);
}</pre>
<p>And now for the slave:</p>
<pre name="code" class="c">/* RS 485 V1 SLAVE, using a SN75176BP

                              -------
   connect to pin 0 (RX)  RO -|     |- VCC [connect to 5v]
                              |     |
          connect toGND   RE -|     |- B--------------&gt;   [connect to Master's B]
                              |     |        | 120R (parallel resistor)
                          DE -|     |- A--------------&gt;   [connect to Master's A]
                              |     |
                          DI -|     |- GND [connect to GND]
                              -------

YOU'LL HAVE TO DISCONNECT RO DURING UPLOAD TO I/O BOARD!!!!!!!!!                          

*/
const int ledPin = 13;      // the pin that the LED is attached to

void setup() {
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT);
}

void loop() {
  byte brightness;

  if (Serial.available()) {// check if data has been sent from the computer:

    brightness = Serial.read(); // read the most recent byte (which will be from 0 to 255):

    analogWrite(ledPin, brightness); // set the brightness of the LED:
  }
}</pre>
<p>If all goes according to the plan, you should see something like this:<br />
<br/><br />
<object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/e_HqusBZXoM&#038;color1=0xb1b1b1&#038;color2=0xcfcfcf&#038;hl=en_US&#038;feature=player_embedded&#038;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowScriptAccess" value="always"></param><embed src="http://www.youtube.com/v/e_HqusBZXoM&#038;color1=0xb1b1b1&#038;color2=0xcfcfcf&#038;hl=en_US&#038;feature=player_embedded&#038;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="425" height="344"></embed></object><br />
<br/><br />
<a href="http://modprobe.complex.ch/wp-content/uploads/2010/03/FILE0004.jpg"><img src="http://modprobe.complex.ch/wp-content/uploads/2010/03/FILE0004-300x232.jpg" alt="" title="closeup" width="300" height="232" class="aligncenter size-medium wp-image-727" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://modprobe.complex.ch/2010/03/13/hello-rs485-arduino/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Makerbot Geneva &#8211; a new google group</title>
		<link>http://modprobe.complex.ch/2010/03/05/makerbot-geneva-a-new-google-group/</link>
		<comments>http://modprobe.complex.ch/2010/03/05/makerbot-geneva-a-new-google-group/#comments</comments>
		<pubDate>Fri, 05 Mar 2010 14:10:15 +0000</pubDate>
		<dc:creator>TO</dc:creator>
				<category><![CDATA[News]]></category>

		<guid isPermaLink="false">http://modprobe.complex.ch/?p=716</guid>
		<description><![CDATA[I just created a new mailing list in google groups. http://groups.google.com/group/makerbot-geneva]]></description>
			<content:encoded><![CDATA[<p>I just created a new mailing list in google groups.<br />
<a href="http://groups.google.com/group/makerbot-geneva">http://groups.google.com/group/makerbot-geneva</a></p>
]]></content:encoded>
			<wfw:commentRss>http://modprobe.complex.ch/2010/03/05/makerbot-geneva-a-new-google-group/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sierpinsky triangle python script for blender</title>
		<link>http://modprobe.complex.ch/2010/02/28/sierpinsky-triangle-python-script-for-blender/</link>
		<comments>http://modprobe.complex.ch/2010/02/28/sierpinsky-triangle-python-script-for-blender/#comments</comments>
		<pubDate>Sun, 28 Feb 2010 18:07:17 +0000</pubDate>
		<dc:creator>david</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[blender]]></category>
		<category><![CDATA[makerbot]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[sierpinsky]]></category>

		<guid isPermaLink="false">http://modprobe.complex.ch/?p=690</guid>
		<description><![CDATA[After printing a sierpinsky triangle on Theo&#8217;s makerbot, I thought it might interest some of you to see how I generated the geometry in blender. However, before starting I should warn you that my knowledge of Blender is virtually non-existent. The blender specific code used here to generate faces is probably not ideal and you&#8217;re [...]]]></description>
			<content:encoded><![CDATA[<p>After printing a sierpinsky triangle on Theo&#8217;s makerbot, I thought it might interest some of you to see how I generated the geometry in blender.</p>
<p>However, before starting I should warn you that my knowledge of Blender is virtually non-existent. The blender specific code used here to generate faces is probably not ideal and you&#8217;re very welcome to improve that part.</p>
<p>So, what do we want to do? Make triangles, lots of them. We probably need a function to generate triangles. Let&#8217;s stay simple and assume that a triangle is composed of 3 points. We are in a 3d space so each point will have 3 components. We shall refer to these points as Vertices. There are many ways to represent this type of data in Python. For something different, let&#8217;s try namedtuples. They provide an elegant extension to the base tuple type. They work as follows:</p>
<pre name="code" class="python">
from collections import namedtuple

Vertex = namedtuple('Vertex', 'x, y, z')  # define vertex 'type'

v1 = Vertex(0.0, 0.0, 0.0) # define a Vertex tuple, with positional arguments

v2 = Vertex(x=0.0, y=0.0, z=0.0) #define a Vertex with named arguments

x, y, z = v2    # unpack as regular tupple

x = v.x   # accessible with named parameter
</pre>
<p>We can now define our triangle function</p>
<pre name="code" class="python">

#import blender bindings
import Blender
from Blender import NMesh
from Blender.BGL import *
from Blender.Draw import *

def triangle(a, b, c):
    """generate triangle geometry
       we expect a b c to be namedtuples of type Vertex"""

    ######### Creates a new mesh
    poly = NMesh.GetRaw()

    ### fill vertices
    v = NMesh.Vert(a.x, a.y, a.z)
    poly.verts.append(v)

    v = NMesh.Vert(b.x, b.y, b.z)
    poly.verts.append(v)

    v = NMesh.Vert(c.x, c.y, c.z)
    poly.verts.append(v)

    ## create a face
    f = NMesh.Face()
    f.v.append(poly.verts[0])
    f.v.append(poly.verts[1])
    f.v.append(poly.verts[2])
    poly.faces.append(f)

     ######### Creates a new Object with the new Mesh
    polyObj = NMesh.PutRaw(poly)

    Blender.Redraw()
</pre>
<p>My poor knowledge of blender doesn&#8217;t allow me to say much about this code. We basically use the api to generate a three point polygon.  As said, please improve or correct this part.<br />
Time for a first test! </p>
<pre name="code" class="python">
#define the three vertices of a triangle
a = Vertex(0.0, 0.0, 0.0)
b = Vertex(25.0, 50.0, 0.0)
c = Vertex(50.0, 0.0, 0.0)

triangle(a, b, c)
</pre>
<p>We define three vertices for our test triangle and call the triangle function. The next step is to load the code in Blender&#8217;s text editor and to press Alt-p to run the code.</p>
<div id="attachment_699" class="wp-caption alignleft" style="width: 495px"><a href="http://modprobe.complex.ch/wp-content/uploads/2010/02/Screenshot.png"><img src="http://modprobe.complex.ch/wp-content/uploads/2010/02/Screenshot.png" alt="" title="single triangle in blender" width="485" height="364" class="size-full wp-image-699" /></a><p class="wp-caption-text">(sorry for the crappy window in the middle)</p></div>
<p>Ok, so let&#8217;s get to the meat of the problem, i.e. the recursive subdivision. I use the basic algorithm from <a href="http://www.amazon.com/Interactive-Computer-Graphics-Top-Down-Approach/dp/0321535863/ref=sr_1_1?ie=UTF8&#038;s=books&#038;qid=1267378668&#038;sr=8-1-spell">here</a>, and adapted it to python:</p>
<pre name="code" class="python">
def divideTriangle(a, b, c, step):
    """ recursive divide until step == 0"""

    if step > 0:
        #compute midpoints of sides

        midpointof = lambda v1, v2: Vertex(x = (v1.x + v2.x) * 0.5,
                                           y = (v1.y + v2.y) * 0.5,
                                           z = (v1.z + v2.z) * 0.5)

        ab = midpointof(a, b)
        ac = midpointof(a, c)
        bc = midpointof(b, c)

        # divide all but center triangle

        divideTriangle(a, ab, ac, step - 1)
        divideTriangle(c, ac, bc, step - 1)
        divideTriangle(b, bc, ab, step - 1)
    else:
        #stop recursion and generate geometry
        triangle(a, b, c)
</pre>
<p>I tried to be as expressive as possible, but I have the feeling that there is something fishy in the midpoint lambda. I guess it could be simplified. But it will do for now. Let&#8217;s put it all together, and see what we get in blender.</p>
<pre name="code" class="python">
from collections import namedtuple

import Blender
from Blender import NMesh
from Blender.BGL import *
from Blender.Draw import *

Vertex = namedtuple('Vertex', 'x, y, z')  

def triangle(a, b, c):
    """a b c are of type Vertex"""

    ######### Creates a new mesh
    poly = NMesh.GetRaw()

    ### fill vertices

    v = NMesh.Vert(a.x, a.y, a.z)
    poly.verts.append(v)

    v = NMesh.Vert(b.x, b.y, b.z)
    poly.verts.append(v)

    v = NMesh.Vert(c.x, c.y, c.z)
    poly.verts.append(v)

    ## create a face
    f = NMesh.Face()
    f.v.append(poly.verts[0])
    f.v.append(poly.verts[1])
    f.v.append(poly.verts[2])
    poly.faces.append(f)

     ######### Creates a new Object with the new Mesh
    polyObj = NMesh.PutRaw(poly)

    Blender.Redraw()

def divideTriangle(a, b, c, step):
    """ recursive divide until step == 0"""

    if step > 0:
        #compute midpoints of sides

        midpointof = lambda v1, v2: Vertex(x = (v1.x + v2.x) * 0.5,
                                           y = (v1.y + v2.y) * 0.5,
                                           z = (v1.z + v2.z) * 0.5)

        ab = midpointof(a, b)
        ac = midpointof(a, c)
        bc = midpointof(b, c)

        # divide all but center triangle

        divideTriangle(a, ab, ac, step - 1)
        divideTriangle(c, ac, bc, step - 1)
        divideTriangle(b, bc, ab, step - 1)
    else:
        triangle(a, b, c)

#main

a = Vertex(0.0, 0.0, 0.0)
b = Vertex(25.0, 50.0, 0.0)
c = Vertex(50.0, 0.0, 0.0)

divideTriangle(a, b, c, 5)
</pre>
<p>and in blender:<br />
<div id="attachment_700" class="wp-caption alignleft" style="width: 495px"><a href="http://modprobe.complex.ch/wp-content/uploads/2010/02/Screenshot-2.png"><img src="http://modprobe.complex.ch/wp-content/uploads/2010/02/Screenshot-2.png" alt="" title="Sierpinsky triangle with 5 levels of subdivision" width="485" height="364" class="size-full wp-image-700" /></a><p class="wp-caption-text">Sierpinsky triangle with 5 levels of subdivision</p></div></p>
<p>All done : )<br />
I leave the extruded version as an exercise for the reader.</p>
]]></content:encoded>
			<wfw:commentRss>http://modprobe.complex.ch/2010/02/28/sierpinsky-triangle-python-script-for-blender/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Labo workbench light, a bit more clever than a switch</title>
		<link>http://modprobe.complex.ch/2010/02/28/labo-desk-light-a-bit-more-clever-than-a-switch/</link>
		<comments>http://modprobe.complex.ch/2010/02/28/labo-desk-light-a-bit-more-clever-than-a-switch/#comments</comments>
		<pubDate>Sun, 28 Feb 2010 10:21:48 +0000</pubDate>
		<dc:creator>TO</dc:creator>
				<category><![CDATA[Embarquée]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[a bit artistic]]></category>
		<category><![CDATA[c++]]></category>

		<guid isPermaLink="false">http://modprobe.complex.ch/?p=627</guid>
		<description><![CDATA[Using an old Arduino, a MosFet transistor, 5m of led strip and an old alarm detector (SIEMENS IR100B), I built an interesting little lighting set up. The idea is that the leds switch on as you approach the desk. The detector is a bit sensitive, but it does the job ok. I was curious about [...]]]></description>
			<content:encoded><![CDATA[<p>Using an old Arduino, a MosFet transistor, 5m of led strip and an old alarm detector (SIEMENS IR100B), I built an interesting little lighting set up.<br />
The idea is that the leds switch on as you approach the desk.<br />
The detector is a bit sensitive, but it does the job ok.<br />
I was curious about the free run consumption when the leds are turned off.<br />
Doing this project I got my answer: it&#8217;s very little. Less than 100mW according the wattmeter.</p>
<p><object width="451" height="254"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=9799002&amp;server=vimeo.com&amp;show_title=0&amp;show_byline=0&amp;show_portrait=0&amp;color=bababa&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=9799002&amp;server=vimeo.com&amp;show_title=0&amp;show_byline=0&amp;show_portrait=0&amp;color=bababa&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="451" height="254"></embed></object></p>
<p>In attachment, code, schematics and video for reuse and improvement.</p>
<div id="attachment_629" class="wp-caption alignnone" style="width: 276px"><a href="http://modprobe.complex.ch/wp-content/uploads/2010/02/led_sensor-bb.png"><img class="size-medium wp-image-629" title="Led Strip and Sensors beta schematics" src="http://modprobe.complex.ch/wp-content/uploads/2010/02/led_sensor-bb-266x300.png" alt="" width="266" height="300" /></a><p class="wp-caption-text">thanks to fritzing</p></div>
<pre name="code" class="cpp">
/* Theo Reichel, Reichel Complex AI, 02/2010 */

int sensorPin = 2; // interrupt 0
int sensorAlimPin = 4;
int ledArrayPin = 9; // PWM
int buttonPin = 3; // interrupt 1
int ledPin = 11; // PWM

volatile bool sensor_status = LOW;
volatile bool button_pressed = LOW;

volatile unsigned int light_power;

unsigned long sensor_millis_diff = 0;
unsigned long sensor_status_age = 0;

volatile int menu;
int i;

void setup()   {
  Serial.begin(19200);
  Serial.println("Labo desk light with detector started");

  pinMode(ledArrayPin, OUTPUT);
  pinMode(sensorAlimPin, OUTPUT);
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT);

  digitalWrite(sensorAlimPin, HIGH);

  attachInterrupt(0, sensor_trigger, CHANGE);
  attachInterrupt(1, user_button, FALLING);
}

void loop()
{
// menu
  while (menu == 0)
    detector();

  while (menu == 1)
    always_on();

  while (menu == 2)
    always_off();
}

void fadein()
{
  for (light_power; light_power&lt;255; light_power++)
  {
    analogWrite(ledArrayPin, light_power);

    if (button_pressed) // button can interrupt fade
    {
      button_pressed = LOW;
      break;
    }

    delay(5);
  }
  if (light_power == 255) // electrical workaround
    digitalWrite(ledArrayPin, HIGH);
}

void fadeout()
{
  for (light_power; light_power &gt; 0; light_power--)
  {
    analogWrite(ledArrayPin, light_power);

    if (sensor_status) // sensor can interrupt during fadeout.
      break;

    if (button_pressed) // button can interrupt fade
    {
      button_pressed = LOW;
      break;
    }

    delay(10);
  }
  if (light_power == 0) // electrical workaround
    digitalWrite(ledArrayPin, LOW);
}

/////////// programs /////////////

void detector()
{
  digitalWrite(ledPin, 50);

  if ( sensor_status )
  {
    Serial.print("update sensor_status_age: ");
    Serial.println(sensor_status_age);
    sensor_status_age = millis();  

    if (light_power &lt; 255)
    {
      Serial.print("fadein from light power: ");
      Serial.println(light_power);

      fadein();
    }
  }
  else
  {
    sensor_millis_diff = millis() - sensor_status_age;

    if ( light_power &gt; 0 &amp;&amp; sensor_millis_diff &gt; 60000 )
    {
      Serial.print("fadout from light power:");
      Serial.print(light_power);
      Serial.print(", duration without motion");
      Serial.println(sensor_millis_diff);

      fadeout();
    }
  }
}

void always_on()
{
  digitalWrite(ledPin, HIGH);

  if (light_power &lt; 255)
    fadein();
}

void always_off()
{
  analogWrite(ledPin, LOW);

  if (light_power &gt; 0)
    fadeout();
}

/////////// interrupts /////////////

void sensor_trigger()
{
  sensor_status = !digitalRead(sensorPin);
}

void user_button()
{
  button_pressed = HIGH;

  if (menu == 2)
    menu = 0;
  else
    menu++;
}
</pre>
<p>The next project in the same wave is to make a nice PCB, arduino compatible with FET and detector on board.<br />
Adding some nice little things like RTC, light sensor and a little led display, I plan to build a better light management.<br />
For instance, if the room is bright enough the leds stays off.<br />
If the time is far in the night, meaning that I&#8217;m not supposed to be awake, the light is faded to keep it soft for my eyes.<br />
And of course a single push button to iterate different modes.</p>
<p>There is probably a lot more to do to make &#8220;clever&#8221; lights.<br />
Feel free to share your ideas, I&#8217;m very interested.<br />
But please, don&#8217;t mention clapping in the hand like in SF movie. I believe the light is improved if it adapts to our presence without our explicit will or interaction.</p>
]]></content:encoded>
			<wfw:commentRss>http://modprobe.complex.ch/2010/02/28/labo-desk-light-a-bit-more-clever-than-a-switch/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
