1 00:00:00,560 --> 00:00:03,800 Welcome to the CircuitPython Show. I'm your host, Paul Cutler. 2 00:00:04,500 --> 00:00:08,860 This episode I'm joined by Tim Cocks, who is known in the Adafruit community as Foamy Guy. 3 00:00:09,640 --> 00:00:15,460 Tim is sponsored by Adafruit to work on CircuitPython, and you can catch Tim's live streams on Saturday mornings at 11am Eastern. 4 00:00:16,540 --> 00:00:17,600 Tim, welcome to the show! 5 00:00:18,440 --> 00:00:19,460 Hey Paul, nice to be here. 6 00:00:20,080 --> 00:00:22,320 How did you first get started with computers and electronics? 7 00:00:23,000 --> 00:00:23,960 Yeah, great question. 8 00:00:24,120 --> 00:00:26,940 So I had a family computer when I was young. 9 00:00:27,020 --> 00:00:30,140 That was really my first start to computers generally. 10 00:00:30,260 --> 00:00:34,560 I don't remember exactly what age I was, but the things that stand out to me in my memory 11 00:00:35,360 --> 00:00:40,160 were getting involved in programming, which started for me in middle school. 12 00:00:40,440 --> 00:00:46,360 I had a tech class where we would get in groups and then go around and there were different 13 00:00:46,460 --> 00:00:49,680 stations and you would do a couple, maybe one or two weeks at each station. 14 00:00:50,040 --> 00:00:54,620 One of them, I think it was like programming one of the robotic arms, but it also included 15 00:00:54,680 --> 00:00:57,760 a little bit of learning basic programming. 16 00:00:58,420 --> 00:01:00,140 I got super excited about that. 17 00:01:00,460 --> 00:01:05,120 Then sometime shortly after that, I ended up over at my aunt and uncle's house. 18 00:01:05,320 --> 00:01:08,120 They're both software developers by trade. 19 00:01:08,200 --> 00:01:12,740 They worked on airline industry stuff for as far back as I can remember. 20 00:01:13,560 --> 00:01:19,020 They gave me a floppy disk, which had MS-DOS and QBasic on it. 21 00:01:19,360 --> 00:01:24,540 I was able to take that home and play with QBasic at home, which was really my launch 22 00:01:24,640 --> 00:01:27,260 point into programming more generally. 23 00:01:28,300 --> 00:01:33,340 I made all sorts of stuff with QBasic, mostly just visual paint pretty colors and do fun 24 00:01:33,480 --> 00:01:38,320 stuff like that, but a couple of basic games and a couple of basic text input and output 25 00:01:38,540 --> 00:01:38,900 type stuff. 26 00:01:40,140 --> 00:01:46,460 That's what I really credit as my first leaping into programming and getting the bugs, so 27 00:01:46,480 --> 00:01:46,880 to speak. 28 00:01:47,380 --> 00:01:49,800 - Sure, how did you discover CircuitPython? 29 00:01:50,860 --> 00:01:53,080 - So for CircuitPython, for me, 30 00:01:53,180 --> 00:01:55,500 it came out of a project at work. 31 00:01:55,900 --> 00:01:58,500 My work was around digital signage, 32 00:01:58,660 --> 00:02:00,820 and at one point we wanted to make 33 00:02:01,020 --> 00:02:02,900 a sort of specialty display setup 34 00:02:03,200 --> 00:02:07,120 that would play different videos on a screen 35 00:02:07,360 --> 00:02:09,340 whenever various different things happened. 36 00:02:09,420 --> 00:02:12,360 In our case, it was like smartphones that were on display, 37 00:02:12,540 --> 00:02:15,060 and you would kind of like pick it up off of the shelf 38 00:02:15,140 --> 00:02:16,480 with its little retractor thing, 39 00:02:16,880 --> 00:02:18,320 and we wanted that to trigger a video. 40 00:02:19,120 --> 00:02:20,540 And so we had this whole software system 41 00:02:20,640 --> 00:02:22,140 that handled the videos and everything, 42 00:02:22,300 --> 00:02:23,720 but we needed a way to get the trigger 43 00:02:24,000 --> 00:02:27,960 from the actual pulling of the little phone holder deal 44 00:02:28,460 --> 00:02:30,340 into the computer that was playing the videos. 45 00:02:30,940 --> 00:02:33,320 And one of the people that I worked with 46 00:02:33,460 --> 00:02:34,700 was aware of CircuitPython, 47 00:02:34,940 --> 00:02:38,480 and this was around the era of the Trinket M0, 48 00:02:38,840 --> 00:02:42,200 which was a very cheap device that supported CircuitPython, 49 00:02:42,300 --> 00:02:44,240 and we ended up using that little device. 50 00:02:44,720 --> 00:02:46,800 The partner that I worked with who knew of it 51 00:02:47,120 --> 00:02:49,000 designed a little PCB for us to just stick 52 00:02:49,160 --> 00:02:50,240 those trinkets on top of. 53 00:02:50,300 --> 00:02:52,940 It had our four outputs so we could hook it up 54 00:02:53,040 --> 00:02:54,900 to the four different pedestals that 55 00:02:55,300 --> 00:02:56,760 would trigger the different videos. 56 00:02:56,840 --> 00:02:59,780 And then we could send those signals in to our player. 57 00:02:59,900 --> 00:03:02,700 So that was my first introduction to CircuitPython 58 00:03:02,780 --> 00:03:03,480 was using those. 59 00:03:03,620 --> 00:03:05,940 And we built a handful of those. 60 00:03:06,020 --> 00:03:09,820 I think we made around 100 or so of those when we first did it. 61 00:03:10,200 --> 00:03:12,440 And it ended up being that the order was large enough. 62 00:03:12,520 --> 00:03:14,400 like Adafruit, as I'm sure you know, 63 00:03:14,840 --> 00:03:16,000 when you make an order that's large enough, 64 00:03:16,080 --> 00:03:18,100 they tend to have some kind of freebies that they throw in. 65 00:03:18,620 --> 00:03:19,780 The freebie that we ended up getting 66 00:03:19,880 --> 00:03:21,240 was a Circuit Playground Express, 67 00:03:21,660 --> 00:03:24,040 which we didn't have otherwise a use for. 68 00:03:24,220 --> 00:03:25,440 And I ended up taking that home 69 00:03:25,640 --> 00:03:28,320 and kind of really diving in and discovering a lot more 70 00:03:28,400 --> 00:03:30,780 of what CircuitPython could do beyond just the simple, 71 00:03:31,420 --> 00:03:33,140 you know, read the switch and send the keyboard, 72 00:03:33,700 --> 00:03:35,520 which is what we were doing for that project. 73 00:03:35,640 --> 00:03:37,600 But yeah, I kind of fell in love with it, 74 00:03:37,860 --> 00:03:40,660 with the CPX 'cause it's so visual 75 00:03:40,720 --> 00:03:42,500 and fun to play with the LEDs 76 00:03:42,500 --> 00:03:44,600 the speaker and all kinds of stuff that it can do. 77 00:03:44,800 --> 00:03:48,840 So that was my first entry really into CircuitPython. 78 00:03:49,320 --> 00:03:50,860 >> Yeah, the Circuit Playground Express was 79 00:03:51,000 --> 00:03:53,140 my first board that I ever bought from Adafruit as well. 80 00:03:53,280 --> 00:03:55,280 So I share that love for that board with you. 81 00:03:55,980 --> 00:03:56,260 >> Nice. 82 00:03:57,040 --> 00:03:58,420 >> You've created a number of games, 83 00:03:58,560 --> 00:03:59,700 including some live during 84 00:03:59,920 --> 00:04:01,920 CircuitPython day and on your live streams. 85 00:04:02,280 --> 00:04:04,440 Where do you get inspiration for the games you've created? 86 00:04:05,300 --> 00:04:07,460 >> Yeah, I think my inspiration 87 00:04:07,680 --> 00:04:10,980 largely comes from just games that I have played in my life. 88 00:04:11,080 --> 00:04:12,480 I've been an avid gamer my whole 89 00:04:12,480 --> 00:04:18,140 life. I got a Game Boy when I was really young. I had an NES, Super Nintendo, Nintendo 64. 90 00:04:18,799 --> 00:04:22,600 That's kind of around the era where I stopped. So I didn't really continue on to the PlayStation 91 00:04:22,880 --> 00:04:27,120 3 and the Xboxes and all the modern stuff. But I kind of transitioned over to PC games 92 00:04:27,180 --> 00:04:29,900 and games are still a relatively big part of my life. 93 00:04:30,460 --> 00:04:34,380 So my inspiration comes a lot from the games that I've played. In particular, the games 94 00:04:34,420 --> 00:04:39,740 I make for CircuitPython, a lot of them are inspired by the old handheld stuff, the Game 95 00:04:39,740 --> 00:04:42,080 boys and the other little handheld games. 96 00:04:42,700 --> 00:04:47,280 Like back in my childhood, there were just loads and loads of little handheld games that 97 00:04:47,360 --> 00:04:48,120 you could buy and play. 98 00:04:48,180 --> 00:04:49,500 And it was a purpose-built one. 99 00:04:49,560 --> 00:04:53,340 I remember I had, I think it was basketball or something like that, but I played the heck 100 00:04:53,360 --> 00:04:53,980 out of that thing. 101 00:04:54,620 --> 00:04:55,580 And it was just very basic. 102 00:04:55,780 --> 00:04:57,100 It only played the one game. 103 00:04:57,500 --> 00:05:03,360 And I think those things are a big part of my inspiration for CircuitPython because they 104 00:05:03,420 --> 00:05:08,180 remind me the form factor of them, the way the graphics work and the types of things 105 00:05:08,180 --> 00:05:12,440 that they can do and kind of how powerful they are in terms of games and graphics and 106 00:05:12,520 --> 00:05:15,000 stuff like that remind me a lot of CircuitPython. 107 00:05:15,100 --> 00:05:17,300 And so lots of my ideas come from there. 108 00:05:18,020 --> 00:05:21,840 But there are cases where outside influences come in. 109 00:05:22,000 --> 00:05:27,960 So working for Adafruit, PT is always keeping up with the latest stuff that's going viral 110 00:05:28,200 --> 00:05:30,180 on socials and everywhere else. 111 00:05:30,280 --> 00:05:34,340 And so he's always seeing the latest cool projects that are popping up and he'll send 112 00:05:34,340 --> 00:05:39,160 And ideas might wave for like, "Hey, this thing is kind of getting popular on Blue Sky 113 00:05:39,400 --> 00:05:42,940 or Mastodon or whatever, and it's this little simple version of this game. 114 00:05:43,080 --> 00:05:45,120 Maybe we can make a CircuitPython version of that." 115 00:05:45,120 --> 00:05:49,720 And so that's where some of it comes from as well, is just ideas from out in the world 116 00:05:49,880 --> 00:05:54,140 that's like, "Hey, can we take this idea and get it into CircuitPython?" 117 00:05:54,140 --> 00:05:57,380 Which I find is a lot of fun for me as well to do that kind of work. 118 00:05:57,480 --> 00:05:58,640 So it works out nicely. 119 00:05:59,900 --> 00:06:03,500 What kind of planning do you do when developing a game for CircuitPython? 120 00:06:04,040 --> 00:06:10,100 Yeah, planning, I will say generally for my software development, I am not huge on planning. 121 00:06:10,300 --> 00:06:15,440 I didn't go through formal training and learn all of the different methodologies for planning 122 00:06:15,520 --> 00:06:16,260 out software and stuff. 123 00:06:16,300 --> 00:06:20,800 And I've always worked on very small teams, worked by myself for a very long time, only 124 00:06:20,860 --> 00:06:23,260 more recently even got a team at all. 125 00:06:23,320 --> 00:06:24,380 And it's always been very small. 126 00:06:24,560 --> 00:06:27,420 So I think that I am not the best. 127 00:06:27,420 --> 00:06:29,980 I will freely admit that I don't think that I am the best at planning, 128 00:06:30,480 --> 00:06:33,940 but in terms of the games that I make and the planning that does go into them, 129 00:06:34,380 --> 00:06:38,720 there's kind of a couple of main ways that it sort of reveals itself. 130 00:06:38,860 --> 00:06:41,280 One of them is just inside my head, thinking about it, you know, 131 00:06:41,360 --> 00:06:42,860 in the background as I go throughout my day, 132 00:06:42,920 --> 00:06:45,460 I've got this idea for I want to do this or I want to do that. 133 00:06:46,100 --> 00:06:49,300 And those just get kind of filed away in my brain. 134 00:06:50,220 --> 00:06:52,040 Sometimes I will scratch a few of them down 135 00:06:52,140 --> 00:06:55,840 just if I don't think I'm going to remember it or if I really want to remember 136 00:06:56,100 --> 00:06:59,180 how a couple of ideas fit together in a specific way. 137 00:06:59,640 --> 00:07:02,080 I'll usually just throw those down into a text file 138 00:07:02,220 --> 00:07:04,480 or something like that that's alongside the code 139 00:07:04,540 --> 00:07:05,780 or assets or anything else 140 00:07:05,860 --> 00:07:07,460 that I have started already for the game. 141 00:07:08,700 --> 00:07:11,880 And then the other way that I plan is with software. 142 00:07:12,100 --> 00:07:15,740 So if I have an idea for how I wanna show 143 00:07:16,200 --> 00:07:17,260 different types of graphics 144 00:07:17,340 --> 00:07:19,060 or how I want different menus to work 145 00:07:19,100 --> 00:07:21,120 or how I wanna be able to jump between the game 146 00:07:21,160 --> 00:07:22,100 and the different menus, 147 00:07:22,620 --> 00:07:24,400 all of that stuff is kind of hyper-specific, 148 00:07:24,580 --> 00:07:26,220 but it tends to be the kind of thing 149 00:07:26,560 --> 00:07:29,240 that I kick around most when I do kind of do my planning. 150 00:07:29,340 --> 00:07:31,260 And so that sort of stuff for me 151 00:07:31,340 --> 00:07:32,400 is a lot of proof of concept. 152 00:07:32,640 --> 00:07:35,540 So I will write a script that does one little tiny piece, 153 00:07:35,980 --> 00:07:37,420 you know, that renders this sprite 154 00:07:37,540 --> 00:07:39,120 or brings together a couple of sprites 155 00:07:39,280 --> 00:07:41,260 and does this one little proof of concept. 156 00:07:41,860 --> 00:07:44,400 And those scripts, even though they all kind of 157 00:07:44,460 --> 00:07:46,080 just do their one thing and that's it, 158 00:07:46,140 --> 00:07:48,960 those kind of serve as a good chunk of my planning 159 00:07:49,020 --> 00:07:50,160 'cause I can go back through them 160 00:07:50,220 --> 00:07:51,840 and eventually copy paste out of them, 161 00:07:52,260 --> 00:07:54,560 but also look back through the history 162 00:07:54,560 --> 00:07:56,180 here's where I tried this and this and this, 163 00:07:56,240 --> 00:07:57,520 and it didn't work for that reason. 164 00:07:57,680 --> 00:08:00,340 And maybe I want to go back to it and tweak it somehow. 165 00:08:00,620 --> 00:08:02,700 Maybe I have a new way I can take it, 166 00:08:02,720 --> 00:08:04,680 and maybe it will work a bit better or what have you. 167 00:08:04,780 --> 00:08:08,620 So yeah, a lot of my thinking is in code, 168 00:08:08,680 --> 00:08:09,860 in scripts and stuff like that, 169 00:08:09,920 --> 00:08:12,600 just because that's kind of where I'm basically 170 00:08:12,920 --> 00:08:15,040 most natural, I guess, with my thoughts. 171 00:08:16,000 --> 00:08:18,300 - What challenges do you run into designing a game 172 00:08:18,380 --> 00:08:19,260 for a microcontroller? 173 00:08:19,440 --> 00:08:21,240 I have to believe that there's a number of constraints 174 00:08:21,420 --> 00:08:23,500 because they're just such small microcomputers. 175 00:08:24,240 --> 00:08:26,780 - Definitely, yeah, so the constraints, 176 00:08:27,540 --> 00:08:30,180 particularly the amount of storage space you have, 177 00:08:30,840 --> 00:08:32,820 especially if you want fancy graphics and stuff like that, 178 00:08:32,880 --> 00:08:34,180 you tend to eat it up fairly quickly. 179 00:08:34,979 --> 00:08:35,760 Although we're getting to the point 180 00:08:35,840 --> 00:08:37,000 where we've got a couple of megs 181 00:08:37,080 --> 00:08:38,140 on some of the devices now, 182 00:08:38,300 --> 00:08:40,099 which is like small by computer standards, 183 00:08:40,419 --> 00:08:42,400 but pretty big by microcontroller standards. 184 00:08:42,560 --> 00:08:43,960 And so it's cool to see some of those 185 00:08:44,039 --> 00:08:46,520 where we don't worry as much about that kind of stuff. 186 00:08:46,600 --> 00:08:49,600 So the amount of space for your actual assets 187 00:08:49,660 --> 00:08:51,000 and your code and stuff like that, 188 00:08:51,320 --> 00:08:54,880 the amount of RAM that you can actually store graphics 189 00:08:55,060 --> 00:08:57,180 and code and things in during runtime, 190 00:08:57,960 --> 00:08:59,620 and then just the CPU itself. 191 00:08:59,900 --> 00:09:02,420 Although, all three of those as the years go on, 192 00:09:02,460 --> 00:09:05,460 I've kind of been involved in CircuitPython 193 00:09:05,900 --> 00:09:07,520 moderately to heavily for probably 194 00:09:08,220 --> 00:09:09,460 getting close to five years now. 195 00:09:09,560 --> 00:09:10,740 So it's actually been a little while. 196 00:09:10,960 --> 00:09:13,420 And steadily, you can kind of see year after year, 197 00:09:13,580 --> 00:09:14,900 the new microcontrollers coming, 198 00:09:15,540 --> 00:09:17,600 bigger RAM, faster, more storage. 199 00:09:17,740 --> 00:09:20,439 And so it's kind of like going through that same cycle 200 00:09:20,440 --> 00:09:21,320 that computers did. 201 00:09:21,780 --> 00:09:23,500 I will say, though, the constraints 202 00:09:23,680 --> 00:09:25,800 that CircuitPython and microcontrollers in general 203 00:09:25,960 --> 00:09:29,340 bring are one of the things I find super fascinating, super 204 00:09:29,560 --> 00:09:31,320 interesting, and just like a fun challenge. 205 00:09:31,380 --> 00:09:32,560 It's a fun puzzle for me. 206 00:09:33,000 --> 00:09:35,020 Not necessarily going super duper deep. 207 00:09:35,080 --> 00:09:37,940 I have no aspirations for writing assembly or anything 208 00:09:38,040 --> 00:09:38,420 full time. 209 00:09:39,240 --> 00:09:40,860 But working within those constraints 210 00:09:40,980 --> 00:09:46,000 is kind of fun because the entire history of my software 211 00:09:46,100 --> 00:09:49,839 development career has all been in environments 212 00:09:49,840 --> 00:09:51,940 where resources are essentially infinite. 213 00:09:52,100 --> 00:09:53,740 I did a lot of work on mobile devices, 214 00:09:54,000 --> 00:09:56,500 which were a little bit constrained compared to PCs. 215 00:09:57,160 --> 00:09:58,380 When they first came out, especially, 216 00:09:59,100 --> 00:10:01,380 I worked on Android stuff when it first came out, 217 00:10:01,420 --> 00:10:03,560 and at that time, the phones weren't quite as powerful, 218 00:10:04,300 --> 00:10:06,440 but still effectively infinite 219 00:10:06,540 --> 00:10:07,860 for anything I was doing with them. 220 00:10:07,880 --> 00:10:09,160 I wasn't doing anything hardcore. 221 00:10:10,020 --> 00:10:12,980 I branched into Python and web development and stuff, 222 00:10:13,140 --> 00:10:14,360 and it's the same deal there, 223 00:10:14,480 --> 00:10:16,380 where it's like anything I wanna do 224 00:10:16,800 --> 00:10:18,940 just uses a tiny fraction of the computer, 225 00:10:19,080 --> 00:10:21,360 a tiny fraction of the RAM, it doesn't really matter. 226 00:10:21,500 --> 00:10:23,360 I can just write my program and not think about it. 227 00:10:24,100 --> 00:10:26,480 Whereas coming into the microcontroller world, 228 00:10:27,040 --> 00:10:28,940 you can take that approach for a little while, 229 00:10:29,060 --> 00:10:30,720 just write your program and don't think about it. 230 00:10:31,100 --> 00:10:32,180 But in particular for games, 231 00:10:32,360 --> 00:10:34,460 or if you've got lots of assets or something like that, 232 00:10:34,560 --> 00:10:37,340 you will end up running into the RAM limit, 233 00:10:37,780 --> 00:10:40,320 and then you can kind of start coming up 234 00:10:40,380 --> 00:10:41,520 with different ways of like, 235 00:10:41,540 --> 00:10:43,580 how can I combine some of my sprites together? 236 00:10:43,960 --> 00:10:47,480 Or how can I maybe offload some of the sprites 237 00:10:47,480 --> 00:10:51,040 to an SD card and only load them whenever I actually need them, 238 00:10:51,140 --> 00:10:53,220 like load them and display them, and then get rid of them 239 00:10:53,260 --> 00:10:55,360 and throw them away when they're not in use, stuff like that. 240 00:10:55,480 --> 00:10:58,840 So those kind of constraints are actually pretty interesting to me 241 00:10:59,600 --> 00:11:00,940 as just problems to solve. 242 00:11:01,000 --> 00:11:03,640 And that's one of the things that I think has hooked me with CircuitPython. 243 00:11:04,280 --> 00:11:07,080 I'll give you a quick example from one of the games 244 00:11:07,180 --> 00:11:08,600 that I have been working on recently. 245 00:11:09,280 --> 00:11:11,780 One of the ways that I kind of got worked around these constraints, 246 00:11:11,940 --> 00:11:15,440 so to speak, was it was with RAM and it was with the amount of sprites 247 00:11:15,440 --> 00:11:16,600 that I wanted to be able to use. 248 00:11:16,760 --> 00:11:18,620 The newest game that I'm working on 249 00:11:19,020 --> 00:11:21,220 is kind of a jewelry crafting game. 250 00:11:21,420 --> 00:11:24,260 And as part of this game, we've got various different items 251 00:11:24,480 --> 00:11:26,540 which you can then craft together into final, 252 00:11:26,760 --> 00:11:28,740 you know, little bits of jewelry that add stats 253 00:11:28,800 --> 00:11:30,080 and do all kinds of other different stuff. 254 00:11:30,660 --> 00:11:32,480 And so there's a couple of different types of metal 255 00:11:32,640 --> 00:11:34,840 and there's a couple of different types of gemstones. 256 00:11:35,120 --> 00:11:37,100 And then the goal is to be able to combine them 257 00:11:37,180 --> 00:11:39,420 to make a couple of different types of finished jewelry. 258 00:11:40,180 --> 00:11:42,400 And quickly, the number of permutations 259 00:11:42,460 --> 00:11:45,280 of the final items, like, just multiplies out. 260 00:11:45,320 --> 00:11:46,900 and so it explodes on you really fast. 261 00:11:47,500 --> 00:11:49,340 And I started going down the road of like, 262 00:11:49,420 --> 00:11:51,760 well, you know, I'm on a ESP32 S3, 263 00:11:51,900 --> 00:11:54,040 I've got a fair bit of RAM to work with, 264 00:11:54,120 --> 00:11:55,880 so maybe I'll just throw a giant sprite sheet 265 00:11:55,920 --> 00:11:56,460 and it'll be okay. 266 00:11:57,080 --> 00:11:58,160 I started measuring that out 267 00:11:58,240 --> 00:11:59,440 with one of those proof of concepts 268 00:11:59,560 --> 00:12:00,760 like I was talking about before, 269 00:12:00,880 --> 00:12:03,840 and I was realizing even with just a small subset 270 00:12:03,900 --> 00:12:05,300 of what I wanted to end up with, 271 00:12:05,860 --> 00:12:09,480 finally, I was still already taking a noticeable chunk 272 00:12:09,620 --> 00:12:10,020 out of the RAM. 273 00:12:10,100 --> 00:12:12,840 And so the way that I solved it in this case 274 00:12:12,840 --> 00:12:16,180 was figured out how to remove the color, 275 00:12:16,400 --> 00:12:18,560 remove the different gemstones from the equation 276 00:12:18,740 --> 00:12:23,040 by exporting only one of my sprites in a specific color 277 00:12:23,160 --> 00:12:26,180 and then also exporting just the palette information, 278 00:12:26,360 --> 00:12:28,580 just the actual list of colors that I need 279 00:12:29,040 --> 00:12:31,920 to represent visually the other gemstones. 280 00:12:32,320 --> 00:12:34,800 And then at runtime inside the CircuitPython code, 281 00:12:34,840 --> 00:12:37,220 I can load the one sprite, I can get its palette, 282 00:12:37,260 --> 00:12:40,420 and then I can manipulate just that one little sequence 283 00:12:40,420 --> 00:12:44,120 of colors and kind of substitute out reds for blues or greens 284 00:12:44,220 --> 00:12:44,800 or what have you. 285 00:12:45,480 --> 00:12:48,120 And that allows me to really drastically reduce 286 00:12:48,240 --> 00:12:50,740 the number of sprites that I'll need in the end. 287 00:12:50,800 --> 00:12:52,320 And I kind of wrote some helper code 288 00:12:52,440 --> 00:12:53,920 that makes it so I don't have to deal 289 00:12:54,000 --> 00:12:55,960 with the nitty gritty details of all of that. 290 00:12:56,000 --> 00:12:59,100 I can kind of just tell it, like, display the red gold one 291 00:12:59,180 --> 00:13:01,440 and it will do it without too much hassle. 292 00:13:01,580 --> 00:13:05,240 So that's one example of one of those types of challenges 293 00:13:05,420 --> 00:13:07,520 that I solved recently that was a lot of fun for me. 294 00:13:08,340 --> 00:13:10,760 Let's chat about some of your current projects and games. 295 00:13:11,440 --> 00:13:13,800 What are they and were there any challenges in building them? 296 00:13:13,860 --> 00:13:15,600 Let's start with the 1D Chomper. 297 00:13:16,440 --> 00:13:18,360 - Yeah, 1D Chomper is a fun one. 298 00:13:18,480 --> 00:13:22,620 That one was the first of the ones that I kind of built 299 00:13:22,800 --> 00:13:25,800 a, what I kind of lovingly call cardboard arcade 300 00:13:25,940 --> 00:13:27,960 or card-baccade if you want to get fun with it, 301 00:13:28,340 --> 00:13:30,520 where I built it into a little cardboard box 302 00:13:30,760 --> 00:13:32,420 'cause I like that sort of physical, 303 00:13:33,520 --> 00:13:34,860 kind of not quite arcade, 304 00:13:34,980 --> 00:13:36,820 it's not a full stand or anything like that, 305 00:13:36,920 --> 00:13:38,620 but it's just kind of sit on the countertop 306 00:13:38,680 --> 00:13:39,320 and you can play it. 307 00:13:39,320 --> 00:13:40,880 I like that physical nature of it. 308 00:13:41,540 --> 00:13:43,100 And I really liked the idea of stuffing it 309 00:13:43,240 --> 00:13:44,360 into a cardboard box as well, 310 00:13:44,460 --> 00:13:46,040 'cause it's really low barrier to entry. 311 00:13:46,400 --> 00:13:47,900 You know, pretty much everyone this day and age 312 00:13:47,980 --> 00:13:49,460 has got a cardboard box lying around 313 00:13:49,780 --> 00:13:52,540 and you can cut it up and bold it to whatever you need. 314 00:13:52,680 --> 00:13:55,840 So it's a fun medium to build a project into. 315 00:13:56,000 --> 00:13:59,720 But yeah, the 1D chopper was built into that. 316 00:14:00,300 --> 00:14:03,640 It uses the qualia displays, the really, really long one. 317 00:14:03,820 --> 00:14:07,380 and the idea there was just like the old school Pac-Man, 318 00:14:07,520 --> 00:14:08,380 you've got the blue walls, 319 00:14:08,540 --> 00:14:09,980 you've got Pac-Man roaming around, 320 00:14:10,140 --> 00:14:11,240 eating the little pellets 321 00:14:11,320 --> 00:14:12,740 and trying to stay away from the ghosts, 322 00:14:12,920 --> 00:14:15,040 but the twist in the 1D Chomper 323 00:14:15,340 --> 00:14:17,960 is that you have sort of only a single hallway 324 00:14:18,220 --> 00:14:19,920 for Pac-Man to run back and forth in. 325 00:14:19,960 --> 00:14:21,820 It's a very narrow sort of hallway 326 00:14:22,200 --> 00:14:23,400 and you just go back and forth, 327 00:14:23,480 --> 00:14:24,860 you try to eat the big pellet, 328 00:14:25,020 --> 00:14:26,900 I think, did they call them fruits in the original game? 329 00:14:26,940 --> 00:14:28,460 Or maybe there are fruits that spawn? 330 00:14:28,940 --> 00:14:30,000 I don't remember, but yeah, 331 00:14:30,080 --> 00:14:31,580 it's just the sort of back and forth. 332 00:14:32,000 --> 00:14:33,600 There's only one big red button, 333 00:14:33,680 --> 00:14:37,860 you just hit the button to change directions, make Pac-Man go the other way. 334 00:14:38,560 --> 00:14:43,540 That one was fairly straightforward, I will say, in terms of the constraints and stuff. 335 00:14:43,600 --> 00:14:47,660 That qualia, I don't have it in front of me, but I think that qualia driver board was an 336 00:14:47,780 --> 00:14:52,140 S3, so it was fairly beefy in terms of RAM and space and all that. 337 00:14:52,180 --> 00:14:54,360 I didn't really run into many issues with that. 338 00:14:55,100 --> 00:14:58,340 And then I will say on that one, I lucked out a little bit. 339 00:14:58,440 --> 00:15:02,200 That was one of the ones where the idea came through Adafruit. 340 00:15:02,240 --> 00:15:07,100 I don't remember if it was PT or somebody else saw that on social somewhere and was 341 00:15:07,140 --> 00:15:09,540 like, "Hey, could we make a CircuitPython one of this?" 342 00:15:09,540 --> 00:15:11,600 So that's where the idea for that one came through. 343 00:15:12,600 --> 00:15:15,740 It was pretty straightforward to put together, and I kind of lucked out a bit because I 344 00:15:15,900 --> 00:15:18,540 had actually implemented parts of Pac-Man before. 345 00:15:18,760 --> 00:15:24,420 I started making a Pac-Man game maybe two or three years ago at this point for a different 346 00:15:24,520 --> 00:15:26,320 screen, for a different device, for everything. 347 00:15:26,720 --> 00:15:30,120 And I was building out some different parts of it, and I was able to reuse actually a 348 00:15:30,120 --> 00:15:34,880 a lot of it from back then for this more recent project, which was really nice. 349 00:15:34,960 --> 00:15:38,360 I didn't necessarily know at the time that I would have a use in the future 350 00:15:38,480 --> 00:15:41,340 for these like Pac-Man entity classes, but yeah, it came in, 351 00:15:41,780 --> 00:15:43,840 came in real handy for that one. That's pretty cool. 352 00:15:44,720 --> 00:15:48,280 Another cardboard arcade project that you'd built was Blinka Says. 353 00:15:49,540 --> 00:15:51,020 Yeah, Blinka Says was another fun one. 354 00:15:51,080 --> 00:15:55,680 That was my second cardboard one, and it is a take on Simon Says. 355 00:15:55,800 --> 00:15:57,360 So the kind of traditional game. 356 00:15:57,680 --> 00:16:00,060 Well, Simon, I guess, is the traditional game. 357 00:16:00,100 --> 00:16:04,360 And then Simon Says is kind of the kind of idea, I guess, the core idea. 358 00:16:04,480 --> 00:16:09,000 But it has got the four different buttons, red, green, blue, yellow. 359 00:16:09,640 --> 00:16:13,240 And then it's kind of shout and response type thing. 360 00:16:13,360 --> 00:16:16,540 The game will play a certain sequence of colors, and then your job 361 00:16:16,600 --> 00:16:19,560 is to go through and press the same sequence for all of those buttons. 362 00:16:19,740 --> 00:16:24,580 And then as you go along, it adds one additional button for each round. 363 00:16:24,720 --> 00:16:27,660 So it gets harder as you go along because you have to memorize 364 00:16:27,660 --> 00:16:29,900 the sequences and they get longer, 365 00:16:30,040 --> 00:16:30,860 so it's harder to memorize. 366 00:16:31,220 --> 00:16:34,340 I think in the real released one of these, 367 00:16:34,480 --> 00:16:36,100 maybe it speeds up as well and it 368 00:16:36,160 --> 00:16:37,620 plays some music or something like that. 369 00:16:37,760 --> 00:16:41,280 Mine's got just a little screen for the high-score board. 370 00:16:41,560 --> 00:16:42,620 It doesn't have a speaker, 371 00:16:43,000 --> 00:16:44,660 and I don't remember for sure if it speeds up, 372 00:16:44,740 --> 00:16:46,840 but it definitely could for sure if you 373 00:16:46,960 --> 00:16:48,480 tweak the CircuitPython code if it doesn't, 374 00:16:48,840 --> 00:16:51,420 and it does get one longer each time. 375 00:16:52,040 --> 00:16:53,480 That one, I would say 376 00:16:53,960 --> 00:16:56,579 the biggest challenges for me on that one 377 00:16:56,580 --> 00:16:59,360 was the physical side, the wiring to hardware, 378 00:16:59,640 --> 00:17:01,460 which my background is all software, 379 00:17:01,660 --> 00:17:03,280 so realistically the hardware side 380 00:17:03,320 --> 00:17:05,199 is generally the hardest for me. 381 00:17:05,319 --> 00:17:06,420 But on that one in particular, 382 00:17:07,079 --> 00:17:08,980 it took me a little bit to get that one finished 383 00:17:09,120 --> 00:17:11,680 because I started down the road of using 384 00:17:12,339 --> 00:17:14,280 or trying to use, wanting to use 385 00:17:14,380 --> 00:17:16,740 some different connectors for the buttons. 386 00:17:17,120 --> 00:17:19,319 On that one, going inside the cardboard, 387 00:17:19,920 --> 00:17:21,079 with a lot of my projects really, 388 00:17:21,199 --> 00:17:23,300 my goal is typically to keep them 389 00:17:23,439 --> 00:17:24,839 as easy to build as possible. 390 00:17:25,400 --> 00:17:27,680 And another thing I really like is the ability 391 00:17:27,760 --> 00:17:30,160 to take it apart, much to the chagrin sometimes 392 00:17:30,440 --> 00:17:32,300 of the folks who want me to build the guides 393 00:17:32,380 --> 00:17:33,800 and the finished products and stuff. 394 00:17:33,920 --> 00:17:36,140 But I like that idea of like being able 395 00:17:36,220 --> 00:17:37,780 to reuse your components, right? 396 00:17:37,820 --> 00:17:40,920 Not everyone can afford to always just buy the new thing 397 00:17:41,000 --> 00:17:42,260 when they wanna make the new project. 398 00:17:42,340 --> 00:17:45,280 So I really value that when someone builds a project, 399 00:17:45,360 --> 00:17:48,220 they take the time to make it so that it can come back apart 400 00:17:48,320 --> 00:17:49,780 and you can reuse the major components, 401 00:17:50,000 --> 00:17:52,000 especially the ones that are the priciest at least. 402 00:17:52,640 --> 00:17:55,380 So in that one, it's all wired with alligator clips 403 00:17:55,380 --> 00:18:01,240 and initially I wanted to use one of the Grove expander ports, like a feather 404 00:18:01,420 --> 00:18:05,580 Grove wing, which would let me plug in the four different buttons. And I thought 405 00:18:05,680 --> 00:18:09,440 the Grove cables were gonna be nice, but they it turned out to be just a little 406 00:18:09,500 --> 00:18:13,060 bit too thin and a little bit too short for my needs. The size of my box, the 407 00:18:13,100 --> 00:18:17,360 distance the buttons were away from the middle, caused them to be not quite long 408 00:18:17,400 --> 00:18:21,400 enough and then the actual wires themselves were fairly thin. I found as I 409 00:18:21,420 --> 00:18:24,820 was trying to get them clipped up onto the buttons and fiddled around and stuff 410 00:18:24,820 --> 00:18:29,880 I was breaking them or they were getting kind of like spotty on not connecting very well 411 00:18:30,000 --> 00:18:37,280 So I swapped over to some different little alligator jumpers and it worked out quite nicely on the inside of that one 412 00:18:37,380 --> 00:18:42,900 So yeah, the biggest biggest challenge there was on the hardware size the software on that's fairly straightforward 413 00:18:43,120 --> 00:18:49,820 It uses I think uses async IO just to pull the digital button inputs and from there 414 00:18:49,900 --> 00:18:54,800 It's very basic of just keeping track which one got pressed and building up the list so that you know 415 00:18:54,800 --> 00:18:56,940 when the user got it right and when they got it wrong. 416 00:18:57,840 --> 00:18:59,740 Lastly, and I know this one isn't a game, 417 00:19:00,040 --> 00:19:02,320 but tell me about Karel or Karel the Robot. 418 00:19:03,360 --> 00:19:03,900 Yeah, yeah. 419 00:19:04,000 --> 00:19:05,440 This is one of my favorites recently. 420 00:19:05,660 --> 00:19:08,540 Karel, it is it's not a game in the traditional sense in that, 421 00:19:08,840 --> 00:19:11,640 you know, you're not necessarily playing against the game as the player, 422 00:19:11,780 --> 00:19:14,000 but it's it's in the same vein as a game. 423 00:19:14,040 --> 00:19:16,520 It's got graphics that are very game like and stuff like that. 424 00:19:17,140 --> 00:19:20,820 And you could consider it kind of a game that's meant to teach you to program, 425 00:19:21,300 --> 00:19:24,280 essentially teach you the basics of programming and logic. 426 00:19:24,620 --> 00:19:30,220 if statements, for loops, functions, things like this. So the basic building blocks. So 427 00:19:30,680 --> 00:19:37,060 Karel was originally created by a person at Stanford in the 70s for the purpose of teaching 428 00:19:37,240 --> 00:19:43,520 other people to program. And then I ran across it more recently through an issue on GitHub. 429 00:19:43,740 --> 00:19:49,000 I'll say shout out to folks who leave issues on our GitHub with ideas like this. This was posted 430 00:19:49,080 --> 00:19:53,660 a while back in an issue. It took a while to come to fruition, but it was a really great idea. And I 431 00:19:53,660 --> 00:19:55,220 I appreciate the person who left it there. 432 00:19:55,340 --> 00:19:56,680 Unfortunately, I don't know their name. 433 00:19:56,760 --> 00:19:58,520 But it's on the turtle repo, if anyone 434 00:19:58,720 --> 00:20:01,660 wants to find it on GitHub, the CircuitPython turtle repo. 435 00:20:01,760 --> 00:20:03,560 Someone put an issue for like, hey, 436 00:20:03,600 --> 00:20:05,000 it'd be cool if we had this thing one day. 437 00:20:05,700 --> 00:20:08,060 Yeah, it was really fun to implement in CircuitPython. 438 00:20:08,280 --> 00:20:09,760 It's built on top of Display.IO. 439 00:20:10,120 --> 00:20:13,960 And the idea is you kind of write some Python code that 440 00:20:14,280 --> 00:20:16,540 controls this little animated robot. 441 00:20:16,760 --> 00:20:19,820 So you can say, like, step one, and it will move forward one. 442 00:20:19,880 --> 00:20:21,600 And then you can say, turn left, and it 443 00:20:22,180 --> 00:20:23,420 will turn 90 degrees to the left. 444 00:20:23,580 --> 00:20:26,380 so that the next time you step, you'll be going a new direction. 445 00:20:27,300 --> 00:20:33,220 Your goal as the student, as the player, is to go through a series of challenges learning 446 00:20:33,280 --> 00:20:34,380 all of the different bits of programming. 447 00:20:34,520 --> 00:20:40,580 Each challenge requires you to learn a new piece of those basic fundamentals of software 448 00:20:40,880 --> 00:20:41,340 development. 449 00:20:43,580 --> 00:20:48,400 You need to go to a certain location, and then eventually you need to go to a certain 450 00:20:48,480 --> 00:20:51,380 location and call a function to pick up a little beeper. 451 00:20:51,760 --> 00:20:55,620 And then eventually you need to go take the beeper to a different location that's been 452 00:20:55,680 --> 00:21:01,520 specified or eventually maybe there's multiple beepers and you need to pick up each beeper 453 00:21:01,740 --> 00:21:06,540 or you need to check whether or not the square that you're on now actually contains a beeper 454 00:21:06,680 --> 00:21:07,200 or not. 455 00:21:07,760 --> 00:21:11,920 And so there's all sorts of different little puzzles and challenges that you can run through 456 00:21:11,980 --> 00:21:17,080 using what you have learned through programming in order to drive this little robot around 457 00:21:17,200 --> 00:21:19,420 and achieve all these different goals. 458 00:21:20,220 --> 00:21:21,860 And it was really fun to work on. 459 00:21:22,240 --> 00:21:24,960 I would say it's probably-- 460 00:21:24,980 --> 00:21:27,620 man, I'm putting myself on the spot here, I would say. 461 00:21:27,720 --> 00:21:31,220 But I think Keral probably would be my favorite-- 462 00:21:31,220 --> 00:21:34,080 the favorite thing that I made in 2024, 463 00:21:34,840 --> 00:21:36,660 because it's just such a cool little-- 464 00:21:36,660 --> 00:21:38,920 I love the idea of helping teach people to program. 465 00:21:39,100 --> 00:21:42,260 I love the idea of gamifying almost anything, 466 00:21:42,500 --> 00:21:43,660 just because I love games so much. 467 00:21:43,760 --> 00:21:46,320 So gamifying, the learning of programming, 468 00:21:46,920 --> 00:21:49,220 and being able to put it onto CircuitPython like that 469 00:21:49,220 --> 00:21:50,760 was a real joy for me. 470 00:21:50,920 --> 00:21:52,160 So that one was a lot of fun. 471 00:21:52,540 --> 00:21:54,140 - And that was on a PyPortal, is that correct? 472 00:21:54,760 --> 00:21:56,380 - It was, yeah, it runs on a PyPortal. 473 00:21:56,620 --> 00:21:59,140 It can also run on a couple of other different things. 474 00:21:59,300 --> 00:22:01,200 I tried to keep, with a lot of my projects, 475 00:22:01,420 --> 00:22:04,220 I go and try to keep it generic enough 476 00:22:04,360 --> 00:22:06,300 to where if you have a little bit of experience 477 00:22:06,400 --> 00:22:08,180 with CircuitPython, you'll be able to swap it 478 00:22:08,200 --> 00:22:10,400 to different displays and stuff like that fairly easily. 479 00:22:11,000 --> 00:22:12,860 They're usually targeted at one directly 480 00:22:13,020 --> 00:22:14,560 where like this is the plug and play one. 481 00:22:14,640 --> 00:22:16,860 If you just take my code and drop it onto there, 482 00:22:16,900 --> 00:22:18,480 it will run, you don't have to do anything else. 483 00:22:19,040 --> 00:22:21,480 But I try to break them up to where usually you'll 484 00:22:21,560 --> 00:22:25,940 be able to just pass in a display to the helper object 485 00:22:26,020 --> 00:22:26,720 or something like that. 486 00:22:26,760 --> 00:22:29,420 And so if you want to, you can go and initialize 487 00:22:29,480 --> 00:22:30,340 an external display. 488 00:22:30,460 --> 00:22:32,540 And so that one, it does run directly 489 00:22:32,620 --> 00:22:34,700 on a Pi portal with no modifications, 490 00:22:35,000 --> 00:22:37,500 but it's very easy to run it on any display. 491 00:22:37,960 --> 00:22:39,220 The one other thing I will throw out, 492 00:22:39,700 --> 00:22:42,000 which actually brings us back a little bit to the constraints, 493 00:22:42,120 --> 00:22:44,980 which I didn't mention, was the display size itself, 494 00:22:45,200 --> 00:22:47,140 which is obviously typically fairly small 495 00:22:47,280 --> 00:22:48,160 for microcontrollers. 496 00:22:48,240 --> 00:22:50,480 And I would mention that for Karel as well. 497 00:22:51,040 --> 00:22:53,660 In order to complete all the challenges, you do need-- 498 00:22:53,660 --> 00:22:55,620 I want to say off the top of my head, 499 00:22:55,700 --> 00:22:59,000 it's maybe 8 by 8 or 10 by 8 or something like that. 500 00:22:59,080 --> 00:23:01,540 You need a certain amount of size 501 00:23:01,640 --> 00:23:03,760 in order to complete the challenges that come with it. 502 00:23:03,860 --> 00:23:06,180 You could make new challenges that fit in a smaller screen. 503 00:23:06,680 --> 00:23:08,320 But that would be my one caveat, is 504 00:23:08,380 --> 00:23:10,760 if you do end up running that on a different screen, 505 00:23:10,840 --> 00:23:12,000 it does kind of-- 506 00:23:12,000 --> 00:23:13,960 at least the challenges that are built-- expect there 507 00:23:14,040 --> 00:23:15,420 to be enough room for that. 508 00:23:15,480 --> 00:23:18,160 So a comparable size to the PyPortal will work fine. 509 00:23:18,620 --> 00:23:19,680 You could go a little bit smaller, 510 00:23:19,840 --> 00:23:21,040 but if you get too much smaller, 511 00:23:21,160 --> 00:23:23,480 then you'll need to modify those challenges. 512 00:23:24,460 --> 00:23:25,500 - Last question for you. 513 00:23:25,820 --> 00:23:26,800 You're starting a new project. 514 00:23:27,200 --> 00:23:28,680 Which microcontroller do you reach for? 515 00:23:29,380 --> 00:23:31,900 - So the first one that I always reach for 516 00:23:32,100 --> 00:23:34,020 is one of the Feather TFTs. 517 00:23:34,440 --> 00:23:39,100 Lately, the Feather ESP32, either S2 or S3 TFT, 518 00:23:39,960 --> 00:23:41,060 they have a lot going for them. 519 00:23:41,160 --> 00:23:42,960 I'll probably stick with the S3 moving forward 520 00:23:43,040 --> 00:23:43,760 'cause it's a bit bigger. 521 00:23:43,840 --> 00:23:45,460 It's got a bit more RAM and stuff like that 522 00:23:45,460 --> 00:23:47,040 until we get the next one in that generation. 523 00:23:47,320 --> 00:23:50,300 But for me, the reason why it's my go-to is 524 00:23:50,480 --> 00:23:51,600 I do a lot of work on displays. 525 00:23:51,780 --> 00:23:54,020 So having the built-in display is very nice. 526 00:23:54,220 --> 00:23:56,180 Even though it's tiny, I can still get a lot done. 527 00:23:56,740 --> 00:23:58,860 If I'm working on some changes in the label 528 00:23:59,020 --> 00:24:01,820 or the shapes library, or if I'm tinkering away 529 00:24:01,940 --> 00:24:03,900 at something inside the core in display 530 00:24:03,940 --> 00:24:06,260 or anything like that, it's more than enough room 531 00:24:06,400 --> 00:24:07,920 to just do quick little tests on. 532 00:24:08,360 --> 00:24:11,340 It's plenty powerful being ESP32 S3. 533 00:24:11,440 --> 00:24:12,480 It's got lots of RAM. 534 00:24:12,660 --> 00:24:13,680 It's got lots of space. 535 00:24:14,180 --> 00:24:14,980 It's really fast. 536 00:24:15,280 --> 00:24:19,080 It has Wi-Fi so I can grab stuff from the internet if I want. 537 00:24:19,840 --> 00:24:22,240 The feather form factor, generally I will say, 538 00:24:22,420 --> 00:24:24,380 is just kind of my go-to these days. 539 00:24:24,680 --> 00:24:26,820 I've got a load of different feathers 540 00:24:27,000 --> 00:24:28,980 and then the feather doublers and triplers 541 00:24:29,040 --> 00:24:30,820 and even quadruplers at this point. 542 00:24:30,880 --> 00:24:32,560 I've got some of those all set out 543 00:24:32,600 --> 00:24:33,560 and loads of different wings. 544 00:24:34,220 --> 00:24:36,680 And the hardware is usually the hard part for me. 545 00:24:36,800 --> 00:24:37,820 Software is super easy. 546 00:24:38,240 --> 00:24:39,460 The feathers and the feather wings 547 00:24:39,640 --> 00:24:40,620 with the doublers and everything, 548 00:24:40,820 --> 00:24:42,460 just being all super plug and play, 549 00:24:43,080 --> 00:24:45,060 that kind of stuff is perfect for me. 550 00:24:45,160 --> 00:24:47,700 Like I've gotten really good at soldering, you know, 551 00:24:48,480 --> 00:24:49,480 is it 10 millimeter or whatever, 552 00:24:49,600 --> 00:24:51,060 the standard breadboard pins. 553 00:24:51,120 --> 00:24:52,600 I've gotten really good at soldering that, 554 00:24:52,740 --> 00:24:54,520 but once I get outside of that little box, 555 00:24:54,620 --> 00:24:55,940 my soldering is not so great. 556 00:24:56,460 --> 00:24:58,300 And so feather wings, I can solder those up 557 00:24:58,460 --> 00:24:59,300 really nice and easy. 558 00:24:59,520 --> 00:25:02,020 And then just being able to plop them on together 559 00:25:02,260 --> 00:25:04,220 and not worry about wires and jumpers 560 00:25:04,280 --> 00:25:06,320 and anything else is really nice for me. 561 00:25:06,420 --> 00:25:09,360 So yeah, I've got TFT feathers with pins 562 00:25:09,440 --> 00:25:10,580 for when I wanna use the doublers. 563 00:25:10,720 --> 00:25:12,340 I've got a couple without the pins 564 00:25:12,340 --> 00:25:14,780 that I can still plug STEMA cables into and stuff. 565 00:25:15,380 --> 00:25:17,060 There are probably three or four of them 566 00:25:17,100 --> 00:25:18,300 on my desk total right now. 567 00:25:18,440 --> 00:25:20,820 So that's my, definitely my go-to. 568 00:25:21,100 --> 00:25:24,100 I do typically, for my actual games and my other projects, 569 00:25:24,160 --> 00:25:25,600 I end up usually graduating to something 570 00:25:25,700 --> 00:25:27,860 with a bigger screen, especially for the games and stuff. 571 00:25:28,380 --> 00:25:32,080 But that is always my go-to anytime I just need a random, 572 00:25:32,200 --> 00:25:33,440 let me try this out or whatever. 573 00:25:33,800 --> 00:25:34,440 - That's a great pick. 574 00:25:34,500 --> 00:25:37,900 I have an S3 reverse TFT sitting on my desk as well 575 00:25:37,960 --> 00:25:39,220 that I've been using for prototyping. 576 00:25:39,360 --> 00:25:41,180 So I know exactly where you're coming from. 577 00:25:41,640 --> 00:25:41,840 - Nice. 578 00:25:42,320 --> 00:25:43,820 - Tim, thanks so much for being on the show. 579 00:25:44,360 --> 00:25:45,400 - For sure, thanks for having me, Paul. 580 00:25:45,620 --> 00:25:46,460 I really appreciate it. 581 00:25:46,540 --> 00:25:47,820 And thanks for making the show as well. 582 00:25:47,860 --> 00:25:48,860 I love listening to it. 583 00:25:49,040 --> 00:25:49,460 - My pleasure. 584 00:25:50,900 --> 00:25:53,040 Thank you for listening to the CircuitPython Show. 585 00:25:53,580 --> 00:25:54,900 For show notes and transcripts, 586 00:25:55,060 --> 00:25:57,940 visit www.circuitpythonshow.com. 587 00:25:58,480 --> 00:26:00,200 Until next time, stay positive.