$fn = 100;

module floor() {
  translate([0, 0, -10])
    cube([250, 250, 10]);
}

module stand() {
  translate([100, 180, 0])
    cube([80, 30, 120]);
  translate([100, 40, 0])
    cube([80, 30, 120]);
  translate([140, 40, 120])
    cube([40, 30, 40]);
}

module rotation_motor() {
  translate([100, 150, 40])
    cube([40, 30, 40]);
}

module linear_motor() {
  translate([140, 180, 120])
    cube([40, 30, 40]);
}

module tape() {
  translate([120, 145, 60]) {
    rotate([90, 0, 0]) {
      difference() {
        cylinder(30, 50, 50);
        cylinder(30, 40, 40);
      }
    }
  }
}

module linear_shafts() {
  translate([160, 180, 140])
    rotate([90, 0, 0])
    cylinder(110, 3.5, 3.5);
  translate([170, 180, 110])
    rotate([90, 0, 0])
    cylinder(110, 3.5, 3.5);
}

module sled(width = 20) {
  translate([150, 130, 100]) {
    difference() {
      cube([30, width, 50]);
      union() {
	translate([-30, width, -40])
	  rotate([90, 0, 0])
	  cylinder(width, 60, 60);
	translate([10, width, 40])
	  rotate([90, 0, 0])
	  cylinder(width, 4, 4);
	translate([20, width, 10])
	  rotate([90, 0, 0])
	  cylinder(width, 4, 4);
      }
    }
  }
}

color([0,0,0]) floor();

stand();
sled();

color([0,1,0]) {
  rotation_motor();
  linear_motor();
  linear_shafts();
  tape();
}