Artwork for podcast The CircuitPython Show
Michael Czeiszperger
Episode 6127th July 2026 • The CircuitPython Show • Paul Cutler
00:00:00 00:19:05

Share Episode

Shownotes

Show Notes

1:22 Michael’s start with electronics

2:38 ScrollKit

5:33 How ScrollKit works

7:08 Scrollkit’s hardware

8:09 How over-the-air-updates work

8:49 Graphics in ScrollKit

10:42 Challenges to overcome

15:09 The ScrollKit simulator

16:35 Theme Park Waits

17:33 What’s next for ScrollKit?

18:18 Which board?

18:51 Wrap-up

Transcripts

Speaker:

Welcome to the CircuitPython Show.

Speaker:

I'm your host, Paul Cutler.

Speaker:

This episode, I welcome Michael Czeiszperger.

Speaker:

Michael, who described himself in a bio he wrote in 1991,

Speaker:

as an engineer who dabbles in writing,

Speaker:

musical composition, and computer graphics,

Speaker:

skillfully avoiding the mastery of any one field.

Speaker:

35 years later, the list has only grown.

Speaker:

Real-time synthesizer prototypes at Yamaha R&D,

Speaker:

where he demoed the entire lab's work for Yamaha's president,

Speaker:

Solaris Audio Libraries at Sun Microsystems, and since 1998, his own company, Web Performance

Speaker:

Incorporated, building load testing tools used by the U.S. Census, Statistics Canada, and the New York

Speaker:

Marathon, most recently shipping agentic AI systems into a 25-year-old Enterprise Java platform.

Speaker:

Michael just released ScrollKit, which exists because he wanted LED signs showing live

Speaker:

theme park wait times, and found that most CircuitPython Matrix libraries get you a scrolling

Speaker:

Hello World and stop. It handles everything after that. Over-the-air updates to boards in the field,

Speaker:

fault-tolerant data refresh, transitions and effects, and a built-in web server, all running at once

Speaker:

on boards like the Matrix Portal S3, plus a pixel-accurate desktop simulator, so debugging doesn't have to happen

Speaker:

on hardware. Michael, welcome to the show.

Speaker:

Hey,

Speaker:

how's

Speaker:

it

Speaker:

going?

Speaker:

How did you first get started with

Speaker:

computers and electronics?

Speaker:

If you want to talk about electronics, my dad was a real big believer in the

Speaker:

value of hard work and other people. And so he had a buddy who had a TV repair shop and it sent me out

Speaker:

to Apprentice there. Look, I was 14. And so they put me to work first sweeping floors and then

Speaker:

soldering used parts off of old TVs to go in the bins to be used. And so I thought that was the coolest thing.

Speaker:

how does it all work?

Speaker:

You know, and the other thing I thought was,

Speaker:

I do not want to repair TVs.

Speaker:

I want to build stereos.

Speaker:

That sounds way cooler.

Speaker:

How did you discover CircuitPython?

Speaker:

I discovered CircuitPython because I've been following

Speaker:

Adafruit since it started.

Speaker:

And so I just think it's a cool company.

Speaker:

I like the way they're run.

Speaker:

And CircuitPython happened to be a good way

Speaker:

to learn how to use our hardware.

Speaker:

I've already done C++ programming on ESP 32s, and I thought, I know how to do that.

Speaker:

But a buddy of mine says, you have to learn Python.

Speaker:

And so what a better way to learn Python than to make LED screens light up.

Speaker:

Speaking of LED screens, you recently released ScrollKit for CircuitPython.

Speaker:

Tell me about ScrollKit.

Speaker:

I wanted to learn Python, but I also wanted to make a product, because I'm kind of like an entrepreneur or product engineer.

Speaker:

And the product I would make was kind of dumb.

Speaker:

And that is a box, which would tell me what the wait times were at theme parks, because I'm a theme park net.

Speaker:

And as a professional programmer, I sat down and all the different bits and pieces that you needed to put together, I'll hold it to do by hand.

Speaker:

It's like, why don't any of these libraries exist?

Speaker:

This is a, you know, I don't mind writing them.

Speaker:

But, I mean, it should be a few lines of code that somebody else wrote, not me.

Speaker:

I mean, all the different pieces.

Speaker:

I was looking at page after page of like gobbly gook of trying to get the boards configured.

Speaker:

And I thought, you know, somebody else could be saved a lot of time if I just pulled out all the commonalities and made it into a library.

Speaker:

And so I happened to be on the API team.

Speaker:

It's on microsystems back in the day for audio.

Speaker:

So I had like an I for, I'm just a real stickler about it should be as simple as possible and extensible.

Speaker:

So that I just love looking at a program.

Speaker:

It's like line one, set everything up, line two, run the program.

Speaker:

You know, it should be logical and easy for even non-programmers to use.

Speaker:

This is version three.

Speaker:

How does it differ from the first two versions?

Speaker:

What have you learned along the way?

Speaker:

Well, I learned a lot.

Speaker:

As you can imagine, version 1.0 actually shipped and people like paid me to shift these boxes out.

Speaker:

And it was pretty much crap.

Speaker:

I mean, I had tested it at home, but these,

Speaker:

you know, people would run it on spotty Wi-Fi networks and it'd be up for six months

Speaker:

and they were naive users.

Speaker:

And so if the box happened to go blank for 10 seconds because the data feed locked up,

Speaker:

they would panic and send an email or unplug the box and then it hose it.

Speaker:

I rewrote the thing to version two and I thought I was going to fix all those things.

Speaker:

And it was more solid then.

Speaker:

It was better.

Speaker:

it was just completely hand-coded.

Speaker:

And then about the same time,

Speaker:

AI coding came along.

Speaker:

And I thought, you know,

Speaker:

I would rather risk learning how to program

Speaker:

with AI on this than at work.

Speaker:

The first time, I said,

Speaker:

all right, refactor this into a library,

Speaker:

separated it.

Speaker:

So I gave it instructions.

Speaker:

And I let it run overnight,

Speaker:

and it came back the next day.

Speaker:

And it was literally 20,000 lines of gobbly gook.

Speaker:

I mean, it was just horrible.

Speaker:

So it was a long process to figure out, all right, how do I, as a former engineering manager,

Speaker:

tell my AI team how to do what I needed to do, which is to create a professional-looking library.

Speaker:

So tell me a little bit more about ScrollKit.

Speaker:

How does it work?

Speaker:

You know, it's a Python library, but when you make a, there's a big difference between just running a little demo app on your CircuitPython device.

Speaker:

and coming out with a product.

Speaker:

And so one of the first things that happens is when you give a person a box,

Speaker:

it has to connect to the Internet.

Speaker:

And all of the CircuitPython documentation that says,

Speaker:

first mount your drive and then edit the file with your Wi-Fi password.

Speaker:

And no, people are not going to do that that have paid for a product.

Speaker:

They just aren't going to do that.

Speaker:

And so the first thing is there were some regular Python scripts,

Speaker:

but I wrote it from scratch that when the box comes up,

Speaker:

it throws an actual web server up with instructions for the user.

Speaker:

So across the device, it scrolls, log into here,

Speaker:

and then it allows you connect your internet.

Speaker:

So it's polished.

Speaker:

It's basically product polish.

Speaker:

So what happens then?

Speaker:

The next thing that happens is, what if the user wants to modify it?

Speaker:

You don't want to write an app for that.

Speaker:

And then they have to download an app.

Speaker:

So then the web server that's running on the box automatically picks up all of your settings

Speaker:

you specified for app and shows them in a nice GUI

Speaker:

should use her and go and change parameters for all speed colors.

Speaker:

Whatever parameters you want, it automatically throws it up.

Speaker:

You just define what your parameters are

Speaker:

and the GUI just takes care of it.

Speaker:

Now, if you want to do something complicated,

Speaker:

you could write your own GUI to.

Speaker:

But the philosophy here is what 99% of people are going to be doing

Speaker:

is handled in just the simplest way possible.

Speaker:

Now, when you say box, what hardware have you targeted?

Speaker:

I believe it's an S3 Matrix portal,

Speaker:

and is it Hub 75

Speaker:

displays?

Speaker:

Yeah, yes. That's pretty much the first case. I have a list of other hardware sitting.

Speaker:

I might ask right now that I'm going to be adding just to add something else. I really like that device,

Speaker:

the S3. It's so, I mean, it's so easy to put together. It's just a couple of wires. You plug it into a

Speaker:

box. The thing runs. There's nothing to solder. I mean, it's it's dead simple for a hobbyist for me.

Speaker:

and I actually went and cadded up a really nice enclosure for it too.

Speaker:

So the whole thing just mounts.

Speaker:

It's got a holes in the right place from the side.

Speaker:

You just plug in your USB power kit, power cable, and it just works.

Speaker:

I've got a project that uses two 64 by 32s together with a nice 3D printed cases.

Speaker:

We might have to trade designs at some point here.

Speaker:

Oh, yeah.

Speaker:

Well, that's the next step.

Speaker:

Once you get one, then you went two, right?

Speaker:

That's right.

Speaker:

How do over-the-air updates work?

Speaker:

Over-the-air updates, basically it looks for a live branch on a GitHub feed.

Speaker:

So you can do your development, and then when you're ready for a ship, you can tag it with a release number, push it to the live branch, and then all the boxes have a little button at the bottom under GUI, and you can say check for updates.

Speaker:

What I typically do is I have a list of people who are using it, and then I just send them an email when there's something with the description and they can upgrade.

Speaker:

great or not.

Speaker:

Sure.

Speaker:

I just remember, we haven't talked about graphics.

Speaker:

Right.

Speaker:

That was the next question.

Speaker:

Perfect timing.

Speaker:

Yeah, we haven't talked about graphics.

Speaker:

So one of the, the first thing that really made me excited about doing this was that,

Speaker:

I don't know if you had the Aterfruit demo where they have a sort of like a flocking thing.

Speaker:

I've seen it.

Speaker:

It was in C++.

Speaker:

Yeah.

Speaker:

All right.

Speaker:

So first thing I tried to do is write that in Python.

Speaker:

Oh, my God.

Speaker:

It did do was just glacial.

Speaker:

I mean, it was just one thing at a time.

Speaker:

And then I looked into it.

Speaker:

I realized that some of the calls, graphic calls,

Speaker:

and circuit bython are really fast because they're in C

Speaker:

and some are.

Speaker:

So what I actually did was wrote a program that went through

Speaker:

and timed each of the graphics calls and made a table.

Speaker:

All right, which ones are fast and which ones are slow.

Speaker:

So all right, now I know which ones to avoid.

Speaker:

And then I said, OK, what higher level constructs

Speaker:

do I really want to do to put together?

Speaker:

other animation to make things walk and make things fly and just came up with a nice, very simple

Speaker:

little kit in order to put sprites in there that all used the fast thing. So the first thing I did

Speaker:

was try to redo that flocking algorithm and it worked this time. By using the fast calls,

Speaker:

I've sort of timed it so I could create a flock of about 20 separate birds. That seems to be

Speaker:

optimal for the S3. Once you get over that, then it slows down.

Speaker:

That's still pretty impressive,

Speaker:

that you can get 20 other birds animating at the same time.

Speaker:

On CircuitPython, to me, the thing is as slow as on that hardware,

Speaker:

it's kind of like writing and basic for old Commodore 64.

Speaker:

And I think that's part of the appeal of learning CircuitPython,

Speaker:

and it's got some of that back-to-basics feel to it.

Speaker:

Well, you know, I think you get some of the best creativity when you're restricted.

Speaker:

If you had a limited compute power, what would the fun of that be?

Speaker:

That's right. It's all about those constraints.

Speaker:

Yeah.

Speaker:

So you mentioned the speed is one of the challenges.

Speaker:

Were there any other challenges you had to overcome?

Speaker:

CircuitPython is different because they rewrote.

Speaker:

They have a different HTTP stack than regular Python.

Speaker:

They have a different graphic stack.

Speaker:

And so trying to get everything running at the same time in the box was challenging

Speaker:

because the HTTP is synchronous.

Speaker:

But in order to get simultaneous scrolling across the screen

Speaker:

and the web server running

Speaker:

and the data being updated simultaneously,

Speaker:

the background would block

Speaker:

every time there's HTTP call.

Speaker:

And so I put a lot of effort down the drain

Speaker:

and trying to make that I-O asynchronous

Speaker:

that just never panned out.

Speaker:

So I decided to work around it

Speaker:

by putting up a screen that says,

Speaker:

I'm updating now, don't unplug.

Speaker:

So the end result of that architecture now

Speaker:

is that I can have multiple graphics processes,

Speaker:

is running and egg secrecy.

Speaker:

So at the same time as there's a message scrolling across the screen,

Speaker:

I can have an animated swarm, form the wait time for the ride.

Speaker:

It's so cool.

Speaker:

It just sort of like call comes in from everywhere and swirls around and then makes the number.

Speaker:

And I think when you have a simple little box like that, it's those fun little animations

Speaker:

that make it interesting, that change every time.

Speaker:

I agree.

Speaker:

You mentioned that you wanted to start the project off by learning

Speaker:

a little bit more about how AI might be able to help.

Speaker:

I believe you used Claude.

Speaker:

How did Claude help you?

Speaker:

Yeah, well, I came back.

Speaker:

I left this project sit for a year,

Speaker:

and I learned how to use AI in a corporate setting,

Speaker:

doing production work.

Speaker:

And so I brought that skill set.

Speaker:

I thought, you know, what would be fun?

Speaker:

I want to have little animations for each ride.

Speaker:

There's a ride at Magic Kingdom with the Big Thunder Mountain,

Speaker:

and there's this goat that's sort of the mascot,

Speaker:

and the goat sort of shakes his head up and down with dynamite's mouth.

Speaker:

I said, I want that, but I want it for every ride.

Speaker:

So I thought, let's try the new Fable.

Speaker:

The big model right now that came out as Fable.

Speaker:

I thought, you know, I'm going to create a list of every ride that are my favorites

Speaker:

and then put out a text description of the animation that I want.

Speaker:

And then I'll just let Fable chew on that overnight.

Speaker:

So I came back and like some of them were really cool

Speaker:

and some of them were blobs.

Speaker:

And so when I realized that I can't tell it to make a guitar,

Speaker:

I have to describe what a guitar looks like.

Speaker:

And so that was a process.

Speaker:

It took like three different revisions.

Speaker:

And then every time it was says,

Speaker:

you know, I don't want the head to bob up and down.

Speaker:

I want it to rotate.

Speaker:

So then every time that happened,

Speaker:

I would update ScrollKit.

Speaker:

So now you can have little bitmaps that rotate.

Speaker:

And then I did a walking mechanism.

Speaker:

And I did a bird flies and flaps.

Speaker:

And then I did vehicles where you can have a road and things walking over the road

Speaker:

where the road stays the same and the people walk.

Speaker:

So basically, I just iteratively went through each of the rides and thought,

Speaker:

all right, what would that be cool?

Speaker:

Had the AI crate that for me, iterated on it, and then moved all the reusable parts of the code over to the library.

Speaker:

Is there the ability for users to fork your repo and actually give prompts to their AI?

Speaker:

to build animations for the LED matrix themselves?

Speaker:

Yeah, that's the whole point,

Speaker:

is that built into this whole thing is

Speaker:

and instructions for the AI of your choice

Speaker:

of how to use this,

Speaker:

where you could go plug in some thing in your head

Speaker:

of how you want it to look visually

Speaker:

and it will try to create an animation that does that.

Speaker:

So I think that's really fun.

Speaker:

You can look at the code yourself

Speaker:

and it's just so cute to see these blocky little things go across the screen.

Speaker:

It might be a great way to introduce someone to CircuitPython, too.

Speaker:

Put them in front of it and get them interested in giving the prompts,

Speaker:

and then over time they might be interested in going under the hood

Speaker:

and learning how it actually works.

Speaker:

That's the idea.

Speaker:

People can use as little or as much coding themselves as they want.

Speaker:

I think the end result would be if somebody says,

Speaker:

You know, I want to do an asteroid game or something silly.

Speaker:

And then they end up having to write code to do that.

Speaker:

So you wrote a simulator that works with Pye game.

Speaker:

How does that work?

Speaker:

Yes.

Speaker:

As you know, professional programmers, we like debuggers.

Speaker:

I love debuggers.

Speaker:

There's nothing faster with a bug to go stick at a breakpoint and then look at all your parameters, see all your values.

Speaker:

But when it's running our hardware, I don't know of a debugger that runs on that.

Speaker:

Maybe there's one now, but when I started the project, there wasn't a debugger that would tell you what was going on the hardware.

Speaker:

And so it was always putting these output statements.

Speaker:

And I'm learning a new language.

Speaker:

You know, it was so tedious.

Speaker:

So I thought, why isn't there a simulator?

Speaker:

This is a simulator for everything else.

Speaker:

I Google and I found some very complicated things online and I couldn't get them to work.

Speaker:

I thought, you know, let me just see what Opus is going to do with this.

Speaker:

So I expect out what a simulator would work.

Speaker:

It took me like several days to iterate on it.

Speaker:

And unbelievable, you can hold up a box with the hardware right next to the simulator, same speed, everything.

Speaker:

So the simulator actually uses those timings I created for each of the calls.

Speaker:

So it knows exactly how long it takes on the S3 to execute each of the calls.

Speaker:

So it knows how to do the exact same speed and color.

Speaker:

It knows bitmaps.

Speaker:

It looks exactly like the hardware.

Speaker:

Oh, that's great.

Speaker:

But you can debug it.

Speaker:

You could throw it in the debugger and you know what's going on.

Speaker:

So that, to me, that was like really fast.

Speaker:

So you mentioned that you're really into theme parks and you have another project on GitHub called theme park weights,

Speaker:

where you've used an API, I believe, to display all the wait times on these devices.

Speaker:

Is that what people are using out in the field that are purchasing this from you,

Speaker:

that they're also into theme parks and they want to understand what the wait times are out at the different theme parks around the world?

Speaker:

That's exactly it.

Speaker:

So the use case here is that people have scheduled a big vacation and it's six months out and they want to get their kids excited.

Speaker:

So there's a countdown on it.

Speaker:

And so they can stick that in the kitchen and every morning the kids can say, all right, here's what's going on at Disney today.

Speaker:

Look at that cute animation.

Speaker:

You know, isn't that going to be great?

Speaker:

Look, we've got only 93 more days.

Speaker:

Well, that's great.

Speaker:

Build that anticipation up.

Speaker:

Yes.

Speaker:

And, of course, I just like having it in my office.

Speaker:

I think my wife's tired of it by now, but I'm still in my office.

Speaker:

What's next for ScrollKit?

Speaker:

I was just thinking about that.

Speaker:

And I was thinking I really want to make the animation more complicated.

Speaker:

Because right now it can do simple little things, but I thought it would be fun to try to do simple games on it.

Speaker:

Like turn it upside down and do Tetris or asteroids or a scroller game.

Speaker:

If people want to learn more about ScrollKit or your work, where should they go?

Speaker:

Well, ScrollKit is at scrollkit.dev.

Speaker:

And it's got a whole bunch of sample animations.

Speaker:

Every single effect you can do has sample code and then an animated gift showing what it should look like.

Speaker:

So it's fun.

Speaker:

You just look at it.

Speaker:

My personal work is just CZEI.org.

Speaker:

Last question I ask each guest.

Speaker:

You're starting a new project or prototype.

Speaker:

Which board do you reach for?

Speaker:

Which board do I reach for?

Speaker:

I have been doing Unix since BSD.

Speaker:

And so Raspberry Pis are just like, they're so capable.

Speaker:

And I've, you know, you can SSH-in into them.

Speaker:

So to me, that's comfort zone, right?

Speaker:

And so trying to use the S3 was me trying to stop using the same ball.

Speaker:

Michael, thanks so much for coming on the show.

Speaker:

Hey, thank you. Appreciate it.

Speaker:

Thank you for listening to The CircuitPython Show.

Speaker:

For show notes and transcript, visit www.circuitpythonshow.com.

Speaker:

Until next time, stay positive.

Follow

Links

Chapters

Video

More from YouTube