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/>.
//
//
2021-01-24 16:44:57 -05:00
//! Used for limit switches. Currently only the button type is supported as the lever and roller types are less accurate.
//!
//! The switch is drawn with the button at the nominal operation point. This can be plus or minus `microswitch_op_tol(type)`.
//!
//! When the button is released it comes out by a maximum of `microswitch_fp_max(type)` from the nominal operating point.
2019-06-08 17:10:47 -04:00
//
2020-02-29 12:52:36 -05:00
include < ../utils/core/core.scad >
2019-06-08 17:10:47 -04:00
2020-03-29 15:39:17 -04:00
microswitch_contact_colour = brass ;
2019-06-08 17:10:47 -04:00
function microswitch_thickness ( type ) = type [ 2 ] ; //! Body thickness
function microswitch_width ( type ) = type [ 3 ] ; //! Body width
function microswitch_length ( type ) = type [ 4 ] ; //! Body length
function microswitch_radius ( type ) = type [ 5 ] ; //! Body corner radius
function microswitch_hole_d ( type ) = type [ 6 ] ; //! Screw hole diameter
function microswitch_holes ( type ) = type [ 7 ] ; //! Hole positions
function microswitch_button_w ( type ) = type [ 8 ] ; //! Button width
function microswitch_button_t ( type ) = type [ 9 ] ; //! Button thickness
2021-01-24 16:44:57 -05:00
function microswitch_button_pos ( type ) = type [ 10 ] ; //! Button position at operating point
function microswitch_op_tol ( type ) = type [ 11 ] ; //! Operating position +/- tolerance
function microswitch_fp_max ( type ) = type [ 12 ] ; //! Free position maximum
function microswitch_legs ( type ) = type [ 13 ] ; //! Leg positions
function microswitch_leg ( type ) = type [ 14 ] ; //! Leg types
function microswitch_body_clr ( type ) = type [ 15 ] ; //! Body colour
function microswitch_button_clr ( type ) = type [ 16 ] ; //! Button colour
2019-06-08 17:10:47 -04:00
function microswitch_lower_extent ( type ) = let ( leg = microswitch_leg ( type ) ) min ( [ for ( pos = microswitch_legs ( type ) ) pos . y - leg . y / 2 ] ) ; //! How far legs extend downwards
function microswitch_right_extent ( type ) = let ( leg = microswitch_leg ( type ) ) max ( [ microswitch_length ( type ) / 2 , for ( pos = microswitch_legs ( type ) ) pos . x + leg . x / 2 ] ) ; //! How far legs extend right
2021-01-06 04:36:13 -05:00
function microswitch_size ( type ) = [ microswitch_length ( type ) , microswitch_width ( type ) , microswitch_thickness ( type ) ] ; //! Body size
2019-06-08 17:10:47 -04:00
module microswitch_hole_positions ( type ) //! Place children at the hole positions
{
for ( hole = microswitch_holes ( type ) )
translate ( hole )
children ( ) ;
}
module microswitch_wire_positions ( type , skip = undef ) { //! Place children at the leg hole positions
leg = microswitch_leg ( type ) ;
legs = microswitch_legs ( type ) ;
for ( i = [ 0 : len ( legs ) - 1 ] )
if ( i ! = skip )
let ( pos = legs [ i ] )
translate ( leg [ 3 ] ? pos + leg [ 4 ] : pos - [ leg . x , leg . y ] / 6 )
children ( ) ;
}
module microswitch ( type ) { //! Draw specified microswitch
vitamin ( str ( "microswitch(" , type [ 0 ] , "): Microswitch " , type [ 1 ] ) ) ;
d = microswitch_button_t ( type ) ;
color ( microswitch_body_clr ( type ) )
2020-03-29 15:18:57 -04:00
linear_extrude ( microswitch_thickness ( type ) , center = true )
2019-06-08 17:10:47 -04:00
difference ( ) { // main body
rounded_square ( [ microswitch_length ( type ) , microswitch_width ( type ) ] , microswitch_radius ( type ) ) ;
microswitch_hole_positions ( type )
circle ( d = microswitch_hole_d ( type ) ) ;
}
color ( microswitch_button_clr ( type ) ) // orange button
translate ( microswitch_button_pos ( type ) - [ 0 , d / 2 ] )
2020-03-29 15:18:57 -04:00
linear_extrude ( microswitch_button_w ( type ) , center = true )
2019-06-08 17:10:47 -04:00
hull ( ) {
circle ( d = d ) ;
translate ( [ 0 , - 3 ] )
circle ( d = d ) ;
}
2020-03-29 15:39:17 -04:00
color ( microswitch_contact_colour ) // yellow contacts
2019-06-08 17:10:47 -04:00
for ( pos = microswitch_legs ( type ) )
translate ( pos ) {
leg = microswitch_leg ( type ) ;
vertical = leg . y > leg . x ;
if ( vertical )
rotate ( [ 0 , 90 , 0 ] )
2020-03-29 15:18:57 -04:00
linear_extrude ( leg . x , center = true )
2019-06-08 17:10:47 -04:00
difference ( ) {
square ( [ leg . z , leg . y ] , center = true ) ;
if ( leg [ 3 ] )
translate ( leg [ 4 ] )
circle ( d = leg [ 3 ] ) ;
}
else
rotate ( [ 90 , 0 , 0 ] )
2020-03-29 15:18:57 -04:00
linear_extrude ( leg . y , center = true )
2019-06-08 17:10:47 -04:00
difference ( ) {
square ( [ leg . x , leg . z ] , center = true ) ;
if ( leg [ 3 ] )
translate ( leg [ 4 ] )
circle ( d = leg [ 3 ] ) ;
}
if ( ! vertical && pos . y < - microswitch_width ( type ) / 2 ) {
gap = - microswitch_width ( type ) / 2 - pos . y ;
translate ( [ - leg . x / 2 + leg . y / 2 , gap / 2 ] )
cube ( [ leg . y , gap , leg . z ] , center = true ) ;
}
}
}