Introduction: Spaceship Control Panel - Laser Cut Arduino Toy
A few months ago I decided to become a member of the local maker space, since I've been wanting to learn the tools of the maker trade for ages.
I had a tiny bit of Arduino experience and a had taken a Fusion-course here on Instructables. However I had no experience with a lasercutter, nor with any sort of intermediate Arduino programming or components besides the standard LED or simple sensor.
Since my nephew's 6-years birthday was coming up in a few months I decided that I wanted to make him a present. Since he loves anything space-related (especially if it contains buttons and lights) I came up with the initial idea of making him a simple Arduino-based toy with some LED's, buttons, a speaker, sliders etc.
So I trawled the internet for tutorials on simple Arduino toy tutorials to get inspired by, but I couldn't quite find exactly what I was looking for. Jeff High Smith's amazing spaceship toy and Duncan Jauncey's remix of it were great inspirations, but were a bit too big a mouthful for me since I was lacking: a) Enough experience to build it, b) Enough time to gain the experience and c) I wanted the project to be controlled only by an Arduino to make it simpler (and cheaper) than having to interface with e.g. a Raspberry Pi or similar. Bob Lander's beautiful little control panel toy, was also an inspiration, but I wanted to build something with a bit more interactivity.
So I started sketching down a few ideas for the control panel until I reached a look that I was happy with.
With the initial design in place (well - sketched out rather quickly on a piece of paper at least) I was ready to move on to actually figuring what it would take to build this - how many and which parts I would need, which Arduino controller to use etc.
WORD OF ADVICE...
... for those that want to venture into the journey of building this: Using the 4017 decade counters is an unnecessarily complicated way to control the LEDs. If you want to make your own version, I'd highly recommend using something like WS2812B (or similar) LEDs, as it will make controlling the LEDs a lot easier (for example using the FastLED library).
Another fellow Instructable member has also discovered some discrepancies between the schematic and the code (with certain I/O pins in the code not corresponding to the shown schematic). I will try to make an updated version of the schematic as soon as I have time. In the meantime, use the code as the basis for the I/O pin setup (not the schematic).
Step 1: Structure of This Tutorial
Now that I had an overall idea of what the spaceship control panel should look like, and having decided to make it relatively simple, I was certain that actually building it would be a breeze...!
Well... turned out the breeze became more of a, well if not a storm, then at least a gale! It was somewhat more difficult than first expected.
The project ended up taking close to three months of sparetime hours, and I only finished the last bit of coding the day before my nephew's birthday!
However, the build process was a great and fun (and only sometimes frustrating) learning experience with tons of trial and error and things that I would do differently, were I to build it again.
Most steps in this tutorial therefore will each have two sections:
- A "Long Read" section for the patient reader, where I describe my process, thoughts and (likely) mistakes in detail.
- A "Tl;dr" section for the more impatient reader, where I get to the point a bit quicker, and present a recipe to follow (revised by learning from my mistakes).
Enjoy the ride and please feel free to ask questions!
Step 2: Tools and Materials
With my sketch in hand, I could start figuring out how many LED's, buttons and other stuff I needed.
Since my sketch contained a lot of LED's (42 including the lit buttons), it was clear that I needed to go for an Arduino Mega. However even using the Mega, there still weren't enough I/O-pins to accomodate for all of the LED's, buttons, piezo buzzers and potentiometers.
If I were to make an updated version I would definitely replace most of the LED's with something like the WS2812B-type LED's since they are a lot easier to chain, program and play around with. But since I did not know that by the time of the build, this tutorial will still focus on using the CD4017-method.
I also didn't yet have a clear idea of what the circuit would look like, so I wanted to make sure that I'd be able to disconnect and reconnect wires and components along the way. I therefore chose to make (almost) all of the connections between the components and the board using female/female dupont cables and male header pins.
To make connecting the components to the arduino via the dupont cables easier, I decided to buy a sensor shield for the Mega.
As for the rest of the tools and materials, you can find them below.
- Laser Cutter.
Our makerspace has a Universal Laser Systems VLS 3.50 45W which I used for cutting and engraving the acrylic, and a big no-name chinese 120w laser that I used for cutting the MDF. You could quite easily cut the box and the acrylic using standard power tools, however for the engraving on the acrylic/paint the laser is to prefer.
- Soldering iron.
- Hot glue gun (optional, but nice to have)
- Screwdriver set.
- Countersink bit.
- Drill bits 2mm-3mm or similar.
- Drill driver (any will do, but a bench drill press will make it easier).
- Masking tape
- A variety of small pliers
- Adobe Illustrator ($$) or Inkscape (free) - or any other vectorbased drawing software.
- Autodesk Fusion 360 (optional) - for designing the case.
For the case and assembly:
- Acrylic sheets, 5mm thickness. Preferably cast acrylic (since it doesn't melt and remerge as easily as rolled acrylic does when laser cut).
- Acrylic sheet 2mm.
- MDF, 6mm thickness.
- Spray paint, I used:
- Molotow Urban Fine-Art Artist Acrylic - dare orange. For the faceplate graphic details and the handles.
- Molotow Urban Fine-Art Artist Acrylic - signal black. For the case and the faceplate.
- A generic non-acrylic based black for the 2mm protective acrylic sheet.
- Arduino Mega 2560 R3
- Mega Sensor Shield V2.0 for Arduino Mega
- Dupont cables female/female (100 pcs. should be enough). Choose (at least) 30 or 20 cm in length - 10 cm will be too short.
- A whole bunch of LEDs - both 3mm and 5mm.
- Male header pins
- PCB strip board
- 4x 16-pin DIP IC socket (for mounting the decade counters)
- 4x CD4017BE decade counter chips
- 2x Red Illuminated LED switch w. flip cover
- 2x Single linear 10k slide potentiometers
- 2x Green square illuminated momentary pushbuttons. Please note!!: The buttons linked to are NOT lit by LED's. They are incandescent and will not light up when connected. To make them light up, you will need to desolder the incandescent bulb inside and replace them with a 3mm LED.
I tried ordering some other similar buttons that claimed to be lit by LED, but alas - when they arrived they turned out to also be incandescent.
- 6x 3-pin 2-position on/on flip switches
- 1x Security lock key switch (DPST or DPDT type).
- 1x SPST on/off rocker switch
- 2x Piezo buzzers
- 1x MAX7219 LED Dot matrix 8-Digit Digital Display Control Module
- 2x Single linear rotary 10k potentiometers
- 2x Rotary knob cover for the potentiometers
- 22x 180 or 200 ohm resistors
- 11x 150 ohm resistors
- 14x 100 ohm resistors
- 1x T-type "9v" snap-on battery connector cable
- 1x 4-slot AA-battery-holder
Step 3: Measuring Parts and Test-fitting
With all of the parts in hand, I could now start measuring each of the individual components to make sure that when I began designing the final design in Illustrator or Inkscape, all of the parts would fit and none of them would overlap on the bottom side of the faceplate.
Especially the key switch was very deep, and thus the final depth (or height, however you wanna put it) of the box would need to accommodate for this, and take this into account when placing the internal components in the case (such as the Arduino Mega, the decade counters etc.).
I then produced a simple vector drawing in Illustrator depicting all of the different component diameters/widths, put a 5mm acrylic test piece in the laser cutter, and cut it out.
Having made sure that all of the components fit snugly into their respective holes/slots I then proceeded to draw each of the components in Illustrator (see photo) to make it easy to use in the the final design.
- Measure all of your components using calipers.
- Use the measurements to produce a vector test file with all button/component sizes in Illustrator.
- Cut out the test file on 5mm acrylic on the laser cutter.
- Use the test piece to see if all the components fit snugly.
- If necessary, adjust the hole sizes in the vector file and make a new test piece with the revised sizes.
- Using the final measurements, make a new Illustrator file and draw in all of your components in the correct scale.
- OR don't do any of the above. I will provide the final vector-file in the next steps, if you just want to use that.
Step 4: Designing the Case
With all of the component measurements in place I could now begin designing the control panel case.
For some reason I decided to make this process a lot harder for myself than necessary and chose to make a parametrically defined finger jointed case in Fusion 360. Well - to be honest, really I just wanted to learn Fusion 360 better, so it wasn't entirely the decision of a madman, but I could have much more easily used the (quite excellent) MakerCase tool and be done with it.
Instead I chose to follow The Hobbyist Maker's parametric finger jointed box tutorial, which I can highly recommend, if you want to getter better at 3D parametric design. However making a full 3D model for a design as simple as mine is a bit overkill, since you'll have to export each surface as a 2D vector drawing afterwards anyway, so you might as well just make it in Illustrator to begin with.
Either way, I continued in Fusion 360 until I was happy with the design. Since I knew (well, hoped at least) my nephew would be carrying this thing around a lot, I wanted to make it easy to for him, by adding some handles. The handles are part of the wooden case and protrude through the acrylic faceplate, providing grip and helping lock the case in place.
With the design in place I exported all of the parts from to 2D .dxf vector files, using the "simple sketch" method described in Taylor Sharpe's Instructable.
I then modified the dxf files in Illustrator and added a small hatch for accessing the battery compartment and holes for connecting to the Arduino Mega (that I'd also measured in the previous step). I also added a hole for an on/off switch for the sound on the side of the case, and little drill holes on the bottom.
The final drawings for the case are attached to this step (in .ai, .svg, and .pdf format), while the design of the faceplate is coming up in the next steps.
- Use MakerCase to make your basic finger jointed box for the case.
- Modify the MakerCase vector files in Illustrator to fit your needs - remember to add a hatch for the battery and holes for the Arduino ports.
- OR just download the plans attached to this step.
Step 5: Designing the Faceplate and Laser Engraving the Paint
With the final overall size of the case and the faceplate in place, I could now finally get to the (even more) fun part: The design of the faceplate!
Since I'd already measured and drawn a small library of all the parts in Illustrator (in step 3) and I had the initial hand drawn sketch to refer to, it was "just" a matter of placing the parts on the clean faceplate vector drawing (exported from Fusion in the previous step) in Illustrator, and adding some cool space graphics.
With the initial vector design in place, it was laser time!
Finding the right process:
For the design of the faceplate, I wanted the faceplate background to be painted black and the space graphics on it to stand out in a signal color (orange in my case). However I couldn't really find any tutorials on this process of laser etching through paint. There were quite a few examples of enhancing an already etched piece with paint or etching once onto a non-transparent surface, or using special laser etching paint that sticks to the surface when lasered (which was kinda the opposite of what I wanted). I later found this video showing more or less exactly what I wanted to achieve - but by then it was too late, and I'd already spent way too much time, testing out different types of paint, different amount of layers of paint and a million different settings on the ULS laser :|
Luckily, you won't have to do that and I'll spare you most of the agonizing details of the many tests og trial and errors, and just present you with the main findings:
The laser etching process - TL;DR:
The process of cutting out the faceplate and etching the design onto it, consists of a few separate steps, in short:
- Cut out the faceplate itself and all of the holes and slots for the buttons and components.
- Paint the underside of the faceplate with one layer of black acrylic spray paint and let it dry fully.
- Put the painted faceplate into the laser cutter again, and etch the design into the painted surface.
- Paint the (now laser etched) underside of the faceplate again with one layer of the orange acrylic spray paint and let it dry.
The laser etching process - LONG READ:
The laser etching process in detail:
- Cut out the faceplate itself and all of the holes and slots for the buttons and components. In the design files attached to this step there are three different layers:
A. The cut layer (red lines)
B. The vector engrave layer (blue lines)
C. The raster engrave layer (black features)
In this step you must only ask the laser cutter to cut out the red layer and the blue layer. The red layer should be cut all the way through, while the blue layer should merely engrave in a fine line into the acrylic.
The blue crosses mark the drill points (for later, when we have to drill the mounting holes into the faceplate), while the blue cross above the planet in the lower left corner is an alignment marker, that we will use when engraving the faceplate in step 3 of the process.
- Paint the underside of the faceplate black. Please note that since the design files are mirrored, the underside is actually the side facing up when it's placed in the laser cutter.
Also, before you start painting you should definitely use some masking tape to mask off the parts of the acrylic that you don't want painted!
I tried out a couple of different types of black paint, but ended up using the Molotow Urban Fine-Art Artist Acrylic signal black, because it is amazing! It has a very high concentration of pigment, so you only really need to apply one layer of paint for it to cover the acrylic completely (which will also come in handy in the next step).
Once the underside is painted black, let it dry fully and continue to the next step.
- With the faceplate underside painted black, place it back into the laser cutter and (if necessary) use the alignment marker (described in step 1) to align the laser perfectly to the faceplate (see attached photos).
To do the etching, I used the VLS 3.50 laser, which comes with a materials library with a ton of presets. However it doesn't really come with any presets for "etching off paint" off acrylic, so I had to experiment a bit.
For the first test pieces I did, I had used several layers of paint, which meant that I had to fiddle a lot with the presets to make the laser etch all the way through the paint layer. However using only one layer of paint, the standard "raster engrave" setting for 5mm acrylic on the VLS 3.50 was sufficient to etch off the paint layer! Nice!
So using the attached design file send the raster engrave layer (black lines) to the laser and start etching some spacey patterns into the paint and acrylic!
- All of the spacey design features of the faceplate should now be etched into the bottom of the faceplate - i.e. you should be able to see through the acrylic, where the paint has been etched off. But we don't want the text, symbols and lines on the faceplate to be see-through! We want them to light up in bright orange!
Therefore grab your orange acrylic paint (I used one from the same Molotow series as the black paint in step 2) and paint a layer or two onto the black underside of the faceplate. Again, mask off the parts you don't want orange paint on - especially the square in the middle of the faceplate! The square needs to remain transparent, as we will later mount a simple LED-display to it.
While you're at it, you might as well paint the handles of the case too (see attached image).
With the painting and the laser etching done, I was ready to test-fit the parts.
Step 6: Case Test-fitting, Assembly and Paint
Earlier I'd cut out an extra case, to use for test fitting (see images) and it seemed to fit (very) snugly, so I thought "All is good"... All was not good...
After painting the "final" case, the added layers of paint meant, that the faceplate just could not fit the case (at least not without scraping all of the paint off the handles..."But you haven't even shown how to paint the case!", you might say. And you're right. Because you shouldn't actually paint and assemble the case until after you've made the faceplate. Or rather you should actually add about 1 mm of tolerance to all of the case mounting slots on the face plate, and then laser cut the face plate (and paint it, etch it etc.) and then make the case, assemble it, paint it and mount it.
However, since I did none of those things in that order, I was left with having to make yet another case, and sand the handles and mounting pegs thinner, assemble it (gluing only the sides together with wood glue - not the bottom!), paint it and then mount it to the faceplate.
Before I did that, however, I also made and cut out a small 2mm acrylic protective inlay to glue to the underside of the faceplate to prevent my nephew from accidentally (or deliberately) scratching off the exposed paint on the acrylic (see image). I glued this piece to the exposed outer rim of the underside of the faceplate using contact adhesive (but beware to not dissolve the paint in the process!).
Doing that meant that I had to make a slight change to the case design, making the mounting pegs 2mm higher and adjusting the bottom of the handle too. Don't worry though - the case design files in step 4 are the final design and thus take this into account. You can find the vector files for the protective inlay at the end of this step.
So to sum it all up, what you ought to do is:
Make and mount a protective inlay
- Cut out the attached protective inlay vector file from a 2mm acrylic sheet on the laser cutter.
- Mount it (precisely!) to the painted underside of the faceplate using contact adhesive.
Making and assembling the box:
- Cut out the case on the laser.
- Sand down the width of the handles and mounting pegs on the case (so they'll fit, when mounting to the faceplate).
- Assemble the sides of the case using normal wood glue. Do not glue the bottom of the box to the sides - the bottom will be mounted with screws later.
- Once the glue is dry, paint the box black and the handles orange.
- Test mount the faceplate to the box.
- Rejoice the amazingly snug fit!
Step 7: Preparing Case and Faceplate for Assembly
With the case and faceplate more or less done, only a couple of small things were left to do, before I could (finally) get to play around with the electronics.
I needed to:
- Drill all of the pilot holes in the faceplate. In my design I had already etched markers onto the surface, showing me where to drill (see step 5).
Since I was going to use 2.5mm diam. screws, I made sure to also use a 2.5 mm drill bit to drill through the acrylic (3mm could also work).
- Use a countersink drill bit to countersink the holes in the faceplate.
- Temporarily mount the faceplate to the case and use a center punch (or just a needle) to mark the screw holes onto the top of the case.
- Remove the face plate and use a 1,5 or 2mm drill to predrill the holes for the screws (see image).
- Do the same on the bottom of the case.
- That's it.
And now - finally - electronics!
Step 8: Designing the Circuit
Since I already knew the placement of all of the components and had some sort of idea of how I wanted them to interact, but had no visual overview, of how everything would be connected, I decided to make an initial sketch by hand and then build on that in Fritzing.
Now was also the time to start thinking a bit more detailed about what the control panel should actually do, since this would to some extent dictate the circuit design. What would happen when I pushed this button? And what would this LED be connected to? Etc.
However since I had already decided that I would use dupont connectors for all of the connections, I would be able to change the circuit design along the way, as I learned more and came up with new ideas for functionality and interaction.
The attached final circuit design has therefore undergone quite a few changes along the way, and was still being changed after all the parts had been mounted and soldered.
The final design
The overall idea for the functionality was that I wanted each section of the control panel to activate in a consecutive manner, meaning that in order to interact with the sections at the top of the control panel, you'd first have to activate the connected lower sections on that side (see image).
Furthermore if all sections on both sides of the control were activated, I wanted the "Supercharge" function to activate (doing whatever a "Supercharge" function does :D ).
To accommodate for this, for the final circuit design I ended up creating two mirrored setups with two 4017 decade counters for each side controlling all of the individual LED's on that side.
The first decade counters controls the LED's that run along the slide potentiometer, while the second decade counter control the five LED's that run along the rotary potentiometer and five of the red LED's that run next to the "Supercharge" arcade button.
As you might also notice on the schematic, the 5v pins of the decade counters are not actually connected to the the Arduino 5v, but directly to each of their separate I/O pin. This was done to be able to easily completely shut off all of the LED's controlled by the decade counter.
The rest of the schematic is pretty straight forward (and by "pretty straightforward" I mean "rather messy to look at, but somewhat functional").
I came up with a circuit design. It took a long time. It's attached below. Use it to build your circuit.
Step 9: Building the Circuit
Building the circuit was a multi-stage process:
- Testing the components using a multimeter.
- Mounting the components (LEDs, buttons, display etc.) to the face plate.
- Soldering male header pins to all of the (necessary) components.
- Using the multimeter to test for shorts and continuity.
- Mounting the Arduino Mega (with sensor shield) to the inside of the bottom of the case.
- Connecting all of the components (correctly) to the Arduino sensor shield using dupont cables.
- Solder the battery connector wires to the Arduino Mega jack terminal.
... and had I been a smarter person, I would have followed those exact steps in that specific order... However I was not a smart person, and thus had to go through hours of replacing faulty components that had already been glued on and mounted to the faceplate, shorting LED's and other fun activities!
But my failures should not stop you from doing a better job, so I'll provide a detailed explanation of each step below and you can find images from the process above.
- Test your components using a multimeterbeforeyou mount them. Check to see if all of the LED's work, if the buttons open and close correctly, if the potentiometers work etc. It is also a good idea to make a small test setup with the MAX7219-led display (see e.g. this nice tutorial), to make sure everything works. It will save you a lot of headaches later on.
- Mount your components to the faceplate.
All of the buttons can easily be mounted to the faceplate since they all have nuts and threaded shafts.
The loose LED's however need to be glued onto the board using hot glue (see images).
- Solder male header pins to all components. Since I'd decided to use dupont connector cables for all of my components, this ironically meant that I had to do a lot of soldering, since every LED and every button had to have male header pins soldered on.
To help make this a bit easier, I cut out pieces of strip board and soldered the male header pins and (if needed) resistors to this. I then soldered that finished strip board to the respective component on the control panel (see images).
The four 4017 decade counters were all mounted on one strip board block to (if necessary) make switching around connections easier (see images).
- Test for shorts and continuity. Use the multimeter to check if all of your solder joints make a connection and check to see if any of them make too much of a connection to things they shouldn't connect to!
- Mount the Arduino Mega to the bottom of the case so that the power jack and usb-plug on the board match up with the holes on the rear side of the case (see images).
You should also mount the 4017 decade counter block to the bottom of the case as well as having cut out, assembled and mounted the battery compartment (attached to this step) (see the images).
- It's now time to connect all of the components up using the female/female dupont cables. Refer to the schematic in step 8 of this Instructable to make sure you connect everything correctly.
- For some weird reason the sensor shield that I bought does not come equipped with a "Vin"-pin to allow for a regulated 7-12 volt input. So I had to solder on the battery connector wires to the Arduino Mega's power jack socket (see image).
So I guess... now it's time to plug it in..!
Step 10: Testing and Coding
You've made it to the final step of the tutorial! Well done!
Coding the control panel was a journey in itself with lots of googling, test programming and rewiring. I was lucky to be able to get some more experienced development assistance from both my brother and my roomie, or else I'd never have been done in time for my nephew's birthday.
Despite this the so-called "final" code that ended up being transferred to the Arduino still has a lot of shortcomings, and is - quite frankly - a bit of a mess. Luckily we weren't developing code for an actual spaceship, so in this particular case the code will more than suffice :)
The code is also not particularly well documented, and since we've been three people working on it, trying to untangle it can be a bit of a trial - even for me.
Either way, the code is attached and - fingers crossed - will still work, if and when you try it :)
Thanks for following along - I hope you've been able to use at least some the things in this tutorial.
Since this is my very first Instructable, I'd be more than happy to hear your feedback and get your tips on how I can improve it (and any future ones).
Enjoy the video of the final project and happy making :D
/ Niels aka. Nilfisken
Step 11: Attributions
Through the course of designing the control panel, I've been using various open-source materials - mainly graphics of various kinds. The creators of these must (and ought to) be mentioned:
From the excellent site TheNounProject, I've used the following icons:
- "Boom" by VectorBakery (CC BY)
- "Sound Vibration" by Symbolon (CC BY)
- "Explosion" by Oksana Latysheva (CC BY)
- "Pentagon Danger" by Blackspike (Public Domain)
- "Galactic Empire" by Franco Perticaro (CC BY)
- "Laser Beam" by Ervin Bolat (CC BY)
- "Saturn" by Lastspark (CC BY)
- "Electric" by Hea Poh Lin (CC BY)
The font used is:
Also a giant thank you to all of you other "tutorialists" out there giving out your tips, tricks and experiences free of charge and for everyone to enjoy. Without you I'd never have been able to build a project like this.
Runner Up in the
First Time Author