The Smell of Molten Projects in the Morning

Ed Nisley's Blog: Shop notes, electronics, firmware, machinery, 3D printing, laser cuttery, and curiosities. Contents: 100% human thinking, 0% AI slop.

Month: January 2011

  • High-Visibility Dremel Chuck Wrench

    Having just spent far too long finding this amid the rubble atop the Machine Shop bench, I wrapped some tape around the handle:

    • flare orange to find it on the bench
    • retroreflective to find it under the bench

    Now it lives on a hook in the floor joist over the bench, right next to the hook where the tool + flexy shaft hangs most of the time.

    High-viz Dremel chuck wrench
    High-viz Dremel chuck wrench
  • Cabin Fever Tchotchke: Engraved Dog Tag

    Once again I’m planning to attend the Cabin Fever Expo in York; my shop assistant says this year she won’t barf in the kitchen sink Thursday evening just before bedtime…

    If I’m going to haul a Sherline CNC setup that far and spend all day talking machining, I must have some tchotchkes / swag to talk about. We figured a small plastic dog tag with relevant URLs would be appropriate.

    Cabin Fever Dog Tag
    Cabin Fever Dog Tag

    I modeled the tag after my father’s WWII tag, including the mysterious notch. The rounded ends actually have three curves: two small fairing arcs blend the sides into the end cap.

    The G-Code routine figures out all the coordinates and suchlike from some basic physical measurements & guesstimates, so tweaking the geometery is pretty straightforward. There was a blizzard going on while I wrote it: a fine day to spend indoors hacking code.

    My assistant fired up Inkscape, laid out the text, figured out how to coerce G-Code out of Inkscape using the cnc-club.ru extension, then aligned it properly with the center of the chain hole as the origin on the right side. My routine calls the text G-Code file as a subroutine.

    The extension’s header and footer files wrap EMC2’s SUB / ENDSUB syntactic sugar around the main file. The default files include an M2 that kills off the program; took a while to track that one down.

    The header file:

    O<dogtagtext> SUB
    

    And the matching footer file:

    O<dogtagtext> ENDSUB
    

    The Inkscape-to-gcode instructions come out with absolute coordinates relative to the origin you define when you create the layout. The nested loops in my wrapper slap a G55 coordinate offset atop each label in turn, then call the subroutine.

    The result is pretty slick:

    Screenshot: AXIS Dog Tags
    Screenshot: AXIS Dog Tags

    I carved out that proof-of-concept label atop double-sided adhesive tape, but peeling off the goo is a real pain; a 2×3 array will be much worse. I’d rather do that than figure out how to clamp the fool things to the sacrificial plate, though.

    The engraving is 0.2 mm deep with a Dremel 30 degree tool. My shop assistant describes it as “disturbing” the acrylic, not actually engraving a channel. This isn’t entirely a Bad Thing, as the font isn’t quite a stick font and the outline of each character mushes together. We must fiddle with the font a bit more; she favors a boldified OCR-A look.

    Some lessons:

    • The Kate G-Code syntax highlighter isn’t down with EMC2’s dialect
    • Be very sure you touch off the workpiece origin in G54, not G55
    • Xylene doesn’t bother acrylic and works fine on tape adhesive
    • Symlinks aimed across an NFS link work fine in ~/emc2/nc_files/
    • That 2×3 array may be too big for the Sherline’s tooling plate
    • Tool length probing FTW!

    The G-Code:

    (Cabin Fever 2011 Dogtag)
    (Ed Nisley - KE4ZNU - December 2010)
    (Origin at center of chain hole near right side)
    (Stock held down with double-stick tape)
    
    (--------------------)
    (Flow Control)
    
    #<_DoText>      = 1
    #<_DoDrill>     = 1
    #<_DoMill>      = 1
    
    ( Sizes and Shapes)
    
    (-- Tag array layout)
    
    #<_NumTagsX>    = 3                         (number of tags along X axis)
    #<_NumTagsY>    = 2                         ( ... Y axis)
    
    #<_TagSpaceX>   = 60                        (center-to-center along X axis)
    #<_TagSpaceY>   = 35                        ( ... Y axis)
    
    (-- Tag Dimensions)
    
    #<_TagSizeX>    = 50.8                      (2.0 inches in WWII!)
    #<_TagSizeY>    = 28.6                      (1-1/8 inches)
    #<_TagSizeZ>    = 2.0
    
    #<_HoleOffsetX> = 4.0                       (hole center to right-side tag edge)
    
    #<_NotchSizeX>      = 3.5                   (locating notch depth from far left edge)
    #<_NotchCtrY>       = 5.0                   (locating notch from Y=0)
    
    #<_NotchAngleBot>   = 30                    (lower angle in notch)
    #<_NotchAngleTop>   = 45                    (upper angle in notch)
    
    (-- Fairing Curve Dimensions as offsets from end arc center)
    
    #<_EndFairR>    = [0.68 * #<_TagSizeY>]
    #<_CornerFairR> = [0.25 * #<_TagSizeY>]
    
    #<_PCRadius>    = [#<_EndFairR> - #<_CornerFairR>]
    #<_PCY>         = [[#<_TagSizeY> / 2] - #<_CornerFairR>]
    #<_PCTheta>     = ASIN [#<_PCY> / #<_PCRadius>]
    #<_PCX>         = [#<_PCRadius> * COS [#<_PCTheta>]]
    
    #<_P1Y>         = [#<_TagSizeY> / 2]                    (top / bottom endpoint)
    #<_P1X>         = #<_PCX>
    
    #<_P2X>         = [#<_EndFairR> * COS [#<_PCTheta>]]
    #<_P2Y>         = [#<_EndFairR> * SIN [#<_PCTheta>]]
    
    (-- Tooling)
    
    #<_TraverseZ>   = 1.0                       (safe clearance above workpiece)
    
    #<_DrillDia>    = 3.2                       (drill for hole and notch)
    #<_DrillNum>    = 1                         ( ... tool number)
    #<_DrillRadius> = [#<_DrillDia> / 2]
    #<_DrillFeed>   = 200                       (drill feed for holes)
    #<_DrillRPM>    = 3000
    
    #<_MillDia>     = 3.2                       (mill for outline)
    #<_MillNum>     = 1                         ( ... tool number)
    #<_MillRadius> = [#<_MillDia> / 2]
    #<_MillFeed>    = 150                       (tool feed for outlines)
    #<_MillRPM>     = 5000
    
    #<_TextDia>     = 0.1                       (engraving tool)
    #<_TextNum>     = 1
    #<_TextFeed>    = 600                       (tool feed for engraving)
    #<_TextRPM>     = 10000
    
    (-- Useful calculated values)
    
    #<_TagRightX>   = #<_HoleOffsetX>           (extreme limits of tag in X)
    #<_TagLeftX>    = [#<_TagRightX> - #<_TagSizeX>]
    
    #<_EndFairRtX>  = [#<_TagRightX> - #<_EndFairR>]
    #<_EndFairLfX>  = [#<_TagLeftX> + #<_EndFairR>]
    
    #<_NotchCtrX>   = [#<_TagLeftX> + #<_NotchSizeX> - #<_DrillRadius>]
    
    (--------------------)
    (--------------------)
    ( Initialize first tool length at probe switch)
    (    Assumes G59.3 is still in machine units, returns in G54)
    ( ** Must set these constants to match G20 / G21 condition!)
    
    #<_Probe_Speed>     = 400            (set for something sensible in mm or inch)
    #<_Probe_Retract>   =   1            (ditto)
    
    O<Probe_Tool> SUB
    
    G49                     (clear tool length compensation)
    G30                     (move above probe switch)
    G59.3                   (coord system 9)
    
    G38.2 Z0 F#<_Probe_Speed>           (trip switch on the way down)
    
    G0 Z[#5063 + #<_Probe_Retract>]     (back off the switch)
    
    G38.2 Z0 F[#<_Probe_Speed> / 10]    (trip switch slowly)
    
    #<_ToolZ> = #5063                    (save new tool length)
    
    G43.1 Z[#<_ToolZ> - #<_ToolRefZ>]    (set new length)
    
    G54                     (coord system 0)
    G30                     (return to safe level)
    
    O<Probe_Tool> ENDSUB
    
    (-------------------)
    (-- Initialize first tool length at probe switch)
    
    O<Probe_Init> SUB
    
    #<_ToolRefZ> = 0.0      (set up for first call)
    
    O<Probe_Tool> CALL
    
    #<_ToolRefZ> = #5063    (save trip point)
    
    G43.1 Z0                (tool entered at Z=0, so set it there)
    
    O<Probe_Init> ENDSUB
    
    (--------------------)
    (Start machining)
    
    G40 G49 G54 G80 G90 G94 G97 G98     (reset many things)
    
    G21                                 (metric!)
    
    (msg,Verify G30.1 position in G54 above tool change switch)
    M0
    (msg,Verify XYZ=0 touched off at left front tag hole center on surface)
    M0
    
    O<Probe_Init> CALL
    T0 M6                           (clear the probe tool)
    
    (-- Engrave Text)
    
    O<DoText> IF [#<_DoText>]
    
    (msg,Insert engraving tool)
    T#<_TextNum> M6         (load engraving tool)
    O<Probe_Tool> CALL
    
    F#<_TextFeed>
    S#<_TextRPM>
    
    (debug,Set spindle to #<_TextRPM>)
    M0
    
    G0 X0 Y0                (get safely to first tag)
    G0 Z#<_TraverseZ>       (to working level)
    
    G10 L20 P2 X0 Y0 Z#<_TraverseZ>         (set G55 origin to 0,0 at this point)
    G55                                     (activate G55 coordinates)
    
    O3000 REPEAT [#<_NumTagsX>]
    
    O3100 REPEAT [#<_NumTagsY>]
    
    O<dogtagtext> CALL
    
    G0 X0 Y0
    G10 L20 P2 Y[0 - #<_TagSpaceY>]         (set Y orgin relative to next tag in +Y direction)
    
    O3100 ENDREPEAT
    
    G10 L20 P2 X[0 - #<_TagSpaceX>] Y[[#<_NumTagsY> - 1] * #<_TagSpaceY>] (next to +X, Y to front)
    
    O3000 ENDREPEAT
    
    G54                                     (bail out of G55 coordinates)
    
    (-- Drill holes)
    
    O<DoDrill> IF [#<_DoDrill>]
    
    T0 M6
    (msg,Insert drill)
    T#<_DrillNum> M6
    O<Probe_Tool> CALL
    
    F#<_DrillFeed>
    S#<_DrillRPM>
    
    #<_DrillZ> = [0 - #<_TagSizeZ> - #<_DrillRadius>]
    
    (debug,Set spindle to #<_DrillRPM>)
    M0
    
    G0 X0 Y0                (get safely to first tag)
    G0 Z#<_TraverseZ>       (to working level)
    
    #<IndexX> = 0
    O1000 DO
    
    #<IndexY> = 0
    O1100 DO
    
    #<TagOriginX> = [#<IndexX> * #<_TagSpaceX>]
    #<TagOriginY> = [#<IndexY> * #<_TagSpaceY>]
    
    G81 X#<TagOriginX> Y#<TagOriginY> Z#<_DrillZ> R#<_TraverseZ>
    G81 X[#<TagOriginX> + #<_NotchCtrX>] Y[#<TagOriginY> + #<_NotchCtrY>] Z#<_DrillZ> R#<_TraverseZ>
    
    #<IndexY> = [#<IndexY> + 1]
    O1100 WHILE [#<IndexY> LT #<_NumTagsY>]
    
    #<IndexX> = [#<IndexX> + 1]
    O1000 WHILE [#<IndexX> LT #<_NumTagsX>]
    
    G30     (go home)
    
    O<DoDrill> ENDIF
    
    (-- Machine outlines)
    
    O<DoMill> IF [#<_DoMill>]
    
    T0 M6                   (eject drill)
    (msg,Insert end mill)
    T#<_MillNum> M6         (load mill)
    O<Probe_Tool> CALL
    
    F#<_MillFeed>
    S#<_MillRPM>
    
    (debug,Set spindle to #<_MillRPM>)
    M0
    
    G0 X0 Y0                (get safely to first tag)
    G0 Z#<_TraverseZ>       (to working level)
    
    G10 L20 P2 X0 Y0 Z#<_TraverseZ>         (set G55 origin to 0,0 at this point)
    G55                                     (activate G55 coordinates)
    
    O2000 REPEAT [#<_NumTagsX>]
    
    O2100 REPEAT [#<_NumTagsY>]
    
    G0 X[#<_NotchCtrX>] Y[#<_NotchCtrY>]     (get to center of notch hole)
    G0 Z[0 - #<_TagSizeZ>]                      (down to cutting level)
    
    G91                                         (relative coordinate for notch cutting)
    G1 X[0 - #<_NotchSizeX>] Y[0 -  #<_NotchSizeX> * TAN [#<_NotchAngleBot>]]
    G1 X[0 + #<_NotchSizeX>] Y[0 +  #<_NotchSizeX> * TAN [#<_NotchAngleBot>]]
    G1 X[0 - #<_NotchSizeX>] Y[0 +  #<_NotchSizeX> * TAN [#<_NotchAngleTop>]]
    G90                                         (back to abs coords)
    
    G42.1 D#<_MillDia>                          (cutter comp to right)
    G1 X[#<_TagLeftX>] Y0                       (comp entry move to tip of left endcap)
    
    G3 X[#<_EndFairLfX> - #<_P2X>] Y[0 - #<_P2Y>] I[#<_EndFairR>] J0    (left endcap front half)
    
    G3 X[#<_EndFairLfX> - #<_P1X>] Y[0 - #<_P1Y>] I[#<_P2X> - #<_PCX>] J[#<_P2Y> - #<_PCY>]
    
    G1 X[#<_EndFairRtX> + #<_P1X>]                                      (front edge)
    
    G3 X[#<_EndFairRtX> + #<_P2X>] Y[0 - #<_P2Y>] I0 J[#<_CornerFairR>]
    
    G3 X[#<_EndFairRtX> + #<_P2X>] Y[#<_P2Y>] I[0 - #<_P2X>] J[#<_P2Y>]    (right endcap)
    
    G3 X[#<_EndFairRtX> + #<_P1X>] Y[#<_P1Y>] I[#<_PCX> - #<_P2X>] J[#<_PCY> - #<_P2Y>]
    
    G1 X[#<_EndFairLfX> - #<_P1X>]                                      (rear edge)
    
    G3 X[#<_EndFairLfX> - #<_P2X>] Y[#<_P2Y>] I0 J[0 - #<_CornerFairR>]
    
    G3 X[#<_EndFairLfX> - #<_P2X>] Y[0 - #<_P2Y>] I[#<_P2X>] J[0 - #<_P2Y>]    (left endcap complete)
    
    G0 Z#<_TraverseZ>
    
    G40
    
    G0 X0 Y0
    G10 L20 P2 Y[0 - #<_TagSpaceY>]         (set Y orgin relative to next tag in +Y direction)
    
    O2100 ENDREPEAT
    
    G10 L20 P2 X[0 - #<_TagSpaceX>] Y[[#<_NumTagsY> - 1] * #<_TagSpaceY>] (next to +X, Y to front)
    
    O2000 ENDREPEAT
    
    G54                                     (bail out of G55 coordinates)
    
    G30         (go home)
    
    O<DoMill> ENDIF
    
    M2
    
    

    The doodles leading to the equations:

    Dog Tag Geometry Doodles
    Dog Tag Geometry Doodles

    We’ll see you there!

  • Blog Summary – 2010

    The numbers as of yesterday:

    Site State - Per Day - Dec 2010
    Site State – Per Day – Dec 2010

    That green block highlights the flash mob from hackaday.com descending on the bed bug posts; other than that, things are pretty quiet around here.

    Half of the daily traffic arrives by search engine for topics of general interest. The hackaday firestorm skews the numbers (the Alpha Geek clock was hackaday’s favorite a year ago), but a few other topics peek through.

    Views	Title
    73159	Home page
    6063	Bed Bugs: Wrapup
    5754	Bed Bugs: Hot Box Disinsector
    5148	Changing the Arduino PWM Frequency
    3688	Arduino Hardware-assisted SPI: Synchronous Serial Data I/O
    2823	Arduino Command Line Programming: Avrdude Puzzlement
    2768	Ubuntu 9.10 Partition Backup: ext4 vs partimage vs dd
    2751	Bed Bugs: Overview
    2450	Alpha-Geek Clock
    2291	Ubuntu 9.10 HAL FDI: Input Device Configuration - Kensington Expert Mouse FAIL
    2202	Finding Transformer Pi Model Parameters
    2184	Arduino vs. ATMega168 Chip Pinouts
    2091	Bed Bugs: Infestation and Breeding
    2019	Arduino Fast PWM: Faster
    1981	Sherline Mill Counterweight Gantry
    1890	Cold & Fractured Solder Joints
    1851	Bed Bugs: Dying on Planet Sticky
    1848	Bed Bugs: Living on Planet Sticky
    1830	Bed Bugs: Assured Destruction
    1734	Bed Bugs: Killing Fields
    1692	Bed Bugs: Traps From Planet Powder
    1637	Bed Bugs: Thermal Kill
    1488	Dell GX270 Auto-On Power Setting
    1481	Bed Bugs: Lures
    1364	Removing a Water Heater Anode Rod
    1356	Bed Bugs: Disinsecting the Bedroom
    1352	Arduino LiquidCrystal Library vs Old HD44780 LCD Controller
    1319	Bed Bugs: Furniture Isolation
    1208	Kensington Expert Mouse Trackball: Scroll Ring Troubles
    1199	Camera Microscope Adapter
    1193	Bed Bugs: Pesticides
    1177	Sunglasses Repair: Half a Hinge Is Better Than None
    1152	Kubuntu Remote Desktop via SSH Tunnel
    1123	Mysterious USB Disconnects
    1039	Recumbent Bicycle Amateur Radio Antenna Mount
    1027	American Standard Elite Kitchen Faucet Disassembly
    1005	Bullet Hole in Plate Glass
    

    The search terms are fascinating, at least to me:

    Views	Search
    832	arduino pwm frequency
    795	arduino pwm
    500	arduino pinout
    460	chain catcher
    433	milling
    408	arduino spi
    397	staghorn beetle
    357	transformer model
    355	atmega168 pinout
    351	atmega328 pinout
    317	cold solder joints
    255	cold solder joint
    253	bellows
    245	partimage ext4
    231	avid rollamajig
    226	triple alert redemption
    214	arduino fast pwm
    203	sherline
    193	avrdude arduino
    192	arduino command line
    176	photoresistor circuit
    172	turkey hen
    162	camera microscope
    160	kubuntu remote desktop
    158	magnetizer
    155	front derailleur cable
    147	dl1414
    145	sinking ship
    145	arduino avrdude
    144	cold solder
    140	resistance soldering
    137	hen turkey
    134	rollamajig
    130	pspice transformer
    125	giant swallowtail butterfly
    123	milling projects
    122	the smell of molten projects
    121	arduino struct
    121	visible light blocking filter
    116	swallowtail butterfly
    115	rats leaving a sinking ship
    115	dragonfly
    109	tektronix 492
    109	taxact vs turbotax
    108	garrotte
    108	bob yak
    107	hv transformer
    107	nielsen tv survey
    107	arduino cnc
    107	sherline mill
    106	ss president coolidge
    105	if you can read this roll me over
    105	wwvb receiver
    104	trackball
    104	pwm arduino
    101	stag horn beetle
    101	backup ext4
    101	scratch paper
    

    I knew Arduino hardware and programming was interesting, but I would not ever have predicted that the fourth most popular search term would land there! Must be a lot of bicyclists with chain troubles out there…

    And I seem to be the go-to guy for pictures of staghorn beetles and turkey hens. Who knew?

    So much for my tech interests…