hanger.scad 6.05 KB
include <libs/polyround.scad>
include <libs/uploads_6f_12_f1_10_d2_ISOThread.scad>
// Author: Hubert Berezowski
// Copyright: 2018
// License: GPL 3

/////////////////////////////////////////////////////////////////// switch settings:
// milling or printing ?? //////////////////////////////////////////////////////////
/* include <conf.milling.scad> */
include <conf.printing.scad>

// output
difference() {
  hanger_wedge_plate();
  hub_grove();
  fixing_pin();
  tensioner_thread();
}

// tensioner thread hole
module tensioner_thread() {
  difference() {
    translate([HANGER_WIDTH / 2, FIX_PLATE_SPAN_Y + HANGER_THREAD_OFFSET , -1]){
      cylinder(h = 20, d = HANGER_THREAD_DIAMETER + TT, center = false, $fn = fn);

    }
    if ( TYPE == "PRINTING" ){
      translate([HANGER_WIDTH / 2, FIX_PLATE_SPAN_Y + HANGER_THREAD_OFFSET , -1])
        thread_in_pitch(HANGER_THREAD_DIAMETER + TT, HANGER_HEIGHT+3, 1);
    }
  }
}

// fixing pin hole
module fixing_pin() {
  ankathete = FIX_OFFSET / tan(22.5);
  translate([FIX_PLATE_SPAN_X, 0, 0]){
    translate([ -ankathete, FIX_OFFSET, -1 ]){
      cylinder(h = 20, d = FIX_PIN_DIAMETER + TT, center = false, $fn = fn);
      cylinder(h = FIX_PLATE_HEIGHT - FIX_PIN_HEAD_RECESS_HEIGHT + 1, d = FIX_PIN_HEAD_DIAMETER + TT, center = false, $fn = fn);

    }
  }
}

// hub groove
module hub_grove() {
  union() {
    if ( TYPE == "MILLING" ){
      hull() {
        translate([ HUB_OFFSET_X, HUB_OFFSET_Y, 0 ]){
          cylinder(h = 20, d = HUB_DIAMETER + T, center = true, $fn = fn);
        }
        translate([ HUB_OFFSET_X, FIX_PLATE_SPAN_Y + T, 0 ]){
          cylinder(h = 20, d = HUB_DIAMETER + T, center = true, $fn = fn);
        }
      }
    }
    if ( HUB_DIAMETER_SPACER > 0 ) {
      translate([ HUB_OFFSET_X, HUB_OFFSET_Y, FIX_PLATE_HEIGHT - HUB_DIAMETER_FRAME_SPACER_HEIGHT]){
        cylinder(h = HUB_DIAMETER_FRAME_SPACER_HEIGHT + 1, d = HUB_DIAMETER_FRAME_SPACER + TT, center = false, $fn = fn);
      }
      translate([ HUB_OFFSET_X, HUB_OFFSET_Y, -1]){
        cylinder(h = 10, d = HUB_DIAMETER_SPACER + TT, center = false, $fn = fn);
      }
      translate([ HUB_OFFSET_X, HUB_OFFSET_Y, FIX_PLATE_HEIGHT - ( HUB_DIAMETER_FRAME_SPACER_HEIGHT + HUB_DIAMETER_SPACER_HEIGHT + 10) ]){
        cylinder(h = 10, d = 20 + TT, center = false, $fn = fn);
      }
    }
  }
}

// hanger wedge plate
module hanger_wedge_plate() {
  fix_plate_shape = [ [ FIX_PLATE_EDGE + T, FIX_PLATE_EDGE + T, FRAME_INNER_RADIUS_NEAR_HUB]
                      , [ FIX_PLATE_SPAN_X - ( FIX_PLATE_EDGE / tan(22.5) + T / tan(22.5) )
                          , FIX_PLATE_EDGE + T
                          , FIX_OFFSET-FIX_PLATE_EDGE ]
                      , [ FIX_PLATE_EDGE + T, FIX_PLATE_SPAN_X - ( FIX_PLATE_EDGE / tan(22.5) + T / tan(22.5) ),0]
    ];

  hanger_shape = [ [ T, FIX_PLATE_SPAN_Y - FRAME_OUTER_RADIUS_NEAR_HANGER + T, 0]
                   , [ FRAME_OUTER_RADIUS_NEAR_HANGER - cos(45) * FRAME_OUTER_RADIUS_NEAR_HANGER + T
                       , FIX_PLATE_SPAN_Y - FRAME_OUTER_RADIUS_NEAR_HANGER + sin(45)*FRAME_OUTER_RADIUS_NEAR_HANGER + T
                       , 0
                     ]
                   , [ FRAME_OUTER_RADIUS_NEAR_HANGER + T, FIX_PLATE_SPAN_Y + T, 0]
                   , [ HANGER_WIDTH - T, FIX_PLATE_SPAN_Y + T, 0]
                   , [ HANGER_WIDTH - T, FIX_PLATE_SPAN_Y + HANGER_SPAN - T, HANGER_WIDTH/2 - T]
                   , [ T, FIX_PLATE_SPAN_Y + HANGER_SPAN - T, HANGER_WIDTH / 2 - T]
    ];

  module fix_plate() {
    difference() { // cut shape where the bike frame ends
      minkowski() {// combine fixation plate with edged corner
        linear_extrude( height = FIX_PLATE_HEIGHT - FIX_PLATE_EDGE)
          polygon(
            polyRound(
              fix_plate_shape, fn
              ));

        linear_extrude(height = FIX_PLATE_EDGE, scale=0)
          circle(r = FIX_PLATE_EDGE);
      }
      // shape where the bike frame ends
      crop_y = FIX_PLATE_SPAN_Y + HANGER_THREAD_OFFSET + T;
      // if hanger is milled, the baseplate ends where the frame ends
      // else it encapsulates the hub screw
                if ( TYPE == "MILLING" ) { 
                  crop_y = FIX_PLATE_SPAN_Y + T;
                }

      translate([ 0
                  , crop_y
                  , -1
                  ])cube(50, 50, 100);
    }
  }

  module hangerblock() {
    difference() {
      union() { // combine base block with safety cylinder
        // hanger
        linear_extrude( height = HANGER_HEIGHT)
          polygon(
            polyRound(
              hanger_shape, fn
              ));
        // safety diameter probabaly unnecessary
        if (HANGER_THREAD_DIAMETER + HANGER_SAFETY_WIDTH > HANGER_WIDTH) {
          translate([
                      HANGER_WIDTH / 2
                      , FIX_PLATE_SPAN_Y + HANGER_THREAD_OFFSET
                      , 0])cylinder(
                        h = HANGER_HEIGHT
                        , d = HANGER_THREAD_DIAMETER + HANGER_SAFETY_WIDTH
                        , center = false
                        , $fn = fn
                        );
        }
      }
      // cut out dropout frame corner
      translate([
                  FRAME_OUTER_RADIUS_NEAR_HANGER - T * 3 /*better safe than sorry*/
                  , FIX_PLATE_SPAN_Y - FRAME_OUTER_RADIUS_NEAR_HANGER
                  , FIX_PLATE_HEIGHT - FIX_PLATE_EDGE
                  ])cylinder(
                    h = HANGER_HEIGHT - FIX_PLATE_HEIGHT + FIX_PLATE_EDGE + 1
                    , d = HANGER_THREAD_DIAMETER*2 +T
                    , center = false
                    , $fn = fn*2
                    );

    }
  }

  difference() {
    union() { // combine fixation plate with hangerblock
      fix_plate();
      hangerblock();
    }

    // make some space for the Tensioner
    if ( TYPE == "PRINTING" ){
      translate([
                  - HANGER_SAFETY_WIDTH /2 - T
                  , FIX_PLATE_SPAN_Y + HANGER_HEIGHT - 12
                  , -1
                  ])cube([
                           50
                           , 40
                           , FIX_PLATE_HEIGHT / 2
                           ]);
    }
  }
}