/*
* Copyright (c) 2022 - 2023 Thomas Buck (thomas@xythobuz.de)
* Philipp Schönberger (mail@phschoen.de)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* See .
*/
include
include
// ######################
// ### PMW3360 Sensor ###
// ######################
// https://github.com/jfedor2/pmw3360-breakout
sensor_w = 22;
sensor_l = 27.6;//34;
sensor_r = 2;
sensor_pcb_h = 1.6;
sensor_hole_dia = 2.2;
sensor_hole_off_x = 3.0;
sensor_hole_off_y = 3.0;
sensor_hole_dist_x = 16.6;
sensor_hole_dist_y = 22.32;
sensor_cut_w = 8.0 + 0.5;
sensor_cut_h = 17.26;
sensor_cut_off_x = 7.0 - 0.25;
sensor_cut_off_y = 5.27;
sensor_cut_edge_to_pin1 = 2.75;
sensor_edge_to_pin1 = 1.52;
sensor_ball_to_lens_top = 2.4;
sensor_ball_to_chip_bottom = 9.81;
sensor_chip_w = 9.1;
sensor_chip_l = 16.2;
sensor_chip_h = 2.21;
sensor_pin_w = 0.5;
sensor_pin_h = 4.51;
sensor_pin_d = 0.2;
sensor_pin_dist = 10.7;
sensor_pin_off_top = 0.5;
sensor_pin_pitch = 0.89;
sensor_pin1_to_optical_center = 5.66;
sensor_lens_cutout_r = 2.0;
sensor_lens_cutout_w = 4.0;
sensor_lens_cutout_growth = 0.25;
sensor_lens_cutout_to_chip = 6.71 - 1.60;
sensor_lens_baseplate_h = 2.40;
sensor_lens_d = 19.0 + 1.0;
sensor_lens_w = 21.35 + 0.2;
sensor_lens_off = 10.97;
sensor_cutout();
module sensor_lens_cutout_intern()
{
cylinder(d = sensor_lens_cutout_r * 2, h = $e);
translate([-sensor_lens_cutout_r, 0, 0])
cube([sensor_lens_cutout_r * 2, sensor_lens_cutout_w, $e]);
}
module sensor_lens_cutout()
{
translate([0, 0, sensor_lens_cutout_to_chip])
hull()
{
translate([0, 0, sensor_lens_baseplate_h - $e])
sensor_lens_cutout_intern();
scale(1 + sensor_lens_cutout_growth * sensor_lens_baseplate_h)
sensor_lens_cutout_intern();
}
translate([-sensor_lens_d / 2, -sensor_lens_w + sensor_lens_off, 0])
rounded_cube(sensor_lens_d, sensor_lens_w, sensor_lens_cutout_to_chip, 6);
translate([-3 / 2, -sensor_lens_w + sensor_lens_off - 0.5, 0])
cube([3, 0.5, sensor_lens_cutout_to_chip]);
}
module sensor()
{
translate([-sensor_w / 2, -sensor_l / 2, 0])
difference()
{
color("green")
minkowski()
{
translate([sensor_r,sensor_r,0])
cube([sensor_w-sensor_r*2, sensor_l-sensor_r*2, sensor_pcb_h]);
cylinder(r=sensor_r,h=$e);
}
translate([sensor_cut_off_x, sensor_cut_off_y, -1])
cube([sensor_cut_w, sensor_cut_h, sensor_pcb_h + 2]);
for (x = [0, sensor_hole_dist_x])
for (y = [0, sensor_hole_dist_y])
translate([sensor_hole_off_x + x, sensor_hole_off_y + y, -1])
cylinder(d = sensor_hole_dia, h = sensor_pcb_h + 2);
}
color("#303030")
translate([-sensor_chip_w / 2, -sensor_l / 2 - sensor_chip_l + sensor_edge_to_pin1 + sensor_cut_off_y + sensor_cut_h - sensor_cut_edge_to_pin1, -sensor_chip_h])
cube([sensor_chip_w, sensor_chip_l, sensor_chip_h]);
translate([0, -sensor_l / 2 - 15 * sensor_pin_pitch + sensor_cut_off_y + sensor_cut_h - sensor_cut_edge_to_pin1, 0])
for (p = [0 : 15])
translate([0, p * sensor_pin_pitch, 0])
for (x = [-sensor_pin_dist / 2, sensor_pin_dist / 2])
if (((p % 2 == 0) && (x < 0)) || ((p % 2 == 1) && (x > 0)))
translate([-sensor_pin_d / 2 + x, -sensor_pin_w / 2, -sensor_chip_h + sensor_pin_off_top])
cube([sensor_pin_d, sensor_pin_w, sensor_pin_h]);
translate([0, -sensor_l / 2 + sensor_cut_off_y + sensor_cut_h - sensor_cut_edge_to_pin1 - sensor_pin1_to_optical_center, 0])
{
color("cyan")
translate([0, 0, -sensor_chip_h + 1])
cylinder(d = 0.2, h = sensor_ball_to_chip_bottom - 1);
%color("blue")
sensor_lens_cutout();
}
}
module sensor_pos() {
rotate(angle_sensor)
translate([0, 0, -trackball_dia / 2 ])
translate([0, sensor_l / 2 - sensor_cut_off_y - sensor_cut_h + sensor_cut_edge_to_pin1 + sensor_pin1_to_optical_center, sensor_chip_h - sensor_ball_to_chip_bottom])
translate([0, -sensor_l / 2 + sensor_cut_off_y + sensor_cut_h - sensor_cut_edge_to_pin1 - sensor_pin1_to_optical_center, 0])
sensor();
}
module sensor_cutout()
{
rotate(angle_sensor)
translate([0, 0, -trackball_dia / 2 ])
translate([0, sensor_l / 2 - sensor_cut_off_y - sensor_cut_h + sensor_cut_edge_to_pin1 + sensor_pin1_to_optical_center, sensor_chip_h - sensor_ball_to_chip_bottom])
translate([0, -sensor_l / 2 + sensor_cut_off_y + sensor_cut_h - sensor_cut_edge_to_pin1 - sensor_pin1_to_optical_center, 0])
sensor_lens_cutout();
// sensor pcb
rotate(angle_sensor)
translate([-1, -1, -trackball_dia / 2 - 20])
translate([0, sensor_l / 2 - sensor_cut_off_y - sensor_cut_h + sensor_cut_edge_to_pin1 + sensor_pin1_to_optical_center, sensor_chip_h - sensor_ball_to_chip_bottom])
translate([-sensor_w / 2, -sensor_l / 2, -10])
cube([sensor_w + 2, sensor_l + 2, sensor_pcb_h + 10 + sensor_pcb_mount_gap+20]);
}