winkelverbinder.scad 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. /* [OpenSCAD] */
  2. $fn=60; // [30:6:180]
  3. /* [Profil] */
  4. // Aluprofil (quadratisch)
  5. Raster = 20; // [20,30]
  6. // Gewindebohrung metrisch
  7. Schraube = 5; // [5,6,8]
  8. /* [Verbinder] */
  9. // Winkel der Verbindung
  10. Winkel = 90; // [30:5:180]
  11. // Schritte in der Unterteilung
  12. Steps = 6; // [1:1:60]
  13. // Ende-zu-Ende (an) oder Ende-in-Führungsnut (aus)
  14. End2End = true;
  15. // Fuehrungsnuten "inline" (an) oder "quer" (aus)
  16. F_Inline = true;
  17. // Fuehrungsnuten "T" Fuß in der Nuten
  18. F_TFoot = false;
  19. // Mit Bohrung zum Festschrauben?
  20. Bohrung = false;
  21. // Tiefe der Führung in den Nuten
  22. Nutentiefe = 3; // [2,3,4,5]
  23. // Modell für den Slicer auf die Seite legen
  24. Kippen = true;
  25. /* [Hidden] */
  26. Toleranz = 0.2;
  27. Fuehrung=1.5;
  28. module plate(height=2) {
  29. delta=Raster/2-1;
  30. hull() {
  31. for (i=[0,90,180,270]) {
  32. rotate([0,0,i]) translate([delta,delta,0]) cylinder(d=2, h=height);
  33. }
  34. }
  35. }
  36. module endcap() {
  37. // Grundplatte
  38. plate();
  39. // Führungsnupsis in den Nuten (Halbkreise)
  40. intersection() {
  41. for (i=[0,90,180,270]) {
  42. rotate([0,0,i]) translate([Raster/2,0,-Nutentiefe/2]) cylinder( d=Schraube, h=Nutentiefe, center=true );
  43. }
  44. cube(Raster, center=true);
  45. }
  46. // Innen-Nippel D=80% von Bohrung < M5 Kernloch, doppelt so lang wie die Führungen außen
  47. translate([0,0,-Nutentiefe]) cylinder(d=Schraube*4/5, h=2*Nutentiefe, center=true);
  48. }
  49. module nutenfuehrung() {
  50. if (F_TFoot==true) {
  51. // T Fuehrung in Nut mit 2.2mm Wandbreite des Profils.
  52. translate([(Raster-Schraube)/2,0,-1.1]) union() {
  53. cube( [Schraube,Schraube-Toleranz,2.2], center=true );
  54. translate([0,0,-2.2]) cube( [Schraube,Schraube-Toleranz+3,2.2], center=true );
  55. }
  56. }
  57. else {
  58. translate([(Raster-Schraube)/2,0,-Fuehrung/2]) cube( [Schraube,Schraube-Toleranz,Fuehrung], center=true );
  59. }
  60. }
  61. module nutencap() {
  62. plate();
  63. if (F_Inline==true) {
  64. for (i=[0,180]) {
  65. rotate([0,0,i]) nutenfuehrung();
  66. }
  67. }
  68. else {
  69. for (i=[90,270]) {
  70. rotate([0,0,i]) nutenfuehrung();
  71. }
  72. }
  73. }
  74. module fill_plate() {
  75. translate([10,0,0]) plate(0.01);
  76. }
  77. module fuellung(angle) {
  78. delta_angle = Winkel/Steps;
  79. hull() {
  80. rotate([0,-angle*delta_angle,0]) fill_plate();
  81. rotate([0,-(angle-1)*delta_angle,0]) fill_plate();
  82. }
  83. }
  84. // Auf die Seite legen, dann wird es beim Slicen einfacher
  85. turn90degree=(Kippen==true)?90:0;
  86. rotate([turn90degree,0,0])
  87. difference() {
  88. union() {
  89. color("red") translate([Raster/2,0,-2]) {
  90. if (End2End==true) {
  91. endcap();
  92. }
  93. else {
  94. nutencap();
  95. }
  96. }
  97. color("orange") rotate([0,-Winkel,0]) mirror([0,0,1]) translate([Raster/2,0,-2]) endcap();
  98. color("green") for ( i = [1:1:Steps] ) fuellung(i);
  99. }
  100. if (Bohrung==true && End2End==false && F_TFoot==false) {
  101. translate([Raster/2,0,0]) {
  102. mirror([0,0,1]) cylinder(d=Schraube+Toleranz, h=Schraube, center=true);
  103. translate([0,0,Toleranz]) cylinder(d=11, h=Raster);
  104. }
  105. }
  106. }