Guest User

Untitled

a guest
Jul 15th, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.59 KB | None | 0 0
  1. // Tour Easy front fender clip
  2. // Ed Nisley KE4ZNU July 2017
  3.  
  4. Layout = "Build"; // Build Profile Ferrule Clip
  5.  
  6. //- Extrusion parameters must match reality!
  7.  
  8. ThreadThick = 0.25;
  9. ThreadWidth = 0.40;
  10.  
  11. HoleWindage = 0.2;
  12.  
  13. Protrusion = 0.1; // make holes end cleanly
  14.  
  15. inch = 25.4;
  16.  
  17. function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
  18.  
  19. //----------------------
  20. // Dimensions
  21.  
  22. // special case: fender is exactly half a circle!
  23.  
  24. FenderC = 51.0; // fender outside width = chord
  25. FenderM = 21.0; // height of chord
  26.  
  27. FenderR = (pow(FenderM,2) + pow(FenderC,2)/4) / (2 * FenderM); // radius
  28. echo(str("Fender radius: ", FenderR));
  29. FenderD = 2*FenderR;
  30.  
  31. FenderA = 2 * asin(FenderC / (2*FenderR));
  32. echo(str(" ... Arc: ",FenderA," deg"));
  33.  
  34. FenderThick = 2.5; // fender thickness, assume dia of edge
  35.  
  36. ClipHeight = 15.0; // top to bottom, ignoring rakish tilt
  37. ClipThick = IntegerMultiple(2.5,ThreadWidth); // thickness of clip around fender
  38. ClipD = FenderD; // ID of clip against fender
  39. ClipSides = 4 * 8; // polygon sides around clip circle
  40.  
  41. BendReliefD = 2.5; // bend arch diameter
  42. BendReliefA = 2/3 * FenderA/2; // ... angle from dead ahead
  43. BendReliefCut = 1.5; // factor to thin outside of bend
  44.  
  45. ID = 0;
  46. OD = 1;
  47. LENGTH = 2;
  48.  
  49. StayDia = 3.3; // fender stay rod diameter
  50. StayOffset = 15.0; // stay-to-fender distance
  51. StayPitch = -5; // angle from stay to fender arch
  52.  
  53. DropoutSpace = 120; // stay spacing at wheel hub
  54. StayLength = 235; // stay length: hub to fender
  55. StaySplay = asin((DropoutSpace - FenderC)/(2*StayLength)); // outward angle to hub
  56.  
  57. echo(str(" ... Pitch: ",StayPitch," deg"));
  58. echo(str(" ... Splay: ",StaySplay," deg"));
  59.  
  60. FerruleSides = 2*4;
  61. Ferrule = [StayDia,3*FenderThick/cos(180/FerruleSides),10*StayDia + StayOffset]; // ID = stay rod OD
  62. FerruleHoleD = 0.1; // small hole to create solid plastic at ferrule joint
  63.  
  64. //----------------------
  65. // Useful routines
  66.  
  67. module PolyCyl(Dia,Height,ForceSides=0) { // based on nophead's polyholes
  68.  
  69. Sides = (ForceSides != 0) ? ForceSides : (ceil(Dia) + 2);
  70.  
  71. FixDia = Dia / cos(180/Sides);
  72.  
  73. cylinder(r=(FixDia + HoleWindage)/2,
  74. h=Height,
  75. $fn=Sides);
  76. }
  77.  
  78. //----------------------
  79. // Clip profile around fender
  80. // Centered on fender arc
  81.  
  82. module Profile(HeightScale = 1) {
  83.  
  84. linear_extrude(height=HeightScale*ClipHeight,convexity=5) {
  85. difference() {
  86. offset(r=ClipThick) // outside of clip
  87. union() {
  88. circle(d=ClipD,$fn=ClipSides);
  89. for (i=[-1,1])
  90. rotate(i*BendReliefA) {
  91. translate([ClipD/2 + BendReliefD/2,0,0])
  92. circle(d=BendReliefD,$fn=6);
  93. }
  94. }
  95. union() { // inside of clip
  96. circle(d=ClipD,$fn=ClipSides);
  97. for (i=[-1,1])
  98. rotate(i*BendReliefA) {
  99. translate([ClipD/2 + BendReliefCut*BendReliefD/2,0,0])
  100. circle(d=BendReliefD/cos(180/6),$fn=6);
  101. translate([ClipD/2,0,0])
  102. square([BendReliefCut*BendReliefD,BendReliefD],center=true);
  103. }
  104. }
  105. translate([(FenderR - FenderM - FenderD/2),0]) // trim ends
  106. square([FenderD,2*FenderD],center=true);
  107. }
  108.  
  109. for (a=[-1,1]) // hooks around fender
  110. rotate(a*(FenderA/2))
  111. translate([FenderR - FenderThick/2,0]) {
  112. difference() {
  113. rotate(1*180/12)
  114. circle(d=FenderThick + 2*ClipThick,$fn=12);
  115. rotate(1*180/8)
  116. circle(d=FenderThick,$fn=8);
  117. rotate(a * -90)
  118. translate([0,-2*FenderThick,0])
  119. square(4*FenderThick,center=false);
  120. }
  121. }
  122. }
  123. }
  124.  
  125.  
  126. //----------------------
  127. // Ferrule body
  128.  
  129. module FerruleBody() {
  130.  
  131. translate([0,0,Ferrule[OD]/2 * cos(180/FerruleSides)])
  132. rotate([0,-90,0]) rotate(180/FerruleSides)
  133. difference() {
  134. cylinder(d=Ferrule[OD],h=Ferrule[LENGTH],$fn=FerruleSides,center=false);
  135. translate([0,0,StayOffset + Protrusion])
  136. PolyCyl(Ferrule[ID],Ferrule[LENGTH] - StayOffset + Protrusion,FerruleSides);
  137.  
  138. }
  139.  
  140. }
  141.  
  142. //----------------------
  143. // Generate entire clip at mounting angle
  144.  
  145. module FenderClip() {
  146.  
  147. difference() {
  148. union() {
  149. translate([FenderR,0,0])
  150. difference() { // angle and trim clip
  151. rotate([0,StayPitch,0])
  152. translate([-(FenderR + ClipThick),0,0])
  153. Profile(2); // scale upward for trimming
  154. translate([0,0,-ClipHeight]) // trim bottom
  155. cube(2*[FenderD,FenderD,ClipHeight],center=true);
  156. translate([0,0,ClipHeight*cos(StayPitch)+ClipHeight]) // trim top
  157. cube(2*[FenderD,FenderD,ClipHeight],center=true);
  158. }
  159. for (j = [-1,1]) // place ferrules
  160. translate([Ferrule[OD]*sin(StayPitch) + (Ferrule[OD]/2)*sin(StaySplay),j*(FenderR - FenderThick/2),0])
  161. rotate(-j*StaySplay)
  162. FerruleBody();
  163. }
  164. for (i=[-1,1]) // punch stiffening holes
  165. translate([FenderThick/2,-i*(FenderR - FenderThick/2),Ferrule[OD]/2])
  166. rotate([0,-90,i*StaySplay])
  167. PolyCyl(FerruleHoleD,Ferrule[OD],FerruleSides);
  168.  
  169. }
  170. }
  171.  
  172. //----------------------
  173. // Build it
  174.  
  175.  
  176. if (Layout == "Profile") {
  177. Profile();
  178. }
  179.  
  180. if (Layout == "Ferrule") {
  181. FerruleBody();
  182. }
  183.  
  184. if (Layout == "Clip") {
  185. FenderClip();
  186. }
  187.  
  188. if (Layout == "Build") {
  189. FenderClip();
  190. }
Add Comment
Please, Sign In to add comment