Introduction: Cryptic Auto-Calendar
I have constructed a number of manual perpetual calendars in the past. The big drawback has always been remembering to advance the calendar each day. I was hooked as soon as I saw the tomatoskins version. I quickly built one; substituting some 3D-printed parts for the original wooden parts. The calendar worked perfectly but I wanted to tweak a few things. The first was that when viewed from the side, the wiring was very visible. The second was that all of the circuit boards produce red LED light which glowed brightly against the wall. Lastly, the calendar is quite large; taking up a lot of wall space.
The cfb70's calendar looks like a piece of abstract art using ancient or alien symbols. You really don't know what you are looking at until the window frame slides into place and the digits magically appear. Again, the thing that I didn't like was having to advance the calendar each day. By limiting the Days and Months to their three character abbreviations, it became possible to morph the calendars together.
I used the inverse of the Porker font identified by cfb70. Each inverse shape was expanded outward to a bounding rectangle offset from the original character and then offset again (made bolder) to help mask any minor rotational errors of the calendar rings. Each character was placed on its corresponding ring at the 12 o'clock position and then rotated about the ring center to its correct location.
The resulting calendar is 75% scale of the original tomatoskins version and features a completely enclosed housing. A small internal fan keeps the idling steppers cool. It can be wall mounted or it can mount to a stand. I used Autodesk Fusion 360 to design all of the parts. Autodesk is a great supporter of the maker community; allowing free use of Fusion 360 to hobbyists. I used Vectric V-Carve Pro to rout the rings and faceplate.
- (8) #8 x 3/4” Multi-Purpose Pan Head Screws
- (8) #8 Flat Washers
- (30) #6 x 3/8” Flat Head Wood Screws
- (4) #8-32 x 1/2” Truss Head Machine Screws
- (4) #8-32 Hex Nuts
- (6) M3 x 16mm Hex Socket Head Screws
- (2) M3 x 8 Hex Socket Head Screws
- (8) M3 Hex Nuts
- (6) M4 x 8mm Hex Socket Head Screws
- (6) M4 Hex Nuts
- (6) M5 x 20mm Hex Socket Head Screws
- (6) M5 Hex Nuts
- (3) M5 Flat Washers
- (4) M2.5 x 12mm Hex Socket Head Screws
- (4) M2.5 Hex Nuts
- (1) M2 x 8mm Machine Screw
- (1) M2 Hex Nut
- Noctua 5VDC fan
- HiLetGo Arduino Nano
- Stepper Motors and Drivers
- Hall Effect Sensors
- Real Time Clock
- Power Jack
- Power Cable
- USB Power Adapter
- (1) 1/2" x 24" x 24" MDF Sheet
- 3-D Printer Filament
- (1) 1/8" (3mm) x 6" x 12" Acrylic Sheet
- (3) 3/8" diameter dowels cut to 3/4" long
- Hookup Wire
- CNC Router with a minimum 18" square cutting area and a spoilboard
- 3-D Printer
- Drill Press or Hand Drill
- Table Saw or Hand Saw
- Oscillating Palm Sander
- Soldering Iron
- Laser cutter
Step 1: 3-D Printing
Print all of the parts. The printed parts are provided in STL format and as solid models within Cryptic_Auto_Calendar_Assembly.step.
I used these parameters:
- PLA filament
- 0.2mm layer height
- 15% infill
- no supports (except as noted below):
- Left Side, Right Side, Nano Mount Fixed, Nano Mount Clamping and M2 Spacer utilized a brim.
- Top Side utilized a support at the fan opening.
- The captive hex nut holes contain a 0.2mm skin. The skin promotes better printing of the bridge infill across the top of the hex feature. Drill out or break out the skin before inserting the hex nuts.
- Most of the 3-D printed parts fit with other parts. The STL files reflect clearances that work well with my printer. You may need to increase or decrease clearances. Use the STEP assembly to modify the parts as needed and then create new STL files.
- The STEP assembly uses generic representations of the electronics. They are not models of the actual electrical components used.
- Left and right naming convention is when viewing the calendar from the front.
- Barrier Terminal Plate.stl
- Day Ring Gear.stl
- Days Ring Support.stl
- Days Stepper Plate.stl
- Days Window Frame.stl
- Fan Grille.stl
- Left Side.stl
- M2 Washer.stl
- Month Ring Gear Segment x 1.stl
- Month Ring Gear Segment x 3.stl
- Months Ring Support.stl
- Months Stepper Plate.stl
- Months Window Frame.stl
- Nano Mount Clamping.stl
- Nano Mount Fixed.stl
- Numbers Ring Gear Segment x 6.stl
- Numbers Ring Support.stl
- Numbers Stepper Plate.stl
- Numbers Window Frame.stl
- Right Side.stl
- Spur Gear.stl
- Top Side.stl
- Work Hanger.stl
- Cryptic Auto Calendar Assembly.step
Step 2: Making the Rings
The rings require machining on both sides of the material. A set of (3) dowel holes are created in the front face of the material and a mirror image set of the (3) dowel holes are created in the CNC Router spoilboard. Dowels are then inserted into the spoilboard and the sheet is flipped over and indexed onto the dowels. This insures perfect alignment of the sheet when flipping front to back. See this video from Vectric to better understand this method of alignment.
Set your material size to 1/2” thick x 17-1/2” square. Set zero to the center top of the material. For the front of the rings, import Cryptic_Auto_Cal_Rings_Front.dxf. Center the geometry on the material. Create the front dowel holes and cryptic character toolpaths. For the dowel holes, select an end mill; cutting to a pocket depth of 3/8”. For the cryptic characters, select a V-bit; v-carving to a flat bottom depth of 0.050”. If your CNC software does not feature v-carving, pocket the characters by selecting a small end mill to a depth of 0.050”.
For the back of the rings, import Cryptic_Auto_Cal_Rings_Back.dxf. Center the geometry on the material. Create the spoilboard dowel holes, the magnet position scribes, the ring gear recesses and the ring profiles. For the dowel holes, select an end mill; cutting to a pocket depth of 1/2” into the spoilboard. For the magnet scribes, select a V-bit; cutting on the line to a depth of 0.030”. For the ring gear recesses select an end mill; cutting to a pocket depth of 1/4”. For the ring profiles, select an end mill; profiling outside the lines and completely through the material. Include tabs in this profile toolpath to keep the rings in position during routing.
Cut a sheet of 1/2” thick MDF to 17-1/2" square. Apply (2) coats of polyurethane to the sheet; sanding lightly between coats. (The polyurethane will help insure clean cuts and will limit the penetration of paint; making sanding easier)
Screw or clamp the sheet to the CNC spoilboard. Mark the corners of the sheet onto the spoilboard. Zero the CNC router at the center top of the material. Cut the dowel holes first and then change tools to cut the cryptic characters. (Do not end your routing session between cuts; X-Y zero will be lost) Remove the sheet from the CNC machine. Vacuum or blow off any dust. Paint the cryptic characters with a small artists brush using black paint. Allow the paint to fully dry and then sand off the excess paint from the sheet surface using a 220 grit disc on an oscillating palm sander.
Draw diagonal lines on the spoilboard from the sheet corner marks produced earlier. Roughly zero the router at the intersection of the lines and the top of the spoilboard. Pocket the spoilboard dowel holes using an end mill. Insert the dowels into the spoilboard holes. Register the sheet onto the dowels and screw or clamp in place. Rout the magnet scribes using a V-bit zeroed to the top of the material. Change to an end mill and rout the ring gear recesses and the ring profiles. Test fit the ring gears into the rings before removing the sheet from the spoilboard. (Do not end your routing session between cuts; X-Y zero will be lost) Remove the sheet and cut through the tabs. Clean up the tabs with a spindle sander or file. If desired, apply a final coat of polyurethane to the rings and sand smooth.
Install (1) magnet per ring gear. Make sure that the south pole is facing up. (see tomatoskins) Temporarily position each ring gear in its corresponding ring. Align the gear such that the leading edge of the magnet is tangent to the scribe line on the ring. Tape the gear in place so that it doesn't move. Use the ring gears screw holes to mark the drill locations on the ring gear recesses. Remove the rings and drill pilot holes at each mark using a 3/32” drill. Be careful not to drill through to the ring face.
Step 3: Making the Faceplate
Set your material size to 1/2” thick x 6" x 14” Set zero to the center top of the material. Import Cryptic_Auto_Cal_Faceplate.dxf. Center the geometry on the material. For the drill hole locations, select a V-bit, drilling to a depth of .030”. (you just want to mark the locations for drilling later) Change tools to an end mill. For the windows, pocket completely through the material. For the window frames, pocket to a depth of .130”. For the outer profile, cut outside the lines and completely through the material. Include tabs on this toolpath to keep the faceplate in position during routing.
Cut a sheet of 1/2" MDF to a size of 6” x 14”. Screw or clamp the sheet to the CNC spoilboard. Zero the router at the top center of the material. Use a V-bit to mark the screw hole locations. Change to an end mill to pocket the windows, window frame recesses and the outer profile. Test fit the 3-D printed window frames. (Do not end your routing session between cuts; X-Y zero will be lost) Remove the sheet and cut through the tabs. Clean up the tabs with a sander or file. Apply polyurethane to the faceplate and sand smooth. Temporarily install the window frames into the faceplate. Mark the window frame screw locations onto the faceplate recesses. Remove the window frames and drill pilot holes at each mark using a 5/64”drill bit. Be careful not to drill through to the face. Likewise, drill pilot holes at the locations marked by the CNC using a 3/32” drill bit. Be careful not to drill through to the face.
Step 4: Making the Backplate
Create the backplate using 1/8" (3mm) acrylic. I used a desktop laser cutter and Cryptic_Auto_Cal_Backplate.svg. CNC or manual methods will work equally as well using Cryptic_Auto_Cal_Backplate.dxf.
Step 5: Assembly
- Install M5 hex nuts into the bottoms of the ring supports. Make sure that they are fully seated.
- Install M3 hex nuts into the bottoms of left and right sides. Make sure that they are fully seated.
- Install the ring gears into the rings and fasten using #6 x 3/8” flat head screws.
- Install the window frames into the faceplate using #6 x 3/8” flat head screws.
- Loosely screw the numbers and months ring supports to the faceplate using #8 x 3/4” pan head multi-purpose screws and #8 flat washers.
- Position all three rings on top of the faceplate. (Use scrap MDF to support the rings)
- Mount the RTC to the left side using a M2 x 8mm screw, the 3-D printed M2 washer and a M2 hex nut.
- Mount the fan and fan grille to the top side using M3 x 16mm screws and M3 hex nuts. The fan should blow out.
- Slide the left and right sides onto the top side and the days ring support.
- Position that assembly over the rings and screw it to the faceplate.
- Check the alignment of the parts and tighten all the screws in the faceplate.
- Attach the stepper motors to the stepper plates using M4 x 8mm screws and M4 nuts. The ears of the stepper motor go on the plate side opposite the embossed text.
- Press the spur gears onto the motor shafts until they bottom against the shaft flat.
- Make sure that the hall effect sensors fit into the holders on each stepper plate.
- Loosely mount the stepper assemblies to the ring supports using M5 x 16mm screws and M5 flat washers at the slotted holes. Match the text on the stepper plate to its corresponding text on the ring supports.
- Slide #8-32 hex nuts into the openings of the top side and days ring support.
- Install the Nano mount and Nano. The fixed half of the mount is closest to the right side. Use M3 x 8 screws and M3 nuts. Position the Nano with the USB socket facing the rectangular opening in the right side.
- Attach the terminal strips to the terminal strip plate using M2.5 x 12mm screws and M2.5 hex nuts.
- Mount the assembly to the left and right sides using M3 x 16mm screws.
- Slide the stepper drivers into the slots on the sides. (The embossed text next to each driver is intended as a visual reference aid when wiring the Nano)
- Install the work hanger using #8-32 x 1/2” truss head screws.
- Support the rings and move the calendar to a temporary vertical support.
- Pivot the stepper plates so that the rings just lift off of the ring supports. Back off just enough to make full contact of the rings to the supports and tighten the stepper plate screws.
Step 6: Wiring and Code Editing
Wiring is per the tomatoskins diagram and Hall Effect Sensor image. Note that the RTC's SCL goes to the Nano's A5 and SDA goes to A4. I chose to crimp on wire ferrules. Twisted and tinned wires will work just as well. I also chose to use DuPont connectors. Direct soldering is equally acceptable. I added a drop of hot glue at each Hall Effect Sensor to insure that they stay in position. Insure that all wiring is below the level of the sides and that wires do not interfere with the fan blades.
Download tomatoskins Circular_Calendar.ino. Edit the code as follows:
// Constants used to advance each ring one day/month. const int NUMBER_OF_DAY_TO_STEP = -1661;//1108 steps per day const int NAME_OF_MONTH_TO_STEP = -2946;//1965 steps per month const int NAME_OF_DAY_TO_STEP = -2745;//1831 steps per day const int COUNTERCLOCKWISE = -1;
// Constants used to advance each ring one day/month. const int NUMBER_OF_DAY_TO_STEP = -1239;//150T/8T*2048/31 = 1239 Steps/Date Number const int NAME_OF_MONTH_TO_STEP = -2197;//103T/8T*2048/12 = 2197 Steps/Month const int NAME_OF_DAY_TO_STEP = -2048;//56T/8T*2048/7 = 2048 Steps/Day const int COUNTERCLOCKWISE = -1;
Set the RTC date and time within the code and then upload it to the Nano.
Step 7: Final Verifications
Upon powering the calendar all (3) rings should rotate counterclockwise simultaneously until the Hall Effect Sensors are tripped by the magnets. Then all (3) rings should jog slightly if you have entered any values into this area of the code:
// Update these constants to adjust the position of the rings at the reset position.<br>// Negative numbers will advance the rings forward (counterclockwise) positive will reverse the rings. const int NUMBER_OF_DAY_RESET_ADJUST = -60; const int NAME_OF_MONTH_RESET_ADJUST = -60; const int NAME_OF_DAY_RESET_ADJUST = -60;
The values shown centered the cryptic characters within the window frames on my calendar. Your values will likely be slightly different.
Lastly, each ring will rotate individually to the correct date, month and day of the week. At midnight, the calendar will advance one day. Confirm that the calendar displays the correct information. Make sure that you have set the date and time on the RTC within the code. Adjust the stepper plates if any ring is not rotating smoothly. Adjust the values in the code if the characters are not centered in the windows.
Step 8: Conclusion
Hopefully everything is functioning as it should. Replace the work hanger with the backplate; attaching it with #8-32 x 1/2 truss head screws. Hang the calendar on the wall or build a table top stand.
I was able to achieve my goals with this project. I think the only change that I would make would be to chamfer the front of the faceplate at the window openings to allow more ambient light to reach the characters. I chose to use inexpensive MDF for this project. I think the project would look even better if made from hardwoods.
I want to thank tomatoskins and cfb70 for their inspiration and I look forward to any comments or tips that you might have. This was a fun project!
Step 9: User Requests
Spur gear DXF is in inches
SVG and STL Rings are in inches
Grand Prize in the