// use $fn = 20 while developing, 100 when about to print
// 20 will make previews fast
// 100 will make printing smooth
-$fn = 20;
+$fn = 100;
-wheel_depth = 6;
-wheel_radius = 68/2;
+use <qr.scad>
-module encoder_shaft(){
- // measured with calipers, checked against the motor shaft
- motor_shaft_big = 3.7; // radius, gets doubled in cylinder
- motor_shaft_small = 4.8; // total length of box
- motor_shaft_length = wheel_depth * 3 / 4;
+qr_size = 54;
+qr_height = 2;
+wall_width = 3;
+
+wheel_width = 6;
+wheel_radius = sqrt(2 * pow(qr_size / 2, 2)) + wall_width / 2;
+
+motor_shaft_radius = 3.7;
+motor_shaft_flat_width = 4.8;
+
+module mounting_screw_flat(){
+ square(2, center = true);}
+
+module motor_shaft_flat(radius, flat_width){
intersection(){
- cylinder(h = motor_shaft_length, r = motor_shaft_big, center = true);
- // x direction is multiplied by 2 because the radius of the cylinder
- // goes in both directions. the extra .1 is for overlap
- cube([motor_shaft_big * 2.1, motor_shaft_small, motor_shaft_length],
- center = true);}}
+ circle(radius);
+ square([flat_width, radius * 2], center = true);}}
-module mounting_screw(){
- cylinder(h = wheel_depth * 1.1, r = 1, center = true);}
+module motor_shaft(radius,
+ flat_width,
+ shaft_length){
+ linear_extrude(height = shaft_length){
+ motor_shaft_flat(radius, flat_width);}}
-module wheel(){
- translate([0, 0, wheel_depth / 2]){
+module rim(radius, wall_width, wheel_width){
+ linear_extrude(height = wheel_width){
difference(){
- cylinder(h = wheel_depth, r = wheel_radius, center = true);
- translate([0, 0, wheel_depth / 4]){
- scale([1, 1, 1.1]){
- encoder_shaft();}}
- mounting_screw();
- for(i = [1 : 5]){
- rotate(i * 360/5, [0, 0, 1]){
- translate([0, 0, -0.6 * wheel_depth])
- between_spokes();}}
- translate([0, 0, wheel_depth / 4]){
- difference(){
- cylinder(h = wheel_depth / 1.2,
- r = 0.85 * wheel_radius,
- center = true);
- cylinder(h = wheel_depth / 1.2,
- r = 0.23 * wheel_radius,
- center = true);}}}}}
-
-module wheel_block(){
- cube([wheel_radius, wheel_radius, wheel_depth]);}
-
-module pie_slice(){
- intersection(){
- translate([0, 0, wheel_depth / 2]){
- cylinder(h = wheel_depth,
- r = 0.85 * wheel_radius,
- center = true);}
- translate([0, wheel_radius * 0.3, 0]){
- rotate([0, 0, (360 / 5) / 2]){
- intersection(){
- wheel_block();
- rotate([0, 0, 90 - 360 / 5])
- wheel_block();}}}}}
-
-module between_spokes(){
- minkowski(){
- pie_slice();
- cylinder(h = wheel_depth / 2, r = 1);}}
-
-wheel();
+ 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 wheel_black(radius, width, shaft_radius, shaft_flat_width, wall_width){
+ color("black"){
+ rim(radius, wall_width, width);
+ 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){
+ wheel_black(radius,
+ width,
+ shaft_radius,
+ shaft_flat_width,
+ wall_width);
+ wheel_white();}
+
+wheel(wheel_radius,
+ wheel_width,
+ motor_shaft_radius,
+ motor_shaft_flat_width,
+ wall_width);