mbed Cortex-M0 LPC11U24 driving an adressable RGB LED strip based on HL1606

Step one: project start

December 17th, 11:54am

Hi everyone !

I always loved LEDs. When I heard I could get my hands on 5 meters of a special RGB LED strip in which each LED is adressable, meaning I can control each LED individually, I just could not resist buying it.

As christmas is coming, I thought these 5 meters could make a nice balcony decoration. This project would allow me to get familiar with the control protocol of the HL1606, to prepare for bigger projects.

Please note: the HL1606 is not the easiest chip to control. There are better controllers if you are looking for a real RGB adressable LED strip. I used HL1606-based strips because they were the cheapest available, but I know it would have been easier to work with a WS2801-based LED strip for instance, such as this one.

I needed a controller to control the strip. I was used to PICs and AVRs, but I needed the project to work quickly as I started it in early december... and I did not have the time to route a PCB, have it manufactured, debug it, and program the microcontroller. I also do not trust breadboards especially for semi-outdoors setup !

Then I heard about the mbed Cortex-M0. With its easy to use USB programming interface, and its high-level programming language, I knew I could kick-start my project and get it to work by christmas !

I am also an avid open-source community member. The online compiler of mbed allow me to continue using my favorite Linux environment to develop, and the features of the mbed website allows me to easily share the code I write and the progress of the project. Woot!

Step two: interfacing: level shifting needed

December 19th, 11:11pm

Hey folks, I thought I would publish a quick update on the project to show I have not abandoned, despite the lack of updates in the last days :)

Interfacing the LEDs to the mbed board needs a level converter, because the LED strip is powered at 5V, and at this voltage the HL1606 needs 3.8V on its logical inputs to "see" a logical one. As the mbed works at 3.3V, the HL1606 is not able to see the data that comes from the mbed board.

A level shifter is needed; I recommend the 74HCT244. You can use almost any 5V logic chip, as long as its Vih (voltage thresold for a high logical level) is say 3V or less. I used a 74F125 (took from an old PC motherboard).

/media/uploads/uski/p1020397s.jpg

Ok, I told you I don't have the time to route a PCB... so I soldered the wired directly to the 74F125 SMT chip ! Don't forget the power supply decoupling capacitor. I used a 100nF SMT 0805 capacitor, directly soldered to the chip pins too. Simple, quick, fast, (somewhat) dirty, and it does the job. The chip will be glued with hot-melt glue to prevent any damage and make it outdoor ready :)

Step three: LED hello world

December 20th, 1:25am

I wanted to be lazy and to reuse an existing HL1606 library. I wanted to be able to do nice fadings, so I needed some sort of PWM. I found that library : https://github.com/adafruit/HL1606-LED-Strip-PWM

However there's a trap: while the HL1606 does support PWM operation, you cannot access its internal register from its interface. You can only fully light up a LED or shut it off. Then you use an extra wire to "clock" the dimming. This means you can only dim all the LEDs simultaneously at the same rate.

So this library works by simulating a PWM by quickly refreshing the whole strip, ignoring the "dimming clock".

Using part of the code from the library (the one from the timer interrupt), I could write a first version of the software, using a mbed Ticker object to refresh the whole strip every 4ms, and a double-buffered in-RAM framebuffer.

At 2 bits per color, there is almost no noticeable flickering, but the color resolution is not good enough for fancy animations. The length of my strip (5 meters) prevents me from using a faster SPI clock and to improve the color resolution. On the video, you can see that the dimming is not smooth, especially with the "rainbow fading" at the end. So I'll have to use that extra dimming clock wire.

Here is the first release at this point:

Import programhl1606drv

Driving a HL1606 RGB LED strip with the new mbed m0 LPC11U24: first version, without the use of the SI wire, software-PWM only.

Enjoy!

[to be continued... :)]


5 comments on mbed Cortex-M0 LPC11U24 driving an adressable RGB LED strip based on HL1606:

19 Dec 2011

Cool! I will be keeping an eye on this project as I am hoping to do something similar. Just waiting for my 1 meter segment to arrive :)

20 Dec 2011

nice job ! have you the intension to publish the code and/or the library ? thanks

21 Dec 2011

Hello !

lesieur raynald wrote:

nice job ! have you the intension to publish the code and/or the library ? thanks

I definitely plan on publishing the code. I will release the first version (the one seen in the video) as soon as I find a convenient way to do it.

I am not sure I will have the time to package it in a proper library, however contributions are always welcome!

22 Dec 2011

Cool stuff. Please share some code soon! :-)

23 Dec 2011

Hey guys, per popular demand I have shared the code I have right now. I do not pretend it to be clean or efficient or anything, but I hope it will give you a baseline to do similar things, this has always been a proof-of-concept/a quick hack.

I will keep this page updated when I improve the code, but now it's christmas time so I don't expect any progress in the next few days :)

Import programhl1606drv

Driving a HL1606 RGB LED strip with the new mbed m0 LPC11U24: first version, without the use of the SI wire, software-PWM only.

Please log in to post comments.