Add ports info module openscad
This commit is contained in:
parent
93230c3736
commit
fee25c654f
3 changed files with 1557 additions and 0 deletions
1095
src/modules/info_ports/gears.scad
Normal file
1095
src/modules/info_ports/gears.scad
Normal file
File diff suppressed because it is too large
Load diff
242
src/modules/info_ports/info_ports.scad
Normal file
242
src/modules/info_ports/info_ports.scad
Normal file
|
@ -0,0 +1,242 @@
|
|||
$fn=100;
|
||||
/* portheight = 37; */
|
||||
|
||||
// distance between mounting holes
|
||||
mounting_hole_dist=[25, 25, 22, 46];
|
||||
|
||||
// size of physical ports
|
||||
port_sizes=[30, 30, 29 ,53];
|
||||
ports = len(port_sizes);
|
||||
distance_between_ports=5;
|
||||
|
||||
cutout_radius=100; // not a physical dimension
|
||||
safe_angle=1;
|
||||
|
||||
eps=0.0001;
|
||||
|
||||
outer_radius=40; // outer radius of inner cylinder (the one with holes)
|
||||
wall_thickness=2;
|
||||
use <servo.scad>;
|
||||
use <gears.scad>;
|
||||
FUTABA_3F_SPLINE = [[5.92, 10, 1.1, 2.5], [25, 0.3, 0.7, 0.1]]; // spline of servo motor
|
||||
gear_height=5;
|
||||
|
||||
big_gear=30;
|
||||
small_gear=14;
|
||||
modul=1;
|
||||
gear_distance=(big_gear+small_gear)*modul/2;
|
||||
|
||||
clip_thickness=7;
|
||||
clip_offset=5;
|
||||
clip_depth=1;
|
||||
|
||||
|
||||
cylinder_height = sum(port_sizes)+distance_between_ports*(ports + 1);
|
||||
|
||||
function shl(x,y) = x * pow(2,y);
|
||||
function shr(x,y) = floor(x * pow(2,-y));
|
||||
function sum(v, i = 0, r = 0) = i < len(v) ? sum(v, i + 1, r + v[i]) : r;
|
||||
function sum_up_to(v, idx, i = 0, r = 0) = (i < idx && i < len(v)) ? sum_up_to(v, idx, i + 1, r + v[i]) : r;
|
||||
|
||||
module rotating_cylinder() {
|
||||
echo("window size = ", 2 * (outer_radius - wall_thickness)*cos(90 + safe_angle - 360 / pow(2, ports + 1)));
|
||||
difference() {
|
||||
union() {
|
||||
/* %translate([0, 0, cylinder_height-0.005]) small_gear_cylinder(); */
|
||||
|
||||
|
||||
%translate([0, gear_distance, cylinder_height-0.005]) rotate([0, 0, 12.5]) {
|
||||
extragear();
|
||||
}
|
||||
|
||||
|
||||
cylinder(r=outer_radius, h=cylinder_height);
|
||||
}
|
||||
rotate([0, 0, (360 / 2^ports)*2]) union() {
|
||||
// hex hole for small gear
|
||||
translate([0, 0, cylinder_height - wall_thickness -distance_between_ports - 0.05]) cylinder(r=5, h=100, $fn=6);
|
||||
|
||||
translate([0, 0, -eps]) cylinder(r=outer_radius-wall_thickness, h=cylinder_height - distance_between_ports + eps*2);
|
||||
for (rot=[0:pow(2, ports)]) {
|
||||
for (bit=[0:(ports - 1)]) {
|
||||
if (shr(rot, ports - 1 - bit) % 2 == 1) {
|
||||
current_height = sum_up_to(port_sizes, bit) + (bit + 1)*distance_between_ports;
|
||||
translate([0, 0, current_height])
|
||||
rotate([0,0,(360 / pow(2, ports))*rot])
|
||||
linear_extrude(height = port_sizes[bit]) {
|
||||
polygon(points=[[0,0],[cutout_radius*sin(90 + safe_angle - 360 / pow(2, ports + 1)), cutout_radius*cos(90 + safe_angle - 360 / pow(2, ports + 1))],[cutout_radius*sin(90 - safe_angle + 360 / pow(2, ports + 1)),cutout_radius*cos(90 - safe_angle + 360 / pow(2, ports + 1))]]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module small_gear_cylinder() {
|
||||
spur_gear(modul=modul, tooth_number=small_gear, width=gear_height, bore=1, pressure_angle=20, helix_angle=0, optimized=false);
|
||||
cylinder(r=5, h=gear_height+5);
|
||||
mirror(v=[0, 0, 1]) cylinder(r=5, h=wall_thickness+distance_between_ports+2, $fn=6);
|
||||
}
|
||||
|
||||
// http://sammy76.free.fr/conseils/electronique/arduino/SG90.php
|
||||
clearance=0.5;
|
||||
|
||||
ignore_height=4;
|
||||
ignore_diameter=11.8;
|
||||
extra_ignore_part=2.9;
|
||||
distance_to_mount=22.7 - 15.9 - 2.5;
|
||||
|
||||
module container() {
|
||||
translation_outer = -outer_radius - wall_thickness - clearance;
|
||||
size_outer = 2*(outer_radius+wall_thickness+clearance);
|
||||
module clip_hole() {
|
||||
cube([clip_thickness+clearance, 100, 10+1]);
|
||||
translate([0, -clip_depth-clearance, 10]) cube([clip_thickness+clearance, 100, 10+clearance]);
|
||||
}
|
||||
echo("height of box = ", cylinder_height + clearance + gear_height + clearance + ignore_height + distance_to_mount)
|
||||
echo("width of box = ", size_outer);
|
||||
difference() {
|
||||
translate([translation_outer, translation_outer, 0]) cube([size_outer, size_outer, cylinder_height + clearance + gear_height + clearance + ignore_height + distance_to_mount]);
|
||||
union() {
|
||||
// hole for inner cylinder
|
||||
translate([0, 0, -eps]) cylinder(r=outer_radius + clearance, h=cylinder_height + gear_height + clearance*2 + eps);
|
||||
|
||||
// hole for main cylinder shaft
|
||||
translate([0, 0, cylinder_height]) cylinder(r=5+clearance/2, h=50);
|
||||
|
||||
// hole for gear shaft
|
||||
translate([0, gear_distance, cylinder_height]) {
|
||||
hull() {
|
||||
cylinder(r=(ignore_diameter+clearance)/2, h=50);
|
||||
translate([(ignore_diameter)/2+extra_ignore_part, 0, 0]) cylinder(r=extra_ignore_part+clearance, h=50);
|
||||
}
|
||||
}
|
||||
|
||||
// rectangular hole for motor
|
||||
|
||||
translate([-5.9 - clearance/2, gear_distance - 11.8/2 - clearance/2, cylinder_height + clearance + gear_height + clearance + ignore_height]) {
|
||||
cube([22.5 + clearance, 11.8 + clearance, distance_to_mount]);
|
||||
}
|
||||
|
||||
// indentations on side for clips
|
||||
translate([clip_offset + translation_outer - clearance/2, size_outer/2 - wall_thickness, 0]) {
|
||||
clip_hole();
|
||||
}
|
||||
translate([size_outer/2 -clip_offset - clip_thickness - clearance/2, size_outer/2 - wall_thickness, 0]) {
|
||||
clip_hole();
|
||||
}
|
||||
mirror(v=[0, 1, 0]) {
|
||||
translate([clip_offset + translation_outer - clearance/2, size_outer/2 - wall_thickness, 0]) {
|
||||
clip_hole();
|
||||
}
|
||||
translate([size_outer/2 -clip_offset - clip_thickness - clearance/2, size_outer/2 - wall_thickness, 0]) {
|
||||
clip_hole();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
// holes on side for ports
|
||||
rot = 0;
|
||||
for (bit=[0:(ports - 1)]) {
|
||||
current_height = sum_up_to(port_sizes, bit) + (bit + 1)*distance_between_ports;
|
||||
translate([0, 0, current_height])
|
||||
rotate([0,0,(360 / pow(2, ports))*rot])
|
||||
linear_extrude(height = port_sizes[bit]) {
|
||||
polygon(points=[[0,0],[cutout_radius*sin(90 + safe_angle - 360 / pow(2, ports + 1)), cutout_radius*cos(90 + safe_angle - 360 / pow(2, ports + 1))],[cutout_radius*sin(90 - safe_angle + 360 / pow(2, ports + 1)),cutout_radius*cos(90 - safe_angle + 360 / pow(2, ports + 1))]]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module extragear() {
|
||||
difference() {
|
||||
spur_gear (modul=modul, tooth_number=big_gear, width=5, bore=1, pressure_angle=20, helix_angle=0, optimized=false);
|
||||
servo_head(FUTABA_3F_SPLINE);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
module prism(l, w, h){
|
||||
polyhedron(
|
||||
points=[[0,0,0], [l,0,0], [l,w,0], [0,w,0], [0,w,h], [l,w,h]],
|
||||
faces=[[0,1,2,3],[5,4,3,2],[0,4,5,1],[0,3,4],[5,2,1]]
|
||||
);
|
||||
}
|
||||
|
||||
module clip(thickness=5, clip_depth=1) {
|
||||
translate([0, -wall_thickness, 0]) {
|
||||
translate([0, -clip_depth, 10]) prism(thickness, wall_thickness + clip_depth, 10);
|
||||
cube([thickness, wall_thickness, 10]);
|
||||
}
|
||||
}
|
||||
|
||||
module container_bottom() {
|
||||
|
||||
size_outer = 2*(outer_radius+wall_thickness+clearance);
|
||||
translate([0, -size_outer/2, 0]) {
|
||||
cube([size_outer, size_outer, wall_thickness]);
|
||||
}
|
||||
translate([0, 0, wall_thickness]) {
|
||||
translate([size_outer/2, 0, 0])
|
||||
difference() {
|
||||
cylinder(r=outer_radius - wall_thickness - clearance, h=distance_between_ports);
|
||||
translate([0, 0, -1]) cylinder(r=outer_radius - wall_thickness*2, h=distance_between_ports+5);
|
||||
}
|
||||
translate([clip_offset, size_outer/2, 0]) clip(thickness=clip_thickness, clip_depth=clip_depth);
|
||||
translate([size_outer - clip_thickness - clip_offset , size_outer/2, 0]) clip(thickness=clip_thickness, clip_depth=clip_depth);
|
||||
mirror(v=[0,1,0]) {
|
||||
translate([clip_offset, size_outer/2, 0]) clip(thickness=clip_thickness, clip_depth=clip_depth);
|
||||
translate([size_outer - clip_thickness - clip_offset, size_outer/2, 0]) clip(thickness=clip_thickness, clip_depth=clip_depth);
|
||||
}
|
||||
|
||||
holder_depth=1;
|
||||
holder_width=25;
|
||||
port_depth=7;
|
||||
port_width = 12.5;
|
||||
hole_clearance = 2.5;
|
||||
translate([2*outer_radius - holder_depth - port_depth, -holder_width/2, 0])
|
||||
difference() {
|
||||
union() {
|
||||
cube([holder_depth, holder_width, cylinder_height - distance_between_ports]);
|
||||
translate([0, holder_width, 0]) cube([port_depth, 5, cylinder_height-distance_between_ports]);
|
||||
translate([0, -5, 0]) cube([port_depth, 5, cylinder_height-distance_between_ports]);
|
||||
}
|
||||
|
||||
union() {
|
||||
for (bit=[0:(ports - 1)]) {
|
||||
current_height = sum_up_to(port_sizes, bit) + (bit + 1)*distance_between_ports;
|
||||
dist_to_hole = (port_sizes[bit] - mounting_hole_dist[bit]) / 2;
|
||||
translate([-1, holder_width/2, current_height + dist_to_hole]) {
|
||||
rotate([0, 90, 0]) cylinder(r=1.5, h=100);
|
||||
translate([0, 0, mounting_hole_dist[bit]]) rotate([0, 90, 0]) cylinder(r=1.5, h=100);
|
||||
translate([0, -(port_width) / 2, hole_clearance]) cube([100, port_width, mounting_hole_dist[bit] - 2*hole_clearance]);
|
||||
}
|
||||
}
|
||||
translate([-(2*outer_radius - holder_depth - port_depth), -(-holder_width/2), 0]) translate([size_outer/2, 0, 0])
|
||||
difference() {
|
||||
cylinder(r=100, h=450);
|
||||
translate([0, 0, -1]) cylinder(r=outer_radius - wall_thickness - clearance, h=500);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* color([1, 1, 0]) */
|
||||
translation_outer = -outer_radius - wall_thickness - clearance;
|
||||
|
||||
|
||||
|
||||
rotating_cylinder();
|
||||
|
||||
translate([125, 0, 0]) container();
|
||||
|
||||
translate([0, 130, 0]) extragear();
|
||||
translate([0, 170, 0]) small_gear_cylinder();
|
||||
|
||||
|
||||
translate([125 + translation_outer, 125, -wall_thickness]) container_bottom();
|
220
src/modules/info_ports/servo.scad
Normal file
220
src/modules/info_ports/servo.scad
Normal file
|
@ -0,0 +1,220 @@
|
|||
/**
|
||||
* Parametric servo arm generator for OpenScad
|
||||
* Générateur de palonnier de servo pour OpenScad
|
||||
*
|
||||
* Copyright (c) 2012 Charles Rincheval. All rights reserved.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Last update :
|
||||
* https://github.com/hugokernel/OpenSCAD_ServoArms
|
||||
*
|
||||
* http://www.digitalspirit.org/
|
||||
*/
|
||||
|
||||
$fn = 40;
|
||||
|
||||
/**
|
||||
* Clear between arm head and servo head
|
||||
* With PLA material, use clear : 0.3, for ABS, use 0.2
|
||||
*/
|
||||
SERVO_HEAD_CLEAR = 0.2;
|
||||
|
||||
/**
|
||||
* Head / Tooth parameters
|
||||
* Futaba 3F Standard Spline
|
||||
* http://www.servocity.com/html/futaba_servo_splines.html
|
||||
*
|
||||
* First array (head related) :
|
||||
* 0. Head external diameter
|
||||
* 1. Head heigth
|
||||
* 2. Head thickness
|
||||
* 3. Head screw diameter
|
||||
*
|
||||
* Second array (tooth related) :
|
||||
* 0. Tooth count
|
||||
* 1. Tooth height
|
||||
* 2. Tooth length
|
||||
* 3. Tooth width
|
||||
*/
|
||||
FUTABA_3F_SPLINE = [
|
||||
[5.92, 4, 1.1, 2.5],
|
||||
[25, 0.3, 0.7, 0.1]
|
||||
];
|
||||
|
||||
module servo_futaba_3f(length, count) {
|
||||
servo_arm(FUTABA_3F_SPLINE, [length, count]);
|
||||
}
|
||||
|
||||
/**
|
||||
* If you want to support a new servo, juste add a new spline definition array
|
||||
* and a module named like servo_XXX_YYY where XXX is servo brand and YYY is the
|
||||
* connection type (3f) or the servo type (s3003)
|
||||
*/
|
||||
|
||||
module servo_standard(length, count) {
|
||||
servo_futaba_3f(length, count);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tooth
|
||||
*
|
||||
* |<-w->|
|
||||
* |_____|___
|
||||
* / \ ^h
|
||||
* _/ \_v
|
||||
* |<--l-->|
|
||||
*
|
||||
* - tooth length (l)
|
||||
* - tooth width (w)
|
||||
* - tooth height (h)
|
||||
* - height
|
||||
*
|
||||
*/
|
||||
module servo_head_tooth(length, width, height, head_height) {
|
||||
linear_extrude(height = head_height) {
|
||||
polygon([[-length / 2, 0], [-width / 2, height], [width / 2, height], [length / 2,0]]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Servo head
|
||||
*/
|
||||
module servo_head(params, clear = SERVO_HEAD_CLEAR) {
|
||||
|
||||
head = params[0];
|
||||
tooth = params[1];
|
||||
|
||||
head_diameter = head[0];
|
||||
head_height = head[1];
|
||||
//head_heigth
|
||||
|
||||
tooth_count = tooth[0];
|
||||
tooth_height = tooth[1];
|
||||
tooth_length = tooth[2];
|
||||
tooth_width = tooth[3];
|
||||
|
||||
/* % cylinder(r = head_diameter / 2, h = head_height + 1); */
|
||||
|
||||
cylinder(r = head_diameter / 2 - tooth_height + 0.03 + clear, h = head_height);
|
||||
|
||||
for (i = [0 : tooth_count]) {
|
||||
rotate([0, 0, i * (360 / tooth_count)]) {
|
||||
translate([0, head_diameter / 2 - tooth_height + clear, 0]) {
|
||||
servo_head_tooth(tooth_length, tooth_width, tooth_height, head_height);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Servo hold
|
||||
* - Head / Tooth parameters
|
||||
* - Arms params (length and count)
|
||||
*/
|
||||
module servo_arm(params, arms) {
|
||||
|
||||
head = params[0];
|
||||
tooth = params[1];
|
||||
|
||||
head_diameter = head[0];
|
||||
head_height = head[1];
|
||||
head_thickness = head[2];
|
||||
head_screw_diameter = head[3];
|
||||
|
||||
tooth_length = tooth[2];
|
||||
tooth_width = tooth[3];
|
||||
|
||||
arm_length = arms[0];
|
||||
arm_count = arms[1];
|
||||
|
||||
/**
|
||||
* Servo arm
|
||||
* - length is from center to last hole
|
||||
*/
|
||||
module arm(tooth_length, tooth_width, reinforcement_height, head_height, hole_count = 1) {
|
||||
arm_screw_diameter = 2;
|
||||
|
||||
difference() {
|
||||
union() {
|
||||
cylinder(r = tooth_width / 2, h = head_height);
|
||||
|
||||
linear_extrude(height = head_height) {
|
||||
polygon([
|
||||
[-tooth_width / 2, 0], [-tooth_width / 3, tooth_length],
|
||||
[tooth_width / 3, tooth_length], [tooth_width / 2, 0]
|
||||
]);
|
||||
}
|
||||
|
||||
translate([0, tooth_length, 0]) {
|
||||
cylinder(r = tooth_width / 3, h = head_height);
|
||||
}
|
||||
|
||||
if (tooth_length >= 12) {
|
||||
translate([-head_height / 2 + 2, head_diameter / 2 + head_thickness - 0.5, -4]) {
|
||||
rotate([90, 0, 0]) {
|
||||
rotate([0, -90, 0]) {
|
||||
linear_extrude(height = head_height) {
|
||||
polygon([
|
||||
[-tooth_length / 1.7, 4], [0, 4], [0, - reinforcement_height + 5],
|
||||
[-2, - reinforcement_height + 5]
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Hole
|
||||
for (i = [0 : hole_count - 1]) {
|
||||
//translate([0, length - (length / hole_count * i), -1]) {
|
||||
translate([0, tooth_length - (4 * i), -1]) {
|
||||
cylinder(r = arm_screw_diameter / 2, h = 10);
|
||||
}
|
||||
}
|
||||
|
||||
cylinder(r = head_screw_diameter / 2, h = 10);
|
||||
}
|
||||
}
|
||||
|
||||
difference() {
|
||||
translate([0, 0, 0.1]) {
|
||||
cylinder(r = head_diameter / 2 + head_thickness, h = head_height + 1);
|
||||
}
|
||||
|
||||
cylinder(r = head_screw_diameter / 2, h = 10);
|
||||
|
||||
servo_head(params);
|
||||
}
|
||||
|
||||
arm_thickness = head_thickness;
|
||||
|
||||
// Arm
|
||||
translate([0, 0, head_height]) {
|
||||
for (i = [0 : arm_count - 1]) {
|
||||
rotate([0, 0, i * (360 / arm_count)]) {
|
||||
arm(arm_length, head_diameter + arm_thickness * 2, head_height, 2);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module demo() {
|
||||
rotate([0, 180, 0])
|
||||
servo_standard(20, 4);
|
||||
}
|
||||
|
||||
demo();
|
Loading…
Reference in a new issue