A Python-based micro game console, optimized for game development workshops.
I really like the #PewPew FeatherWing as a platform for teaching game development, but the cost of Feather boards needed to use it makes it difficult to organize workshops for larger groups of people. I have previously tried to work around that problem by merging the FeatherWing with the schematic stolen from a Trinket M0 (with an additional flash memory), but the resulting design was complex, difficult to make and still a bit expensive. Now after having designed a few more CircuitPython boards I think I can really cut the costs and make a standalone device with all the functionality of the original shield, but optimized for workshops.
I just got a photo from @Elecrow of the first unit they produced (a prototype to test the process). The mass production should commence shortly.
As you can see, I have chosen slightly more lively colors than in the prototype: the switches are green and the PCB is red. Otherwise it's all the same. The LED matrix and the battery holder will come separately, to be soldered by the user.
I resisted for a long time, but when three more color versions of the big 60x60mm LED matrix arrived, I gave up and designed a PCB for them. You might recall that I already experimented with them before, a few logs ago, just connecting them with wires. Now I prepared a proper PCB:
I switched to silicon buttons, like in the #µGame, and a bigger through-hole power switch. Also, the battery holder is now on the front side (so the whole thing is thinner) and uses inline configuration of the batteries. There are also two prototyping areas on the sides, and two large holes for a lanyard if you wanted to use it as a badge of some sort. The back side is clear (except for the prototyping areas, of course).
I ordered the PCBs from @Elecrow this time, and they have already fabricated and sent it to me, now I'm just waiting for it to reach me:
I took a few PewPew prototypes to the Maker Faire Zürich, to show them off but also to have them tested by the actual target audience. I think they were a success, because we always had a couple of kids at our table playing them, even though the game selection wasn't that good (mostly snake, some tetris). But I got to see how people handle them, to test how long they last on battery power (around 14 hours on two AAA batteries) and, last but not least, they went through a crash course of actually being used by a lot of living humans. I'm happy to report that there were no injuries or defects on either side.
(Sorry for the silly face on the photo.)
In the worse news, I finally didn't have the time to write the code to control the robot. I naively thought until the last moment that I will have some free time during the event. Nope. It was eight hours of people talking to me non-stop. Which I guess is good, because it means they were interested. But no robots. Well, I had some of my robots walking around, but not controlled with PewPew. Maybe next time.
The Maker Faire Zürich is coming, and I need to show something. Sure, I could just let people play some games, but it's always cool to have something moving. Last year I had the #Deltabot controlled with #D1 Mini X-Pad Shield, this time I decided to use the PewPew to control a #MeArm.
The connections are rather simple, even if there is a lot of them — every servo gets its own GPIO pin, and power from the powerbank. Tested the servo movements with the REPL, and it all seems to be working fine. Now I need to write some simple code to control them with the buttons, and maybe to display some status on the display...
The AAA battery holders finally arrived, so I could complete the prototype:
I also got to experiment with adding some wooden parts to the bottom, to make the whole thing a bit easier to hold. For now I cut them out of wood by hand, but ultimately they would be laser-cut out of acrylic:
The whole thing fits very well with the mini-breadboard boards:
I will need to make a sticker with pin labels for the top of the display, so it's easier to see what is what.
Finally, I got the first responses from the fabs, and it seems that at small quantity (50 pieces) the price will still be relatively high, around $9, but at larger quantities (300 pieces) it can get as low as $6 (that's without the shipping costs and margins, of course). This is for a partially assembled kit, where you need to solder the matrix and the battery holder yourself.
(I think that I previously mentioned a bi-color matrix of similar size.) In any case, it's a great temptation for designing a PCB for a bigger version of the PewPew. It would of course be more expensive (the matrix I'm using right now is a kind of sweet spot, being the cheapest and the easiest to source), but maybe it would make sense to have one like that during the workshop, so that the teacher can show things to the whole group from a distance. Whatever the justification, for now I just wired it to the small PCB with wires:
It works perfectly fine! I could even mount it in some kind of box, with the PCB with the buttons below it, to have a pretty convenient device. For now this is just an experiment, but it's good to know that I could make such a big version. Maybe one day it will become a badge for some conference, who knows.
In the mean time I was also working a bit on the documentation. I have restructured the ReadTheDocs website a bit to allow for different devices, and I have written a simple Bouncing Ball Tutorial. Of course that is not enough to actually run a workshop, but it's enough to get you started writing your own game, hopefully.
Thanks to the generosity of @oshpark, the PCBs for version 10.2 arrived today. I spent the evening assembling it and updating the code to handle the new button arrangement. Here it is, with the working scrolling text in all its glory:
Please excuse the potato-cam that can't really catch the colors properly, and the dark photo — it's night in here already.
For debugging, I'm using the optional voltage regulator to power it from USB. I'm still waiting for the battery holders for 2×AAA batteries. Once they arrive, I can also try experimenting with a laser-cut piece that will go on the back around the battery holder, to make the whole thing more comfortable to hold.
I also need to prepare all the materials and start asking fabs for quotes — this will be the final result of all this work for making it cheaper.
It's a kind of anniversary: I have reached the tenth prototype of the "standalone" version of PewPew. Admittedly, not all prototypes have been actually realized in hardware, but many were, and all were ready for it. In any case, I present you the tenth version:
I took some liberties in the design of the back side, since it will be mostly hidden anyways:
As you can see I narrowed the device back to the 32mm of the LED matrix, and I squeezed the pin header underneath, only accessible from the bottom. I think this makes the whole design more robust, and doesn't much affect convenience. I can put a color sticker on the top edge of the matrix to serve as a legend for the pins.
I'm also considering adding laser-cut pieces on the underside and top, similar to how this year's Hackaday Belgrade badge had. This way it will be thicker and easier to hold. Of course they are optional. I will prototype them with wood for now.
There is another option in there — I added a footprint for a voltage regulator next to the power switch. It will be unpopulated by default, but if you add it, you can use the device without battery, just connected to USB.
The battery holder is for 2×AAA batteries, and I made holes for two versions — because the order of cables coming out of them seems to be mostly random. A 2×AA holder would fit too, but it would cover the pin header, so not recommended.
There are two mounting holes next to the pin header. Those can be used to securely attach any kind of larger add-ons for the device. The laser-cut parts will have a suitable cutout, of course. There is also plenty of holes for either attaching a case, or attaching the device to a larger contraption.
Finally, I made both the power switch and the USB port a little bit recessed — so that they don't stick outside the outline of the board. That should make it easier to carry it in your pocket.
As the prototypes are coming, this device is becoming a pretty nice thing for teaching game programming, which is its main focus. However, wouldn't it be great if it could also be used for hobby electronics projects, like the micro:bit or any number of development boards? For that it would need to break out more pins than the SWD and SWC it breaks out right now, and they would need to be broken out in a way that makes it easy to connect stuff to them.
The current pin budget is as follows:
8 pins for the LED matrix rows
8 pins for the LED matrix columns
6 pins for the buttons
2 pins for programming/debugging/connecting stuff
2 pins for USB
One way to free some pins would be to drop the LED matrix and use charlieplexed LEDs like in the business card prototype — then I can get away with 9 pins instead of 16, and would have 7 free pins, which is enough for this kind of use in my opinion. However, while the parts cost is similar, the assembly costs might go up, and the display is much less readable, due to lack of diffusing. I could add a 3D-printed diffuser on top, but that again adds to the cost.
Is there any way I could save pins on the buttons? Right now I use one pin per button, which is kinda wasteful. I could arrange them in a 2×3 matrix, which would require 5 pins, saving me one, but I don't think it's worth it, especially since I would then need additional diodes to avoid ghosting. I could use a resistor ladder and connect all the buttons to an analog pin — but then reading the button state would take longer, as ADC is not as fast as simple digital pins. Can I share the LED matrix pins with the buttons? If I just connected them to the row pins via diodes, I could have an additional fake column for which I would scan the buttons, but that's 6 extra diodes. Hmm, what if the other end of the buttons wasn't connected to GND or VCC, but instead to an additional pin? I already scan the columns, so I could connect the buttons to that, and on every column check the additional pin (with a pullup) for the value of the corresponding button. As a bonus, no extra components and no extra cycles in the matrix scanning, so the brightness shouldn't suffer. That seems like the way to go!
And that gives me 5 free pins, which together with the 2 debugging pins give me a nice 7 pin header. That should be enough for most basic hobby electronic uses, especially since I can choose pretty much any pins for that, so I can take all the ones that have interesting peripherals on them: ADC, DAC, serial, I2C, SPI, timers.
Now, onto the connector.
I can't just use normal male headers, even though that would make it super-easy to connect the device to a breadboard, because it's supposed to be carried in a pocket, and the pins could lead to injuries, torn clothes and, what's worse, bent pins. I don't want to use an edge connector, like the microbit, because it forces you to buy special hardware and defeats the whole idea of a cheap device. I don't like the big holes for banana plugs/crocodile clips, because who uses banana plugs today? Also they are huge and wasteful. I could use a female pin header — then you could easily use dupont cables to connect it to anything you need. It would even look good next to the matrix display. Or I could just leave the holes for the header unpopulated (which saves me part and some soldering), and use staggered holes, so that you can insert a male pin header when you need it, or solder a female header if you want. I think I will go with that.
The last question is where should the header be located? Obviously we don't want to have it on the same side as the USB plug and power switch. In fact, if this is going to be connected to a breadboard, we don't want an USB plug anymore, and we will need to switch back to a micro USB socket, so that you can have some distance between your computer and the breadboard. But still we don't want them on the same side.
When we put all this together, we get something roughly like this: