separate data into *-data.scad for 3d models
[challenge-bot] / 3d-printables / wheel-data.scad
diff --git a/3d-printables/wheel-data.scad b/3d-printables/wheel-data.scad
new file mode 100644 (file)
index 0000000..940228a
--- /dev/null
@@ -0,0 +1,120 @@
+// challenge-bot
+// GNU AGPLv3 (or later at your option)
+// project available at these locations:
+// https://gitorious.org/ozzloy/challenge-bot
+// https://github.com/waynegramlich/challenge-bot
+
+// use $fn = 20 while developing, 100 when about to print
+//  20 will make previews fast
+//  100 will make printing smooth
+$fn = 100;
+
+qr_size = 45;
+qr_height = 2;
+
+wall_width = 3;
+
+wheel_width = 9;
+wheel_radius = sqrt(2 * pow(qr_size / 2, 2)) + wall_width / 2;
+
+motor_shaft_radius = 3.7;
+motor_shaft_flat_width = 4.8;
+
+tread_radius = 4 / 2;
+
+module mounting_screw_flat() {
+  circle(0.9); }
+
+module motor_shaft_flat(radius, flat_width) {
+  intersection() {
+    circle(radius);
+    square([flat_width, radius * 2], center = true); } }
+
+module motor_shaft(radius,
+                   flat_width,
+                   shaft_length) {
+  linear_extrude(height = shaft_length) {
+    motor_shaft_flat(radius, flat_width); } }
+
+module rim(radius, wall_width, wheel_width) {
+  linear_extrude(height = wheel_width) {
+    difference() {
+      circle(radius);
+      circle(radius - wall_width); } } }
+
+module motor_shaft_holder_flat(radius, flat_width, wall_width) {
+  difference() {
+    motor_shaft_flat(radius + wall_width,
+                     flat_width + wall_width);
+    motor_shaft_flat(radius, flat_width); } }
+
+module motor_shaft_holder(radius, flat_width, wall_width, height) {
+  linear_extrude(height = height) {
+    motor_shaft_holder_flat(radius, flat_width, wall_width); } }
+
+module tread(wheel_radius, tread_radius) {
+  rotate_extrude(convexity = 10) {
+    translate([wheel_radius, 0]) {
+      circle(tread_radius); } } }
+
+module wheel_black(radius,
+                   width,
+                   shaft_radius,
+                   shaft_flat_width,
+                   wall_width,
+                   tread_radius) {
+  color("black") {
+    difference() {
+      rim(radius, wall_width, width);
+      translate([0, 0, width / 2]) {
+        tread(radius, tread_radius); } }
+    linear_extrude(height = qr_height) {
+      difference() {
+        qr_black_flat();
+        mounting_screw_flat(); } }
+    translate([0, 0, qr_height]) {
+      motor_shaft_holder(shaft_radius,
+                         shaft_flat_width,
+                         wall_width,
+                         width - qr_height); } } }
+
+module wheel_white() {
+  color("white") {
+    linear_extrude(height = qr_height) {
+      difference() {
+        qr_white_flat();
+        mounting_screw_flat(); } } } }
+
+module wheel(radius,
+             width,
+             shaft_radius,
+             shaft_flat_width,
+             wall_width,
+             tread_radius) {
+  wheel_black(radius,
+              width,
+              shaft_radius,
+              shaft_flat_width,
+              wall_width,
+              tread_radius);
+  wheel_white(); }
+
+module wheel_solid(radius,
+                   width,
+                   shaft_radius,
+                   shaft_flat_width,
+                   wall_width,
+                   tread_radius) {
+  difference() {
+    rim(radius, wall_width * 2, width);
+    translate([0, 0, width / 2]) {
+      tread(radius, tread_radius); } }
+  linear_extrude(height = qr_height) {
+    difference() {
+      square(qr_size, center = true);
+      mounting_screw_flat(); } }
+  translate([0, 0, qr_height]) {
+    motor_shaft_holder(shaft_radius,
+                       shaft_flat_width,
+                       wall_width,
+                       width - qr_height); } }