My self-made 3D-printable designs, mainly in OpenSCAD
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

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]);