--- /dev/null
+// 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); } }