Thunder Pack

A kick-ass high-power ARM board with everything you need -- and small enough to fit in your pocket.

Similar projects worth following
Starting from
jeremy has 16 orders / 0reviews
Ships from United States of America
A tiny, high-power output, ARM microcontroller board with everything you need for wearable projects and more.

Why? I've built a lot of wearable lighting projects and got tired of wiring together the same 3 parts: arduino, charging controller & battery. They always felt janky and flat lipo batteries can explode if they get damaged (especially if you're wearing it!). I wanted something compact, rugged, and could pump out enough current for a lot of LEDs without the additional parts. What I've ended up with is this little beast with 4 onboard PWM MOSFETs, driving upwards of 1.4A per channel! It also has a built-in high-power battery charger, 16MB flash, 12 additional GPIOS, 5 onboard programmable LEDs, USB, and more.

Develop your project faster with fewer extra parts!

Primary Goals

  • Self contained
  • Compact
  • Rugged
  • Intuitive controls

Self Contained

The controller should have everything you need on a single PCB: MCU, battery, USB, charger, buttons, and LEDs for status and debugging.


It needs to easily fit inside a pocket or in the palm of your hand. 


You should be able to throw it around without much concern for damage. The problem with the typical lithium pouch cell batteries, is they will explode if they get bent or punctured. This project will use a cylindrical lithium battery so it can take some abuse.

Intuitive Controls

This will have 2 buttons: One satisfying on/off push button and another tactile momentary button which can be programmed to do anything (i.e. cycle through modes).


On most LED controllers, the single button for both power and mode selection is horrible! To turn it off, you either have to press and hold for an undetermined amount of time or cycle through all modes to get it to stop blinking. Not a very good user experience at all.


  • 1 × STM32F411xx Microprocessors, Microcontrollers, DSPs / ARM, RISC-Based Microcontrollers
  • 1 × NCR18650B Battery 3400mAh capacity, Max continuous discharge current: 6.8A
  • 1 × MCP73831T Power Management ICs / Power Supply Support
  • 1 × GD25Q16CEIGR 16MB Flash

  • Compact is coming

    Jeremy11/18/2020 at 08:23 0 comments

    After months of tweaking, prototyping, sourcing new buttons, and finding a novel way to integrate an LED into them; the brand new, super compact, ThunderPack is about ready!

    Measuring in at a minuscule 4cm x 1.9cm (1.6 x 0.75 inches), it still packs nearly the same punch as the original -- with some additional features!

    What's New

    To open up more possibilities with data logging and larger CircuitPython programs, it now rocks an onboard 16MB SPI flash chip.

    There's an additional tiny RGB Dotstar LED (APA102-2020) for more LED indicator options.

    The power indicator LED is now inside the power button. When the board is turned on, the button is illuminated. There's also a cuttable trace to disable or rewire it if needed.

    What's the catch?

    Of course, I couldn't shrink it this much without losing something.

    The battery is no longer is embedded on the board. However, there's a standard JST battery connector and it still has the 500mA lithium battery charger. I found that bundling the battery on the board limited its applications in some areas. I still prefer cylindrical batteries for wearable applications and have been playing with JST connectors and shrink tubing to repackage some batteries.

    To conserve more space, I had to reduce the PWM MOSFETs from 2.3A to 1.4A.

    It was really hard keeping the four PWM LED indicators. On a 2-layer board this tight, finding room became difficult. I almost had to ditch them entirely, but at the last minute, I was able to find some room on the other side of the board.

    Besides that, and outside of a few new circuit design choices, that's pretty much all it lost. The new board does nearly everything the original did, with some new features, at a fraction of the size. 

    What do you think?

    After a few more checks, I'll be making a new production run to sell on my tindie store. I'm debating if I should keep both the original ThunderPack form factor (with the added new features) along with the new compact version, or fully commit to the compact version and deprecate the old. What do you think? 

  • Getting MUCH smaller with more features

    Jeremy08/07/2020 at 07:08 0 comments

    The new prototypes have arrived!

    The board now features a 16Mb SPI flash chip and DotStart Micro RGB LED (APA102-2020). These additions were inspired by CircuitPython. The flash chip gives much more space for your python programs and the LED is used by CircuitPython to show system status. 

    Even though they were added for CircuitPython, you're not limited to how you use them. For example, go ahead and use the flash chip for logging data or turn your ThunderPack into a USB mass storage device. 

    New Compact Board

    The most exciting part of this update is the new compact board. Coming in at just around 4cm x 2cm (1.6" x 0.75"), this tiny board will fit about anywhere. To shrink it down as far as I could, I made it double-sided, with the switch and tactile user button on one side and pretty much everything else on the other. 

    It has all the same features as the standard board, except:

    • No onboard LEDs for the PWM outputs.
    • External battery
    • PWM outputs are limited to 1.4A per

    Otherwise, it does everything else.

    What's next?

    I'm making a few more tweaks here and there and will be getting another round of prototype boards. If those go well, I'll submit a production run and sell the new boards through my tindie store.

    Let me know what you think!

  • A preview of things to come...

    Jeremy07/04/2020 at 21:27 3 comments

    This is a prototype I've been working on for a couple months now. With all the same features as the main ThunderPack board, but much, much smaller! (40mm x 19 mm)

    It also has an on-board 16Mb flash chip and a DotStar status LED. (both of these are also getting added to the next version of the standard ThunderPack board).

    Due to it's size, I did have to drop a couple things:

    • Individual physical LEDs on the PWM outputs.
    • USB ESD protection.
    • On-board battery.

    This board is perfect for wearable applications that need to be lightweight. 

    I've been building this prototype into a leather choker, similar to this Adafruit's Tutorial, for a friend. However, in my version the board is truly integrated with the choker with the switch poking through a slot in the leather and the LEDs mounted to a custom flex PCB from OSH park. I'll post pics and more info soon.

  • Selling on Tindie and planning the next version

    Jeremy06/25/2020 at 23:13 0 comments

    I finally received a small run of boards (20) from PCBWay and I've listed them on Tindie!

    You can order from the product page, here:

    What Next

    I'm playing with a couple more prototypes for the next version of the board. Here are some of the things I'm thinking about:

    • On-board flash memory: The base STM32 chip has about 512kb of memory, but CircuitPython uses most of this for the runtime. An external flash chip will allow larger CP programs or it can be used for logging or to create a USB MSD.
      • I have an open PR to boost the user program flash memory a bit for the current board.
    • New flat board with external battery: The original form factor works well in many cases, but sometimes you need something flatter/smaller. I'm working on an alternative form factor which uses an external battery. It should retain the same basic features.
    • Flexible LED PCBs: Loosely inspired by Adafruit's LED Collar, I've been playing with flexible PCBs from OSHPark to make DIY LED strips that mate directly with the thunderpack board. This has some great wearable applications.
    • Shorter Board, Same Power: Using a new switch I found on Aliexpress, I can reduce the length of the standard ThunderPack board by 4.5mm (~1/4 inch)

    Stay tuned, I'll be posting more soon about these ideas.

  • Received Production Units

    Jeremy06/07/2020 at 19:06 0 comments

    Good news! I just received the small production run from PCBWay and they're beautiful. 

    Amid COVID shipping has been significantly longer than usual, so these too a little bit longer than expected to receive.

    I'm still waiting on the shipment of batteries, but once I get them I'll be listing these for sale on my Tindie shop.

  • It's alive! (and with CircuitPython)

    Jeremy03/26/2020 at 08:00 0 comments

    It took awhile to get here but the new STM32F411 chips are working really well! 

    COVID aside

    It has been so interesting to see how COVID has affected everything in such real ways. I say this because, most things come and go but don't really have this kind of Hollywood movie effect. So to see something stop so much is truly staggering and I'm in awe. (I'm also in week 2 of quarantine in San Francisco, so I might be a bit loopy). 

    For perspective, here's what the streets of San Francisco have looked like lately.

    I find my self comparing how surprised people are about COVID19 to climate change. People didn't expect a worldwide pandemic to actually happen...and here it is. So many people refuse to believe climate change can happen...but it's here and is happening; whether you believe it is or not.

    All that to say, I placed PCB orders with DirtyPCBs and OSHPark in min February and it took about a month to get to my door. Longer than expected, but totally reasonable considering the circumstances. 

    It also meant that my trip to the Open Hardware Summit was grounded and I attended virtually; just like everyone else.

    Choosing chips

    Bare PCBs to play with!!!

    My goal with this batch was to get CircuitPython running on the boards. So I ordered 2 chips to try: STM32F412 and STM32F411. The F12s come with as much as 1Mb flash while the F411s top out at 512Kb. I know CircuitPython takes at least 256Kb of flash, so I wanted to test the chips side-by-side. Would 512Kb be enough space to load both the CircuitPython runtime and user programs? (It turns out all STM chips seem to be limited to 48Kb for user program space - source). 

    The STM32F411 had plenty of room and ran CircuitPython really well. It's also a couple dollars cheaper and is way more common; so it's the clear winner.

    Officially on CircuitPython!

    I have to say, the CircuitPython engineers are phenomenal. I had a few issues getting the boards working and the devs on their discord server were super responsive and helped me out a lot.

    Along the way I was even able to contribute a general fix back to the codebase and add non-volatile memory (EEPROM emulation) support to the library for the STM line of chips.

    I'm now excited to say that the team behind CircuitPython have accepted my PR and Thunderpack is an official port in their repository!

    Arduino on the way

    I have a Github PR open with the stm32duino team to add the new version of the board & chip to their project. Hopefully that'll be added in their next version.

    Next - Update Examples

    Now that the big things are out of the way, the next step is to update all the existing examples, add CircuitPython examples and get a new round of boards. Unsurprisingly, the WS2812B/Neopixel examples are giving me some grief (The DMA to PWM code always seems to cause trouble). I'm hoping to get that all sorted this week.

    Feel free to follow along in the STM32F4 branch in github.

  • CircuitPython coming with a big upgrade!

    Jeremy02/06/2020 at 20:57 0 comments

    The goal of ThunderPack is to be accessible to beginners and experts alike. With that in mind, CircuitPython seemed like an important thing to include. Only one problem...the chip I chose will not work for it.

    Why? STM32L072xx and CircuitPython

    I liked the STM32L07 because it's small, low-power and has integrated EEPROM. The only problem is that CircuitPython requires ~50KB of flash to work as expected*, and the STM32L072 only has about 128KB.

    * you can technically get CircuitPython/MicroPython to fit inside 128KB, but it doesn't include the USB mass storage device firmware loader or the REPL. In my opinion, this removes the two most useful things of CircuitPython -- so why bother.

    Upgrade to STM32F4xx with big flash and speed boost!

    A great thing about the SMT32 line of chips is how they attempt to maintain pin compatibility between families. Which means we can upgrade ThunderPack to the STM32F4xx chip, which packs a whopping 1MB of flash space and can run up to 100Mhz, without significant changes to the board.

    It's pin-compatible, but unfortunately not a drop-in replacement because the chip footprint itself is a little bigger (7x7 vs. 5x5). I had to rearrange a few things but was able to keep the overall form factor and pinout the same. I will also need to update the examples for this chip and the Arduino core.

    Feel free to follow along the process in the STM32F4 branch on Github. 


    As the board is finally in the more production-ready phase, I'm collecting ideas for what people would do with ThunderPack. Share your ideas in the comments!

    Open Hardware Summit

    I will also be going to the Open Hardware Summit in New York in March and hope to have a handful of these boards with me to give away. 

  • New Sizes!

    Jeremy02/06/2020 at 17:22 0 comments

    While talking to friends about the projects they wanted to use ThunderPack for, I realized that the 18650 battery size might be a bit big for smaller projects. So I took the design and shrunk it to two smaller battery sizes: 14500 (AA) and 10440 (AAA).

    Power Differences

    The real downside to the smaller batteries is power. These are the maximum ratings I've found for cells with built-in protection:

    • 18650 (standard)
      • Capacity: 3,500mAh
      • Max continuous discharge current: 10A
      • Souce
    • 14500 (small - AA)
      • Capacity: 1,000mAh
      • Max continuous discharge current: 2A
      • Source
    • 10440 (tiny - AAA)
      • Capacity: 600mAh
      • Max continuous discharge current: 0.5A
      • Source

    Ultimately the 10440 is the least bulky, but also severely lacks juice for projects involving LEDs; however, it could still be useful for other projects.

    Next Steps...


    ThunderPack needs to be accessible to everyone, so the next step is to get CircuitPython running on it. I've done a little work on this already and it's clear I'll need to make some hardware changes to support this. More details soon...

    Open Hardware Summit

    I'll be flying to New York for the Open Hardware Summit in March and I'm planning to bring a handful of these boards with me. This will be my first time at a hardware conference, so I'm very excited and not sure what to expect.

  • Arduino Support and more boards

    Jeremy11/09/2019 at 01:06 0 comments

    Arduino Support

    It's official, ThunderPack has been added to version 1.8 of the STM32 Arduino Cores project! This version hasn't been released yet, but support for ThunderPack will conveniently be there for Arduino when it does.

    I also have another PR open to remove the need to install outside software to flash programs to the board from Arduino. This update should also benefit all STM32 boards which support USB flashing via the DFU protocol. This also led to a pretty interesting conversation about the DFU protocol and potential enhancements to the dfu-util program itself.

    More Bugs, More Prototypes

    In writing the Addressable LED (WS2812B) examples, I found a bug with the board design...

    Naturally, an addressable LED strip should be powered by the battery and the "Batt+" pin is connected directly to the battery. This all sounds good, right? Well, imagine this: You turn your board on, the program runs a lighting program to the LED strip, then you turn the board off. At this point the board stop sending new data to the strip, but the power isn't remove because it's directly connected to the battery. So, the strip continues to display the last pattern sent to it until you physically remove it from power.  🤦

    The next version of the board (rev 5) will have a pin which provides power after the on/off button.

    More Ideas...

    Of course I'm already thinking about what to do after the board is finalized. Here are the ideas I have running around my head currently:

    • MicroPython (or CircuitPython) support.
    • A version of the hardware built around the smaller 14500 battery (AA size). This would be for more compact projects and give up to 1A of power.

  • Pinouts, Reviews & Arduino

    Jeremy10/22/2019 at 16:03 0 comments

    We're rounding the corner to a final product! I've been getting feedback from friends, creating documentation and prepping arduino support.

    Pin out diagram

    The real step to making something real and usable by others is documentation. And in my mind, the first tangible piece of documentation for a custom board is the pinout diagram. From there an intrepid maker can dig up datasheets as necessary to get things running. 

    I went through a few iterations of this because I wanted it to be easily viewable without scrolling (a vertical oriented board meant vertical scrolling on laptop screens). If the labels look familiar, I borrowed the style from the adafruit pinout diagrams.

    There's still room for improvement (I'm not loving the angled labels), so if anyone wants to lend a hand or ideas, please let me know. (also the SVG file is also an inkscape file)

    Arduino Support

    Another important step to making a board usable by others is platform support; notably Arduino. These days I run a little closer to the metal, but there's a lot of value in giving all makers a very accessible starting point.

    The stm32duino project already provides arduino support for STM32 boards; however, I still needed to add Thunder Pack board configs to it. Luckily the stm32duino team (notably [fpistm]) have been very responsive and helpful with my pull requests. Along the way, I even found a bug with one of their binaries and am providing additional pull requests to cut down on the number of outside software dependencies necessary for an end-user to get up and running with any of their boards.

    If I'm lucky ThunderPack will be supported by stm32duino 1.8.0! 🤞

    Hardware Reviews & Feedback

    A couple weeks ago I sent the hardware files to some friends who actually work in hardware design & development. Through that, they pointed out that I was missing some decoupling caps, my USB traces could be optimized for data line impedance, and a few other helpful tricks. This was incredibly helpful and also reassuring about the overall design.

    The next step is to build a few more boards and hand them off to more friends for real-world testing.

View all 15 project logs

Enjoy this project?



thomas.pujolle wrote 04/12/2020 at 14:28 point

Hey there, awesome project ! I recently tried to put together 4 LED strips with one Lilypad and had the exact problems you just solved, form factor, power management and distribution :)
One question though, I'm new to getting this kind of project done over in china, any manufacturer to recommend? I shall just give them the content of for example? 

Take care

  Are you sure? yes | no

Jeremy wrote 04/13/2020 at 23:43 point

Good question. I've used Macrofab and PCBWay for manufacturing in the past. PCBWay is usually quite a bit cheaper. I just put in a small order with them for boards that I'll be selling through Tindie, if you're interested.

If you want to get some be manufactured yourself, you'll need to look at the STM32F4 branch on github (it hasn't been merged to master yet, hopefully this week).

The manufacturer will need the following files:

* fabrication/

Those were the files I used in the more recent order.

  Are you sure? yes | no

thomas.pujolle wrote 04/14/2020 at 07:01 point

Thanks ! Yes I would be interested, you probably have a tindie page where I can find the product?

  Are you sure? yes | no

Jeremy wrote 04/23/2020 at 22:32 point

I don't have a tindie shop yet, but I'll set one up soon.

  Are you sure? yes | no

Jeremy wrote 07/02/2020 at 18:37 point

  Are you sure? yes | no

ExplodingWaffle wrote 03/28/2020 at 17:39 point

" tired of wiring together the same 3 parts: arduino, charging controller & battery..."

a-freakin-men! i really like the portable form factor you've got going! i also enjoy the rigid batteries; in addition to the whole less explody thing, they're more common to salvage. then i scroll down and find out you're using the 411- im in love, defo keeping tabs on this guy.
maybe could benefit from usb c? extra juice for battery charging etc. (usb c headphones??? i've heard they're a bit crazy tho.)

  Are you sure? yes | no

Jeremy wrote 04/13/2020 at 23:44 point

USB C would be a pretty interesting upgrade. I'm definitely keeping that in mind for the future.

  Are you sure? yes | no

Xasin wrote 10/22/2018 at 16:46 point

Yikes, wha ... Holy heck, how many different chips are you looking at! :O
Thanks for pointing out the STM32 type chips. I ... This might be surprising to hear, but I have never tried those. I did a jump directly from AVR to ESP >.>

Your comment about the ESP not having EEPROM is correct, but it has something much better: Integrated Flash, which can be used as a File-System. So saving configuration is quite easy :P

The lack of USB connection is true, but ... Considering all the other stuff it has, it's forgivable.

  Are you sure? yes | no

Jeremy wrote 10/22/2018 at 20:25 point

I kinda went straight to the STM32 because I had heard really great things about them and wanted to start learning a little closer to the metal.

Your point about integrated flash is really interesting. I was wondering about that when I was reading through the datasheet. The APIs also look really nice to work with.

  Are you sure? yes | no

Xasin wrote 10/23/2018 at 17:21 point

The API is fantastic, and the online documentation is pretty good too. Very readable English :D

The environment is easy to install too. 

I'll warn you now though, it has a few small quirks here and there. Nothing major though :D

I'd love to help out if you have some questions about it, but it's fun and easy to get into by oneself ^^

And I'll definitely look at the STM32 for mid range projects!

  Are you sure? yes | no

mpinner wrote 09/12/2018 at 17:51 point

really nice. thanks for sharing

  Are you sure? yes | no

Xasin wrote 09/11/2018 at 06:13 point

Speaking of feature creep, why don't you switch to an ESP instead of an ATTiny?
It could be programmed directly via USB, no need for a bootloader. You'd also get rid of the boost converter, a simple 3.3V LDO will do. The ESP Pico is pretty low power, but you could add Bluetooth support for phone config.

And while we're at it, those LEDs could be replaced with a string of NeoPixel or similarly addressable lights.

I ah ... Ok, maybe that's overshooting the initial goal of the project just a tiny bit, sorry >.>
In all honesty, I do very much enjoy the simplicity your current system has! It's good to use the tool that's most appropriate for the situation, like a simple ATTiny for just a bit of RGB blinking ^^

  Are you sure? yes | no

Jeremy wrote 09/18/2018 at 18:10 point

Oh no! Now you got me thinking about that. (and I've been looking for an excuse to play with the ESP). Maybe I'll give this a look too. I'm already planning a couple different hardware configurations. First would be a big version with a 18650 (~AA) battery and a smaller one with a 10440 (~AAA) battery. I could try a third version with the ESP, too.

In the upcoming version an addressable LED string could be connected via a couple of the ISP header pins. If I were to swap to ESP, I'd probably need to add the boost controller for an addressable string.

  Are you sure? yes | no

Xasin wrote 09/19/2018 at 05:04 point

Not sure if the boost converter is necessary, just run them off of battery power. The NeoPixel or WS2812 don't have strict power requirements. 

Oh BTW, if you need some code to address the NeoPixels, I've made one. The ESP32 has a nice hardware signal generator, so it doesn't block ^^

  Are you sure? yes | no

Jeremy wrote 10/22/2018 at 00:30 point

So, you got me going down the ARM path. For the past few weeks I've been playing with the STM32 and Chibios. (Using an RTOS for this application is probably overkill, but might as well use this as an excuse to learn that too.) I started with the STM32F070RB and this week will be playing with a STM32L053R8, because it has integrated EEPROM.

I'm planning to give the ESP32 Pico a try soon too. The only downside is that it doesn't have built-in USB or EEPROM; so I'd need to add those externally.

  Are you sure? yes | no

Similar Projects

Does this project spark your interest?

Become a member to follow this project and never miss any updates