<?xml version="1.0"?><rss version="2.0">
<channel>
  <title>Alan&#039;s Ramblings - led strip tag</title>
  <link>http://bleaklow.com:80/tags/led strip/</link>
  <description>My opinions may be incorrect, but they are my own</description>
  <language>en</language>
  <copyright>Alan Burlison</copyright>
  <lastBuildDate>Wed, 29 Feb 2012 20:50:00 GMT</lastBuildDate>
  <generator>Pebble (http://pebble.sourceforge.net)</generator>
  <docs>http://backend.userland.com/rss</docs>
  <image>
    <url>http://bleaklow.com/images/misc/logo.gif</url>
    <title>Alan&#039;s Ramblings</title>
    <link>http://bleaklow.com:80/</link>
  </image>
  <item>
    <title>As it says, &#034;Beautiful light performance&#034;</title>
    <link>http://bleaklow.com:80/2011/03/11/as_it_says_beautiful_light_performance.html</link>
    <description>
          &lt;p&gt;
Well, we did our first performance with the LED strips on Wednesday at &lt;a href=&#034;http://www.islingtonmill.com/&#034;&gt;Islington Mill&lt;/a&gt; in Manchester,and I&#039;m relieved to say they worked flawlessly, even after one of the wheels was dropped just before the performance started!  The lighting in the venue was a bit too bright to make a good video, so Andy made a video of the strips in action at Thursday&#039;s &lt;a href=&#034;http://travellinglightcircus.com/&#034;&gt;Travelling Light Circus&lt;/a&gt; rehearsal which he&#039;s put up on YouTube.  Even though I say it myself, I think it&#039;s rather good :-)
&lt;/p&gt;
&lt;p&gt;
Seeing the strips in use by the talented TLC performers just gives them an entirely different dimension, and I think the video is really well done as well. For me, one of the best bits of the project has been the opportunity to work with people who have an artistic clue :-)
&lt;/p&gt;
&lt;p&gt;
&lt;iframe title=&#034;YouTube video player&#034; width=&#034;640&#034; height=&#034;390&#034; src=&#034;http://www.youtube.com/embed/p2Q76JXH06U&#034; frameborder=&#034;0&#034; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/p&gt;</description>
      <category>Arduino</category>
    <category>Tech</category>
    <comments>http://bleaklow.com:80/2011/03/11/as_it_says_beautiful_light_performance.html#comments</comments>
    <guid isPermaLink="true">http://bleaklow.com:80/2011/03/11/as_it_says_beautiful_light_performance.html</guid>
    <pubDate>Fri, 11 Mar 2011 23:01:00 GMT</pubDate>
  </item>
  <item>
    <title>Connecting a HL1606 strip to an ATmega</title>
    <link>http://bleaklow.com:80/2011/03/09/connecting_a_hl1606_strip_to_an_atmega.html</link>
    <description>
          I&#039;ve been left &lt;a href=&#034;/2010/05/28/bidirectional_patterns_with_the_hl1606.html#comment1299357384118&#034;&gt;a comment&lt;/a&gt; asking how the HL1606 strips are connected up to an Arduino.  The wiring is really pretty simple, but depends on exactly which ATmega version you have, as the hardware SPI pins vary from MCU to MCU. The following assumes it&#039;s a ATmega328P as used on the more modern Duemilanoves, you&#039;ll need to refer to the MCU documentation and the board schematic to find the correct ports and pins for different Arduino versions.&lt;/p&gt;
&lt;p&gt;The 328P uses the following pins for hardware SPI:&lt;/p&gt;
&lt;pre&gt;
/CS    Port B Pin 2    (Arduino pin 10)
MOSI   Port B Pin 3    (Arduino pin 11)
MISO   Port B Pin 4    (Arduino pin 12)
SCK    Port B Pin 5    (Arduino pin 13)
&lt;/pre&gt;
&lt;p&gt;
I used Timer 2 to drive the fade clock on the strips.  The output of Timer 2 uses the following pin:
&lt;pre&gt;
TIMER2 Port B Pin 1    (Arduino pin 9)
&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;The strips themselves have the following labelling on the inputs:&lt;/p&gt;
&lt;pre&gt;
S-I    Fade clock input
D-I    Data input
CK-I   Data clock input
L-I    Data latch input
&lt;/pre&gt;
&lt;p&gt;
So you need to wire up the strip as follows:
&lt;pre&gt;
ATmega      Strip
/CS     to  L-I
MOSI    to  D-I
SCK     to  CK-I
TIMER2  to  SI
&lt;/pre&gt;
&lt;p&gt;
Note that if you want to wire up more than one strip you&#039;ll need to work around the fact that the HL1601 strips don&#039;t implement the SPI protocol properly.  The easiest way is to gate the SCK signal with the /CS line so that when a strip is not being accessed it doesn&#039;t see the data clock.  I&#039;ve detailed the problem and the solution more fully in this &lt;a href=&#034;2010/05/27/how_the_hl1606_really_works.html&#034;&gt;earlier post&lt;/a&gt;,
&lt;/p&gt;</description>
      <category>Arduino</category>
    <category>Tech</category>
    <comments>http://bleaklow.com:80/2011/03/09/connecting_a_hl1606_strip_to_an_atmega.html#comments</comments>
    <guid isPermaLink="true">http://bleaklow.com:80/2011/03/09/connecting_a_hl1606_strip_to_an_atmega.html</guid>
    <pubDate>Wed, 09 Mar 2011 23:29:00 GMT</pubDate>
  </item>
  <item>
    <title>I&#039;m wheely pleased...</title>
    <link>http://bleaklow.com:80/2011/03/03/im_wheely_pleased.html</link>
    <description>
          &lt;p&gt;
Last night I met up with Andy and Colin of &lt;a href=&#034;http://www.travellinglightcircus.com/&#034;&gt;The Travelling Light Circus&lt;/a&gt; at &lt;a href=&#034;http://madlab.org.uk/&#034;&gt;MadLab&lt;/a&gt; to finally finish off some the &lt;a href=&#034;/2011/01/15/radio_controlled_hl1606_strips.html&#034;&gt;LED strips&lt;/a&gt; that I&#039;ve been working on for so long.  The original plan was for them to be worn, which would have meant splitting the 4 20-LED strips connected to each strip driver in half, to allow for bending at knees and elbows.  That would have meant doing an additional 32 joints, so when they said they&#039;d come up with an alternative way of mounting the strips I was not at all unhappy :-)
&lt;/p&gt;
&lt;p&gt;
Andy managed to source some translucent plastic tube that the strips slide neatly inside.  The tube does two things, it protects the fairly fragile strip from damage and it also diffuses the light from the LEDs to increase the viewing angle and provide a nice glowy effect.  Andy and Colin&#039;s plan was to mount a box to contain the strip driver on the hub of a bike wheel and to then attach the four tubes + LED strips to the wheel as if they were &#039;umbrella spokes&#039; - the picture below makes the setup clear:
&lt;p/&gt;
&lt;p&gt;
&lt;a href=&#034;/images/2011/wheely.jpg&#034; onclick=&#034;window.open(&#039;/images/2011/wheely.jpg&#039;,&#039;popup&#039;,&#039;width=660,height=660,toolbar=no,directories=no,location=no,menubar=no,status=no&#039;); return false&#034; class=&#034;thumbnailLink&#034;&gt;&lt;img src=&#034;/images/2011/thumbnails/wheely.jpg&#034; alt=&#034;LED wheels&#034; class=&#034;thumbnailImage&#034;/&gt;&lt;/a&gt;
&lt;p/&gt;
&lt;p&gt;
Will of TLC fabricated a really good mounting for the box, and the batteries and strips were simply attached to the bike wheel with cable ties.  The wheel itself is mounted onto a large diameter aluminium pole, attached to the wheel where the gears would normally be.  The really neat thing is that because Will used rear bike wheels he could keep the freewheel mechanism in place, so simply &#039;flicking&#039; the aluminium pole sets the whole thing spinning.  Of course having got them finished, we had to have a play :-)  The first video was taken inside the MadLab building by Sam from &lt;a href=&#034;http://www.manchestergirlgeeks.com/&#034;&gt;Girl Geeks&lt;/a&gt; when we had the first wheel finished.
&lt;p/&gt;
&lt;p&gt;
&lt;iframe src=&#034;http://player.vimeo.com/video/20575412?portrait=0&amp;amp;color=c9ff23&#034; width=&#034;425&#034; height=&#034;319&#034; frameborder=&#034;0&#034;&gt;&lt;/iframe&gt;
&lt;/p&gt;
&lt;p&gt;
The second video is with two wheels and was taken outside MadLab on Edge Street, just across from the &lt;a href=&#034;http://www.aplacecalledcommon.co.uk/&#034;&gt;Common&lt;/a&gt; bar and we caused quite a commotion, with people coming out of the bar to see what we were up to.  As you can see from the video, the patterns on both wheels are synchronised.  The slightly wobbly video is because I was filming and operating the radio controller for the strips at the same time - you can hear the switch clicks on the audio as I&#039;m changing the patterns.  And I love the obligatory enthusiastic American on the video soundtrack - &#034;Awesome!&#034; :-)
&lt;/p&gt;
&lt;p&gt;
&lt;iframe title=&#034;YouTube video player&#034; width=&#034;480&#034; height=&#034;390&#034; src=&#034;http://www.youtube.com/embed/O2c-x2Y4Iqw?rel=0&#034; frameborder=&#034;0&#034; allowfullscreen&gt;&lt;/iframe&gt;
&lt;p/&gt;</description>
      <category>Arduino</category>
    <category>Tech</category>
    <comments>http://bleaklow.com:80/2011/03/03/im_wheely_pleased.html#comments</comments>
    <guid isPermaLink="true">http://bleaklow.com:80/2011/03/03/im_wheely_pleased.html</guid>
    <pubDate>Thu, 03 Mar 2011 08:46:00 GMT</pubDate>
  </item>
  <item>
    <title>Radio-controlled HL1606 strips</title>
    <link>http://bleaklow.com:80/2011/01/15/radio_controlled_hl1606_strips.html</link>
    <description>
          &lt;p&gt;
Well, I&#039;ve finally finished the design and implementation of the radio-controlled LED strips I&#039;ve been asked to make for &lt;a href=&#034;http://travellinglightcircus.com/&#034;&gt;The Travelling Light Circus&lt;/a&gt;.  It&#039;s taken far longer than I expected, but I&#039;ve learned an immense amount in the process.  The remaining tasks are to construct some more boards, put the boards into suitable enclosures and to sort out how best to package and connect the strips, so now seems like a good point to write up what was involved in the project.  Some of the items are worthy of posts of their own, but first I&#039;ll give an overview of how everything fits together.  The system is composed of two parts, a single controller and a number of LED strip drivers.  The controller is used to select the required pattern and to synchronise the LED drivers, with the communication being done with 2.4GHz radio transceivers.  I&#039;ve put a video together to show everything in operation, and there are some annotated photos of the controller and LED strip drivers at the start.
&lt;/p&gt;
&lt;p&gt;
&lt;object width=&#034;560&#034; height=&#034;340&#034;&gt;&lt;param name=&#034;movie&#034; value=&#034;http://www.youtube.com/v/BXAnan8zkC0?fs=1&amp;amp;hl=en_GB&amp;amp;color1=0x234900&amp;amp;color2=0x4e9e00&#034;&gt;&lt;/param&gt;&lt;param name=&#034;allowFullScreen&#034; value=&#034;true&#034;&gt;&lt;/param&gt;&lt;param name=&#034;allowscriptaccess&#034; value=&#034;always&#034;&gt;&lt;/param&gt;&lt;embed src=&#034;http://www.youtube.com/v/BXAnan8zkC0?fs=1&amp;amp;hl=en_GB&amp;amp;color1=0x234900&amp;amp;color2=0x4e9e00&#034; type=&#034;application/x-shockwave-flash&#034; allowscriptaccess=&#034;always&#034; allowfullscreen=&#034;true&#034; width=&#034;560&#034; height=&#034;340&#034;&gt;&lt;/embed&gt;&lt;/object&gt;
&lt;/p&gt;
&lt;h1&gt;Hardware&lt;/h1&gt;
&lt;p&gt;
As I&#039;ve said, the hardware consists of two parts, the controller and the LED strip driver.  At the moment these are made using discrete parts on a hand-built breadboard, but version 2 will be a PCB with most of the components mounted directly on the PCB.
&lt;/p&gt;
&lt;h2&gt;Controller&lt;/h2&gt;
&lt;p&gt;
The controller consists of the following parts:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#034;http://www.arduino.cc/en/Main/ArduinoBoardProMini&#034;&gt;Arduino Pro Mini&lt;/a&gt;.  This uses a ATMega328p microcontroller and runs the controller software.&lt;/li&gt;
&lt;li&gt;4-digit 7-segment display, from &lt;a href=&#034;http://www.sparkfun.com/products/9767&#034;&gt;SparkFun&lt;/a&gt;.  Whilst this works, getting it to work cause me an inordinate amount of problems, as I documented in an &lt;a href=&#034;/2010/08/28/sparkfun_are_less_than_electrifying.html&#034;&gt;earlier post&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Voltage regulator - a 7805, which I&#039;ve discussed in an &lt;a href=&#034;/2010/06/30/characterising_the_7805.html&#034;&gt;earlier post&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#034;http://www.nordicsemi.com/index.cfm?obj=product&amp;act=display&amp;pro=94&#034;&gt;nRF24L01+&lt;/a&gt; radio transceiver.  This a a reasonably complicated SPI device, capable of working in several different modes.  I&#039;m using a &lt;a href=&#034;http://www.sparkfun.com/products/691&#034;&gt;breakout board&lt;/a&gt; from SparkFun, but in future revisions the radio chipset will probably be integrated onto the controller PCB.&lt;/li&gt;
&lt;li&gt;A rotary encoder/switch used to select and activate the required pattern.  I&#039;ve already discussed this in an &lt;a href=&#034;/2010/09/23/switch_debouncing_the_hard_and_the_soft_way.html&#034;&gt;earlier post&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;A simple voltage divider to sense external battery voltage and shut down when the battery is discharged.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;LED strip driver&lt;/h2&gt;
&lt;p&gt;
The LED strip drivers consist of the following parts:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An Arduino Pro Mini.  This runs the software that drives the LED strips.&lt;/li&gt;
&lt;li&gt;A nRF24L01+ radio transceiver, which receives the control and timing messages from the controller.&lt;/li&gt;
&lt;li&gt;74125 glue logic to make the HL1606 strips behave like proper SPI devices.  Despite the manufacturer&#039;s claims they aren&#039;t true SPI devices, a topic that I covered at length in an &lt;a href=&#034;/2010/05/27/how_the_hl1606_really_works.html&#034;&gt;earlier post&lt;/a&gt;.
&lt;li&gt;Voltage regulators - two 7805 linear regulators.  Two are needed to provide the 4 amps that is required to drive the 4 LED strips.  In future revisions this will probably be replaced by a switched-mode supply as the 7805s get very hot under high load and are quite inefficient, both of which are issues for portable use.&lt;/li&gt;
&lt;li&gt;A simple voltage divider to sense external battery voltage and shut down when the battery is discharged.&lt;/li&gt;
&lt;li&gt;A thermistor used to sense the temperature between the regulators.  When it reaches 60C the strips are turned off to protect the hardware.  When it drops back below 40C the patterns are resumed.
&lt;/ul&gt;
&lt;h1&gt;Software&lt;/h1&gt;
&lt;p&gt;
The software is the most complicated part of the system, and it&#039;s divided into four main parts, described below.  The various parts of both the controller and LED driver are implemented as tasks, implemented using the task manager described in the library section below.
&lt;/p&gt;
&lt;h2&gt;Library code&lt;/h2&gt;
&lt;p&gt;
This is code that is used in the LED strip project but that is used in other projects as well.
&lt;/p&gt;
&lt;h3&gt;SPI master library&lt;/h3&gt;
&lt;p&gt;
The nRF24L01+ radios, the 7-segment display and the LED strips are all SPI devices, so it seemed useful to abstract the core SPI master functionality into a separate library.
&lt;/p&gt;
&lt;h3&gt;nRF24L01+ driver&lt;/h3&gt;
&lt;p&gt;
This driver builds on top of the SPI master library and provides access to the low-level nRF24L01+ functionality such as device configuration and message transmit/receive.
&lt;/p&gt;
&lt;h3&gt;Task library&lt;/h3&gt;
&lt;p&gt;
This library has been described in an &lt;a href=&#034;/2010/07/20/a_very_simple_arduino_task_manager.html&#034;&gt;earlier post&lt;/a&gt;.  It is a simple non-preemptive task scheduler with fixed priority scheduling and a 1 millisecond timer tick.  It is available for download from &lt;a href=&#034;http://bleaklow.com/files/2010/Task.tar.gz&#034;&gt;here&lt;/a&gt;.
&lt;/p&gt;
&lt;h2&gt;Common code&lt;/h2&gt;
&lt;p&gt;
This is code that is specific to the LED strip project, but that&#039;s shared between both the controller and the LED strip drivers.
&lt;/p&gt;
&lt;h3&gt;Global configuration and LED strip colours&lt;/h3&gt;
&lt;p&gt;
Some aspects of the system such as the colour definitions for the HL1606 strips, timing intervals, radio channels etc are shared between the master controller and the slave LED strip drivers.
&lt;/p&gt;
&lt;h3&gt;Radio message&lt;/h3&gt;
&lt;p&gt;
This is a simple definition of the control messages that are sent from the master to the slaves.
&lt;/p&gt;
&lt;h3&gt;Pattern animator&lt;/h3&gt; 
&lt;p&gt;
Both the master and the slave units run the same pattern animation code.  In the case of the master, the output is a series of synchronisation radio messages that keep the slaves in synchronisation.  In the case of the slaves, the output is a series of SPI commands that drive the LEDs.  This means that if a slave temporarily loses the radio signal from the master, it will continue to display the pattern.  The resonators used on the Arduino pro Mini boards are not very stable, so in early testing it became apparent that the slaves would have to be kept in synchronisation by the master.  To achieve this, the master sends a constant stream of synchronisation messages no more than 13 milliseconds apart to ensure the pattern generators in the slave remain in step.
&lt;/p&gt;
&lt;h3&gt;Animation output and animation fade clock base classes&lt;/h3&gt;
&lt;p&gt;
As the master and the slave are both running the same animation code, the animation output and fade clock output code were implemented as empty base classes, with the master and slave providing implementations appropriate to their roles in the system.
&lt;/p&gt;
&lt;h3&gt;Pattern definitions&lt;/h3&gt;
&lt;p&gt;
As has been noted, both the master and the slave run the same pattern animation code, so they both need access to the pattern definitions.  Each of the 4 strips on the slave are animated separately, so the pattern definitions are a reasonably complex tree of data structures containing colour, movement and timing information that are interpreted at run-time.  The pattern definitions are too large to fit in the ATmega&#039;s limited 2Kb of SRAM, so they are stored in program memory and the subset necessary for the current pattern step is extracted into SRAM and interpreted at run time.
&lt;/p&gt;
&lt;h2&gt;Master controller&lt;/h2&gt;
&lt;p&gt;
The software in the master is implemented as a set of tasks, implemented using the library descried above.  The main program simply initialises the tasks before transferring control to the task scheduler.  The tasks are as follows:
&lt;/p&gt;
&lt;h3&gt;Display driver task&lt;/h3&gt;
&lt;p&gt;
This manages the 7-segment display described in the hardware section above.  Updating the display is not time-critical, so updates are made by saving the new display contents and scheduling the display update when no other high-priority tasks need to run.
&lt;/p&gt;
&lt;h3&gt;Radio transmitter task&lt;/h3&gt;
&lt;p&gt;
The radio task is responsible for transmitting the synchronisation messages via the nRF24L01+.  Transmitting a message consists of storing the message details and scheduling the transmitter task to run.  When it runs the message is transferred to the radio via SPI and transmitted.  As synchronisation is key to the correct operation of the slaves, this is the highest-priority task.
&lt;/p&gt;
&lt;h3&gt;Four animation synchroniser tasks, one per strip&lt;/h3&gt;
&lt;p&gt;
These are derived from the Animation output base class that is defined in the shared code section.  They are called by the pattern animators when the next step for an animation pattern needs to be output, at which point they queue a synchronisation message that is subsequently send by the transmitter task to the slaves.
&lt;/p&gt;
&lt;h3&gt;Four pattern animator tasks, one per strip&lt;/h3&gt;
&lt;p&gt;
Each strip is animated separately, so each requires its own animator instance.  The animators extract the pattern definitions from &lt;a href=&#034;/2010/09/05/progmem_and_gcc_bug_34734.html&#034;&gt;PROGMEM&lt;/a&gt; and interpret them.  At each new step the animators call the synchronisation tasks to output the appropriate synchronisation message.
&lt;/p&gt;
&lt;h3&gt;Encoder/switch handler task&lt;/h3&gt;
&lt;p&gt;
The rotary encoder and switch need to be read and debounced as described in &lt;a href=&#034;/2010/09/23/switch_debouncing_the_hard_and_the_soft_way.html&#034;&gt;this post&lt;/a&gt;.  This task is responsible for doing that.
&lt;/p&gt;
&lt;h3&gt;Voltage monitor task&lt;/h3&gt;
&lt;p&gt;
The voltage monitor task samples the battery voltage every second via a voltage divider.  Once the battery voltage drops below a certain level, the subcomponents of the master are powered down and the ATMega is put into suspend mode.
&lt;/p&gt;
&lt;h3&gt;Interaction and pattern switching objects&lt;/h3&gt;
&lt;p&gt;
These objects simply marshal and redirect the internal messages between the various tasks.  They are called directly by tasks and call non-blocking operations on other tasks, although they themselves are not implemented as tasks.
&lt;/p&gt;
&lt;h2&gt;Slave LED strip driver&lt;/h2&gt;
&lt;p&gt;
As in the master, the software in the slave is implemented as a set of tasks, implemented using the library descried above.  Again, the main program simply initialises the tasks before transferring control to the task scheduler.  The tasks are as follows:
&lt;/p&gt;
&lt;h3&gt;Four LED strip driver objects, one per strip&lt;/h3&gt;
&lt;p&gt;
These are called by the pattern animators when the next step for an animation pattern needs to be output, at which point they output the new LED settings to the strips via SPI.  They aren&#039;t tasks as they merely transmit the LED setting bytes to the strips.
&lt;/p&gt;
&lt;h3&gt;LED clock object&lt;/h3&gt;
&lt;p&gt;
The LED strips need a fade clock to drive the pattern fades as described in &lt;a href=&#034;/2010/05/26/driving_the_hl1606_using_the_arduinos_hardware_support.html&#034;&gt;this post&lt;/a&gt;.  This object manages the internal ATMega timer that is used to generate the fade timing clock pulses.
&lt;/p&gt;
&lt;h3&gt;Four pattern animator tasks, one per strip&lt;/h3&gt;
&lt;p&gt;
Each strip is animated separately, so each requires its own animator instance.  The animators extract the pattern definitions from &lt;a href=&#034;/2010/09/05/progmem_and_gcc_bug_34734.html&#034;&gt;PROGMEM&lt;/a&gt; and interpret them.  At each new step the animators call the LED strip driver objects and the LED clock object to output the appropriate synchronisation message.
&lt;/p&gt;
&lt;h3&gt;Radio receiver task&lt;/h3&gt;
&lt;p&gt;
This task receives the incoming radio messages from the master, decides which strip they refer to and makes any necessary adjustments.  This could be to switch to a new pattern, to adjust the current pattern step of a strip if it leads or lags the controller, or to adjust the delay until the next pattern step if the clocks on the master and the slave have drifted.
&lt;/p&gt;
&lt;h3&gt;Voltage and temperature monitor task&lt;/h3&gt;
&lt;p&gt;
This task samples the battery voltage and temperature every second via a voltage divider and a thermistor.  Once the battery voltage drops below a certain level, the subcomponents of the slave are powered down and the ATMega is put into suspend mode.  If the temperature exceeds 60C the strips are turned off until the temperature drops below 40C, at which point the pattern output will be resumed.
&lt;/p&gt;
&lt;h1&gt;Summary&lt;/h1&gt;
&lt;p&gt;
This project is reasonably complex for a microcontroller - about 5000 lines of code with the master and slave binaries both being 13K in size.  There are a number of non-obvious design constraints and decisions that I haven&#039;t had space to fully explain in this post, I&#039;m intending to write some follow-ups to explore those areas in more depth.
&lt;/p&gt;</description>
      <category>Arduino</category>
    <category>Tech</category>
    <comments>http://bleaklow.com:80/2011/01/15/radio_controlled_hl1606_strips.html#comments</comments>
    <guid isPermaLink="true">http://bleaklow.com:80/2011/01/15/radio_controlled_hl1606_strips.html</guid>
    <pubDate>Sat, 15 Jan 2011 18:07:19 GMT</pubDate>
  </item>
  <item>
    <title>Waiting for O(1)</title>
    <link>http://bleaklow.com:80/2010/10/19/waiting_for_o1.html</link>
    <description>
          &lt;p&gt;
Due to a misconfiguration the notification emails from my blog weren&#039;t reaching me, so I missed a couple of interesting comments on my earlier &lt;a href=&#034;/tags/hl1606/&#034;&gt;HL1606-related&lt;/a&gt; posts.  The ones from Dan from over at &lt;a href=&#034;http://waitingforbigo.com/&#034;&gt;Waiting for O(1)&lt;/a&gt; were particularly interesting, and he&#039;s written a SPI library for driving the HL1606 as well as other similar LED drivers such as the LPD6803 and WSC2801 - if you are looking for alternatives to the HL1606 he has some links on the &lt;a href=&#034;http://code.google.com/p/fastspi/&#034;&gt;googlecode&lt;/a&gt; page for his project.  Dan is actually doing PMW fading of the strips, so he&#039;s driving them via timer-generated hardware interrupts.  Dan has a lot of useful tips and observations about speed and power limitations he&#039;s run into and how he&#039;s solved them that are well worth checking out, check out &lt;a href=&#034;http://waitingforbigo.com/&#034;&gt;his blog&lt;/a&gt;.
&lt;/p&gt;</description>
      <category>Arduino</category>
    <category>Tech</category>
    <comments>http://bleaklow.com:80/2010/10/19/waiting_for_o1.html#comments</comments>
    <guid isPermaLink="true">http://bleaklow.com:80/2010/10/19/waiting_for_o1.html</guid>
    <pubDate>Tue, 19 Oct 2010 17:14:11 GMT</pubDate>
  </item>
  </channel>
</rss>

