From 3a634cdb18d2c40963c5dc40e9e3100c3f93f5e0 Mon Sep 17 00:00:00 2001 From: sirlilpanda Date: Mon, 23 Feb 2026 20:46:02 +1300 Subject: [PATCH] refactored files add some new ones --- modules/bidirectional_idt.scad | 150 +++++++++++++++++++++++++++++++++ modules/bond_pad.scad | 48 +++++++++++ modules/idt.scad | 69 +++++++++++++++ modules/parameter_text.scad | 15 ++++ modules/wafer.scad | 11 +++ 5 files changed, 293 insertions(+) create mode 100644 modules/bidirectional_idt.scad create mode 100644 modules/bond_pad.scad create mode 100644 modules/idt.scad create mode 100644 modules/parameter_text.scad create mode 100644 modules/wafer.scad diff --git a/modules/bidirectional_idt.scad b/modules/bidirectional_idt.scad new file mode 100644 index 0000000..79da3a2 --- /dev/null +++ b/modules/bidirectional_idt.scad @@ -0,0 +1,150 @@ +include +include + +// creates the input and output idts +// [TODO] clean this +module bi_directional_idt( + c, + f, + n_fingers, + distance = 100, + finger_length = 50, + gap = 0, + thickness = 0, + impedance = 50, + + // bond pad prams + has_bond_pads = false, + bond_pad_leg_length = 0.00005, + bond_pad_leg_width = 0.00001875, + bond_pad_size = 0.000075, + bond_pad_angle = 45, + bond_pad_bond_pad_shape = "square", + + // id number prams + id_number = 0, + has_id = false, + id_flip_dir = [1, 1, 1], + // extra + post_scale = 1, + echo_stats = false, + center = false +) { + + + lambda = c/f * post_scale; + // dont worry about these magic fractions + length_of_input = n_fingers*lambda+1.74*lambda; + + + should_be_centered = center ? 1 : 0; + center_offset_y = length_of_input + distance * lambda/2; + center_offset_x = finger_length*lambda/2 + gap/2 + thickness; + + translate([-center_offset_x * should_be_centered, -center_offset_y * should_be_centered, 0]) { + + if (has_id) { + color([255/255, 0/255, 255/255]) + translate([finger_length*lambda/2, has_bond_pads ? -(bond_pad_leg_length * post_scale * cos(bond_pad_angle)) : -lambda*finger_length/2, 0]) + scale(id_flip_dir) + text(str(id_number), size=id_text_size, halign="center"); + } + + + + // echo(str("lambda_scale = ", post_scale)); + delay_line(lambda, n_fingers, finger_length, gap, thickness); + + + color([0/255, 255/255, 128/255]) { + translate([0, distance*lambda+length_of_input, 0]) { + delay_line(lambda, n_fingers, finger_length, gap, thickness); + } + } + + // near ori + rotate([0, 0, -90]) { + if (has_bond_pads) { + color([255/255, 255/255, 255/255]) { + bond_pad( + leg_length_tweak = lambda/4, + leg_width=c/f/4, + leg_length=length( + [0,0,0], + [bond_pad_leg_length, bond_pad_leg_length, 0] + ), + leg_angle = -bond_pad_angle, + size = bond_pad_size, + post_scale=scale_unit + ); + } + } + } + // near side + + translate([lambda*finger_length+gap+thickness*2+lambda, 0, 0]) { + rotate([0, 0, -90]) { + if (has_bond_pads) { + bond_pad( + leg_length_tweak = lambda/5, + leg_width=c/f/4, + leg_length=length( + [0,0,0], + [bond_pad_leg_length, bond_pad_leg_length, 0] + ), + leg_angle = bond_pad_angle, + size = bond_pad_size, + post_scale=scale_unit + ); + } + } + } + + // far side + translate([0, length_of_input+distance*lambda+length_of_input, 0]) { + rotate([0, 0, 90]) { + if (has_bond_pads) { + bond_pad( + leg_length_tweak = lambda/5, + leg_width=c/f/4, + leg_length=length( + [0,0,0], + [bond_pad_leg_length, bond_pad_leg_length, 0] + ), + leg_angle = bond_pad_angle, + size = bond_pad_size, + post_scale=scale_unit + ); + } + } + // furthest side + translate([lambda*finger_length+gap+thickness*2+lambda, 0, 0]) { + rotate([0, 0, 90]) { + if (has_bond_pads) { + bond_pad( + leg_length_tweak = lambda/4, + leg_width=c/f/4, + leg_length=length( + [0,0,0], + [bond_pad_leg_length, bond_pad_leg_length, 0] + ), + leg_angle = -bond_pad_angle, + size = bond_pad_size, + post_scale=scale_unit + ); + } + } + } + } + } + + + if (echo_stats) { + echo("===== DELAY LINE IDT INFO ===== "); + echo(str("lambda = ", lambda)); + echo(str("min feature size lambda/4 = ", lambda/4)); + echo(str("impedance = ", impedance)); + echo(str("total capacitance = ", 1/(2*PI*f*impedance))); + echo("===== DELAY LINE IDT INFO ===== "); + } +} diff --git a/modules/bond_pad.scad b/modules/bond_pad.scad new file mode 100644 index 0000000..35b866a --- /dev/null +++ b/modules/bond_pad.scad @@ -0,0 +1,48 @@ +function length(point_1, point_2) = sqrt( + (point_1-point_2).x^2 + + (point_1-point_2).y^2 + + (point_1-point_2).z^2 +); + +// todo fix this +// units in m, the size is the min bond pad size +module bond_pad( + leg_length = 0.000075, + leg_width = 0.00001875, + leg_length_tweak = 0, + leg_angle = 45, + size = 0.000075, + bond_pad_shape = "square", + post_scale = false +) { + if (post_scale) { + circle(r=leg_width*post_scale); + + rotate([0, 0, leg_angle+180]) { + translate([-leg_length*post_scale-leg_length_tweak, -leg_width*post_scale/2, 0]) { + // color([0, 255/255, 255/255]) { + // arm + square(size=[(leg_length)*post_scale+leg_length_tweak, leg_width*post_scale]); + // } + } + } + // pad + translate([post_scale*leg_length*cos(leg_angle), post_scale*leg_length*sin(leg_angle), 0]) { + square(size=[size*post_scale, size*post_scale], center=true); + } + + // echo(str("x = ", post_scale*leg_length*cos(leg_angle+180))); + // echo(str("y = ", post_scale*leg_length*sin(leg_angle+180))); + + + } else { + rotate([0, 0, leg_angle+180]) { + translate([-leg_length/2, -leg_width, 0]) { + // color([0, 255/255, 255/255]) { + square(size=[leg_length, leg_width]); + // } + } + } + square(size=[size, size], center=true); + } +} diff --git a/modules/idt.scad b/modules/idt.scad new file mode 100644 index 0000000..2328cbf --- /dev/null +++ b/modules/idt.scad @@ -0,0 +1,69 @@ +// creates 1 side of the idt +module delay_line(lambda = 1, n_fingers = 1, finger_length = 50, gap = 0, thickness = 0) { + // code + l45 =lambda*5/4; + l2 = lambda/2; + l4 = lambda/4; + l8 = lambda/8; + b = l4 + thickness; + f = l4 + finger_length*lambda; + + points_cap = [ + [0, 0], + [0, l2], + [-b-f, l2], + [-b-f, l4], + [-b, l4], + [-b, 0] + ]; + + points = [ + [0, 0], + [b, 0], + [b, l2], + [b+f, l2], + [b+f, l2+l4], + [b, l2+l4], + [b, l4*5-l4], + [0, l4*5-l4] + ]; + // union () { + + translate([0, l2, 0]){ + for(i = [0:n_fingers]){ + translate([0, i*(l45-l4), 0]) { + polygon(points); + } + } + + color("red") { + rotate([0, 0, 180]) + translate([0, 0, 0]) { + polygon(points_cap); + } + + translate([f+l2+gap+thickness, -l2, 0]) { + square(size=[l4+thickness, l4]); + } + } + + + union() { + for(i = [0:n_fingers]){ + translate([2*b+f+gap+l4, i*(l45-l4)+l2+l4 , 0]) + rotate([0, 0, 180]) + polygon(points); + } + } + + color("red") { + translate([2*b+f+gap+l4, n_fingers*lambda+lambda-l4, 0]) { + polygon(points_cap); + } + translate([0, n_fingers*lambda+lambda, 0]) { + square(size=[l4+thickness, l4]); + } + } + + } +} diff --git a/modules/parameter_text.scad b/modules/parameter_text.scad new file mode 100644 index 0000000..f6f2475 --- /dev/null +++ b/modules/parameter_text.scad @@ -0,0 +1,15 @@ +module parameter_text( + heading, + params, + heading_size = 4, + param_size = 2.5, + font = "Ubuntu Sans Mono:style=Regular", + center = false +) { + text(heading, size=heading_size, font=FONT, halign = center ? "center" : "left"); + for (i=[0:len(params)]) { + translate([0, -heading_size*(i+1), 0]) + text(params[i], size=param_size, font=FONT, halign = center ? "center" : "left"); + } +} + diff --git a/modules/wafer.scad b/modules/wafer.scad new file mode 100644 index 0000000..c30a78a --- /dev/null +++ b/modules/wafer.scad @@ -0,0 +1,11 @@ + + + +// [TODO] try add the flat edge on to the wafer +module wafer(d) { + color([128/255, 128/255, 128/255]) { + translate([0, 0, -1]) { + circle(r=d/2); + } + } +}