A website featuring my projects
View the PROJECT on GitHub maxsimmonds1337/maxsimmonds.engineer
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.
