 Hello, welcome to the show. It's me, John Park, and it's time for John Park's workshop. Thank you so much for standing by. We had a couple of technical difficulties earlier in attempting to launch the show, but now it appears like everything is not good broadcasting properly. We're going out over the, let me pause this right here, going out over Restream I.O. to a bunch of places including Twitch, and we've got Facebook, we've got YouTube, so you can head to any of those places to catch the show. And if you're wondering where the chat is happening, it's right here in Discord. So adafruit.it slash discord, go to the live broadcast chat channel. And there you can see people discussing topics relevant to the show. I can also keep a little bit of a eye on the YouTube chat as well. So thanks for stopping by, everyone, in all of those chat places. So let's get going. First thing I wanted to do is mention our job board. We have a job board over at jobs.adafruit.com and it looks an awful lot like this right here. If you head over there, you can post if you are looking for work, you can post if you're looking to hire someone, it's entirely free to use. And this is just an example right here of some of the types of positions people are posting about. And that can cover everything from on location, remote, part time, full time, contract, freelance, you name it, it's probably there. So go and check out jobs.adafruit.com and see if you can hire someone or find some work or who knows. Let's see, what else is going on? I'll tell you what's going on. On Tuesdays, I've got my product pick show. It's called JP's product pick of the week. It's hotter in here than I thought. I'm rolling up my sleeves. Time to get to work, right? And on the product pick show, I picked something from our list of either new or old but awesome or somewhere in between products. And I have a huge 50% discount typically on the product pick or picks. This week it was two of them. And then I do some demos. We can go over code if there's code related, do some hardware stuff. If there's hardware related, usually both. This week it was a couple of different neopixel strips but we had them both as a 50% off and we are broadcasting the video live inside of the product page in this case for both of those pages. And thank you so much to everyone at Adafruit who helps make this possible. It's a bunch of extra work to make all this happen but we hope it inspires people to pick up some cool stuff on a great discount. Here's a little recap of what I did this week. Ah, there it is. Yes, that's one whole meter of pixels per meter. So these are perfect for things like our circuit playground express and circuit playground blue fruit boards as well as micro bit because they have these nice alligator clip friendly pads on them. What we have are a ground, a power which is good for anywhere from three to five volts and a data pin. And then we can power that off directly off of a lipo if we want. Mount that inside of your cool cyber hoody hood. Alligator clip, neopixel strips in both the one meter and half meter length both with 30 pixels, so two different densities. Hey, wait, was that gonna loop again? I shouldn't have, but I caught it just in time. All right, yeah, so that was product pick of the week and tune in next week. It's on Tuesdays at one o'clock Pacific time. That's my time zone and four o'clock Eastern time. If you dig that or if you wanna do the math to figure out other points on the planet, you can do that. I don't think we're broadcasting beyond the planet currently, but you never know. Let's see. Cup of coffee says a regurgitated product pick. I did not regurgitate that. It was an illusion. Yeah, don't eat those. Probably don't eat those. I don't know, they're in silicone. They're probably fine. All right, let's see. Next up, I wanted to do a little cleaning up of this display before we do product or rather, circuit pipe on parsec. That off there. Lots of reflections. Go for it. Here we go. That circuit pipe in. All right, standby. I've got a file to open here. It's chaos, I tell you. All right, let's launch that one right there. That'll do it. Okay. For the circuit python parsec today, I want to continue on with our series of vector IO shapes. This is the lightweight 2D shapes library that works with display IO in circuit python. And last week I did circle and rectangle, which are the two sort of implicit primitive objects. Now we have the very versatile polygon object. So if you see what's going on right here, I've got a feather, no, it's a feather RP2040 and the TFT feather wing, three and a half inch, I think it is. This is a set of polygon objects being drawn on here using vector IO. If you take a look at the code and how I'm doing that, in fact, let me zoom in on here and focus a little better. Just like that, there you go. Very nice, clear polygon shapes. And the way I'm doing these are in code. I import the vector IO library. I've also got display IO and some other goodies to go along with it. I'm setting up three pallets in this case. This is in flux, this will be changing, but right now I have three pallets to do three different colors. And then you can see we create a list of points. These are vertex pairs. So in the case of this hex object, I have a set of X, Y coordinates for each point on this hexagon. Then I create an object called hex using vector IO.polygon and I refer to the pallet, one of the pallets I've set up, and I refer to that list. So I take these X, Y coordinate pairs for each vertex of the polygon. It creates the edges and the fill for us. So it fills it in automatically. And then you can see in this case I'm setting up two objects, one star one and star two. These are both using vector IO polygon, picking a different pixel shader for them so they're different colors, picking the same set of points and then I'm putting them in different positions on the screen. Then I append those to the display and they get drawn. If we go ahead and change the position of one, let's say, and resave the code, you'll see it's gonna refresh and it will redraw that second star in a different space. It'll also respect the order that you draw them so you can put things on top of or below each other inside of the display's sort of Z depth. So that is a really simple way to get started creating polygon objects using vector IO inside of circuit Python. And that's your circuit Python Parsec. Yes, circuit Python. I'm just hearing over in the chat that YouTube is having a little bit of a buffering. Okay, it looks like we're back up and running and it seems that the stream health according to YouTube is a little better than it was so hopefully we won't have any stuttering and buffering. I'll tell you what, the question is, did we get a clean circuit Python Parsec that I can, I think I can pull that off a Twitch if that one was clean, we'll see. I always create a sort of two minute version of the circuit Python Parsec that gets played later in the week and is uploaded separately so people can look at that. Oh no, C Grover says Twitch just dropped out completely. All right, if it looks like YouTube is streaming okay, maybe I'll rerun that. Let's redo the circuit Python Parsec. See if I make up new facts this time. Who knows what'll happen. All right, here we go. Ready, circuit Python Parsec take two. Yes, circuit Python. For the circuit Python Parsec today, I wanted to introduce vector IO polygons. So this is something that works hand in hand with display IO and circuit Python. It is a 2D lightweight shaped drawing library. Last week we checked out circle and rectangle, these implicit primitive objects. This week we're gonna look at the very versatile polygon object. So as you can see here, I have a Feather RP2040 with a TFT feather wing. This is a three and a half inch one. And I have three of these polygon objects drawn on here using vector IO. They actually use just that one command in the library but I'm giving them different sets of points and different positions and colors so that I get different shapes displayed on the screen. If you look at the code here, what I've got going on. I'm importing vector IO as well as some supporting things like display IO in the feather wing library. And then I am creating three palettes in this case and this is gonna be changing but right now I have three palettes so I can do three different colors. And then I am setting up this list of points for that hexagon. So you can see here I have these pairs of points which are x, y coordinates of different vertices or points on the screen which are gonna be used when we then create the polygon object itself. Here in this command I'm creating something called hex one and that equals vector IO.polygon. And then in the argument for it, I'm telling it which of the pixel shader palettes to use which set of points to use and then an x and y coordinate for the whole object on screen. You can see here, it's kind of interesting when I do the stars, I'm actually only creating one list of points for this and then I'm reusing it in two different places. So I have all of these different vertices that make up a star and then I'm creating star one and star two objects using vector IO polygon, pick a pixel shader for those, pick the same set of star points for them and in this case I'm putting them in two different points on the screen. Then I am appending those to the display and they show up right on screen. If I do something like change the position of the second star's x, it's gonna move closer to the left, you'll see that it's gonna draw that in a new position, same points and it also overlaps that first one because it respects the draw order that we presented. And so that is the basics of using the polygon inside of vector IO in circuit Python. That is your circuit Python Parsec. All right, now I feel like I'm getting into a rhythm. I should just keep repeating this one all day. Let's see how smooth we can get that. All right, so hopefully that was working on Twitch and it looks like it was working well on YouTube. So thank you. Thanks for putting up with that behind the scenes action there. But yeah, I'm really excited about these. Let me flip back over to the screen here for a second. I'm really excited about these polygon objects because you can pretty much draw anything you want. Right now we're doing a simple fill with them. So these are gonna be single color. There is some work that FOMI guy Tim has been doing with some helper objects, including a line which allows us to do sort of an outline. So maybe doing an outline or a stroke on these will be possible, but we also wanna keep them lightweight so that we can move them quickly on screen. In fact, this example right here, you can see I'm not moving them actively, but let me just reopen a different one. Let's see which this one does. I'm gonna resave this as code.py. And this is I think the one I had done. I showed this a little bit last week. This has some of our motion code as well as different polygon objects. So sorry for the glare there. You can see I've got these little triangles. Those are the polygon object. I've got these trapezoids at the bottom. Those are also polygon object. And then I'm using that line helper to do these little strings for that. And then we also have the rectangle and the circle on there. So, oh yeah, Dexter just noticed that I have too many points for that hexagon object. I'm not sure why I did that, but I think I started repeating the points. You actually, based on how this works, you can get away with one fewer point. You don't have to seal the object. You can end and it will. So if you place one, two, three, four points, you can create a four-sided object. You don't have to repeat the first and last point, which is probably that makes sense for some people. I'm used to things in CG where you tend to close, make an object watertight landing the last point where the first point was. But yeah, how many do I have on that hex? I have way too many, I'm sure. All right, so exciting stuff and tune in, I believe, tomorrow for the deep dive with Tim, where he's gonna be, I'm not sure if he's doing vector IO stuff, but he has been covering a bunch of it, which is cool. Yeah, C Grover says, display IO shapes have outlines already, but vector IO shapes are more efficient. So this is the sort of trade-off. We can do this using the shapes and display IO, but they are not as efficient. So we probably wanna be careful about not loading on too many features to vector IO so that we can maintain speed as its main cool feature. All right, so let's, next up, I wanna talk about this Star Trek L-Cars panel. So give me a second. Let me bring up a browser here. Make that a little bit smaller. Move myself off to the side. So if you're not familiar with it, first of all, let's go to Wikipedia and type in L-Cars. This is a, make that a little bigger. This is a nice introduction to what is essentially the user interface of the Star Trek franchise. And I don't know the Star Trek franchise well, which is one of the reasons I wanna bring this up so I don't misspeak which shows and movies this appears in or doesn't appear in. Here it says, in the Star Trek chronology, the term was first used in Star Trek to the next generation. And you can see on the right there, that image, that's a typical piece of user interface from this system. It was created by Michael Okuda, who's graphic designer, and it stands for Library Computer Access Retrieval System. So the interesting thing about the L-Cars as a user interface, I was reading up a little bit on the history and the design, was it allowed the interface of the ship to be very simple and fairly low budget because these were essentially created as films that were applied to Plexiglas masked and then different polarizing filter film was used so that they could backlight it, spin the lights, or spin a filter in front of the lights, rather polarizing filter, which would cause animation to appear, so effects to appear. And this is in the earlier incarnations, later things ended up on different types of CRTs and monitors or in-camera versus post-production animation. So, but at its most basic form, this is a backlit poster. And the reason this came up is that a friend of mine brought to me a L-Cars panel that was, you won't be able to see it well because it's not backlit right here, but let me see if I can always point a light at the back of it, hold on. And this is, I can't say too much about it for various reasons, but this friend of mine acquired this, it had something to do with Star Trek production and he asked me if I could light it for him in a little frame, so you can see there, it's a little backlit piece of, I think it's color print on vinyl in this case. So it's a single piece there that's got the printing for the color and the black and you see the light does not shine through that black, which is pretty cool. Mounted on some smoked Plexiglas there. And he asked me if I could create a small frame for it that would include lighting that could be animated. So easiest thing in the world would be to make a light box and just light it, it'll light up and look great. But in order to make it animate in a similar way to these do on the show, which is often whole sections of the lighting blinking on and off or even in some cases, little stepped sort of lighting and shadow effects moving across bars on the interface. Then we got a few options. One thing I looked into, I don't know if I have any right here are small LED backlight panels. No, I don't think I have any right here. And those look really nice and bright, but they're very difficult to actually arrange exactly where you want them, just the geometry of it. And controlling them would be a whole bunch of PWM stuff, probably. You could also head over to Neopixel Land and figure out a way to do the lighting sort of like my Ninja timer. Whoops, if you remember this thing, this is a set of Neopixel strips with acrylic and I've got some spacing and sort of light pipe kind of stuff happening so that I think it's eight Neopixels per strip just look uniform. We don't get the individual points of light. So this is kind of a nice direction to go to this I think, but given the sheer size of it, the suggestion that Lady Aida made was what about using an LED matrix, an RGB matrix instead of Neopixels? So here's one of these. You remember this is actually the one that was in our Aida box with the matrix portal that I have right there. Let me remove these little strings on here. So matrix portal, if you'll remember, is a sort of all-in-one microcontroller designed for driving these types of panels. And I was just in New York looking at, in Times Square, looking at the just massive, massive building-sized panel matrices of matrices. So they plug in just endless numbers of these things into a driver board and make up those huge signs. So using this, we have, this is a 64 by 32 array and the size is just about right. I haven't looked yet to see if we have anything with a denser pitch that might work better or different sizes, but I think this one's gonna work out really well if you look at the size that we have. In fact, let me, let me switch over to this view here. It'll be easier to show you some of this stuff. So there we go, jump over here and let me just bring up the chat, there we go. Oh, I'm seeing on our chat, by the way, if you go to our Discord chats, people using L-cars interfaces on their iPads and similar types of tablets, which is really cool. So here you can see I've got panel there, sizing is pretty good. I wanna be careful with this, careful not to scratch this. I don't think I brought my little silicone pad I was using. I'll just set down some padding there. So if you look at the sort of debossed, hopefully you can see that. You can see the printing is kind of debossed based on how that was made. You see a little indents there. So looking at that, I can cover just about everything. Missing about a couple millimeters on one side. So it's possible that with this being separated with a little distance, so we don't see all those individual LEDs and with some light pipes made as a cutout, we'll be able to light that all from this. And then my idea for animation is to create BMP sprite sheets because it's very easy to animate sprite sheets, pretty small low resolutions, 64 by 32, have a series of those. And then I can have in software it doesn't blink. It's really effective. It's not like a slide show where it's having to load up new BMPs. It loads one BMP up if we want, and then we'll move between different animation frames to blink stuff. So what I did, I'm doing this cooking show style a little bit for you. What I did was I took a photo, I don't have a flatbed scanner anymore, but I may see if I can scan it on someone else's or borrow one. But I took a long lens photo so it's pretty flat with a ruler in there so I could get this geometry pretty well traced. It's not a hundred percent accurate, but it's pretty well traced inside of Rhino where I designed a little light pipe cutout that you can see I've created just a prototype one using some MDF material. My material was a little short, so I'm missing one side there, but it's just about reaches. So if we flip this over, you can see, this'll line up pretty well. If you can see, yeah, I don't think you can see that side at all with the way this is set up. Let's see if, oh, you're not gonna be able to see that. Okay. But trust me on this, it lines up pretty well. I'll work to get a better fit. And then what I have going on with the Matrix Portal to light that, let me grab a good power supply. So one thing for this is that you wanna use a three amp power supply with this so that you are giving it enough current. Otherwise you'll see some weird glitching and blinking. I think this three amp USB-C power is gonna be enough for this. Look at that. And let's set this over here. Actually, I'm gonna try it with two panels because I'm working on getting the right distance. The MDF works fine. It may be the final thing or I may do this in some black acrylic but I'm running low on black acrylic so I tested it with this. So let's set that there and then I'm gonna power up the Matrix Portal underneath and I may have to do some alignment. There we go. All right, so let me turn off a light. Lower this one so you can see it a little better. Nope, exposure control is not set on that. I don't know what control it's on. Well, you know what, I'll put this over in the, we'll bring this over to the other display where you'll be able to see that better. It is, let me drop one layer of this. It is not exactly a fit yet. Just the BMP I made doesn't fit my animation quite as well as I'd like. Let's get, there we go. So you can see this is doing some basic blinky stuff with it. Like I say, it's not as bright as I like but this is that full white on these. You can see they are pretty bright. If I put this directly on here you can see the problem with full illumination from it as we see all those individual LEDs. Usually diffusion material doesn't really cut it and it's spacing that you need to get even lighting like this. And even at that distance I'm seeing a little bit of dots in it. So let me bring this over. I just wanna show you this under better lighting circumstances, because it does look a little better in real life than what I'm seeing on the camera. Let's go over here, let me go to this down shooter and I'll plug this in. Oh, we're gonna get it. The camera is adding a bunch of flicker, which is too bad. At least get the exposure. There we go. So that's a little, sorry about the glare but that's a little more like what I'm seeing here in the real world for that. So you can see the color is built into the panels. It's possible that you could also try to match the color in the LED animation itself or the BMPs but you can see here, this actually looks pretty nice over in this section and my alignment isn't so hot in some areas. So if I slide that over there you'll see this little animation. Let me turn off this, this lights the limits. That's a little better. So let's put a second and put the second spacer on here and the spacer isn't the same as the first one so it'll mask some things, unfortunately. Let's get that aligned. There we go. So flicker you see on camera is only on camera. It's not in the real world and it looks pretty good. It looks pretty steady. So that's my progress on this so far. You can imagine if you're using just a light box you can just get a ton of light if I use this little, oops, let me switch cameras here. If I use this little lighting panel I'll put this on a white light, full brightness. You can get what we really want, right? It's just super, super tons and tons of light there. You have the right size panel. So not sure yet if I'll be able to get away with the matrix. I may try LED strips. Some neopixel strips. May try again with the little individual panels. So we'll see but this is kind of cool. Also, this is a smoked acrylic so it's cutting down the light a good bit. What I'd like to do is show, so this one is a production one. It's made a particular way and it was gonna be just saturated with light from behind using a light box I think. However, if you wanna make this sort of thing yourself there's a lot of places, a lot of good resources online like the Replica Prop Forum will point you at where you can do printouts on archival paper, spray-mounted inside a clear acrylic so you get more light coming through and then figure out your backlighting technique that you're gonna use. What I wanted to do also is show, oh yeah, that looks pretty cool right there, like these numbers, this part's really nice. Let me see my little blocker there. I wanted to see, actually you know what I'm gonna do is I'll put a, when I do the guide for this I'll put up a link to the really clever polarizer wheel. It's essentially a motorized disc that's spinning of just sort of polarizing film that changes the angle of the light hitting different sections of this that have then film put on in different directions. Yeah, Todd in our chat says, wow they had really bright lights behind those Elkars panels. That's what someone was saying on one blog post showing how they worked. They just had huge amounts of big fluorescent bulbs basically behind these things. It must have been really hot in there lighting up all of those panels. There we go. Let's see, oh yeah, there's Ryan Kunk in our chat. Hey Ryan, Jim Hendrickson, hello. Nice to see you all. Yeah, Seagrover Hired Density Matrix Panel. It's gotta help, right? If I could double the amount of light in there that would be fantastic. Dexter says maybe this is one of those episodes where the systems are malfunctioning. Yeah, it has that look. Yeah, actually let's back away. So one of the nice things too about these is that they were often not so close to camera. Let me straighten this. You can see there I have a mismatch right now between my laser cut blocker and the LEDs. That's a little better there. Let me focus that. There we go, that's getting better. So you can see I probably want the panel to be larger anywhere where I'm, I think I was being optimistic thinking I'd get away with the light not really being directly under it anywhere where it's a little bit off, it gets pretty fuzzy. So we want like full lighting to hit the blockers anywhere that I have black gaps in them that aren't intentional is gonna soften that, soften that lighting up I think. Cob LEDs, Andy Callaway says, yeah. That could be a good thing too. Wagon loads over in YouTube says I've seen a YouTube video of someone made an Arduino based Star Trek sick base screen with the sound effects, that's excellent. Yeah, clearly you can do a lot with just modern displays. I'm sure a good iPad or a similar, an app on a similar type of device would look amazing. But if we can get this working, it's got a totally different look to it than a screen. The resolution is whatever you can print at and the sort of type of colors, type of look is very different. You know, one thing I want to do is show you how I'm creating that animation for this and also just wanna throw a full blast, full white at it from this panel just to see. Now, it will glitch out when I try to do that over my computer USB even though it's a powered hub that I'm going through. I don't think it's gonna provide the current that this thing wants, so we'll program it and then we'll need to plug into that Pi supply, that three amp Pi supply. So let's go for a second. I need to create a share. I'm gonna use a sprite, which is the little pixel animation software I like and it works well for this. Let's do a screen capture, new screen capture. Bear with me one second. Well, it sucked into that black hole appropriately. Okay, that over there and we'll put me in the corner. Hello. So you can see here I took essentially the 64 by 32 pixel. This is the design of the graphics and the cutouts that I made in Rhino sort of squished down to 64 by 32. And what I'm doing is creating frames of animation that are just blocking parts of it out. Oops. And then these don't really have an implicit timing to them the way I'm exporting them. So you could tell the frames to hold for a certain time and I'm previewing them at 300 milliseconds per frame. You can set that to anything you want, but in the end we're just gonna be exporting one BMP that has in this case seven copies stacked on top of another in a vertical sense. So that's the type of sprite sheet, excuse me that we're making. And then we can tell in circuit Python code, we can tell the matrix portal how long to hang on each tile of this sprite sheet basically. So if we wanna just make this pure white for a second, let's just do that. And I'm sure there's other ways, but what I'll do is just make a 64 by 32 white. I'm gonna export this as just L cars, white BMP and say, okay, export, and now you won't see this part, but I'm just gonna go into my finder on the Mac here and copy and paste that onto the circuit Python drive. Let's find it first. Use your set and done. Make a shortcut for myself, there we go. L cars, BMPs, L cars, white, copy, circuit Python drive, I'm just gonna paste this into here and I will move this one out of there. L cars, anim sheet five was the limit was on there. Okay, so now we just have this L cars, white BMP on there and let's go look in code there one second. Okay, so let's see, I'm gonna actually open up the REPL here and see if it's yelling anything at me. It wants me to restart it. You know what? It probably is really unhappy trying to drive every pixel at full bright white. Hey, there it goes. And now it's, yeah, I'm killing my USB there. Oh, you didn't see that, okay, fade it out. Let me use that three amp capable supply and we'll see how that goes. That's a found shooter. It's funny that it tried. Not gonna do it even on this. Yeah, that's not, even that's not enough. All right, it tries and restarts itself. Funny, so actually, you know what might be interesting is we have, I don't know if on the Matrix portal we have a way to use a different external power supply but we do with the feather wing. So there's a Matrix driving feather wing. Do I have one around here? I don't think I do. That allows us to hook up an external power supply so we could get like a nice 10 amp 5 volt, I think is what we can use on that. I'll have to double check that. But I think this is just not gonna be happy about driving pure white. I am kind of curious if we make this, let's say pure red. Let me update, I'm gonna plug that for a second. Let's update this, or let's do blue, how about? So this is a third of the current, essentially. So with these panels, RGB, red, green, blue, there's three diodes per LED and you draw one third of the current if you only drive a single color. I have to remember in a sprite how to, there we go, let's go to RGB mode and I'll go full blue. I did full red, full blue, there we go. Let's re-export that. Now car is blue. There's also a chance that my board is resetting itself because it got unhappy with the power dip and wants me to like reinstall circuit Python. That can happen sometimes as well. Okay, so let's, I'll see if I can manage to keep the board alive long enough to, okay, I'm gonna have to play with the reset button as I plug this in. What if I, yeah, let me see if I undo the power. That should help. Let me see this here. Move that out of the way. So I've unplugged power to it and I'm just gonna remove the power supply line, the five volt out from the panel there. This should allow me to plug it in without causing the power dip. And now we'll put, yeah, it's staying on. That's good. So let me go over to that new L cars blue, copy, paste. Okay, so now I can re-plug that power. I guess I could use external power with this. I just have to tie it to the ground on here but drive the panel from a brick. That should work, actually, yeah. Okay, so here you can see it's much happier to display the pure blue. Obviously that's not gonna be as bright but I'm curious how that looks with, yeah, you can see it's not anywhere near as bright but it's quite even. This is the Tron version of it. Yeah, again, sorry about the flickering that we get over the camera. It's not there in real life. All right, so that is, yeah, so I think that may be the way. I think that'll be my next attempt is just to simply give it like a 5 volt, 10 amp power supply should be plenty, famous last words, and tie that to ground on the matrix portal but give it this external power supply and see how that works. I'm not sure if we can power the, we might be able to power the board from that as well, right? That would be nice. I don't want to have multiple power supplies so I think we should, in a lot of cases you want to keep those power supplies separate with things like robotics. You don't want the sort of motor power to cause brownouts on the board but I think that could work in this case. Let's see. Wagonload says, can you drive your panel at full brightness using a PWM to limit power drain? I do not know. That's a good question. This is, I'm trying to remember, the matrix portal is ESP32 and I can't remember if that's a coprocessor. I think that's a coprocessor for doing wifi stuff and I think it has the M4 for processing so you could potentially tie this into Internet of Things things, make an interface on your phone for it. There's things you could do once you get the sort of basic control of it working. I think that's going to do it. So thanks everyone for stopping by. Let me know if you have other thoughts about this. I'm going to try a few different ways with this but I think this one could be pretty promising and especially if you find a tighter density display, make a smaller one. So we have a lot of possibilities for backlighting stuff using this matrix I think. All right. For Adafruit Industries, that's going to do it for John Park's workshop today. It's me John Park and I will see you next time. Thanks everyone for stopping by. Boop.