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
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.