Picture of Aurora 9x18 RGB LED art
*** Check out my blog for updated version of this project and more! ***

My obsession of LEDs has led me to this. Aurora 9x18 is a thing of beauty (if I can say so myself) - has 162 RGB-LEDs in a circular configuration. The color of each circle is controlled by a microcontroller using a twisted form of PWM.

The microcontroller (PIC24F08KA101) only has one PWM module, yet Aurora is capable of 27 (9xR,G,B) independent brightness control. This Instructable reveals the inner-working of Aurora 9x18 through the building process.

Step 1: Concept

Picture of Concept

A RGB LED is nothing more than a LED that actually encases 3 small LEDs of primary colors inside. RGB LEDs can create wide range of colors by combining 3 primary colors - Red, Green, and Blue. By changing the ratio between the 3 colors, you get many in-between colors. RGB LEDs are often called full-color LEDs.

Most of brightness controlling circuit utilizes the method called PWM. Many of microcontrollers today have a PWM controller or more built in, however there are usually less than 4 or 5 of them in a controller. So if I were to control 9 LEDs, I needed to use multiple controllers or external circuits. If those 9 LEDs were RGB LEDs, then there would be 27 PWM controllers needed.

I've gone through a few approaches - multiple microcontrollers working together in various configurations - some are complex and exotic. I was trying to solve more than just the number of LEDs that I can control - I wanted to make the fades in/out of brightness as smooth as possible. Turned out, 8 to 10 bit PWM resolution that most PIC microcontrollers provide was not good enough to create smooth transition in the darker/dimmer part of the brightness change. When the brightness is low, the transitions look more like steps than fading. Due to human eye's non-linear or exponential response to light intensity necessitates gamma correction of the brightness change curve, which requires at least 12 bits of PWM resolution to give smooth fades (in my conclusion).

If I simply design a circuit where each LED is controlled by it's own PWM controller having 12 bit or more resolution, I'd have to use a speciality LED controller IC. While this solves the problem, the added cost and size to the final product did not appeal to me. (Those LED controller IC are not very small or cheap.)

So I came up with an idea of combining PWM with multiplex drive. I further broke up each PWM cycle into multiple pulses, so that multiple LEDs were lit multiple times within one PWM cycle. (Kind of hybrid between PWM and PDM, I guess.) This way, the average output of LEDs are the sum of the many pulses within the short period. By combining more than one PWM pulses increases effective PWM resolution.
This technique also helpes reduce the perceived flicker of the light out of LEDs. Aurora 9x18's LED refresh rate is about 246 Hz, but LEDs blink a lot more often. This creates the illusion of much higher refresh rate.

Take a look at the timing chart. I picked 7 LEDs and R/G/B bus signals to present the concept.
As you can see, R/G/B buses go up momentarily, taking turns. These pulses control the actual duration that LEDs light up. Each common lead of the LEDs controls whether that LED will light during the period that R/G/B buses go high. The actual timing that LEDs light up are marked with the color on the chart.

The condition here is:
LED 1 is on level 1 red (the lowest brightness).
LED 2 is on level 2 green.
LED 3 is on level 3 blue.
LED 4 is on level 3 yellow (red + green).
LED 5 is on level 3 purple (red + blue).
LED 6 is on level 3 turquoise (green + blue).
LED 7 is on level 255 (maximum brightness) white.
* time scale is about 8.1 ms for the entire width of the chart.

Hope this explains the way Aurora controls the brightness/colors of LEDs.

- PWM on wiki
- PDM on wiki

LED refresh rate originally stated was wrong - it's 246 Hz not 123 Hz.

1-40 of 181Next »
smileyam2 years ago
hi, led artist,

according to the Current limits of DMP3098,3A. a RBG bus line can hold 600LED? because one LED current= 5V/(1k+150ohm)=5mA. 3A/5mA=600.

so if the PCB is larger, it will be even much beautiful.
ledartist (author)  smileyam2 years ago
LEDs get about 11 to 18 mA each. The formula is: (supply voltage - LED forward voltage - transistor C-E saturation voltage) / 150 ohm
So you can only connect about 166 LEDs. In practice you can push more - in fact I doubled that with no problems. So about 350 might be the limit.

There are 162 LEDs in this project,but only 9 LEDs will be lighted at the same time.Does it mean that the maximum current is 9x(11~18 mA)=160mA,?Thanks for your help.

赵云1 year ago

why not use 9 resisters in the emitter of BJT to limit current,rather than 162x150ohm?

The layout of the LEDs nailed it for me, great work
smileyam2 years ago
hi, LED artist,

what's the camera with you to get to beautiful Pictures and videos of "aurora"? not only the art itself ,but also the pictures and videos are art!
ledartist (author)  smileyam2 years ago
I shot the video with Canon HF S200 camcorder. Stills are shot with Nikon D700, but many of the stills are from the video.
smileyam2 years ago

i was quite empressed by the beauty of your LED art. and made a 18mini (easiest one). thanks for your study and share on the net!

when i passed by supermarket , a question rised. can a full color screen do the same? what's the cost of a full color screen the same area of an 9*18 art?

as long as you limit your work in toy, that's ok ,but when i was used in industry, there should be an answer.

kbeharee2 years ago
Fantastic work! In your schematic for aurora R-DRV G-DRV B_DRV are all in parallel on the same PWM output so this means RGB lines receive same PWM pattern ..

My question is that why in the aurora conceptial timing diagram the PWM patterns are not in sync ??
ledartist (author)  kbeharee2 years ago
The 3 transistors Q2R/G/B effectively work like an AND gate.
So R-BUS only gets high when PWM = high and R-DRV = low, G-BUS gets high when PWM = high and G-DRV = low, and so on.
The microcontroller uses R/G/B-DRV pins to select which R/G/B channel PWM pulse goes to.
danm_daniel2 years ago
legit, awesome work. could be cool to see LEDs move in circular pattern too
ledartist (author)  danm_daniel2 years ago
Thanks! I know it would be cool if the colors moved in other directions too...
theargha2 years ago
Can I program it using an Arduino ?
ledartist (author)  theargha2 years ago
Not sure... Some people are programming 8 bit PICs using Arduino:(http://arduino.cc/forum/index.php/topic,92929.0.html)

However I can't find any information on programming 16 bit PICs.

happyfrank3 years ago
I mean the PCB design that your showed in this page. Could you please share me that, because i am not professional.
ledartist (author)  happyfrank3 years ago
Sorry, but I'm not sharing the PCB files. However, you can create the PCB with the information published here.
I think you should sell the PCB as many of us cannot create PCB's in our kitchen... the MixMaster just ruins them. ;)
ledartist (author)  mortso2 years ago
You can buy PCBs at my website - http://www.theledart.com/ .

Cool! Thanks! BTW the PCB is a pretty cool work of art itself! ... Looks decidedly Mayan in concept. Thanks!
#iluvleds3 years ago
Hi. This project is sick as. I am working on my own version using an AVR uC. I was just wondering what the diameter of the PCB is. Also, how do you line the LEDs up on a circle? Thanks in advance
ledartist (author)  #iluvleds3 years ago
PCB diameter is 4.3 inches. Not sure that you mean by "how do you line the LEDs up on a circle"...
jackalinson3 years ago
I'm really impressed by the project, but I must admit I didn't quite understand the part about the colors shifting.

Could you show the *.c program? If not, could you elaborate about how do you do to keep the colors going through the lines?
On the chart it seems like the LED 7 turns white in the end, and all the others fade out.
ledartist (author)  jackalinson3 years ago
You can read the text in the instructable, but the LEDs will light:

LED 1 is on level 1 red (the lowest brightness).
LED 2 is on level 2 green.
LED 3 is on level 3 blue.
LED 4 is on level 3 yellow (red + green).
LED 5 is on level 3 purple (red + blue).
LED 6 is on level 3 turquoise (green + blue).
LED 7 is on level 255 (maximum brightness) white.

I wrote the program in assembler, so there's no .c file...

jmcculley3 years ago
I love this innovative art did you intentionally use a Fibocci Sequence ? in the pattern?

ledartist (author)  jmcculley3 years ago
Yes, Fibonacci number was one of the influences in the design. I looked into the nature for timeless beauty.

happyfrank3 years ago
happyfrank3 years ago
COuld you please share me your PCB.
alan52523 years ago
Absolute Genius!!!!! Thanks for everything.
artisticled3 years ago
1 x PIC24F08KA101
3 x VP3203N3-G
12 x PN2222ATA
1 x MCP1702-3302E
162 x rgb leds common cathode
13 x 1000 ohm
162 x 150 ohm (1/8 watt)
9 x 220 ohm
1 x 10k ohm
1 x 7805
2 x 100 nf
2 x 10 uf
PCB.zip325 KB
Excellent excellent

Thank you for sharing!  I ordered the components for this awesome project. Hope it will arive soon.

ledartist (author)  artisticled3 years ago
Wow!!! A successful replica of Aurora 9x18 with TH parts!

The picture looks as though the green LEDs are not lighting... or it's just that picture?

Looking at the parts, VP3203N3 seems a bit weak for the job - 0.6 ohm RDS seems high. How does it perform?

I'd love to hear more about it.

rhaber3 years ago
Hi Aki

Thanks for your comments but it was you who really did the hard work, I can't even write programs for micro-controllers, so I didn't modify your firmware at all. I have uploaded a hand drawn circuit diagram of my modification at:


Basically, to add remote control (as well as keeping the original manual pushbutton switches) I added a pic16f628 together with tsop2236 receiver and slightly altered an RC5 example program for the Proton Basic Compiler to toggle outputs on the PIC in response to button presses of the remote. The outputs of the PIC feed an 'or gate' so that a logic high is produced when either a button on the remote is pressed or a manual push-button switch is pressed for each of the 'up', 'down', 'left', 'right', 'centre' cases. This logic high then feeds a cd4066 switch chip which then feeds the PIC24F08ka101.

To add auto-dimming I simply fed the DMP3098L mosfets with a varying voltage of about 2.9V in dark conditions to about 5V in bright conditions (as opposed to a fixed 5V). As you can see in the circuit this is simply achieved using an mic2941 regulator and an LDR together with appropriate resistors. Oh, and to make sure the colour balance remains relatively unaffected at lower mosfet supply voltages I added a 1N4001 diode at the output of the R-bus to lower the red LED current (due to the lower voltage drop of the red LED).

I'll have a look at your analogue input mode next.....hope it's as good as the rest. Amazing work (subarashi dekibae de odoroki mashita) Aki.

ledartist (author)  rhaber3 years ago
Thanks for uploading the schematics. I see you added a voltage based brightness control... IR remote is something that can be added to Aurora via a simple firmware upgrade - so long as you can let go of one of the switches to open an I/O pin. (I have working IR remote receiver code for 16Fxxx. My earlier work almost always had the IR receiver, but I started preferring mechanical switches somehow.)
This gives me an idea for the next round of enhancements. Great work. Yoku dekimashita.

rhaber3 years ago
Hi Aki

I've finally finished making your Aurora 9x18 display, and have added a temperature/clock display in the centre of it. I also added a remote control and auto-dimming functionality to it. Feel free to ask any questions.

Again, many thanks for developing Aurora 9x18 - it really is hypnotic to look at. You'll find a couple of videos at:


ledartist (author)  rhaber3 years ago
Just realized that there is a shot of the controller in the video...
ledartist (author)  rhaber3 years ago
Wow! Congrats! Great looking finish. I wish I was that handy...

I'd love to see the controller part of Aurora as well.

How did you add the auto-dimming and remote control? Did you add code to the Aurora chip?

I have IR remote receive firmware written for PIC16F, but haven't ported to PIC24F yet...

Thanks for shearing.

rmashmoul3 years ago
Can you send me a better picture of the PCB or maybe a CAD (if you have it) please? Thanks! --- rmashmoul@yahoo.com
asimo3 years ago
I bought the kit and put it together without any problems. This project and instructable are very well done. I high recommend this project to anyone considering purchasing the kit (if there are any left).
Thank you for sharing a PCB. I think a lot of people have mixed results with soldering SMD components like me. When the size of the print exceeds the 5x5 cm I already know it will fail because of temperature differences between inner and outer regions of the board. If it succeeds the components are not positioned straight.
1-40 of 181Next »