UltrasonicSensorServoMount

From BITPlan Wiki
Revision as of 08:05, 10 June 2019 by Wf (talk | contribs)
Jump to navigation Jump to search

<jscad> //Parametric. //Oktay Gülmez, 23/2/2016. // converted to OpenJSCAD by Wolfgang Fahl 2019-06-09 //GNU_GPL_V3

// include("Bezier.jscad")

/**

* create front Plate
*/

function frontPlate(thickness, eyes_width, eyes_diameter) {

 safety = 0.6;
 radius = eyes_diameter+2;
 radius2 = 5;
 var parts = [];
 var holes = [];
 //Front plate:
 parts.push(linear_extrude({
   height: thickness,
   convexity: 10,
   fn: 60
 }, hull(
   translate([-eyes_width / 2, 0, 0], circle({
     r: radius,
     center: true
   })),
   translate([eyes_width / 2, 0, 0], circle({
     r: radius,
     center: true
   }))
 )));
 parts.push(linear_extrude({
   height: thickness,
   convexity: 10,
   fn: 60
 }, hull(
   translate([-eyes_width / 2, 0, 0], circle({
     r: radius,
     center: true
   })),
   translate([-8, -30, 0], circle({
     r: radius2,
     center: true
   }))
 )));
 parts.push(linear_extrude({
   height: thickness,
   convexity: 10,
   fn: 60
 }, hull(
   translate([eyes_width / 2, 0, 0], circle({
     r: radius,
     center: true
   })),
   translate([8, -30, 0], circle({
     r: radius2,
     center: true
   }))
 )));
 parts.push(translate([-8, -35, 0], cube([16, 35, thickness])));
 //Transducers holes:
 for (fx = -1; fx <= 1; fx += 2) {
   holes.push(translate([fx * eyes_width / 2, 0, thickness / 2], cylinder({
     h: thickness + 2,
     r: eyes_diameter / 2 + safety,
     fn: 50,
     center: true
   })));
 }
 return difference(union(parts), union(holes));

}

//Servo mounting bracket function servoBracket() {

 radius = 8;
 radius2 = 5;
 return translate([0, -35, 0], rotate([-90, -90, 0], linear_extrude({
   height: 6,
   convexity: 10
 }, hull(
   translate([0, 0, 0], circle({
     r: radius,
     center: true
   })),
   translate([23, 0, 0], circle({
     r: radius2,
     center: true
   }))
 ))));

}

function tabsPCB_Mounting(length,width) {

 //Sensor PCB mounting tabs:
 var parts = [];
 var holes = [];
 height = 3.5;
 outer = 3;
 inner = 1;
 for (fx = -1; fx <= 1; fx += 2) {
   for (fy = -1; fy <= 1; fy += 2) {
     parts.push(translate([fx *length / 2, fy * width / 2, 0], cylinder({
       h: thickness + height,
       r: outer
     })));
     //Sensor PCB mounting screws holes:
     holes.push(translate([fx * length / 2, fy * width / 2, 1], cylinder({
       h: thickness + height,
       r: inner
     })));
   }
 }
 return difference(union(parts), union(holes));

}

function servoHead() {

 var parts = [];
 //Servo head placement:
 parts.push(translate([0, -35, 8], rotate([-90, 0, 0], cylinder({
   h: 2.5,
   r: 3.8
 }))));
 parts.push(translate([0, -35 - 1, 8], rotate([-90, 0, 0], cylinder({
   h: 8,
   r: 1.25
 }))));
 parts.push(translate([0, -35 + 4.5, 8], rotate([-90, 0, 0], cylinder({
   h: 3,
   r: 3
 }))));
 parts.push(translate([0, -35 - 1, 23], rotate([-90, 0, 0], cylinder({
   h: 8,
   r: 1
 }))));
 parts.push(translate([0, -35, 8], rotate([-90, -90, 0], linear_extrude({
   height: 2.5,
   convexity: 10
 }, hull(
   translate([0, 0, 0], circle({
     r: 3.5,
     center: true
   })),
   translate([15, 0, 0], circle({
     r: 2,
     center: true
   }))
 )))));
 return union(parts);

}

/**

* create a smile
*/

function smile(thickness) {

 /*bezier = BezierFactory.create(0,0);
 bezier.append([
   [0,15],
   [15,15]
 ]);
 return rotate([0,0,135],bezier.spline(thickness)).translate([10,0,0]);
 */

}

/**

* create a parametric ultrasonic sensor
*/

function main() {

 BezierFactory();
 //Parameters:
 //The diameter of the transducer in mm.: 16mm. mostly.
 eyes_diameter = 16;
 //Distance between centers of transducers in mm.: 25.4mm for HC-SR04.
 width = 41.5
 eyes_width = 25.4;
 //Sensor PCB mounting holes in mm.: 41.4x17 for HC-SR04.
 mount_length = 42.35;
 mount_width = 17.4;
 //Desired thickness in mm.: Maximum 5mm.
 thickness = 2.5;
 //Decorations: "1" smile, "2" teeth, "3" vampire, "4" mustage, "5" O, other for none.
 face = 1;
 fn = 20;
 var parts = [];
 var holes = [];
 parts.push(frontPlate(thickness, eyes_width, eyes_diameter));
 parts.push(servoBracket());
 parts.push(tabsPCB_Mounting(mount_length,mount_width));
 // holes.push(smile(thickness).translate([0, -20, 0]));
 holes.push(servoHead())
 //Cleaning overhang:
 holes.push(translate([-10, -35, -10], cube([20, 10, 10])));
 return difference(union(parts), union(holes));

} </jscad>