NopSCADlib/vitamins/battery.scad

162 lines
5.9 KiB
OpenSCAD
Raw Permalink Normal View History

2019-06-08 17:10:47 -04:00
//
// NopSCADlib Copyright Chris Palmer 2018
// nop.head@gmail.com
// hydraraptor.blogspot.com
//
// This file is part of NopSCADlib.
//
// NopSCADlib is free software: you can redistribute it and/or modify it under the terms of the
// GNU General Public License as published by the Free Software Foundation, either version 3 of
// the License, or (at your option) any later version.
//
// NopSCADlib 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License along with NopSCADlib.
// If not, see <https://www.gnu.org/licenses/>.
//
//
//! Actually just single cells at the moment, shown here with mating contacts in place.
//!
//! Note that the [Lumintop LM34](http://www.lumintop.com/lm34c-usb-rechargeable-18650-li-ion-battery.html) has a built in charger with a USB socket and two LEDs.
//!
//! The battery length includes its contacts and the origin is the centre of that length. As well as drawing the battery and contacts there are functions
//! exposing enough information to make a battery box.
//
include <../utils/core/core.scad>
2019-06-08 17:10:47 -04:00
use <spring.scad>
use <../utils/rounded_cylinder.scad>
function battery_length(type) = type[2]; //! Total length including terminals
function battery_diameter(type) = type[3]; //! Casing diameter
function battery_neg_dia(type) = type[4]; //! Negative terminal diameter
function battery_pos_dia(type) = type[5]; //! Positive terminal diameter
function battery_pos_height(type) = type[6]; //! Positive terminal height above the casing
function battery_colour(type) = type[7]; //! Casing colour
function battery_led_positions(type) = type[8]; //! LED positions for Lumintop
function battery_usb_offset(type) = type[9]; //! USB connector offset from the top
function battery_contact(type) = type[10]; //! Contact type
module battery_led_positions(type) { //! Position of the LEDs on a Lumintop
posns = battery_led_positions(type);
for($i = [0 : 1 : len(posns) - 1])
translate([posns[$i].x, posns[$i].y, battery_length(type) / 2 - battery_pos_height(type)])
children();
}
module battery(type) { //! Draw a battery
vitamin(str("battery(", type[0], "): ", type[1]));
len = battery_length(type);
l = 6;
iw1 = 7;
iw2 = 5.7;
ih1 = 1;
ih2 = 1.85;
h = 2.65;
t = 0.4;
module D() {
hull() {
translate([-iw1 / 2, h - t - ih1])
square([iw1, ih1]);
translate([-iw2 / 2, h - t - ih2])
square([iw2, ih2]);
}
}
color(battery_colour(type)) render() difference() {
translate_z(-battery_pos_height(type) / 2)
cylinder(d = battery_diameter(type), h = len - battery_pos_height(type), center = true);
if(battery_usb_offset(type))
translate([battery_diameter(type) / 2, 0, len / 2 - battery_usb_offset(type) + h / 2])
rotate([-90, 0, 90])
linear_extrude(l + 1)
2019-06-08 17:10:47 -04:00
offset(delta = t)
D();
}
color("gold")
translate_z(len / 2 - battery_pos_height(type))
rounded_cylinder(r = battery_pos_dia(type) / 2, h = battery_pos_height(type) + eps, r2 = 0.5);
color("silver") {
if(battery_usb_offset(type))
translate([battery_diameter(type) / 2 - 1, 0, len / 2 - battery_usb_offset(type) + h / 2])
rotate([-90, 0, 90]) {
linear_extrude(l)
2019-06-08 17:10:47 -04:00
difference() {
offset(t) D();
D();
}
translate_z(l - 1)
linear_extrude(1)
2019-06-08 17:10:47 -04:00
D();
}
translate_z(-len / 2)
vflip()
cylinder(d = battery_neg_dia(type), h = eps);
}
battery_led_positions(type)
color(["red","green","blue"][$i])
cylinder(d = 1.5, h = eps);
}
function contact_width(type) = type[1]; //! Width of the flat part
function contact_height(type) = type[2]; //! Height of the flat part
function contact_thickness(type) = type[3]; //! Thickness of the metal
function contact_tab_width(type) = type[4]; //! Width of the tab
function contact_tab_length(type) = type[5]; //! Length of the tab
function contact_pos(type) = type[6]; //! Positive contact dimple height and top and bottom internal diameter
function contact_neg(type) = type[7]; //! Negative spring height above the plate when compressed and the spring type
module battery_contact(type, pos = true) { //! Draw a positive or negative battery contact for specified battery
vitamin(str("battery_contact(", type[0], ", ", pos, "): Battery ", pos ? "positive" : "negative", " contact"));
neg = 9;
tw = contact_tab_width(type);
h = contact_height(type);
hole_y = -contact_tab_length(type) + tw / 2;
t = contact_thickness(type);
color("silver") {
rounded_rectangle([contact_width(type), h, t], r = 1);
2019-06-08 17:10:47 -04:00
translate([0, -h / 2, t])
rotate([90, 0, 0])
linear_extrude(t)
2019-06-08 17:10:47 -04:00
difference() {
hull() {
translate([-tw / 2, -1])
square([tw, 1]);
translate([0, hole_y])
circle(d = tw);
}
translate([0, hole_y])
circle(tw / 4);
}
if(pos) {
p = contact_pos(type);
cylinder(d1 = p.z + 2 * t, d2 = p.y + 2 * t, h = p.x);
}
else {
p = contact_neg(type);
not_on_bom()
translate_z(t)
comp_spring(p.y, p.x - t);
}
}
}