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.

Day: November 5, 2011

  • Logitech Ball Camera Tripod Adapter

    The Logitech notebook webcam that peers into the Thing-O-Matic has terrible dynamic range compensation; turning on the LED ring light washes out the image something awful. An old Logitech ball camera seems better, but it sits atop a rubbery dingus adapted to grip huge old laptops. So I built an adapter with a standard 1/4-20 tripod screw thread in the bottom that ought to make it more useful.

    The old & new mounts compared:

    Logitech ball camera mounts
    Logitech ball camera mounts

    The color change comes from switching to yellow filament for an upcoming larger object.

    The solid model shows those tiny little notches will require a bit of riffler file work:

    Logitech camera tripod adapter - solid model
    Logitech camera tripod adapter – solid model

    The bottom has a blind 1/4-20 tapped hole. Lacking a bottoming tap, not having any broken 1/4-20 taps, and being unwilling to grind the end off a perfectly good taper tap, I filed three notches along a bolt. Ran the taper tap in until it hit bottom, ran the bolt in likewise, and defined the result to be Good Enough:

    Homebrew bottoming tap
    Homebrew bottoming tap

    On the other end, the most probable failure will leave that delicate little post jammed firmly inside the camera’s socket. There’s not enough post to allow printing a small guide hole, but there’s no real need for one; I drilled a #50 hole right down the middle, ran a 2-56 screw into it without tapping the hole, and filed the screw head flat:

    Camera mount with filed screw
    Camera mount with filed screw

    After cleaning up those notches, it snapped solidly into place:

    Logitech ball camera with mount
    Logitech ball camera with mount

    And then the camera sits neatly atop a cheap Gorillapod knockoff:

    Logitech ball camera on tripod
    Logitech ball camera on tripod

    That tiny reddish dot in the middle of the imposing set of rings marks the actual lens, so it’s more of a pinhole camera than anything else. The fixed focus kicks in beyond a meter, but a bit of rummaging in the Box o’ Lenses produced a random meniscus lens that pulled the focus in to maybe 100 mm. Alas, that means the camera must float in mid-air about 15 mm inside the Thing-O-Matic’s box. If I can conjure up a mount that holds the ball inside the box, above-and-forward of the stage, that’d work great. VLC can allegedly rotate the image upside-down, so maybe I can mount it bottom-up.

    Here’s everything I know about those two cameras, with the ball camera on top and the webcam on the bottom:

    Logitech ball and notebook webcam data
    Logitech ball and notebook webcam data

    Apparently it’s easier to put that information on a tag than provide a good old data plate on the camera body.

    The OpenSCAD source code:

    // Tripod mount for Logitech ball camera
    // Ed Nisley KE4ZNU - Oct 2011
    
    include </home/ed/Thing-O-Matic/lib/MCAD/units.scad>
    include </home/ed/Thing-O-Matic/Useful Sizes.scad>
    include </home/ed/Thing-O-Matic/lib/visibone_colors.scad>
    
    //-------
    //- Extrusion parameters must match reality!
    //  Print with +0 shells and 3 solid layers
    
    ThreadThick = 0.33;
    ThreadWidth = 2.0 * ThreadThick;
    
    HoleFinagle = 0.2;
    HoleFudge = 1.02;
    
    function HoleAdjust(Diameter) = HoleFudge*Diameter + HoleFinagle;
    
    function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
    
    Protrusion = 0.1;			// make holes end cleanly
    
    //-------
    // Dimensions
    
    BallDia = 60.0;				// camera ball
    BallRad = BallDia/2;
    
    BaseDia = 16.0;				// interface at tripod surface
    BaseRad = BaseDia/2;
    
    BaseLength = 10.0;			// to base of ball
    
    BoltDia = Tap025_20;		// standard 1/4-20 thread
    BoltLength = 7.0;
    
    StemLength = 8.5;
    StemDia = 4.7;
    StemRad = StemDia/2;
    
    FlangeWidth = 6.6;
    FlangeThick = 2.6;
    
    NotchSectionDia = 1.4;		// toroid cross-section diameter
    NotchSectionRad = NotchSectionDia/2;
    NotchOffset = 2.3;			// from top of stem
    
    //-------
    
    module PolyCyl(Dia,Height,ForceSides=0) {			// based on nophead's polyholes
    
      Sides = (ForceSides != 0) ? ForceSides : (ceil(Dia) + 2);
    
      FixDia = Dia / cos(180/Sides);
    
      cylinder(r=HoleAdjust(FixDia)/2,h=Height,$fn=Sides);
    }
    
    module ShowPegGrid(Space = 10.0,Size = 1.0) {
    
      Range = floor(50 / Space);
    
    	for (x=[-Range:Range])
    	  for (y=[-Range:Range])
    		translate([x*Space,y*Space,Size/2])
    		  %cube(Size,center=true);
    
    }
    
    //-------
    //
    
    ShowPegGrid();
    
    translate([0,0,BaseLength])
      union() {
    	difference() {
    	  translate([0,0,-BaseLength])
    		cylinder(r=BaseRad,h=2*BaseLength);
    	  translate([0,0,BallRad])
    		sphere(r=BallRad);
    	  translate([0,0,-(BaseLength + Protrusion)])
    		PolyCyl(BoltDia,(BoltLength + Protrusion));
    	}
    	rotate(180/16)
    	  cylinder(r=StemRad,h=StemLength,$fn=16);
    	difference() {
    	  translate([0,0,StemLength/2])
    		cube([FlangeWidth,FlangeThick,StemLength],center=true);
    	  translate([0,0,(StemLength - NotchOffset)])
    		rotate_extrude(convexity=3,$fn=64)
    		  translate([FlangeWidth/2,0,0])
    			circle(r=NotchSectionRad,$fn=16);
    	  translate([0,-FlangeWidth/2,StemLength + sqrt(FlangeWidth)])
    		rotate([0,45,0])
    		  cube(FlangeWidth + 2*Protrusion);
    	  translate([0,FlangeWidth/2,StemLength + sqrt(FlangeWidth)])
    		rotate([0,45,180])
    		  cube(FlangeWidth + 2*Protrusion);
    	}
      }