M.Eng (Hons) First Class
Software engineer at Starship Technologies and co-founder of Purple Parrot. Previously at CERN and ESA. MEng (Hons, 1st) from the University of Plymouth. Based in Tallinn, Estonia.
Okay, so, as I said. I want to have a scrolling LED, wall mounted display that can show:
Basically, anything that I want to put on it. Itāll be Wi-Fi enabled (either by ESP32, or RPI or something, not yet decided. If I can get away with the low pin count of the ESP, then that makes the most sense).
In terms of loose requirements, in no particular order:
The main parts of the design will be:
Thatās all for now, tomorrow weāll tackle the multipl>exing issue!

Okay, so itās been a little longer than āthe next dayā. I should have known. Iāve been busy on a few projects in parallel (I have a startup utilising edge AI, an enclosure for my 3D printer, and a few others in the works).
Anyway, Iāve been googling and thinking about multiplexing vs charlieplexing. I read some interesting pros and cons. Originally, I wanted to go with the former, as I was thinking __ādamn if I want 15 or so modules, with 64 LEDS each, thatās almost 1000 LEDs. Each requiring a driving pin. No microcontroller has that many pins.
I was thinking of solutions with charlieplexing, shift registers, I2C IO expanders, and then I realised, thereās no point charlieplexing (which has downsides in refresh rates and brightness, plus āghostingā issues between switching), I was going to have to use shift registers in any case, so IO expanders were not really needed (can daisy chain the shift registers). The added complexity of charliplexing (which needs tristate shift registers) was just not needed.
With 3 pins:
I can drive any number of LEDs with just these three DIO pins - I can add more whenever I want (just software update) and I can still scroll either vertically or horizontally. So this really seems like the best of all worlds.
Each shift register output needs to be able to drive the LED and sink current from it. Typically, this is about 25mA for full brightness. We can PWM LEDs on a āper moduleā basis using the output enable (OE) pin on the shift register (obviously, weāll need to choose one that has this feature, I have 3 in mind, which Iāll show a pro/con for each, but likely we will settle for the simple 74HC595).
This means we can easily use the ESP32, and run as many 8x8 modules that we need.
A lot of this project is defined by the shift register choice. Iāve been looking around, asking Gemini, etc., and I think Iāve come to a decision. The 4 I thought about were:
The winner, based on price and a few other things, was the 74HC959. Letās summarise them below:
| IC | Pros | Cons | Price |
|---|---|---|---|
| CD4014 | ⢠Cost is essentially ā¬0 (I have 4) ⢠Good for learning |
⢠PISO (Parallel-In, Serial-Out) is the opposite of what we want ⢠No output latch (flicker) |
~ā¬1-2 |
| 74HC595 | ⢠OE pin allows for PWM ⢠Extremely cheap |
⢠6mA limit! Needs a Darlington array (ULN2803) or external transistors to handle the current | ~ā¬0.20 |
| TPIC6B595 | ⢠150mA per output (massive) ⢠Power shift register |
⢠More expensive ⢠Harder to source on LCSC |
~ā¬1.00 |
| MAX7219 | ⢠Purpose-built display driver ⢠Built-in multiplexing ⢠LCSC Chinese clones make it affordable |
⢠Genuine Maxim versions are crazy expensive (ā¬15+) ⢠Requires 10µF/0.1µF caps to stay stable |
~ā¬1.00 |
So, letās think, maybe we should go with the MAX7219? Letās think more about this tomorrow.
Okay, a few days late but hey, weāre back. Letās pick up where we last were, I think the MAX7219 is the choice. Specifically, the MAX7219M/TR. For each module (64 LEDs), I would need only 1 for each 8x8 module. Thatās pretty good. Also, itās possible to control the brightness digitally too. Finally, they can be cascaded - so that works well for this scrolling text.
So, next step is to take a look at some LEDs. Weāre going to need a lot, so I want some cheap ones. Iām not too sure on size yet, either. Iām not sure if I need SMD or THT - Iām inclinded to thing that THT would be more the look Iām going for. From NASAs mission control center:

Looking on LCSC this LED looks to be a good fit. In 1000 quantities, itās about $27.7. Thatās not too bad, so probably will get these. Theyāre clear (which probably looks better when LEDs are off) and then itās green when itās on.
Well itās been a little while, but I have been working (I promise). Iāve been getting the base schematic done, I wonāt share it just yet, Iāll wait till itās done. But hereās a few insights Iāve gotten so far:
The wifi link (ESP32) isnāt actually an ESP32. I had a look at what I actually had and it was a D1 mini, which actually has an ESP82266MOD with 4MB of flash (over the SPI pins of the dev board, so those are actually out of action). Now, these are pretty cheap on LCSC, about $2.5 or so. The ādev boardā is an ESP12F - really low GPIO count, and not many bells and whistles. It needs a USB 2 UART, a few pullups/downs, and a 3v3 LDO.
I realised that, to keep costs down, I should make a PCB with all components on every module (IE, wifi, LEDs, USB connectors, etc.) Obviously only one board (letās call it, the master board) needs a wifi module/USB, etc., but I can reuse the same PCB board for each. That way, I can get 20 ish made at JLCPCB, probably 100x100mm, for like $20.
So I want to think about the current requirements of the LED supply.
Since itās rastered (that is, column driven) I think the worst case current, assuming full brightness, would be \(8 \cdot 20mA = 160mA\). But, thatās for just one module. We have 15 (maybe 16, seems like a more rounded number? Letās go with 16 for now) so \(16 \cdot 160mA = 2.560A\). At 5V, thatās about 12.5W - I will just pull this from the USB port that this will be connected too.
Okay, so, I think the schematic capture is pretty much done. Hereās a pdf of it, in itās current version.
As I move towards the PCB layout, I want to give a little thought to the mechanical design. The PCB itself will be 100mmx100mm - but how thatās housed, how the LEDs are situated and how far apart, etc., needs a little thought. I know I want some way of passing the 3 display signals (CLK, CS, and data), plus power and ground, in a way thatās easy - no cables. So, that leaves contact connectors (like pogo pins) or some push-fit type connectors (like header pins, but probably something a bit more robust).
Letās brainstorm:
| connector type | Pros | Cons | Cost | Link |
|---|---|---|---|---|
| Pogo Pins | * Press fit * Cool * More tolerance in X and Y (depending on type) * Intergrated magnets |
* Current carrying capabilities is limited though I found one for 2A (could probably do 2.5A at a push) * Requires manual soldering |
~3$ per pair | https://www.lcsc.com/product-image/C41361293.html |
| Mechanical Connector | tigher fit, might not shake loose on wall. * Cheap |
Ā | Ā | Ā |
| (basically pin headers) * Doesnāt require manual soldering (probably) |
Ā | Ā | Ā | Ā |
| 0.10$ | https://www.lcsc.com/product-detail/C18357552.html?s_z=n_pcb%2520interconnect%25205%2520pin | Ā | Ā | Ā |
So, I really wanted to go for the magnetic one, but all things considered, a mechanical connector makes the most sense. Also, I can reuse the USB connector that I need anyway, so that keeps the overall BOM list smaller. I have an idea for how to set these out physically:
Okay, so I didnāt get a chance to finish where I was last night. I woke up extra early today (0530 hrs!) to have some time to work on this, and other things, before work. I found a nice āPCB edgeā connector that I think will work really well for the module interconnect. Specifically, itās this one:

So, this is designed for PCB thicknesses of 0.8mm. Iāll need to remember that. Gemini seems to think this may not be the best part (and also, I canāt find anything similar on LCSC!) and I need a mid-mount part. So, letās take a look at those.
Actually, talking a few hours later, I donāt think I need a mid-mount part. I can have a normal mounted USB C connector, with PCB pads on either side. Depending on whether I want to pass USB power in, or pass through the CS, Data, etc.,. I can either solder it from top or bottom, or I could just have 0 Ohm resistors for selecting what goes where - like that idea better, I think. And with that, letās CAD something simple up.
Nope, no CAD. I flip-flopped back again. I realised an issue. Male USB C connectors donāt seem to be easily available in right angle mounted horizontal connectors. Maybe they are and Iām just not looking correctly. But the more I look at it, the more I would need to either choose both edge mounted, or both normal mounted, to ensure alignment, and I just donāt think I can find that. Iām going back to the nice mag connectors.
Okay, been a couple of days, Iāve been working on a seperate project (inductive charging but letās refocus on this, and try and get that CAD mockup done of the connectors.
Step 0 - model them because I canāt find a model online :(.

The magcon didnāt have a dimension for the hole which houses the magnet. I used a known dimension (the 4mm radius) and measured the number of pixels. It was 130 pixels. Then I measured the unknown dimension, which was 103, and that gives me:
\[\frac{4}{130} \cdot 103 = 3.16 \approx 3.2mm\]So now I have the dimension!

Okay, so I got the connector modelled, and I started place them on the āPCBā. This will be the basis for me to understand how the enclouser will look. The enclosure will house the PCB, but also the LEDs and possible use some lithophane type techniques (or not really lithophane, but some type of dispersion maybe?) of the LEDS. Or I might just have a hole ā not sure yet, thatās why I need to CAD it up!

We have a model! A very basic one, but we have a model. This was a pretty decent exercise. I now have a PCB board envelope to work with. I do my modelling in OnShape. Itās pretty easy to get a DXF of the layout, which I then import into KiCAD as a board layout:

I remembered, I wanted to have a buzzer so that I could also use this as an alarm, maybe even play some crappy music. But, I have no pins left on the uP. So, I do have an I2C bus, but I havenāt played or seen any I2C buzzers before. Letās see if I can find any.
Okay, I had a look, all I can find thatās somewhat decent is the SparkFun speaker board. It has an ATTiny84 on there for basically being an I2C -> PWM converter with configurable frequency and volume. I checked LCSC, itās like 2$ for an attiny84 and then another few dollars for the buzzer, which is currently out of stock so Iāll probably chose a different one.
For the sake of a couple of dollars, Iāll add one (of course, the footprint will be on every module, but only one can be used unless I pass I2C bus over the modules some how. Iāll need to write my own firmware for it, but thatāll be pretty cool. I have this old programmer from SparkFun that programes the ATTINY series, so I can easily program it that way. Seems like a pretty cool addition. Plus, the schematics are all available, so nice and easy.
Letās add this to the current schematic and update the github repo. Then, weāre ready for PCB Layout!
Ah - I just found this which is the firmware for the attiny! I might need to make mods, because the pin out may not be the same (I might use a digipot for the volume) but that will make this much much easier!
In the end, I didnāt go with the digipot. LCSC has a bunch, but Iād need to mod the firmware and now I know I donāt have to write custom FW, Iām lazy! The pinout for the IC Iāve chosen (QFN) is not the same as SparkFunās, so Iāll need to do some pin changes, but that should be fine.
Schematicās not finished, but Iāll do some more tomorrow.
New day, letās gooooooo.

Alright, I added a buzzer, it was pretty involved, but itās now done. Back to the PCB. The exported PCB board file is nice, but I would like guidelines on where to put them. Luckily, we can export that from OnShape, and add it on a layer in the PCB.

This was actually pretty easy in KiCAD. I used the DXF of LED places from OnShape to understand whereabouts I need to place them. Then, I used the Grid Array feature in KiCAD (CMD + T on a mac) and placed them in an 8x8 grid, with 12.5 (\(\frac{100}{8}\)) spacing.
Quick update: Iām an idiot. I wanted to use through holes to give the modules an archaic feel, but thatās not going to work. Thereās so many holes that I canāt place anything on either side of the PCB. DOH. So, Iāll update the LEDs to SMD (theyāre cheaper, too!) and then maybe weāll need light pipes or maybe we can get away with just the 3D printed diffusers or something. Needs some thought, but today (later) Iāll update the schematic to change the footprints to SMD. Sigh.
Been 3 days, not had too much time. I had a couple of issues I wanted to note down though.

Anyway, thatās all I can update today. Hopefully will get some more time for this later this week, and get the boards made! Itās been about 5 weeks since I had this idea, so need to get the cadence up!
Iāve mostly done the layout now, I wanted to add some photos to show the progress.

Layout is now done, DRC is passing, and DFM checks on JLCPCB are good. A few warnings about annular rings and some other such stuff (silkscreen over board edge, but thatās not an issue, just how I placed my custom magconnector footprints).
Iām using Claude to help speed up part selection - when LCSCās BOM uploader tool canāt find a part (or itās out of stock) I get Claude to find me a replacement, drop in. For example, the buzzer I used was available in LCSC, but itās out of stock. Claude was able to find a great match, based on a bunch of metrics (DB, size, footprint) and one thatās in stock - I was pretty impressed!
Okay, so, about 2 days ago I finally hit the button on the order! The grand total is:
Total: $246.66
So, it was quite a lot! But, I did get enough for 30 boards. The mag connectors were not in-stock which was a shame, so I had to order some header pins (luckily the mag conns were 2.54 mm pitch parts and I made a custom footprint (to solder them parallel to the board) so it was an easy fix)). Shame I canāt easily extend the modules, but itās okay, I can buy them later if needs be.
All the board files, manufacture ring data, bom, etc, are here. I havenāt started the software/firmware yet, I wanted to think about that a bit here.
I think Iāll need:
Itās actually pretty simple, in my head there was a lot more I needed to do. I have an ESP12F here so I can start on some of the work, things off the top of my head:
Anyway, thatās the update, PCBs should be here on 31st March. That gives me about a week to get the software ready, or at least as ready as I can without actually having the hardware!

PCBs!!! I got them, check it out. They came several days early, which is awesome. I donāt have the parts yet (they arrived into France this morning from China, so a few days to get over to Estonia).
Iāve actually done a bunch of stuff here since the last post. I havenāt been able to update here, though. So Iāll do a quick data dump and maybe will write up more in the future.
On the night / morning of the launch, I cracked open a monster energy (launch window started at 0130 on the 2nd of April), my daughter went to bed at about 8/9, and I started soldering up my first board:

I used the IBOM of the board, a super nice plugin that allows a view of the BOM (which helpful tick boxes), then the cross selection of item to location on front or back of board (and vice versa)).

I populated the LEDs first, it was pretty easy to do them, actually. The most difficult part was the temp IC - small footprint to paste without a stencil.

The solder paste was a little messy, I just squeezed it with the syringed paste. It worked, though. I did touch up all LEDs after, just incase. I also had one LED (youāll see in photos later) that didnāt solder, and one that fell off when I dropped the board š¤¦š»āāļø).

Thatās the LEDs populated before I used a hotair gun to solder.

It didnāt reflow well. That could be because of a few reasons, I think:

In any case, I touched up all the LEDs and temperature IC, all looked a lot better after that, and I tested most lines using a DMM (using diode function) and the pads from the MAX7219 IC.

The back was basically the same as the front side of the board, though, it took a lot longer. Obviously a bunch of different components, and a lot of 0402 passives which take a little longer.

A little messy, again, but okay. I touched up each part again with the soldering iron and sometimes with liquid flux to get nice clean solder joints.

At this point it was about L - 15 on the clock for the launch. I thought, maybe, if the board worked first time I might be able to get a simple 10s count down going in sync with the launch - but there was an issue. Spoiler, I didnāt find it until the next day, but look was sleep Max placed instead of the USB to UART IC:
Thatās not the CH430!.

Anyway, the board did light up all LEDs (just USB wasnāt being detected, obviously).
https://youtube.com/shorts/8IFnWLreycE?si=TLuFFuXFJKIlkUf4
I took a super short video of it working (rotating smiley face that I got claude to do).
Currently, Iām working on converting an image into something that can be displayed on the board/s. I have only one board at the moment, so iām converting images to greyscale, then I will run a kernal over that (sized correctly such that the kernal will run 64 times over an image) and then calc the average greyscale value in that kernal - and threshold it. Anything over 127 will be on, and anything less will be off.