How I built a Bluetooth connected, 840 LED, message scrolling marquee totem for EDC (and how you can, too!)
This year (2018) was my third Electric Daisy Carnival, AKA the largest electronic music festival in the US. But as someone who’s usually more at home on Burning Man’s playa than a garbage encrusted NASCAR racetrack, I wanted to do something more than just go.
I’ve always found the former’s participatory nature far more creatively inspiring than the latter’s spectator sport. To borrow the words of a wise fellow burner:
“Everything at Burning Man is there because someone thought it would be cool to bring it to Burning Man.”
At EDC, the stages are built by the festival. At Burning Man, all of the art installations (aside from the Man and Temple) are there because someone thought it’d be cool to build them there.
At EDC, the artists are booked by the festival’s talent team. At BM, they’re all there, sometimes clandestinely, because they thought it’d be cool to play at Burning Man.
At EDC, there are huge parades of choreographed hired dancers and slickly produced art-cars. At BM, people put on their own hilarious parades and some of those same art cars roam around the desert because people want to bring something cool to Burning Man.
This year, I was gonna bring something cool to EDC.
What IS that?!
It’s my very tall oblong son.
My pointy oblong boy.
My great big enlightening delightful child.
Okay, it’s my totem. Specifically, my custom-made vertical Vexillium with a dual-sided 840-LED Bluetooth-connected scrolling-marquee perched on top.
What’s a totem?
EDC is a nearly 140,000 person festival. Good luck finding your friends or sticking with your group in a crowd that size. You’ll lose each other in the first ten minutes, and cell reception is a laughable prospect, so nobody can even hear you scream.
So… what’s a group of ravers to do? Carry around a giant tall thing to act as a beacon that calls everyone home, that’s what! Flags, signs, pool noodles, papier-mâché memes, weird pole-mounted sculptures, blow-up sex dolls, you name it; as long as it’s visible above the sea of heads and rhythmic flailing hands.
Here’s our group’s totem from my first EDC (2016):
OK, but that’s more than just a totem, isn’t it?
How perceptive! Yes.
You can write stuff on it?
Yep, whatever we wanted. In real time. Using a simple Bluetooth app, we wrote jokes, memes, quotes, trolls, sayings, deep thoughts, emotional outpourings, messages from other people, and anything else we wanted on it, all festival long.
How did you come up with this?
For Dreamstate SoCal 2017, I built my first totem. It was a Trance flag mounted on relatively simple collapsible flagpole I adorned with a long 16' strip of RGB 5050 LEDs. Then, to kick it up a notch, I attached a sound-sensitive LED controller.
The result? A blindingly bright giant flag-flying beacon that could be seen from anywhere, pulsating in time with the music!
People loved it, and it worked fantastically for our group, so after Dreamstate I set about thinking of various improvements I wanted to make. For example, I noticed that flapping the flag around all the time tired us out, so what if I just mounted the flag vertically, like a Bannerflagge?
No more manual waving!
Next, I turned my attention to the LEDs and what a potent form of visual communication they could be. In a loud, crowded music festival setting, where the sounds around you are naturally the dominant environmental factor in the space, it’s a major challenge to communicate with people around you. Aside from one-on-one, mouth-to-ear conversations, you’re essentially down to hand signals, totems, and other visual cues.
Art thrives under constraints, right?
What if I built a totem that could also act as a visual communication medium?
(I wasn’t communicating with Will-Smith-hating aliens, just friendly fellow ravers, so actual English letters would suffice.)
LED marquee signs immediately came to mind. They can spell out words and can be seen and read by everyone around me… what if I mounted one on top of the flagpole?
I googled around for LED signs, like the ones you see in storefront windows, and found some — but they were all meant for powered indoor use, could only be programmed while connected to a Windows PC, and cost hundreds of dollars. Not fit for my purposes. I would have to roll my own.
But where the heck do I even start? I’d last done any sort of hardware or electronics in college, and building a physical project like a sign seemed overwhelming to me — I’ve always been more software inclined.
By pure serendipity, I stumbled upon this beautiful, fantastic, magical, superb, well-documented, well-built (by a beautiful, handsome genius no doubt) custom LED sign project that was exactly what I had dreamed of building, writ large.
The most attractive part here was the sheer originality and efficiency. Rather than using one of those dinky off-the-shelf signs or a pre-made addressable LED array, Josh took 7 rows of cheap commodity LED strips, hooked each row up to a pin on an Arduino board, and through some clever assembly bit-twiddling and a touch of math, shot text, animations, and even little icons down its whole length.
It was perfect.
How did you build it?!
I knew I’d need three things.
- The physical hardware (raw materials and electronics) for the sign and the software to drive it.
- A way to communicate with the sign on-the-fly.
- A way to power the whole damn thing on the go.
(1) was easy. Josh magnanimously provides the list of the raw materials he used, plus the specific Arduino model and all of the code on his website, shared as a Github project, fully documented and commented. Seriously, you have no idea what a rarity it is to find any kind of free/open-source software online that is this well documented and maintained. His post even has a gigantic trove of comments on it that he still actively participates in years later, answering questions for myriad other fellow adventurers who’ve built their own versions. If his main post is the tip, the tree of comment threads below it is the rest of the glorious iceberg.
(2) also seemed easily solvable. The Arduino has a USB port, and I initially considered just dangling a long USB cable from it and hooking my phone up to let me write things on the sign. Then, upon further investigation, I found that there’s even a little Bluetooth add-on board you can buy. Wireless communication FTW! (Check out the Bluetooth section at the end of this article).
(3) was my first actual challenge. This thing was going to need power. A lot of power.
How much power? Well, enough to cause Real Problems™ if I didn’t actually study and learn about physical Real World™️ electrical concepts like resistance, wire gauge, voltage drop, and power topologies. Take a trip with me, if you will, to the…
⚛️ PHYSICS ZONE ⚛️
If you hate science, feel free to skip to the end of this section.
No really, I like science. How much power?
In the article above, Josh uses a 300W power supply that’s simply connected to the wall. I’m building a portable version, so obviously I’d need batteries. But what kind? And what size? And how many?
The math is fairly simple. A 5-volt LED draws 20 milliamps of current at full blast. Each programmable LED, which happens to be called a WS2812b, is actually composed of three LEDs; a red, a green and a blue. The WS2812b turns them on at varying intensities to display any color in the rainbow. So if I were to tell it to turn white, it would turn all three on. And if I were to do that at full brightness, it would suck down 60mA.
Okay. But that’s for one LED. What’s the total power draw?
Well, I have 7 strips of 60 LEDs each. So that’s 420 total (Niice). But wait, did I mention I want this sign to be dual-sided? A marquee sign is no fun to look at from the back, so why not build it in such a way so that it has no back?
It must be done! But that brings our total to 840 LEDs. At 60mA each, that’s 51,600mA, or nearly 52 amps of current. At 5 volts, that’s nearly 260W!
Yeah. For reference, those portable phone chargers people carry around? Those put out a measly 2 amps at 5 volts. Fifty-two amps is the kind of current that you’d find in a clothes dryer or a Tesla Supercharger. That kind of load could make even Josh’s beefy 300W wall power supply start breaking a sweat.
So where the hell can you get a battery that can provide this much juice?
Nowhere! This will never work! Fucking physics! This is why I should stick to software.
“Fucking physics! This is why I should stick to software.”
One sec. 260W is our maximum draw, if I were to turn on ALL of the LEDs white, at full brightness (and melt every single retina around me — these things are bright as heck.) I’m never going to do that, and since all the sign is going to do is scroll colored text, only a fraction of the LEDs are going to be on at any one time, and certainly not at white, which draws the most power. In practice, real-world usage was going to be a fraction of that max draw, probably closer to 12 amps, or 60W. I was going to take that chance.
5V output and 20,000mAh, which means they can put out 20 amps for one hour (or 10 amps for two hours, 5 amps for four, etcetera). Beautiful. I ordered two.
But then, physics struck again.
What about voltage drop? Or wire resistance?
👩🏫💬 “If you’re running this much current over a wire, it better be thick enough and as short as possible.”
Ever wonder why the power company runs gigantic thick overhead power lines at thousands and thousands of volts when your home appliances only need 120V or 220V? It turns out, running electricity over a wire isn’t 100% efficient. The wire itself resists some of the current, and the thinner the wire, the more resistance it has.
This is why it’s hard to find really long cables to charge your phone with. If, say, you were to run 5 volts through a skinny 10 foot USB cable, you might only get 4.35V out the other end. The rest is lost to heat.
I wanted to mount the sign on a 16-foot flagpole.
And the troubles don’t stop there. You’re also limited by how much current you can run before the wire’s resistance causes it to overheat and melt. Push too many amps of current through, and you get too much heat. This is how electrical fires happen, and is one of the reasons why USB cables are limited to 2 amps or so.
Uh… how much electricity did you want to push up there again?
A dozen to several dozens of amps at peak! And for a 16-foot wire, this was not happening, not unless I got some seriously thick & heavy cables.
Despondent, I took to Facebook.
Remember Ohm’s Law? I’d forgotten all about it from my high school physics days:
👩🏫💬 “Electricity is measured in watts, which is a product of current (in number of amps) and voltage (in number of volts).”
The popular analogy for electricity is water flowing in a pipe. Imagine a pipe emptying into a pool.
- Voltage is the cross-section of the pipe, or how big it is.
- Amperage, or current, is how quickly the water is flowing through the pipe. (The pipe is always full, but the flow could be faster or slower).
- Wattage, or power, is the amount of water coming out of the pipe.
So using the above equations, it’s easy to figure out that if we want to power a 60-watt load, we can feed it 60 volts at 1 amp, or 120V at 0.5 amps, or 12V at 5 amps, or 5V at 12 amps… and so on.
Yep. That meant I didn’t have to run 12 goddamn amps of 5V up the flagpole. I could instead run a much more manageable 5 amps of 12V. And as it turns out, those beefy batteries I bought have 12V outputs that put out up to 6 amps. Hooray!
And by the way, the reason the power companies don’t run 120 volts at a bajillion amps to your home is that running 10,000+ volts at a much lower amperage is much safer, cheaper and, uh, physically possible.
Also, remember voltage loss? When you’re running thousands of volts over long distances, any voltage loss suffered is no longer that big of a deal. Plus, the cables are thick enough and the current isn’t that high, so the lines won’t get all melty.
Nice. But didn’t you say the LEDs need 5V? How do you convert 12 volts to 5 volts?
Same way the power company does. When the power lines reach your house, the voltage gets stepped down to the 120V you know and love.
I needed step-down converters.
Also called “buck converters”, these lovely little components will happily take any voltage supplied within a generous range, and output nice stable 5V for you. How? Quite a bit of interesting magic! Check out this article to learn more, which also includes a bunch of surprising examples of real-world things that use them.
With a couple of these babies added to the build (one connected to each battery’s 12V port), my power woes were solved.
⚛️ END PHYSICS ZONE ⚛️
Wait! What about the Bluetooth part? How were you messaging it?
Saved the best for last! Getting the communication working was the most magical part of building this.
Bluetooth Low Energy (BLE) is some seriously cool technology. It’s one of the simplest and most power-efficient ways to transmit and receive data over short distances. Your phone uses it, your wireless earbuds use it, your Fitbit uses it. I even use it to find my keys!
As I mentioned, the Arduino has a little Bluetooth add-on board you can buy. I ordered this one and thought I was all set: bolt on the board, modify Josh’s Arduino code a bit to make it read and display messages from the Bluetooth connection, and I’m #winning.
Ah, how foolish, how naive I was! There was one more unexpected hurdle to clear; one more showstopper that nearly killed the whole dream:
Josh’s LED marquee code can’t communicate via Bluetooth and show messages at the same time.
What? Why not?
The crux of the issue is interrupts.
“In system programming, an interrupt is a signal to the processor indicating an event that needs immediate attention. An interrupt [requires] the interruption of the current code the processor is executing.”
The code needs to turn off interrupts while scrolling messages because any interruption would screw up the smooth movement of the shiny letters.
Guess what you need interrupts for? Communication via Bluetooth, serial, and any other method the Arduino uses to talk to the outside world, among other things.
To complicate matters further, Josh’s sign build uses 7 output pins at once, one for each row of LEDs. And one of those pins happens to be the serial TX/RX pin — a pin that the Arduino Bluetooth module also needs to connect to. Shiiiiiit.
There are workarounds, such as using a different set of pins for transmit/receive along with a library called SoftSerial, but then you’re still screwed because guess what? SoftSerial still requires interrupts to be on!
So there’s no way to communicate with the Arduino while it’s scrolling messages!
I discovered all of this while sitting at a conference, exactly one week before EDC.
My response exactly.
I broke into a sweat.
The entire project was suddenly thrown in jeopardy.
I would not have enough time to throw away Josh’s code and write my own. Could I perhaps hook up and program a second Arduino to handle the Bluetooth communication, as this comment suggested? Ugh, not enough time, not enough time!
My mind was racing so hard that I could barely pay any attention to the morning session I was attending at Google I/O.
And then, it hit me, like a furious bolt of lightning: I was at Google I/O, surrounded by the nerdiest nerds on the planet, and there was a free Android Things kit sitting in my swag bag…
I bolted up from my seat, ran out of the talk, and made a beeline for the Android Things tent.
What the heck is an Android Thing?
It’s Google’s IoT solution, and they launched version 1.0 right there at Google I/O. Imagine an Arduino or a Raspberry Pi, and then imagine it running Android. That means all you need to do to program one is to write an Android app in Java or Kotlin. That’s light-years easier and more powerful than the eccentric flavor of C the Arduino runs on!
The Android Things board that came with my kit, called the NXP Pico i.MX 7D, also happens to come with WiFi and Bluetooth built-in, plus some serial UART pins that can hook up to other boards. See where I’m going with this?
So this Pico IMX whatchamathingie handles all of the Bluetooth communication?
Yep! The wonderful folks at the Android Things booth gave me a crash course on how to implement a Bluetooth GATT Server in Android, and then I spent the entire final day of the conference building it at the Code Lab area.
AND IT WORKED:
I could talk to the IMX board over Bluetooth! Now, all I needed to do was get it to talk to the Arduino. Easily accomplished via serial — just hook up the UART transmit pins to the receive pins on each board, right?
Not so fast…
That interrupt thing again?
Yeah. The Arduino has to turn off interrupts while the text is scrolling across the LEDs, remember? And to read stuff from the serial pins, interrupts need to be on.
But! Now that we offloaded all the Bluetooth shenanigans to the Android IMX board, we don’t have to have interrupts on all the time. We could just take quick breaks from scrolling messages. We can turn interrupts on for a little while, read something from the serial port, then turn them back off and get back to scrolling text.
That’s what I did. Every time the Arduino finishes scrolling a message, before it starts over, it takes a short one-second break. During this break:
- It turns interrupts on.
- It sends a single character over serial to the IMX board to announce that it’s ready to talk.
- The IMX sees the character, and responds with the message to display. (For example, the last message it received over Bluetooth).
- The Arduino reads the response and saves the message in memory.
- Then, it turns interrupts back off and scrolls that message from memory.
Rinse and repeat.
Here’s the sign panel scrolling the Jabberwocky poem, the Arduino, and the IMX (and its connected screen), all working together!
And if you’re wondering… I finished all of this logic (and miscellaneous soldering of remaining power cables, lol) at 4AM the night of the Above & Beyond pool party, 16 hours before EDC. ❤
Kickass! Can you help me build something like this?
Yes! Contact me or comment below with any questions. I’ll add the best questions to this pseudo-FAQ, as a homage to the format of Josh’s immensely helpful original post.
You bet! The code’s available on my Github:
- Here’s the Arduino code, largely based off of Josh’s MacroMarquee (and heavily modified since)
- And here’s the Android Things code, which implements the Bluetooth GATT Server and the serial call/response communication with the Arduino that I detailed in the previous section.
Thanks for reading! If you liked all of this, leave me some claps 👏 below this article.
“People who are really serious about software should make their own hardware.”
— Alan Kay