Over the past few months I have found myself writing a number of utilities for the ESP32, a popular microcontroller with a wide range of capabilities from WiFi connectivity to just sipping uA of current in a deep sleep. Growing tired of having a dongle hanging off the side of my machine, I can think of a number of use cases in which I would love an ESP32 in the form-factor an an ESP32 module.
I have the resources to get an initial concept module electrically developed and fabricated, however I am not going to commit money unless I know there are others which will use a module like this.
The idea is a module which will fit entirely within the space of a single Framework expansion card, offering UART connectivity back to the host for programming and user-interface with the application. On the side of the module exposed to the world, there will be 2x small buttons and a small header for connecting I2S/SPI/GPIO based accessories for development purposes. On the PCB will be an RGB LED exposed on user-GPIO pins - the LED should be visible from the side of the laptop.
If I can get 10 people to commit to buying one ($50/shipped) I will full-send and have PCBs ready to go within 6 weeks time. The price will drop significantly if there is enough interest to justify a larger batch.
Although S2 would be nice, the dual-core and BT makes S3 boards preferable.
My main focus on the S2/S3 is the USB OTG capabilities. If I’m understanding the spec, it would mean that the ESP32 could be used as an HID device, a USB host, or a serial JTAG. The TinyS2/S3 also allows for real-time programming (no serial flashing) using micro/circuitpython.
For I/O, 0.1" headers are probably too large to be useful, but STEMMA-style JST connectors could be useful. For example, a JST SH-20 receptacle could fit on the exterior or the card, and allow for most of the board I/O to be exposed to a breadboard-friendly breakout. A FFC/FPC connector may also be a possible solution for a breakout, but could be too fragile.
A lipo port would also be useful. Might need to be placed on the bottom exterior of the expansion card though. But this would allow the extension card to be stored and programmed as an expansion card, and then dropped somewhere, powered by the lipo, and communicate back to the laptop over wifi/BT.
Overall possible use cases:
USB Rubber Ducky (for controlling the framework or external PCs)
Expansion-Card Lipo-powered sensor platform (perhaps with STEMMA JST SH compatibility)
Extra bluetooth/ble/wifi comm board
Live programming (using cpython etc) on the laptop with attached breakout board for sensor integration and testing
I know this is probably more involved than you envisioned, but just wanted to share some thoughts and ideas I’ve been playing around with.
I am just working on another ESP32 project now about found out, unexpectedly, that the S2 does not have Bluetooth! I have not yet played with the S3, but I can get one on the way.
This was one of the features I definitely wanted to expose on the module - I am imagining a dip switch (remove card first?) which will flip the card between UART programming mode, and the USB OTG pins so that applications could actually register as an arbitrary USB device.
Completely agree, I had not decided on a final IO port, but the idea was something exactly along the lines of what you mention here!
Interesting thought. I would say exclude a battery, but put a connector on the topside of the module. It will not be accessible when plugged into the Famework, but allows the module to be powered when not plugged in. I like the idea.
These are the kinds of pieces of feedback I am looking for, keep them coming! I will look more into the S3 before designing anything.
If using a larger JST SH, depending on the arrangement of the internal pins you could also have it compatible with the I2C stemma, like I mentioned. Just instead of using the full 20-pin cable, you’d plug the 4-pin I2C into the 4 right pins, if that makes sense.
I am still learning exactly how the S2/S3 “know” whether to be in a certain USB mode. That’s a bit of a hot topic too, since the S2 was released with that capability but not really the firmware written. Pretty sure things have progressed forward but it’s still a recent development.
The USB Rubber ducky has a dip switch. However, I think a button might be sufficient to put it into programming mode, probably best if placed on the underside so it can be pressed (or switched) when the card is still in?
Yeah, internal battery would be sketchy and unsafe. A bottom lipo port would be nice because it allows charging, but it’s probably not a good idea to use a fancy laptop as a cheap-lipo charger. And now that I think of it, you could just plug the unsheathed card into any usb-c port to handle charging.
I’ll keep playing around with the S2 in USB mode. It’s possible that the TinyS2’s setup is not fully compatible with all the ideas we’re considering, but that’s more of a concern based on limited experience with USB OTG.
Need to evaluate a few different connector options, will definitely keep this one in mind.
So there are 2 different things we will need to contend with - I am not certain on the S3, but with the S2, there are dedicated IO for USB which are separate from the UART pins used for programming the ESP32. If we wish to allow for reprogramming, USB from the host needs to be routed through a UART chip, an then to the RX/TX lines. To act as an HID device, USB from the host needs to be routed away from the UART chip and to the dedicated IO on the ESP32. This will be harder to accomplish with a button, and was why my initial idea was for a (dip) switch.
As for what the device registers as once plugged into the host using those dedicated IO pins, it appears as if the Espressif-Arduino library has a bunch of different examples already which can be leveraged to build a few different applications on the device.
Would also be prone to damage on the bottom side of a laptop? My vote is accessible only if removed from the laptop.