Made front pages of Hackaday and Hacker News!
This project is a battery powered musical chime set, loosely inspired by a set of microprocessor controlled electro-mechanical real bells we had as kids, I think the Ye Merry Minstrel Caroling Christmas Bells. Other similar products had light-up bell decorations with a speaker, like the Caroling Christmas Bells or Mr Christmas Bells of Christmas (but weren't real bells).
I wanted to recreate, but could not find a source of bells reasonably priced for this project. So I substituted DIY chimes, which worked quite nicely IMO.
Built with a black walnut stand using copper tubing, 3d-printed hangers and controlled by an ESP32 running MicroPython.
Some videos of it working:
- Silent Night
- Hark! The Herald Angels Sing
- God Rest Ye Merry Gentlemen
- Close up of the user interface (OLED display)
I chose to implement these 12 notes (which cover a decent number of songs), but it can be extended as needed (up to the free GPIO pins):
- C5, D, E, F, F#, G, A, B, C6, D, E, F
I mapped C5 (and like) to C4 in software since an actual C4 chime didn't really sound like C4 due to secondary frequencies. This guide was very useful to understand what's going on.
I've simplified a number of MIDI files to play, available here.
This took me somewhere between 40-80 hours to design, code and build, starting with a "mandatory fun day" event at work.
Get some wood. This is some black walnut I slabbed a year or two ago:
Make sure it's big enough to fit everything:
Cut and plane and do all the normal stuff to make it look pretty:
Cut 12 copper tubes to length. I found an excellent guide at http://leehite.org/Chimes.htm. I bought two 10' sections of type M 1/2" copper pipe and cut them accorting to this guide.
Drill and chamfer holes to hang them by at the hang points.
Make the stand as you please. I chose some pretty simple feet and through tenons.
Make some electromagnets using 1.25" pieces of 3/8 in. Plain Steel Round Rod. 3D print end caps.
Use a helper if available!
Make some recesses in the underside of your wood for 12 hanger modules:
3D print hangers and assemble:
Dead bug solder up each electromagnet.
Space is tight, I used more of the magnet wire for signaling.
Stainless screws for the capacitive buttons. (Line them up better than I did!)
Use a nice power button:
Batteries...
Assemble:
OLED screen and holder:
Finish with Danish Oil.
The software uses regular MIDI files I whittled down in LMMS to simple melodies. I used a version of Mido I stripped down for memory reasons. The ESP-32 runs MicroPython.
The main code is in main.py. It's MVP (but not much more).
- 3/8" steel rod
- #8 Nuts
- 1/2 in. x 10 ft. Copper Type M Pipe
- Springs
- Wood beads
- 5V regulator
- Battery charger circuit
- Motor drivers
- 18650 batteries (Amazon doesn't seem to sell these directly, but they have these "flashlights" packages. =)
- Barrel jack power connector
- Charger
- Battery holders
- Wooden dowels
- Magnet wire
- OLED display
- Power switch
- ESP-32 microcontroller
- Thread
- Wood!
Use what you have around, this is just what I used.
- Chisel set
- Pipe cutter
- Metal ruler (for accuracy)
- Mortiser (Total overkill / recent present to myself - a drill press or hand tools will work as well.)
- Table saw
- Miter saw
- Tenoning Jig
- Disc sander
- 3D printer
- Planer
- Jointer
- Center punch
- Chamfer/Countersink Bit Set
- Sawmill
The strikers return to their default position via gravity. This is not reliable. Sometimes they don't return at all due to friction, or they return part-way, resulting in the next strike being less effective. I'm working on a redesign w/ springs and a wider swing arc. This should make the chimes more consistent, and possibly allow harder strikes, variable intensity strikes, etc.
The ESP-32 has wifi. I want to be able to control this over mobile.
Memory is very tight. MicroPython supports baking in large libraries into the firmware to save memory. (Their equivalent of .pyc
files can be run directly from flash according to documentation.) Figure out how to do this and create a custom firmware.
Be able to check and display battery voltage / % used.