The CircuitPython 9 Release Show
S02:E07

The CircuitPython 9 Release Show

Episode description

00:00 Welcome to The Bootloader

00:22 What are we excited about in CircuitPython 9?

00:56 jpegio and the Memento Camera

2:12 The one downside of JPEG vs. BMP or PNG

3:03 How Adafruit is innovating around the hardware and software

3:57 bitmapfilter image effects

4:28 USB Host

5:07 Keyboards on USB Host

7:12 MicroPython and merging its changes into CircuitPython

  • Split heap memory management

9:55 paralleldisplaybus

  • LilyGO microcontrollers
  • 8x faster display using paralleldisplaybus for ESP32

12:13 CIRCUITPY on Android

13:28 ESP-IDF software development kit for Espressif microcontrollers

  • CircuitPython 9.0 moves from IDF v4.x to IDF v5
  • Potential for Bluetooth for ESP32-S3 chips

15:52 ConnectionManager and the CircuitPython community

18:04 Breaking changes in CircuitPython

  • display.show() deprecated
  • Mounting a filesystem requires an existing directory
  • CircuitPython now requires explicit socket port re-use. Use socket.setsockopt(pool.SOL_SOCKET, pool.SO_REUSEADDR, 1), as in CPython.

20:10 Thank you to everyone in the CircuitPython community who contributed to CircuitPython 9.0

20:43 The CircuitPython Community Weekly Meeting every Monday at 2pm EST in the Adafruit Discord

21:33 Thanks for listening!

Memento photo used under a CC-BY-SA 3.0 license

Download transcript (.srt)
0:00

[MUSIC]

0:03

>> Hi, welcome to the Bootloader. I'm Tod Kurt.

0:06

>> I'm Paul Cutler. We're back after

0:08

an extended break with a special episode breaking

0:10

down the recently released CircuitPython 9.

0:13

It's been just over a year since CircuitPython 8

0:15

was released in February 2023,

0:17

and Tod and I are going to chat about what's new and

0:19

what we think is cool in CircuitPython 9.

0:22

With that said, Tod,

0:23

what are you excited about in this release?

0:25

>> All right. There's a ton of things,

0:27

but I'm going to list four real quick

0:28

without any explanations.

0:30

We can get to them in detail as we go.

0:32

JPEG I/O, parallel display bus,

0:36

USB host, and ESP-IDF update.

0:39

How about you? What are some of the things you're excited by?

0:42

>> JPEG I/O and the Momento camera definitely.

0:44

CircuitPy on Android, I think is pretty cool.

0:47

Brand new connection manager and USB host,

0:51

I'm excited to learn more about.

0:52

I haven't played with it yet.

0:54

So let's jump in. We both had JPEG I/O on our list.

0:57

The Momento camera just came out in the last couple of months and was

1:00

just unveiled in the latest AdaBox as well.

1:03

Have you had a chance to play with a Momento?

1:05

>> I have. Yeah. I ended up getting a board before the AdaBox,

1:09

but then I also got the AdaBox.

1:11

Of course, there was JP's wonderful unboxing video

1:14

that he did last night,

1:16

which was the 20th of March, 2024.

1:18

So there have been other,

1:20

so it's an ESP32-S3, I think,

1:23

baseboard that has on it a camera module, microphone, SD card slot,

1:28

bunch of this stuff, accelerometer.

1:30

But it's ESP32, so it's Wi-Fi capable, Bluetooth capable.

1:34

But the camera module writes JPEG.

1:39

Like when you turn it on and say, "Take a picture," it spits out

1:41

JPEG data that you're supposed to just save to disk as a JPEG file.

1:44

So that raises the question,

1:46

how do you read that on a CircuitPython device?

1:49

So now we have JPEG I/O,

1:51

which allows you to decode JPEGs and load them,

1:55

load JPEG images into CircuitPython and display them on a screen.

1:58

>> That's a big deal. I mean, we had a bitmap support

2:01

and most everything is using bitmaps,

2:03

but there's also ping support,

2:04

but you don't see a lot of it.

2:05

But JPEG is the standard for everything.

2:07

You can get small enough file sizes and all that fun stuff.

2:10

So it's pretty cool to see that added.

2:12

>> Yeah. It's incredible.

2:14

The one downside of JPEGs compared to

2:16

the other image formats that we like to use in CircuitPython,

2:20

the BMP or the PNGs,

2:22

is those can be palletized,

2:23

which means you can choose exactly how many colors your image has.

2:27

So if you have a specifically just black and white image,

2:29

you can say, "Only use one bit per pixel for this image,"

2:34

which makes the image on your disk a little bit bigger

2:38

because there's no real compression in BMPs.

2:40

But it means that in memory,

2:42

the CircuitPython image buffer will be much smaller.

2:45

With JPEGs, JPEGs are like the full color space.

2:48

So I think that it stores them as a 16-bit color,

2:51

two bytes per pixel.

2:53

So it's a bit bigger.

2:54

So JPEG I/O will only probably work really well on ESP32 devices,

2:59

things with lots of RAM,

3:00

but it's like we got it.

3:02

>> I think one of the really neat things about it too is it

3:05

shows how Adafruit's innovating around the product,

3:08

the hardware, and the software coming together to create the product.

3:11

>> Yeah.

3:12

>> It's almost Apple-like that when you can

3:14

have influence over both of those things,

3:16

you can have an experience that's really pretty cool.

3:18

>> Yeah. I've had a couple of these little ESP cams.

3:23

You can get them pretty cheap off of AliExpress or whatever

3:25

that are what the Memento was based on.

3:29

It's got ESP32 with one of

3:30

these little low-cost camera modules hooked up to it,

3:33

and some simple C code that shows basically how to just write the file.

3:39

But it's not a product.

3:40

It's not really anything that's usable.

3:42

Whereas the Memento is super usable,

3:44

partly because it's got a good design physically,

3:47

but also because now you can do it all in CircuitPython.

3:49

>> The first open-source powered camera.

3:52

>> Yeah.

3:52

>> That's pretty darn cool.

3:54

>> Yeah, it's pretty awesome. One of the other things I like about

3:57

the Memento effort was that one of the CircuitPython devs,

4:02

Jepler, added a bunch of image effects in

4:05

a general way with this thing called a new library in the core called Bitmap Filter.

4:10

This lets you do what's called convolution filters,

4:13

which is your standard Photoshop filters.

4:15

You can do things like sepia tone or blur or unsharp mask or whatever.

4:21

>> But it is pretty cool how that piece of hardware

4:23

is driving the software innovation that Adafruit is working on.

4:26

>> Totally.

4:27

>> Next up, let's chat about USB host.

4:30

I understand you've played around with that a bit. I have not.

4:33

>> I've played around with a little bit on other systems,

4:36

not much in CircuitPython world yet.

4:38

But yeah, the thing I've mostly played around with is that there are a lot of

4:41

really interesting little USB MIDI keyboards out there in the world that are only USB.

4:48

It'd be really cool if you could plug these into

4:50

something that's not a full computer,

4:53

but something that's smaller that could then create normal MIDI,

4:57

standard five-pin MIDI, or it could be a synthesizer in itself.

5:02

So with this new USB host functionality,

5:04

we might actually get that.

5:06

>> The other thing it adds is keyboard support.

5:09

>> Oh, like for computer keyboards.

5:11

>> Yes, it does. Scott,

5:13

I think earlier this year,

5:14

blogged in a CircuitPython 2024 wish list

5:17

about how close we're getting to an actual CircuitPython powered computer.

5:21

We've got the bigger displays and the quality is right.

5:24

You've got USB host,

5:25

so you can actually have the keyboard,

5:27

and now you've got the microcontroller working as a full-blown computer.

5:30

It's almost back to the eight-bit days of yore.

5:33

>> Yeah. Back when we could turn on the computer and it would

5:36

immediately give you a little prompt to let you start programming,

5:39

like that was amazing.

5:41

You'd have to wait for it to boot up because you just turned it on and there it was.

5:45

>> It's funny, I think not that it's in CircuitPython 9 specifically,

5:51

but I've seen work going on with a soft keyboard,

5:53

so a software keyboard,

5:54

as well as just a couple of weeks ago in Discord,

5:57

and I don't know the details,

5:58

but someone was talking about how could we have a terminal actually in CircuitPython.

6:03

>> Oh, interesting.

6:04

>> Right. I don't know how that would work if it's connected to the REPL or what,

6:08

but there were some questions.

6:09

I'm like, "Oh, every day we seem to get just a little bit closer."

6:12

>> Yeah. It's amazing.

6:15

It's a pretty complicated problem, it seems,

6:17

where right now when you want to talk to CircuitPython,

6:21

you connect via the serial REPL,

6:23

this USB interface over generally the USB interface,

6:27

but it looks like a serial port to your computer and you can control-C

6:30

your program and you can start the program back up again and you can see printouts.

6:34

But then there's also what's called the web workflow,

6:37

where you can do that same interaction but via a web page.

6:41

There's also a Bluetooth workflow where you can do something similar,

6:44

but with a little BLE app.

6:46

Now we might have something where there's a different workflow

6:50

where the keyboard and the screen are connected directly to the microcontroller.

6:54

Somehow these all work without them colliding.

6:58

If I do something in the web workflow,

7:01

I can still see it in the serial REPL, I think.

7:04

It's just a tour de force of programming to make all this work together.

7:10

>> It absolutely is. With that said,

7:13

we have to give credit to MicroPython.

7:16

CircuitPython is a downstream fork of MicroPython.

7:19

Every major release of CircuitPython,

7:21

they merge back in all the changes within MicroPython.

7:25

In this release alone in CircuitPython 9,

7:27

there were three MicroPython merges that they made,

7:30

1.19.1, 1.20, and 1.21,

7:34

were all merged into CircuitPython 9,

7:36

which brings a lot of innovation.

7:39

There's one thing called the split heap management.

7:42

I actually looked into it and couldn't understand it,

7:45

so I went to one of the core developers,

7:47

and Dan Halbert gave me a really great explanation.

7:50

It's a little long to read here,

7:51

I'll include it in the show notes.

7:52

But especially if you have some of the boards with smaller amounts of memory like the SAMDs,

7:57

you might have some memory issues going forward

8:00

to watch out for.

8:01

But overall, it's a really innovative change.

8:04

>> I've also been looking at the piece of text that Dan gave you.

8:09

I'm a pretty good coder, I feel,

8:10

but this is a little bit beyond me.

8:12

>> Those of you who want to know the guts and internals of CircuitPython,

8:16

I want to know about what changed.

8:17

We've got the info for you.

8:18

Just go to the bootloader.net and read the show notes.

8:21

>> Totally. About the merge,

8:23

I don't know how many people who are listening have actually

8:27

done merges to an upstream fork of code they're using.

8:31

But it is a ordeal because you take this code,

8:36

some piece of code, and you fork it,

8:38

you make your own changes,

8:39

and then the original makes their changes.

8:43

And if you want to track what they've done,

8:45

you have to go through this merge process.

8:48

Man, if you've changed the same file,

8:50

if you've decided to re-architect something

8:52

to have a different way of thinking about a problem,

8:55

it's just a huge problem.

8:57

And the fact that they're still doing upstream merges,

9:01

where they're still trying to track what MicroPython is doing,

9:03

so that CircuitPython is a subset of MicroPython is amazing.

9:07

And I was looking at the changes just for the 1.2.0 MicroPython merge,

9:12

the commit for that in CircuitPython touched

9:16

779 source files over 250 commits.

9:20

And that's pretty much-

9:23

>> And they merged three of those.

9:24

>> Three of those.

9:25

(laughs)

9:27

It's like, this is a huge undertaking.

9:29

And it seems to work, you know,

9:31

that like, so we get some of the new thinking

9:34

from MicroPython into CircuitPython.

9:36

And sometimes some of the CircuitPython ideas

9:38

bubble up to MicroPython,

9:40

but sort of in an out of band way,

9:42

because it would be hard for CircuitPython

9:45

to sort of push changes back up directly.

9:47

But yeah, I think it's really cool

9:49

that we're working together with MicroPython, CircuitPython.

9:52

>> Yeah, the beauty of open source.

9:53

>> Yep.

9:55

>> Next up, let's chat about parallel display bus.

9:59

What's going on there?

10:00

>> Ah, okay, so if you've used a little display,

10:04

little like, you know, LCD or TFT OLED or something,

10:09

you can talk to it via the I2C bus,

10:13

which is two little wires kind of slowed around 400 kilohertz,

10:17

or you can use the SPI bus, which is also two wires,

10:20

but can operate to like 30 megahertz or so.

10:23

And anytime you want to rewrite the entire screen,

10:26

that could be kind of slow because you're transmitting,

10:28

you know, several hundred thousand bytes of data

10:31

to rewrite all the pixels.

10:33

'Cause these displays are pretty dense, you know,

10:36

like one of the ones I like to use is 240 by 240 pixels.

10:39

And so you do your remote,

10:41

you do your best to minimize whole screen updates.

10:43

You just want to change little bits

10:45

that are changing on the screen

10:46

rather than rewrite the whole screen each time.

10:48

But there are some really nice boards

10:50

that LilyGo has made.

10:52

They're another like maker of little microcontroller gizmos

10:55

that have these really beautiful TFT color displays

10:59

with an ESP32 board on the back.

11:01

And, but they're hooked up via what's with a parallel

11:04

technique, which is eight data bits

11:06

instead of the one data bit that SPI has.

11:09

And so you can essentially get like eight times

11:11

the bandwidth.

11:12

So it's like an eight times faster display.

11:14

And CircaPython has sort of supported this,

11:16

but only for certain chips

11:18

and not for these cool LilyGo chips, which are ESP32.

11:21

And so lately the parallel display bus

11:24

has been turned on and fixed for ESP32.

11:27

Now we can use these cool boards

11:30

that have the really fast displays

11:31

and you can update them really quickly.

11:33

- So on the LilyGo displays,

11:34

they're actually built into the boards

11:37

similar to like the reverse TFTs that Adafruit sells.

11:39

- They look a lot like the reverse TFTs.

11:41

Yeah, yeah.

11:42

And so it wouldn't surprise me if Adafruit comes out

11:45

with something similar

11:46

'cause they can now take advantage

11:48

of these parallel displays.

11:50

And it's kind of like,

11:50

it's really the native way of how you talk

11:53

to these displays is via these parallel interfaces.

11:56

You have to go through extra work to talk via SPI

11:59

or I swear to see.

12:00

So yeah, so I'm excited by it

12:01

because I like to do a lot of cool graphic stuff

12:03

with these little computers

12:04

and watching things load the display is kind of,

12:08

it's like, oh man.

12:09

- Sure.

12:10

(laughing)

12:11

- That's not good for a little video game.

12:12

- Next up, one of the things that I'm excited about,

12:14

and you were just talking about something related to this

12:17

is you have a number of different ways

12:19

that you can work with CircuitPython.

12:20

You can plug, with most of the boards,

12:22

you plug it in as the USB drive, it sees it,

12:24

and you can edit the code.py right on there.

12:27

There's the web workflow now

12:28

where you can connect wirelessly and edit your code.

12:31

You can do it via Bluetooth.

12:33

Now you can do it on an Android device.

12:35

They updated CircuitPython 9 with Android support.

12:39

So you can plug in a CircuitPython 9 device

12:42

and actually write to your code.py right on there

12:45

and unplug it and your microcontroller will run the code.

12:48

- Oh, that's so cool.

12:49

Yeah, because on Android,

12:51

you can do serial devices over the cable, right?

12:56

- I believe it's over USB.

12:57

- Yeah, yeah, 'cause I think that's one of the restrictions

12:59

on iPhones is you can't do USB serial or something,

13:03

but that's so cool.

13:05

Yeah, 'cause we should be able to edit these things

13:08

with a tablet, right?

13:09

(laughing)

13:10

- Right, we should be.

13:11

But as you said, Apple's got all that market share,

13:14

so not yet.

13:17

- They prefer you to do everything via Bluetooth

13:20

rather than with a physical cable

13:21

for reasons that are only clear to them.

13:23

(laughing)

13:25

- This is true.

13:25

Next up, let's chat about the ESP-IDF.

13:30

- Ah, yeah, so this is because I'm a big fan

13:33

of these WiFi chips, ESP32.

13:36

There's a bunch of different types of ESP32s

13:38

that are, unfortunately, they all have the name ESP32

13:41

and they're very, very different.

13:43

So like the ESP32-S2 is a single core WiFi only,

13:48

but the ESP32-S3 is dual core with WiFi and Bluetooth.

13:52

So it's just very confusing.

13:54

But the underlying sort of code API

13:58

that we all use to write software for these

14:02

is called the ESP-IDF.

14:03

It's an SDK that Espressif,

14:05

the company that makes ESP32s, puts out.

14:08

And for the longest time,

14:10

CircuitPython was using ESP-IDF 4,

14:13

which was like two or three years ago version,

14:16

and it supported only a certain amount of chips,

14:19

a certain number of the chips,

14:21

and it only supported certain of the features.

14:24

Most notably, we couldn't get, I think,

14:26

Bluetooth support on some of the newer chips we like to use.

14:29

And so through a big effort,

14:31

similar to the effort of merging with upstream MicroPython,

14:35

was updating the ESP-IDF to version 5,

14:38

which enables CircuitPython to have new chip support.

14:43

Like there's this ESP32-C6 coming out soon

14:46

that I think has WiFi mesh or something.

14:49

I forget, but there's all these new ESP32 chips coming out,

14:52

and also it fixes some of the Bluetooth stuff.

14:55

So we should have BLE support for ESP32s soon,

14:59

which has been a sticking point.

15:01

People are like, oh, you know,

15:03

CircuitPython has such good Bluetooth support.

15:05

Well, only for the Nordic NRF chips.

15:09

- Right.

15:10

And I'd caution you,

15:12

I wouldn't say that expressive Bluetooth support

15:15

is coming soon.

15:16

- Oh, no.

15:17

- Hopefully it's coming.

15:18

- Yeah, no, no.

15:19

It's like now it's possible,

15:20

whereas before it wasn't even possible.

15:23

- Right.

15:24

So I don't want people to get their hopes up

15:25

too much right away.

15:26

- Yeah, yeah, yeah.

15:27

But if anyone knows ESP-IDF and wants to help

15:30

kind of flush out the Bluetooth support for CircuitPython

15:34

for the ESP chips, you know,

15:36

go to the GitHub and you can help out immensely.

15:39

- Or join the CircuitPython Discord.

15:41

There's a user, a community member

15:42

working on Bluetooth support for the Pico right now.

15:45

- All right.

15:46

- Being done via community members.

15:48

So, you know, which is a great segue

15:50

to the next thing that I'm excited about,

15:52

which is Connection Manager.

15:53

- Yeah, what is this?

15:55

I've only heard about it obliquely.

15:57

- So from what I understand,

15:58

and I haven't updated my wireless code yet,

16:01

is they've standardized the ability

16:03

of how you connect to Wi-Fi

16:05

when you're instantiating the network

16:07

on the microcontroller itself.

16:09

So if you were using an airlift, you did it one way.

16:13

If you did it with built-in Wi-Fi,

16:15

you did it a different way.

16:17

From what I understand, if I'm understanding it correctly,

16:20

a lot of that code has just been simplified

16:22

so there's one right way to do it

16:24

and it figures it out for you.

16:26

Don't quote me on that.

16:27

What I think is so cool about it

16:29

is a couple of different things.

16:30

One, it's snuck in right under the release.

16:32

But two, it was done by a gentleman by the name of Justin

16:35

who's a community member.

16:37

He partnered up with the core developers,

16:38

figured out how to build CircuitPython, how the CI works.

16:42

It was great seeing him get involved

16:45

and it's great seeing that a community member's involvement

16:48

resolves in a whole new library built into CircuitPython.

16:52

- That's great.

16:53

That is one of the nicest things

16:54

about the CircuitPython team,

16:57

the distributed global community that's working on this,

17:00

which some of them work at Adafruit,

17:02

is that they're very welcoming.

17:04

It's like, oh, if you've got something

17:05

that you wanna contribute, submit a PR, let's try it out.

17:09

Yeah, I've created a couple different libraries

17:12

and people are like, yeah,

17:14

we'll put it in the official bundle

17:16

that you can then use to,

17:18

that anyone can then easily install.

17:19

So, yay.

17:21

I can't wait to try out this connection manager

17:23

'cause that's always been the real bummer

17:26

is that if you are using one of these Wi-Fi add-on boards,

17:30

the way you started up the Wi-Fi was totally different.

17:35

The way you got sockets and stuff was totally different

17:37

than doing the ESP32 native Wi-Fi stuff.

17:42

- And I'm not the most technical, so don't quote me,

17:44

but that's my understanding of how it works.

17:46

And I'm sure if I'm wrong, I'll hear about it

17:48

and we can issue a correction notice next episode.

17:51

- Well, that's how we get the viewer numbers up, right?

17:53

Or the listener numbers up

17:55

is we say something purposefully wrong

17:57

so that we'll get more engagement.

17:59

(laughs)

18:00

- Oh, a little controversy for you right there.

18:02

(laughs)

18:04

Last up, we would be remiss if we didn't mention

18:06

some of the things that CircuitPython 9 no longer supports.

18:10

So there's a couple of things that have been deprecated.

18:12

The big one for me personally is using display.show,

18:15

parentheses, and then you would put your group name

18:17

in the function.

18:19

Now it's display.groupgroup equals the group name

18:23

that you created earlier in the process.

18:25

So that's a big one for me as I'm going through slowly

18:27

and updating all my devices that have displays

18:30

so that they work correctly.

18:32

Next up is file system mounts

18:35

need to be on an existing directory.

18:37

So no longer can you have the drive blank,

18:40

you need to manually create a /sd directory,

18:43

for example, if you're using SD cards.

18:45

- Yeah, that one, I'm not, even though,

18:49

so as an old Unix nerd who knows that like,

18:52

whenever you mount a disk,

18:54

you must first create the directory

18:56

and then use the mount command to say,

18:58

put this disk at this directory.

19:00

So it's always a two-step process.

19:01

I really liked the old CircuitPython way of just like,

19:05

hey, mount this thing at that directory.

19:06

(laughs)

19:08

It was so much simpler.

19:10

- Sure.

19:10

- But yeah, so now it's more in line

19:12

with how real Python works,

19:15

but I kind of miss the old way.

19:17

- Yup.

19:18

And speaking of being more in line with how C Python works,

19:22

the last change is CircuitPython now requires

19:24

explicit socket port reuse.

19:26

- Yeah.

19:27

- So you can see in the show notes,

19:28

the actual command that you would have to use.

19:30

- Yeah.

19:30

- But that aligns to how C Python does it,

19:32

which makes sense why they would make

19:35

a breaking change like that.

19:36

- Yeah.

19:37

Yeah, I'm glad they're getting more and more close

19:39

to C Python, to the desktop Python,

19:41

'cause I wrote a networking library,

19:44

a little UDP library recently,

19:46

and I was able to support both C Python and CircuitPython

19:51

with just a very small, like two or three line changes

19:54

in the middle of like, basically, how do you get a socket?

19:56

And I'm like, oh, this is nice,

19:58

'cause this means I could do like almost all my testing

20:01

on my laptop with no device connected,

20:03

and then like just do the couple line changes

20:05

and try it out on a CircuitPython device,

20:06

and it all works.

20:08

- Well, that's pretty cool.

20:09

So lastly, I think we should give some credit

20:11

to everyone who contributed

20:13

to CircuitPython 9's development,

20:14

who beta tested it through the long beta testing process

20:18

that went on, who filed issues,

20:20

who left feedback in Discord,

20:22

who participated in the CircuitPython 2024 wishlist.

20:26

It's a great community.

20:27

That's why I did the CircuitPython 9 show.

20:30

That's how we met.

20:31

We're both still in the Adafruit community.

20:33

So thank you to everyone who's had any part

20:35

in bringing CircuitPython 9 to life,

20:37

and thank you to Adafruit for sponsoring CircuitPython.

20:40

- Totally, and if anybody is interested in like,

20:43

kind of getting in and like kind of listening

20:45

to the development process of CircuitPython,

20:47

there's a weekly meeting via Discord audio,

20:49

whatever that feature's called.

20:51

You can join just to listen in.

20:54

You don't have to present or anything.

20:55

The core developers, but also people

20:57

that are just like writing libraries and stuff,

20:59

and you can listen in and see

21:01

if you want to participate actively,

21:03

or it's also good just to get a behind the scenes

21:05

as to what's kind of coming up in CircuitPython,

21:08

'cause you'll see somebody,

21:09

like I saw that Jepler was working on JPEG I/O

21:11

like three months ago or whatever,

21:13

(laughs)

21:14

and I was like, "Oh, I can't wait." (laughs)

21:16

- Right, and that's where Connection Manager

21:18

has been discussed in the Weeds section

21:20

at the end of the meeting.

21:21

So that's a great idea.

21:23

It's Mondays at 2 p.m. Eastern.

21:25

Check it out if you're interested

21:26

in joining the CircuitPython community.

21:28

We're members, we love it.

21:30

I think that enthusiasm comes through,

21:32

and thanks for listening to the episode.

21:34

And I'm Paul Cutler.

21:36

- And I'm Tod Kurt.

21:37

- Thank you for listening to The Bootloader.

21:40

For show notes and transcripts,

21:42

visit thebootloader.net.

21:44

If you use Mastodon, you can follow the show on Mastodon

21:47

to be notified when new episodes are released.

21:50

Visit thebootloader.net, click on the follow us link,

21:53

and enter your Mastodon handle.

21:55

Until next time, stay positive.

21:57

[MUSIC PLAYING]