Minimal "font" size for leds

One project I’ve come back to a few times and it’s worming in my brain now, is an alpha display…that is letters.

With the average matrix at 8x8, 16x16, etc… It’s temping to do an 8high font… Maybe 5x8… or even 5x7… But that means on a 16x16, you get just 6 characters. (See @sorceror 's recent LEDaliClock matrix pattern for example.

The problem is 4x4 is just slightly too small for legible letters. B,S,M, and W among other letters don’t really fit. 4x4 would be awesome otherwise as it’s just 16bits of data.

The first size that really works is 5x5. This gives you a center point, center lines, and angles on all four corners, as well as enough visual space to drop corners and look curved, etc. 5x5 is just 25 bits, so it’ll work with a 16.16 number, meaning we can stored the entire “letter” as one number. Then just bitwrangle it into 25 LEDs.

But of course, 5x5 only fits 1 letter on a 8x8 but you can see the start of the next letter if you scroll. For 16x16, you get 3 letters in 3 rows or 9 letters but only one row/column of space left over between (if needed), not two. Using Sorcerer’s trick of coloring differently, you could avoid spacing at all, but still only 3 letters wide/tall. That’s not even a GAME OVER display.

Combos like 4x5 or even 3x5 don’t yield good fonts… I think you have to go to 3x7 to even get close to usable. And M and W don’t look great.
(Btw, those 4 letters are really the keystones here. If S, B, M, W can look good, likely the rest will)

5x5 seems the best small option I’ve found. Doesn’t help on 8x8 but on a 16x16, you get 3 rows, not just two. Anything taller like 5x8 or 5x7, it’s just two. 5x7 seems the next best choice, BUT it’s also 35 bits, so… It no longer fits into a 16.16 bit pattern (which is just 32 bits)
5x6? Lacking a center row, you end up using mostly 5x5 anyway, with a rare 6 for improved looks.

So 5x5 seems the sweet spot. One number per item, So you can easily stuff it into an array, and do instant translation lookup (for ascii or whatever) if you wanted to send text to the PB via a variable.

I considered color stuff like 4x4 with colors but it didn’t help. We can’t use “subpixel” techniques with large pixels.

Even a clock display on a 16x16 doesn’t fit with 5x5, so a smaller clock display font should be numbers only (no PM, the M problem)

I recently posted a 7 segment SDF which we could expand to 14-16 segments (or bigger) and get full “cheap” alpha numerics, but that’s only good for larger displays… At “low resolution” you are better with a bit map.

No code yet, but it’ll happen. I found tools to build the font bitmap graphically and turn it into binary. Converting to a 16.16 number might be slightly smaller, but then again, way less editable. If you have the binary and want to tweak a bit, you can see it visually.

Added: I did find a 4x7 font that looks nice. So that might be an alternative.

And a few 3x5 fonts are good with the exception of M and Ws. Maybe make them 2 char wide? That would be 16/3 is 5 chars, and Game would fit even with 2 for M. Hmm… Since the core pattern will work for all of these, time to code something up, and I guess they will be font options.

When I was working with LEDaliClock, which uses the Wu fractional-coordinate antialiased lines, I was thinking that the Persistence of Vision could be of use.

For example, GAME OVER on 16x16 could be drawn with 5x7 vector characters scaled to 3x7 but with the origin moving between 0,0 and 1,1, such as a circle centred at 0.5,0.5. Or, scale the entire vector set from the 2x2 center out to 16x16. Or wobble-rotate it from -5° to +5°. Or … Star Wars scroller. Or pretty much any demoscene text scrolling effect.

You get the picture: moving vector fonts using temporal resolution to compensate for lack of spatial resolution. Then instead of a bitmap we draw the fonts on a 100x100 grid and scale as required.

1 Like