My self-made 3D-printable designs, mainly in OpenSCAD
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

Copter.scad 4.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. /*
  2. * Created by:
  3. * Thomas Buck <xythobuz@xythobuz.de> in April 2016
  4. *
  5. * Licensed under the
  6. * Creative Commons - Attribution - Share Alike license.
  7. *
  8. * Idea based on the "Parametric brushed micro quadcopter"
  9. * by "drkow" / Patrick Sapinski:
  10. * http://www.thingiverse.com/thing:843597
  11. */
  12. // -----------------------------------------------------------
  13. wallSize = 2;
  14. armSize = 6;
  15. motorDiameter = 7.3;
  16. baseWidth = 41;
  17. diameter = 78;
  18. height = 5;
  19. bodyHeight = 8;
  20. motorHeight = 15;
  21. wireWidth = 2;
  22. wireHeight = 1;
  23. // size of a Turnigy nano-tech 1S 750mAh LiPo
  24. batteryWidth = 25;
  25. batteryLength = 45;
  26. batteryHeight = 10;
  27. // Hubsan compatible propellers/motors
  28. propeller = 55;
  29. realMotorHeight = 20;
  30. $fn = 25;
  31. // -----------------------------------------------------------
  32. baseLength = baseWidth + (2 * wallSize);
  33. realBaseLength = 2 * sqrt(2 * (baseLength / 2) * (baseLength / 2));
  34. armDiameter = motorDiameter + (wallSize * 2);
  35. realDiameter = 2 * sqrt(2 * (diameter / 2) * (diameter / 2));
  36. armLength = ((realDiameter - realBaseLength) / 2) - armDiameter;
  37. // -----------------------------------------------------------
  38. module arm() {
  39. difference() {
  40. // arm
  41. translate([0, -armSize / 2, 0])
  42. cube([armLength, armSize, height]);
  43. // wire grooves
  44. translate([armLength / 3, -wireWidth / 2, 0])
  45. cube([armLength * 2 / 3, wireWidth, wireHeight]);
  46. translate([armLength / 3, -wireWidth / 2, 0])
  47. cube([wireWidth, armSize, wireHeight]);
  48. translate([armLength / 3, armSize / 2 - wireHeight, -height / 2])
  49. cube([wireWidth, wireHeight, height * 2]);
  50. translate([armLength / 3, -wireWidth / 2, height - wireHeight])
  51. cube([wireWidth, armSize, wireHeight]);
  52. translate([-wireWidth, -wireWidth / 2, height - wireHeight])
  53. cube([armLength / 2, wireWidth, wireHeight]);
  54. }
  55. // motor mount
  56. translate([armLength + (armDiameter * 2 / 5), 0, 0])
  57. union() {
  58. difference() {
  59. // wall
  60. cylinder(d = armDiameter, h = motorHeight);
  61. // motor hole
  62. cylinder(d = motorDiameter, h = motorHeight);
  63. // wire groove
  64. translate([-(motorDiameter / 2) - (wallSize * 3 / 2), -wireWidth / 2, 0])
  65. cube([2 * wallSize, wireWidth, wireHeight]);
  66. }
  67. // visualize motors
  68. %cylinder(d = motorDiameter, h = realMotorHeight);
  69. // visualize propellers
  70. %translate([0, 0, realMotorHeight])
  71. cylinder(d = propeller, h = 2);
  72. }
  73. }
  74. // -----------------------------------------------------------
  75. // visualize real diameter (print bed size)
  76. %translate([-diameter / 2, -diameter / 2, -height - batteryHeight])
  77. cube([diameter, diameter, height]);
  78. // four arms
  79. rotate([0, 0, 45])
  80. for (i = [0 : 90 : 360]) {
  81. rotate([0, 0, i])
  82. translate([realBaseLength / 2 - (wallSize * 11 / 7), 0, 0])
  83. arm();
  84. }
  85. difference() {
  86. // body
  87. translate([-baseLength / 2, -baseLength / 2, 0])
  88. cube([baseLength, baseLength, bodyHeight]);
  89. // space for flight control
  90. translate([-baseWidth / 2, -baseWidth / 2, -bodyHeight / 2])
  91. cube([baseWidth, baseWidth, bodyHeight * 2]);
  92. // wire grooves
  93. for (i = [0 : 3]) {
  94. a = (i % 2) ? 1 : -1;
  95. b = (i < 2) ? 1 : -1;
  96. translate([a * (baseWidth + wallSize) / 2
  97. - ((a == 1) ? (
  98. (b == 1) ? wallSize / 2 : wallSize / 2)
  99. : 0),
  100. b * (baseWidth + wallSize) / 2
  101. - ((a == 1) ? (
  102. (b == 1) ? wallSize / 2 : -wallSize / 2)
  103. : 0),
  104. height - wireHeight])
  105. rotate([0, 0, a * b * 45])
  106. translate([-wallSize, -wireWidth / 2, 0])
  107. cube([wallSize * 3, wireWidth, bodyHeight]);
  108. }
  109. }
  110. // battery holder / bottom part
  111. union() {
  112. translate([-baseWidth / 2, -batteryWidth / 3, 0])
  113. cube([baseWidth, batteryWidth * 2 / 3, wallSize]);
  114. translate([baseWidth / 4, batteryWidth / 3, 0])
  115. cube([baseWidth / 8, (baseWidth - batteryWidth * 2 / 3) / 2, wallSize]);
  116. translate([-baseWidth * 6 / 16, batteryWidth / 3, 0])
  117. cube([baseWidth / 8, (baseWidth - batteryWidth * 2 / 3) / 2, wallSize]);
  118. translate([baseWidth / 4, - batteryWidth / 2 - (baseWidth - batteryWidth) / 2, 0])
  119. cube([baseWidth / 8, (baseWidth - batteryWidth * 2 / 3) / 2, wallSize]);
  120. translate([-baseWidth * 6 / 16, - batteryWidth / 2 - (baseWidth - batteryWidth) / 2, 0])
  121. cube([baseWidth / 8, (baseWidth - batteryWidth * 2 / 3) / 2, wallSize]);
  122. }
  123. // visualize battery
  124. %translate([-batteryLength / 2, -batteryWidth / 2, -batteryHeight])
  125. cube([batteryLength, batteryWidth, batteryHeight]);