Loading

Protective mounting case for iMacwear W1 (a.k.a. DM98)

by garlopf, published

Protective mounting case for iMacwear W1 (a.k.a. DM98) by garlopf Aug 5, 2017
0 Share
Download All Files

Thing Apps Enabled

Order This Printed View All Apps

Design Tools

OpenSCAD

Use This Project

Give a Shout Out

If you print this Thing and display it in public proudly give attribution by printing and displaying this tag.

Print Thing Tag

Thing Statistics

69Views 2Downloads Found in Robotics

Summary

Rugged case to allow mounting iMacwear's W1 wearable Android watch to be mounted on mobile robot

Original design: Lennart Rolland.
For project: OctoMY™ (http://octomy.org).
Description: This is a protective case to make the iMacwear W1 wearable android device, a.k.a. DM98 (link to unboxing of this device here)usable on a mobile robot. The case serves the flowing purposes:

  • Ruggedizes the device to protected from whatever mechanical dangers are lurking in the world of mobile robots.
  • Makes maintaining a permanent retention of the magnetic USB charging/data cable more convenient.
  • Makes attaching the device to RC servo or many other convenient mounting options possible (just add your own geometry to match whatever mounting requirements you may have).

Please note: This is a prototype design that may already have been superseded.

Pros

  • Really tight fit
  • Super light
  • Perfect fit with servo horn
  • Almost snap-on attachment
  • Even looks kind of cool!
  • Retains the cable surprisingly well
  • Very modular and parametereized design that can easily be adapted in all kinds of ways

Cons

  • A bit more fragile than I had hoped. Risk of cracking along layer lines when snapping it in

Overal: Albeit the obvious room for improvement I am still quite happy with the result!

Standard disclaimer: This work is provided as a convenience and for informational purposes only. The original author assumes no responsibility for any adverse effects that may arrise from this work.

Copyright / license: I hereby place this work into the public domain, though if you want to show appreciation and you have robot parts to spare, please consider donating them to the OctoMY™ project http://www.octomy.org/contribute/donation ).

Print Settings

Printer:

Creality CR10

Rafts:

Yes

Supports:

Yes

Resolution:

$fn=120

Infill:

100% (model is only a shell)


Notes:

Due to the fine details of the case, I would recommend that you use as low layer height and slow print speed as time allows for in your project.

Post-Printing

Preparing the W1 for insertion

The W1 has wrist bands extruding from the main body, and they contain the WiFi and GSM antennas for the android device.

If you want to remove the wrist bands, you have to be very careful. I recommend taking of the back lid first and unscrewing the wrist supports (aluminium and plastic parts that keep each strap mounted well). There are two fasteners holding down the support for each strap.

I ended up just tearing of the strips with pliers which in turn broke the antennas. The antennas can be disconnected by two tiny snap on coaxial connectors, and I am hoping to find replacement antennas.

After removing the straps there are still two protrusions on each side of the case. The design is made with those in mind.

This is the backside of the watch showing (faintly) the metal bezels holding the straps

On the leftmost strap the mount is clearly visible

I have marked WiFi & GSM antenna snap-on connectors and approxiamte location of screws for strap mounts.

The watch running an old version of OctoMY™ agent. Pretty awesome!

Getting the case on for the first time...

So, you know the first time there is going to be some anxiety. But don't worry, we have you covered. Instead of lube try a little exposure to light hair-dryer.

Be careful not to go too far, it will go all jelly on you!

How I Designed This

Made with OpenSCAD

This was made from the ground up in OpenSCAD to be very modular and adaptible.

I have commented each module in the hope that someone else might make sense of it all.

I have included the entire file here for searchability:


$fn=120;
tolerance=0.2;

function hex_dia(dia) = dia * ( 2 / sqrt (3) );

function normalize(v) = v/(sqrt(v[0]*v[0] + v[1]*v[1]));

// General purpose 2D voronoi function used to make structural enhancement
module voronoi(points, L=200, thickness=0.2, rounding=6){
    for (p=points){
        difference(){
            minkowski(){
            intersection_for(p1=points){
                if (p!=p1){
                    translate((p+p1)/2 - normalize(p1-p) * (thickness+rounding)){
                    angle=90+atan2(p[1]-p1[1], p[0]-p1[0]);
                        rotate([0,0,angle])
                        translate([-L,-L])
                        square([2*L, L]);
                    }
                }
            }
            circle(r=rounding);
            }

        }
    }
}

// Utility function to make a rounded rectangular prism using minowski
module rounded_prism(length=1, width=1, height=1, rounding=0.1){
        linear_extrude(height=height){
            minkowski(){
                resize([length-rounding,width-rounding])square(center=true);
                circle(r=rounding/2);
            }
        }
}

// Utility function to make a rounded box using minowski
module rounded_box(length=1, width=1, height=1, rounding=0.1){
    minkowski(){
        resize([length-rounding,width-rounding,height])cube(center=true);
        sphere(r=rounding/2);
    }
}

// The straps and strap mounts of the W1
module strap(length=33, width=20, height=10){
    color("green")difference(){
        rotate([0,0,0])cube([34,20,12], center=true);
        translate([0,13,0])cube([35,21,60], center=true);
        // If you remove the straps so that only strap mounts of the housing remains, you must comment out the following line
        translate([0,0,0])cube([35-10,21,60], center=true);
    }
}

// The gold contactors for the cable and cable mount (only for comparison, not useful in the print)
module contactors(){
    num=4;
    space=9/3;
    diameter=1.5;
    height=1;
    center=(space*(num-1))/2;
    for(i=[0:space:space*(num-1)]){
        color("Goldenrod")translate([0,i-center,0.2])cylinder(diameter=diameter, height=height);
    }
}

// Voronoi based decoration (and mechanical strengthening) for the case
module voronoi_decoration(length= 60,width=60, height=30, resolution=10, thickness=0.2, rounding=0.3, randomness=0.6){
    xs=length/resolution;
    ys=width/resolution;
    rand=rands(0,1,(xs+1)*(ys+1)*2*resolution, seed_value=1337);
    //echo(rand);
    point_set = [
    for (y = [0:resolution:width])
        for (x = [0:resolution:length])
            [ x+rand[x*xs+y]*randomness*resolution, y+rand[x*ys+y]*randomness*resolution ]
    ];
        //echo(point_set);
        translate([-length/2,-width/2, -height/2])linear_extrude(convexity=10, h=height*2)voronoi(points=point_set, L=max(width, length)*2, thickness=thickness, rounding=rounding);
}

// Cutout for only the toothed wheel of RC servo horn
module servo_horn_cutout( tooth_count = 25, tooth_height = 0.3, tooth_length = 0.7, tooth_width = 0.1, head_diameter = 5.92, head_height = 4, head_thickness=0.7, head_screw_diameter=2, screw_area_height=2, screw_area_diameter=4, clearance=0.02) {
    union(){
         cylinder(r = head_diameter / 2 - tooth_height + 0.03 +clearance, h = head_height, $fn=tooth_count*2);
         for (i = [0 : tooth_count]) {
              rotate([0, 0, i * (360 / tooth_count)]) {
                    translate([0, head_diameter / 2 - tooth_height +clearance, 0]) {
                        linear_extrude(height = head_height) {
                            polygon([[-tooth_length / 2, 0], [-tooth_width / 2, tooth_height], [tooth_width / 2, tooth_height], [tooth_length / 2,0]]);
                        }
                    }
              }
         }

    }
}

// Cutout for the attachment point for RC servo including toothed wheel, screw hole and access
module servo_horn_attachment_cutout(tooth_count = 25, tooth_height = 0.3, tooth_length = 0.7, tooth_width = 0.1, head_diameter = 5.92, head_height = 4, head_thickness=0.7, head_screw_diameter=2, screw_area_height=2, screw_area_diameter=4, clearance=0.02){
    servo_horn_cutout( tooth_count, tooth_height, tooth_length, tooth_width, head_diameter, head_height, head_thickness, head_screw_diameter, screw_area_height, screw_area_diameter, clearance );
    translate([0,0,head_height+screw_area_height])cylinder(r1 = screw_area_diameter / 2 + head_thickness ,r2 = (screw_area_diameter / 2 + head_thickness)*1.1, h = head_height );
        translate([0,0,head_height])cylinder(r = head_screw_diameter / 2, h = screw_area_height);
}

// Cutout for the cable
module cable_cutout(length=22, width=6, height=6, rounding=5){
    color("red")union(){
        rounded_prism(width+tolerance,length+tolerance,height+tolerance, rounding);
        translate([0,0,2])rotate([0,90,0])rounded_prism(3.5+tolerance,7+tolerance,40+tolerance, 3);
    }
    translate([0,0,6-0.5])contactors();
}

// Main cutout for the shell
module main_cutout(length=60, width=43.5, height=14.5, rounding=12){
    strap_height=10;
    strap_height_offset=-1;
    power_port_indent_h=1;
    power_port_offset=11;
    port_h=10;
    port_l=20;
    port_r=6;
    bezel_h=2;
    bezel_d=2;
    union(){
        difference(){
            color("blue")translate([0,0,height+rounding/2-tolerance])rounded_box(length=length, width=width, height=height*2, rounding=rounding);
            color("cyan")translate([0,0,height*2-bezel_h])cube([length+1, width+1, height*2], center=true);
            //color("yellow")translate([length/2+port_l/2-power_port_offset,0,-port_h+power_port_indent_h ])rounded_prism(port_l,22,port_h, port_r);
        }
        color("LightSkyBlue")translate([0,0,height-bezel_h])rounded_prism(length-bezel_d, width-bezel_d, bezel_h, (rounding*(length-bezel_d))/length );
        strap_ofs=length/2-7.1;
        translate([0,0,-strap_height/2 + height - strap_height_offset]){
            translate([0,-strap_ofs,0])strap(33,20,strap_height);
            translate([0,strap_ofs,0])rotate([0,0,180])strap(33,20,strap_height);
        }
        translate([length/2-7.5,0,0])contactors();

        translate([length/2-7.5,0,-5])cable_cutout();
    }
}

// The complete object
module complete_w1_holder(){
    length=60;
    width=44;
    thickness=3;
    h=4;
    difference(){
        union(){
            translate([0,0,h/2+6])rounded_box(length=length+thickness, width=width+thickness, height=h, rounding=15);
            translate([length/2-7.5,0,2.5])rounded_box(length=8+thickness, width=24+thickness, height=6, rounding=8);
            difference(){
                grid_t=thickness*0.2;
                color("red")translate([0,0,h/2+6-grid_t])rounded_box(length=length+thickness+grid_t, width=width+thickness+grid_t, height=h, rounding=15);
                color("white")voronoi_decoration(length*0.8,width*0.8, h*2,6,grid_t,0.2,0.2);
            }
            color("gray")translate([0,-19,7])rotate([90,0,0])cylinder(d1=14, d2=9,h=10);
        }
        color("yellow")translate([0,-width/2-8,7])scale([1,-1,1])rotate([90,0,0])servo_horn_attachment_cutout();
        color("indigo")translate([length/2,0,15])rounded_box(length=300, width=9+thickness, height=12+thickness, rounding=2);
        color("magenta")translate([length/2,-13,9])rounded_box(length=thickness, width=thickness, height=thickness, rounding=2);
        translate([0,0,10/2+14])cube([80,60,10], center=true);
        main_cutout(length=length, width=width);
    }

}

rotate([-90,0,0])intersection(){
    //servo_horn_cutout();
    //main_cutout();
    complete_w1_holder();
    //contactors();
    //translate([length/2-7.5,0,-5])cable_cutout();
    //Cable holder
    //  color("pink")translate([25,0,-12])cube([20,30,30], center=true);
}

More from Robotics

view more

All Apps

3D Print your file with 3D Hubs, the world’s largest online marketplace for 3D printing services.

App Info Launch App

Auto-magically prepare your 3D models for 3D printing. A cloud based 3D models Preparing and Healing solution for 3D Printing, MakePrintable provides features for model repairing, wall thickness...

App Info Launch App

Kiri:Moto is an integrated cloud-based slicer and tool-path generator for 3D Printing, CAM / CNC and Laser cutting. *** 3D printing mode provides model slicing and GCode output using built-in...

App Info Launch App
KiriMoto Thing App

With 3D Slash, you can edit 3d models like a stonecutter. A unique interface: as fun as a building game! The perfect tool for non-designers and children to create in 3D.

App Info Launch App

Print through a distributed network of 3D printing enthusiasts from across the US, at a fraction of the cost of the competitors. We want to change the world for the better through technology, an...

App Info Launch App

Quickly Scale, Mirror or Cut your 3D Models

App Info Launch App

3D Print a wide range of designs with Treatstock. Easy to use tools to get the perfect result. The global 3D printing network that connects you with high-quality and fast working print services nea...

App Info Launch App
Top