Compare commits

...

21 Commits

Author SHA1 Message Date
sirlilpanda
9f4ce14d35 fixed feature size 2026-02-26 11:23:07 +13:00
sirlilpanda
9918d2b064 autogen 2026-02-26 09:48:45 +13:00
sirlilpanda
d499fff5cc changed output file name from waferlayout to something more discriptive 2026-02-26 09:48:26 +13:00
91f84fb78a fixed comment line 2026-02-25 23:02:33 +13:00
129a5b5d3d autogened 2026-02-25 23:02:22 +13:00
67a76eff07 makefile for compling all dxfs 2026-02-25 23:02:11 +13:00
8ae175e08c added the smallest unit value to the ploygon in order to ensure they overlap and union correctly 2026-02-25 21:59:26 +13:00
sirlilpanda
04e1ad0d0a moved to dxfs 2026-02-25 21:13:45 +13:00
sirlilpanda
2516378755 added more comments 2026-02-25 21:13:25 +13:00
sirlilpanda
f94a6d137e new wafer layout and update the comments on some others 2026-02-25 21:13:05 +13:00
sirlilpanda
7526d8d2a1 added more comments to explain each part 2026-02-25 21:12:37 +13:00
sirlilpanda
21ed153977 some preset dxfs to use 2026-02-25 21:12:09 +13:00
f3216a74db updated image location 2026-02-23 21:02:42 +13:00
bdc5bbbd6a make sure that wafer doesnt appear in the final design 2026-02-23 21:02:30 +13:00
7382cca207 basic readme 2026-02-23 21:01:55 +13:00
79fa5c8237 custom layout for the wafers 2026-02-23 20:47:58 +13:00
f65383ef28 these are all the common params that each wafer layout may need, these will change in the future 2026-02-23 20:47:39 +13:00
ab7024b46a dir of save params 2026-02-23 20:47:04 +13:00
3a634cdb18 refactored files add some new ones 2026-02-23 20:46:02 +13:00
ade276e1ec refactored in to other files 2026-02-23 20:45:45 +13:00
446890d958 fairly happy 2026-02-23 17:52:12 +13:00
33 changed files with 17977790 additions and 481 deletions

50
README.md Normal file
View File

@@ -0,0 +1,50 @@
# openscad IDT creation scripts
these are a collection of scripts and layout for creating IDTs within openscad as well as some fun
layout on wafers. Currently these scripts only support bidirectional IDT but i will be adding more
in the future. but you could create cool IDT on wafers like this:
![alt text](res/image.png)
## to start
- download openscad
```bash
$ sudo apt install openscad
```
- clone this repo
```bash
$ git clone https://git.sirlilpanda.studio/sirlilpanda/openscad_parameteric_IDT_creation_scripts.git
```
- create a new openscad file within wafer layouts for this example it will be called `your_new_idt_layout.scad`
```
...
|
├ wafer_layouts
| ├ cross_pattern_idt.scad
| ├ hex_layout_idt.scad
| ├ pair_idt.scad
| ├ quadrant_array.scad
| ├ your_new_idt_layout.scad
| └ single_idt.scad
├ common_params.scad
└ README.md
```
- add the required files to get started in your `your_new_idt_layout.scad`
``` scad
// > your_new_idt_layout.scad
// the idt module itself
include <../modules/bidirectional_idt.scad>
// a module for nicely displaying the parameters used for your idt
include <../modules/parameter_text.scad>
// a simple wafer model that wont get added in to your final design
include <../modules/wafer.scad>
```
- and lastly copy in the `common_params.scad` in to your `your_new_idt_layout.scad`, these are just common parameters that each design need such as frequency and speed of sound in your substrate.
- now you can add as many idts to the wafer as you want.
check out `single_idt.scad` and `quadrant_array.scad` to see what is possible with these scripts.

116
common_paramas.scad Normal file
View File

@@ -0,0 +1,116 @@
// ================= README =================
// these are the normal parameters used by
// each one of the layout scripts
// however they do dont directly use them
// and instead have thier own copy
//
// this was done in order to have more control
// over each of the scripts themsevels
// allowing each to have even more parameters
// and having them show up in the open scad
// parameters window
// ================= README =================
// ================= openscad prams =================
// min angle
$fa = 0.1;
// min size
$fs = 0.01;
// ================= openscad prams =================
// ================= meta =================
// version number of the current script
SCRIPT_VERSION="0.0.1";
// font for layout
FONT="Ubuntu Sans Mono:style=Regular";
// the test number ref number for this set of IDTs
test_number = 1;
// this is needed due to the min size value
// a pre scaler for the given values
scale_unit = 1e3;
// ================= meta =================
// ================= IDT =================
// the underlying substrate
substrate = "SI";
// linbo
// the aoucstice wave speed in the substrate
c = 3992.0;
// si
// c = 3159.0;
// the target frequency of the IDT
freq = 50.0e6;
// the distance between the input and output IDT
// should be between 100-200
distance = 50;
// the number of fingers the IDT has
n_fingers = 50;
// the length of the figure or aperture should be 50-70
finger_length = 60;
// the gap between both sides of the IDT (should be used for tweaking)
gap = 0;
// the thickness of the wire the connects all the fingers
thickness = 0;
// adds an ID number to an IDT, useful if you have multiple on a wafer
has_id_number = false;
// ================= IDT =================
// ================= bond pad =================
// the length of the bond pad leg from the edge of the IDT to the center of the bond pad
leg_length = 0.003;
// the width of the leg
leg_width = 0.00001875;
// the angle the leg comes off from the IDT,
// positive angle means the leg is angled away
// negitive angle means the leg is angled inwards
leg_angle = 10;
// the size of the bond pad
size = 0.002;
// the shape of the bond pad (not implemented)
bond_pad_shape = "square";
// ================= bond pad =================
// ================= text =================
info_block_offset_x=7;
info_block_offset_y=30;
// total scale of infoblock
info_block_scale=0.3;
// the text size of the heading in the info block
title_text_size = 4;
// the size of all the sub items in the info block
prop_text_size = 2.5;
// the size of the ID numbers in on the IDTS
id_text_size = 1;
// ================= text =================
// ================= wafers =================
// the size of the wafer in inchs (why inch and not metric like everything else because its standard)
wafer_size_inch = 4;
// ================= wafers =================

View File

@@ -1,481 +0,0 @@
// inputs, delay line config
// will have to scale approperly
$fa = 1;
$fs = 0.01;
SCRIPT_VERSION="0.0.1";
FONT="Ubuntu Sans Mono:style=Regular";
// lambda = 7.5;
substrate = "SI";
test_number = 1;
// linbo
c = 3992.0;
// si
// c = 3159.0;
freq = 50.0e6;
// $fs = (c/freq);
// inout distance
distance = 50;
// number of finger
n_fingers = 50;
// should be 50-70
finger_length = 60;
// for tweaking the design
gap = 0;
// for tweaking the design
thickness = 0;
// scale in m
scale_unit = 1e3;
leg_length = 0.003;
leg_width = 0.00001875;
leg_angle = 10;
size = 0.002;
bond_pad_shape = "square";
info_block_offset_x=7;
info_block_offset_y=30;
info_block_scale=0.3;
title_text_size = 4;
prop_text_size = 2.5;
id_text_size = 2;
number_of_idts_per_quadrent=4;
idt_x_spacing = 10;
idt_y_spacing = 7;
wafer_size_inch = 4;
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
);
// 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]);
}
}
}
}
// 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);
}
}
// creates the input and output ids
module delay_line_idt(
c,
f,
n_fingers,
distance = 100,
finger_length = 50,
gap = 0,
thickness = 0,
impedance = 50,
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",
post_scale = false,
id_number = 0,
has_id = true
) {
local_scale = 0;
// echo("===== DELAY LINE IDT INFO ===== ");
if (post_scale) {
lambda = c/f * post_scale;
// dont worry about these magic fractions
length_of_input = n_fingers*lambda+1.74*lambda;
// n_fingers*lambda+lambda/2;
echo(str("lambda = ", lambda));
// echo(str("lambda/4 = ", lambda/4));
// echo(str("lambda_scale = ", post_scale));
delay_line(lambda, n_fingers, finger_length, gap, thickness);
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])
text(str(id_number), size=id_text_size, halign="center");
}
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
);
}
}
}
}
} else {
lambda = 1;
length_of_input = n_fingers*lambda*15/8;
echo(str("lambda = ", lambda));
echo(str("lambda_scale = ", 1));
delay_line(lambda, n_fingers, finger_length, gap, thickness);
translate([0, length_of_input+distance*lambda, 0])
delay_line(lambda, n_fingers, finger_length, gap, thickness);
}
// echo(str("impedance = ", impedance));
// echo(str("total capacitance = ", 1/(2*PI*f*impedance)));
// echo("===== DELAY LINE IDT INFO ===== ");
}
module wafer(d) {
color([128/255, 128/255, 128/255]) {
translate([0, 0, -1]) {
circle(r=d/2);
}
}
}
module prameter_text() {
text(str("IDT ", substrate, "#", test_number), size=4, font=FONT);
translate([0, -title_text_size, 0])
text(str("c : ", c), size=prop_text_size, font=FONT);
translate([0, -title_text_size*2, 0])
text(str("freq : ", freq), size=prop_text_size, font=FONT);
translate([0, -title_text_size*3, 0])
text(str("distance : ", distance), size=prop_text_size, font=FONT);
translate([0, -title_text_size*4, 0])
text(str("n_fingers : ", n_fingers), size=prop_text_size, font=FONT);
translate([0, -title_text_size*5, 0])
text(str("finger_length : ", finger_length), size=prop_text_size, font=FONT);
translate([0, -title_text_size*6, 0])
text(str("gap : ", gap), size=prop_text_size, font=FONT);
translate([0, -title_text_size*7, 0])
text(str("thickness : ", thickness), size=prop_text_size, font=FONT);
translate([0, -title_text_size*8, 0])
text(str("leg_length : ", leg_length), size=prop_text_size, font=FONT);
translate([0, -title_text_size*9, 0])
text(str("leg_angle : ", leg_angle), size=prop_text_size, font=FONT);
translate([0, -title_text_size*10, 0])
text(str("size : ", size), size=prop_text_size, font=FONT);
translate([0, -title_text_size*11, 0])
text(str("feat. size (mm): ", (c/freq)*1e3), size=prop_text_size, font=FONT);
translate([0, -title_text_size*12, 0])
text(str("version : ", SCRIPT_VERSION), size=prop_text_size, font=FONT);
}
translate([info_block_offset_x, -info_block_offset_y, 0]) {
rotate([0, 0, -90])
scale([info_block_scale, info_block_scale, info_block_scale]) {
prameter_text();
}
}
rotate([0, 0, 180])
translate([info_block_offset_x, -info_block_offset_y, 0]) {
rotate([0, 0, -90])
scale([info_block_scale, info_block_scale, info_block_scale]) {
prameter_text();
}
}
// delay_line_idt(
// c,
// freq,
// n_fingers,
// distance,
// finger_length,
// gap,
// thickness,
// post_scale=scale_unit,
// has_bond_pads = true,
// bond_pad_angle = leg_angle,
// bond_pad_leg_width = leg_width,
// bond_pad_leg_length = leg_length,
// bond_pad_size = size
// );
// wafer(wafer_size_inch*25.4);
for (i=[0:number_of_idts_per_quadrent-1]) {
translate([idt_x_spacing/4, 0, 0]) {
translate([i * idt_x_spacing, idt_y_spacing, 0]) {
delay_line_idt(
c,
freq,
n_fingers,
distance,
finger_length,
gap,
thickness,
post_scale=scale_unit,
has_bond_pads = true,
bond_pad_angle = leg_angle,
bond_pad_leg_width = leg_width,
bond_pad_leg_length = leg_length,
bond_pad_size = size
);
}
translate([i * idt_x_spacing, -idt_y_spacing, 0]) {
scale([1, -1, 1]) {
delay_line_idt(
c,
freq,
n_fingers,
distance,
finger_length,
gap,
thickness,
post_scale=scale_unit,
has_bond_pads = true,
bond_pad_angle = leg_angle,
bond_pad_leg_width = leg_width,
bond_pad_leg_length = leg_length,
bond_pad_size = size
);
}
}
}
scale([-1, 1, 1])
translate([idt_x_spacing/4, 0, 0]) {
translate([i * idt_x_spacing, idt_y_spacing, 0]) {
delay_line_idt(
c,
freq,
n_fingers,
distance,
finger_length,
gap,
thickness,
post_scale=scale_unit,
has_bond_pads = true,
bond_pad_angle = leg_angle,
bond_pad_leg_width = leg_width,
bond_pad_leg_length = leg_length,
bond_pad_size = size
);
}
translate([i * idt_x_spacing, -idt_y_spacing, 0]) {
scale([1, -1, 1]) {
delay_line_idt(
c,
freq,
n_fingers,
distance,
finger_length,
gap,
thickness,
post_scale=scale_unit,
has_bond_pads = true,
bond_pad_angle = leg_angle,
bond_pad_leg_width = leg_width,
bond_pad_leg_length = leg_length,
bond_pad_size = size
);
}
}
}
}
// bond_pad(
// leg_length = 0.0075,
// leg_width = 0.00001875,
// leg_angle = 20,
// size = 0.0075,
// bond_pad_shape = "square",
// post_scale = scale_unit
// );

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,38 @@
{
"parameterSets": {
"design default values": {
"$fa": "1",
"$fs": "0.01",
"FONT": "Ubuntu Sans Mono:style=Regular",
"SCRIPT_VERSION": "0.0.1",
"bond_pad_shape": "square",
"c": "3992",
"distance": "70",
"finger_length": "50",
"freq": "1e+7",
"gap": "0",
"has_id_number": "true",
"id_text_size": "1",
"idt_1_x_offset": "-15",
"idt_1_y_offset": "0",
"idt_2_x_offset": "15",
"idt_2_y_offset": "0",
"info_block_offset_x": "32",
"info_block_offset_y": "-7",
"info_block_scale": "0.3",
"leg_angle": "10",
"leg_length": "0.003",
"leg_width": "0.00001875",
"n_fingers": "50",
"prop_text_size": "2.5",
"scale_unit": "1000",
"size": "0.002",
"substrate": "SI",
"test_number": "2",
"thickness": "0",
"title_text_size": "4",
"wafer_size_inch": "4"
}
},
"fileFormatVersion": "1"
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,36 @@
{
"parameterSets": {
"design default values": {
"$fa": "0.1",
"$fs": "0.01",
"FONT": "Ubuntu Sans Mono:style=Regular",
"SCRIPT_VERSION": "0.0.1",
"bond_pad_shape": "square",
"c": "3992",
"distance": "50",
"finger_length": "50",
"freq": "1e+7",
"gap": "0",
"has_id_number": "false",
"id_text_size": "1",
"idt_x_offset": "0",
"idt_y_offset": "0",
"info_block_offset_x": "25",
"info_block_offset_y": "10",
"info_block_scale": "0.3",
"leg_angle": "10",
"leg_length": "0.003",
"leg_width": "0.00001875",
"n_fingers": "50",
"prop_text_size": "2.5",
"scale_unit": "1000",
"size": "0.002",
"substrate": "LINBO",
"test_number": "1",
"thickness": "0",
"title_text_size": "4",
"wafer_size_inch": "4"
}
},
"fileFormatVersion": "1"
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,38 @@
{
"parameterSets": {
"design default values": {
"$fa": "1",
"$fs": "0.01",
"FONT": "Ubuntu Sans Mono:style=Regular",
"SCRIPT_VERSION": "0.0.1",
"bond_pad_shape": "square",
"c": "3992",
"distance": "150",
"finger_length": "60",
"freq": "2.5e+7",
"gap": "0",
"has_id_number": "false",
"id_text_size": "1",
"idt_1_x_offset": "0",
"idt_1_y_offset": "0",
"idt_2_x_offset": "0",
"idt_2_y_offset": "0",
"info_block_offset_x": "20",
"info_block_offset_y": "-30",
"info_block_scale": "0.3",
"leg_angle": "10",
"leg_length": "0.003",
"leg_width": "0.00001875",
"n_fingers": "50",
"prop_text_size": "2.5",
"scale_unit": "1000",
"size": "0.002",
"substrate": "LINBO",
"test_number": "1",
"thickness": "0",
"title_text_size": "4",
"wafer_size_inch": "4"
}
},
"fileFormatVersion": "1"
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,38 @@
{
"parameterSets": {
"design default values": {
"$fa": "0.1",
"$fs": "0.01",
"FONT": "Ubuntu Sans Mono:style=Regular",
"SCRIPT_VERSION": "0.0.1",
"bond_pad_shape": "square",
"c": "3992",
"cols": "10",
"distance": "50",
"finger_length": "60",
"freq": "3.45e+8",
"gap": "0",
"has_id_number": "true",
"id_text_size": "0.5",
"info_block_offset_x": "28",
"info_block_offset_y": "-5",
"info_block_scale": "0.3",
"leg_angle": "10",
"leg_length": "0.001",
"leg_width": "0.00001875",
"n_fingers": "50",
"prop_text_size": "2.5",
"rows": "10",
"scale_unit": "1000",
"size": "0.00075",
"spacing_x": "4",
"spacing_y": "7",
"substrate": "SI",
"test_number": "1",
"thickness": "0",
"title_text_size": "4",
"wafer_size_inch": "4"
}
},
"fileFormatVersion": "1"
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,37 @@
{
"parameterSets": {
"design default values": {
"$fa": "1",
"$fs": "0.01",
"FONT": "Ubuntu Sans Mono:style=Regular",
"SCRIPT_VERSION": "0.0.1",
"bond_pad_shape": "square",
"c": "3992",
"distance": "50",
"finger_length": "60",
"freq": "5e+7",
"gap": "0",
"has_id_number": "true",
"id_text_size": "1",
"idt_x_spacing": "10",
"idt_y_spacing": "12.5",
"info_block_offset_x": "7",
"info_block_offset_y": "30",
"info_block_scale": "0.3",
"leg_angle": "10",
"leg_length": "0.003",
"leg_width": "0.00001875",
"n_fingers": "50",
"number_of_idts_per_quadrent": "4",
"prop_text_size": "2.5",
"scale_unit": "1000",
"size": "0.002",
"substrate": "SI",
"test_number": "1",
"thickness": "0",
"title_text_size": "4",
"wafer_size_inch": "4"
}
},
"fileFormatVersion": "1"
}

File diff suppressed because it is too large Load Diff

19
makefile Normal file
View File

@@ -0,0 +1,19 @@
all: single_10MHZ pair_10MHZ quadrand_50MHz array_345MHz cross_25MHz
single_10MHZ:
openscad -o dxfs/10MHz_single_IDT/single_10MHZ.dxf wafer_layouts/single_idt.scad -p dxfs/10MHz_single_IDT/single_idt.json
pair_10MHZ:
openscad -o dxfs/10MHz_pair_IDT/pair_10MHZ.dxf wafer_layouts/pair_idt.scad -p dxfs/10MHz_single_IDT/pair_idt.json
quadrand_50MHz:
openscad -o dxfs/50MHz_quadrant_array_16/quadrand_50MHz.dxf wafer_layouts/quadrant_array.scad -p dxfs/50MHz_quadrant_array_16/quadrant_array_16_50MHz.json
array_345MHz:
openscad -o dxfs/345MHz_grid_10_10_IDT/array_345MHz.dxf wafer_layouts/gird_array_idt.scad -p dxfs/345MHz_grid_10_10_IDT/gird_array_idt.json
cross_25MHz:
openscad -o dxfs/25MHz_cross_idt/cross_25MHz.dxf wafer_layouts/cross_pattern_idt.scad -p dxfs/25MHz_cross_idt/cross_pattern_idt.json

View File

@@ -0,0 +1,154 @@
include <idt.scad>
include <bond_pad.scad>
// 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_scale = [1, 1, 1],
id_translate = [0, 0, 0],
id_rot = [0, 0, 0],
// 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])
translate(id_translate)
rotate(id_rot)
scale(id_scale)
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 ===== ");
}
}

35
modules/bond_pad.scad Normal file
View File

@@ -0,0 +1,35 @@
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
) {
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)));
}

77
modules/idt.scad Normal file
View File

@@ -0,0 +1,77 @@
// creates 1 side of the idt
module delay_line(
lambda = 1,
n_fingers = 1,
finger_length = 50,
gap = 0,
thickness = 0
) {
// just a very small value that allows the polygons to overlap nicely
esp = $fs;
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 + esp],
[0, l4*5-l4 + esp]
];
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]);
}
}
}
}
}

View File

@@ -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");
}
}

11
modules/wafer.scad Normal file
View File

@@ -0,0 +1,11 @@
// [TODO] try add the flat edge on to the wafer
module wafer(d) {
if ($preview) {
color([128/255, 128/255, 128/255])
translate([0, 0, -1])
circle(r=d/2);
}
}

BIN
res/image.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

View File

@@ -0,0 +1,151 @@
include <../modules/bidirectional_idt.scad>
include <../modules/parameter_text.scad>
include <../modules/wafer.scad>
// ================= README =================
// these are the normal parameters used by
// each one of the layout scripts
// however they do dont directly use them
// and instead have thier own copy
//
// this was done in order to have more control
// over each of the scripts themsevels
// allowing each to have even more parameters
// and having them show up in the open scad
// parameters window
// ================= README =================
// ================= openscad prams =================
$fa = 1;
$fs = 0.01;
// ================= openscad prams =================
// ================= meta =================
SCRIPT_VERSION="0.0.1";
// this really just need to be any mon font
FONT="Ubuntu Sans Mono:style=Regular";
test_number = 1;
// scale in m
scale_unit = 1e3;
// ================= meta =================
// ================= IDT =================
substrate = "LINBO";
// linbo
c = 3992.0;
// si
// c = 3159.0;
freq = 25.0e6;
// $fs = (c/freq);
// inout distance
distance = 150;
// number of finger
n_fingers = 50;
// should be 50-70
finger_length = 60;
// for tweaking the design
gap = 0;
// for tweaking the design
thickness = 0;
has_id_number = false;
// ================= IDT =================
// ================= bond pad =================
leg_length = 0.003;
leg_width = 0.00001875;
leg_angle = 10;
size = 0.002;
bond_pad_shape = "square";
// ================= bond pad =================
// ================= text =================
info_block_offset_x=20;
info_block_offset_y=-30;
info_block_scale=0.3;
title_text_size = 4;
prop_text_size = 2.5;
id_text_size = 1;
// ================= text =================
// ================= IDT Pos =================
idt_1_x_offset = 0;
idt_1_y_offset = 0;
idt_2_x_offset = 0;
idt_2_y_offset = 0;
// ================= IDT Pos =================
// ================= wafers =================
wafer_size_inch = 4;
// ================= wafers =================
module params() {
parameter_text(
str("IDT ", substrate, "#", test_number),
[
str("c (ms): ", c),
str("freq (Hz): ", freq),
str("distance : ", distance),
str("n_fingers : ", n_fingers),
str("finger_length : ", finger_length),
str("gap : ", gap),
str("thickness : ", thickness),
str("leg_length : ", leg_length),
str("leg_angle : ", leg_angle),
str("size : ", size),
str("feat. size (mm): ", (c/freq)*1e3 / 4),
str("version : ", SCRIPT_VERSION)
]
);
}
translate([info_block_offset_x, -info_block_offset_y, 0])
scale([info_block_scale, info_block_scale, info_block_scale])
params();
wafer(wafer_size_inch*25.4);
translate([idt_1_x_offset, idt_1_y_offset, 0])
rotate([0, 0, 90])
bi_directional_idt(
c,
freq,
n_fingers,
distance,
finger_length,
gap,
thickness,
post_scale=scale_unit,
has_bond_pads = true,
bond_pad_angle = leg_angle,
bond_pad_leg_width = leg_width,
bond_pad_leg_length = leg_length,
bond_pad_size = size,
center = true
);
translate([idt_2_x_offset, idt_2_y_offset, 0])
bi_directional_idt(
c,
freq,
n_fingers,
distance,
finger_length,
gap,
thickness,
post_scale=scale_unit,
has_bond_pads = true,
bond_pad_angle = leg_angle,
bond_pad_leg_width = leg_width,
bond_pad_leg_length = leg_length,
bond_pad_size = size,
center = true
);

View File

@@ -0,0 +1,188 @@
include <../modules/bidirectional_idt.scad>
include <../modules/parameter_text.scad>
include <../modules/wafer.scad>
// ================= README =================
// these are the normal parameters used by
// each one of the layout scripts
// however they do dont directly use them
// and instead have thier own copy
//
// this was done in order to have more control
// over each of the scripts themsevels
// allowing each to have even more parameters
// and having them show up in the open scad
// parameters window
// ================= README =================
// ================= openscad prams =================
// min angle
$fa = 0.1;
// min size
$fs = 0.01;
// ================= openscad prams =================
// ================= meta =================
// version number of the current script
SCRIPT_VERSION="0.0.1";
// font for layout
FONT="Ubuntu Sans Mono:style=Regular";
// the test number ref number for this set of IDTs
test_number = 1;
// this is needed due to the min size value
// a pre scaler for the given values
scale_unit = 1e3;
// ================= meta =================
// ================= IDT =================
// the underlying substrate
substrate = "SI";
// linbo
// the aoucstice wave speed in the substrate
c = 3992.0;
// si
// c = 3159.0;
// the target frequency of the IDT
freq = 345.0e6;
// the distance between the input and output IDT
// should be between 100-200
distance = 50;
// the number of fingers the IDT has
n_fingers = 50;
// the length of the figure or aperture should be 50-70
finger_length = 60;
// the gap between both sides of the IDT (should be used for tweaking)
gap = 0;
// the thickness of the wire the connects all the fingers
thickness = 0;
// adds an ID number to an IDT, useful if you have multiple on a wafer
has_id_number = true;
// ================= IDT =================
// ================= bond pad =================
// the length of the bond pad leg from the edge of the IDT to the center of the bond pad
leg_length = 0.001;
// the width of the leg
leg_width = 0.00001875;
// the angle the leg comes off from the IDT,
// positive angle means the leg is angled away
// negitive angle means the leg is angled inwards
leg_angle = 10;
// the size of the bond pad
size = 0.00075;
// the shape of the bond pad (not implemented)
bond_pad_shape = "square";
// ================= bond pad =================
// ================= text =================
info_block_offset_x=28;
info_block_offset_y=-5;
// total scale of infoblock
info_block_scale=0.3;
// the text size of the heading in the info block
title_text_size = 4;
// the size of all the sub items in the info block
prop_text_size = 2.5;
// the size of the ID numbers in on the IDTS
id_text_size = 0.5;
// ================= text =================
// ================= wafers =================
// the size of the wafer in inchs (why inch and not metric like everything else because its standard)
wafer_size_inch = 4;
// ================= wafers =================
// ================= # IDTS =================
rows = 10;
cols = 10;
spacing_x = 4;
spacing_y = 7;
// ================= # IDTS =================
module params() {
parameter_text(
str("IDT ", substrate, "#", test_number),
[
str("c (ms): ", c),
str("freq (Hz): ", freq),
str("distance : ", distance),
str("n_fingers : ", n_fingers),
str("finger_length : ", finger_length),
str("gap : ", gap),
str("thickness : ", thickness),
str("leg_length : ", leg_length),
str("leg_angle : ", leg_angle),
str("size : ", size),
str("feat. size (mm): ", (c/freq)*1e3 / 4),
str("version : ", SCRIPT_VERSION)
]
);
}
translate([info_block_offset_x, -info_block_offset_y, 0])
scale([info_block_scale, info_block_scale, info_block_scale])
params();
wafer(4*0.0254*scale_unit);
translate([-spacing_x*rows/2, -spacing_y*cols/2, 0])
for (x=[0:rows]) {
for (y=[0:cols]) {
translate([spacing_x*x, spacing_y*y, 0])
bi_directional_idt(
c,
freq,
n_fingers,
distance,
finger_length,
gap,
thickness,
post_scale=scale_unit,
center = true,
has_bond_pads = true,
bond_pad_angle = leg_angle,
bond_pad_leg_width = leg_width,
bond_pad_leg_length = leg_length,
bond_pad_size = size,
has_id = has_id_number,
id_translate = [1.7, -0.5, 0],
id_rot = [0, 0, 90],
id_number = x*rows + y
);
}
}

View File

@@ -0,0 +1,174 @@
include <../modules/bidirectional_idt.scad>
include <../modules/parameter_text.scad>
include <../modules/wafer.scad>
// ================= README =================
// these are the normal parameters used by
// each one of the layout scripts
// however they do dont directly use them
// and instead have thier own copy
//
// this was done in order to have more control
// over each of the scripts themsevels
// allowing each to have even more parameters
// and having them show up in the open scad
// parameters window
// ================= README =================
// ================= openscad prams =================
$fa = 1;
$fs = 0.01;
// ================= openscad prams =================
// ================= meta =================
SCRIPT_VERSION="0.0.1";
// this really just need to be any mon font
FONT="Ubuntu Sans Mono:style=Regular";
test_number = 1;
// scale in m
scale_unit = 1e3;
// ================= meta =================
// ================= IDT =================
substrate = "LINBO";
// linbo
c = 3992.0;
// si
// c = 3159.0;
freq = 50.0e6;
// $fs = (c/freq);
// inout distance
distance = 150;
// number of finger
n_fingers = 50;
// should be 50-70
finger_length = 60;
// for tweaking the design
gap = 0;
// for tweaking the design
thickness = 0;
has_id_number = false;
// ================= IDT =================
// ================= bond pad =================
leg_length = 0.003;
leg_width = 0.00001875;
leg_angle = 10;
size = 0.002;
bond_pad_shape = "square";
// ================= bond pad =================
// ================= text =================
info_block_offset_x=20;
info_block_offset_y=-30;
info_block_scale=0.3;
title_text_size = 4;
prop_text_size = 2.5;
id_text_size = 1;
// ================= text =================
// ================= IDT Pos =================
idt_1_x_offset = 0;
idt_1_y_offset = 0;
idt_2_x_offset = 0;
idt_2_y_offset = 0;
// ================= IDT Pos =================
// ================= wafers =================
wafer_size_inch = 4;
// ================= wafers =================
module params() {
parameter_text(
str("IDT ", substrate, "#", test_number),
[
str("c (ms): ", c),
str("freq (Hz): ", freq),
str("distance : ", distance),
str("n_fingers : ", n_fingers),
str("finger_length : ", finger_length),
str("gap : ", gap),
str("thickness : ", thickness),
str("leg_length : ", leg_length),
str("leg_angle : ", leg_angle),
str("size : ", size),
str("feat. size (mm): ", (c/freq)*1e3 / 4),
str("version : ", SCRIPT_VERSION)
]
);
}
translate([info_block_offset_x, -info_block_offset_y, 0])
scale([info_block_scale, info_block_scale, info_block_scale])
params();
wafer(wafer_size_inch*25.4);
translate([idt_1_x_offset, idt_1_y_offset, 0])
rotate([0, 0, 60])
bi_directional_idt(
c,
freq,
n_fingers,
distance,
finger_length,
gap,
thickness,
post_scale=scale_unit,
has_bond_pads = true,
bond_pad_angle = leg_angle,
bond_pad_leg_width = leg_width,
bond_pad_leg_length = leg_length,
bond_pad_size = size,
center = true
);
translate([idt_2_x_offset, idt_2_y_offset, 0])
rotate([0, 0, 120])
bi_directional_idt(
c,
freq,
n_fingers,
distance,
finger_length,
gap,
thickness,
post_scale=scale_unit,
has_bond_pads = true,
bond_pad_angle = leg_angle,
bond_pad_leg_width = leg_width,
bond_pad_leg_length = leg_length,
bond_pad_size = size,
center = true
);
translate([idt_2_x_offset, idt_2_y_offset, 0])
bi_directional_idt(
c,
freq,
n_fingers,
distance,
finger_length,
gap,
thickness,
post_scale=scale_unit,
has_bond_pads = true,
bond_pad_angle = leg_angle,
bond_pad_leg_width = leg_width,
bond_pad_leg_length = leg_length,
bond_pad_size = size,
center = true
);

157
wafer_layouts/pair_idt.scad Normal file
View File

@@ -0,0 +1,157 @@
include <../modules/bidirectional_idt.scad>
include <../modules/parameter_text.scad>
include <../modules/wafer.scad>
// ================= README =================
// these are the normal parameters used by
// each one of the layout scripts
// however they do dont directly use them
// and instead have thier own copy
//
// this was done in order to have more control
// over each of the scripts themsevels
// allowing each to have even more parameters
// and having them show up in the open scad
// parameters window
// ================= README =================
// ================= openscad prams =================
$fa = 1;
$fs = 0.01;
// ================= openscad prams =================
// ================= meta =================
SCRIPT_VERSION="0.0.1";
// this really just need to be any mon font
FONT="Ubuntu Sans Mono:style=Regular";
test_number = 1;
// scale in m
// 1e3 : mm
// 1e6 : um
// 1e9 : nm
scale_unit = 1e3;
// ================= meta =================
// ================= IDT =================
substrate = "LINBO";
// linbo
c = 3992.0;
// si
// c = 3159.0;
freq = 10.0e6;
// $fs = (c/freq);
// inout distance
distance = 70;
// number of finger
n_fingers = 50;
// should be 50-70
finger_length = 50;
// for tweaking the design
gap = 0;
// for tweaking the design
thickness = 0;
has_id_number = true;
// ================= IDT =================
// ================= bond pad =================
leg_length = 0.003;
leg_width = 0.00001875;
leg_angle = 10;
size = 0.002;
bond_pad_shape = "square";
// ================= bond pad =================
// ================= text =================
info_block_offset_x=32;
info_block_offset_y=-7;
info_block_scale=0.3;
title_text_size = 4;
prop_text_size = 2.5;
id_text_size = 1;
// ================= text =================
// ================= IDT Pos =================
idt_1_x_offset = -15;
idt_1_y_offset = 0;
idt_2_x_offset = 15;
idt_2_y_offset = 0;
// ================= IDT Pos =================
// ================= wafers =================
wafer_size_inch = 4;
// ================= wafers =================
module params() {
parameter_text(
str("IDT ", substrate, "#", test_number),
[
str("c (ms): ", c),
str("freq (Hz): ", freq),
str("distance : ", distance),
str("n_fingers : ", n_fingers),
str("finger_length : ", finger_length),
str("gap : ", gap),
str("thickness : ", thickness),
str("leg_length : ", leg_length),
str("leg_angle : ", leg_angle),
str("size : ", size),
str("feat. size (mm): ", (c/freq)*1e3 / 4),
str("version : ", SCRIPT_VERSION)
]
);
}
translate([info_block_offset_x, -info_block_offset_y, 0])
scale([info_block_scale, info_block_scale, info_block_scale])
params();
wafer(wafer_size_inch*25.4);
translate([idt_1_x_offset, idt_1_y_offset, 0])
bi_directional_idt(
c,
freq,
n_fingers,
distance,
finger_length,
gap,
thickness,
post_scale=scale_unit,
has_bond_pads = true,
bond_pad_angle = leg_angle,
bond_pad_leg_width = leg_width,
bond_pad_leg_length = leg_length,
bond_pad_size = size,
has_id = has_id_number,
center = true
);
translate([idt_2_x_offset, idt_2_y_offset, 0])
bi_directional_idt(
c,
freq,
n_fingers,
distance,
finger_length,
gap,
thickness,
post_scale=scale_unit,
has_bond_pads = true,
bond_pad_angle = leg_angle,
bond_pad_leg_width = leg_width,
bond_pad_leg_length = leg_length,
bond_pad_size = size,
has_id = has_id_number,
id_number = 1,
center = true
);

View File

@@ -0,0 +1,220 @@
include <../modules/bidirectional_idt.scad>
include <../modules/wafer.scad>
include <../modules/parameter_text.scad>
// include <../pramas.scad>
// ================= openscad prams =================
$fa = 1;
$fs = 0.01;
// ================= openscad prams =================
// ================= meta =================
SCRIPT_VERSION="0.0.1";
// this really just need to be any mon font
FONT="Ubuntu Sans Mono:style=Regular";
test_number = 1;
// scale in m
scale_unit = 1e3;
// ================= meta =================
// ================= IDT =================
substrate = "LINBO";
// linbo
c = 3992.0;
// si
// c = 3159.0;
freq = 50.0e6;
// $fs = (c/freq);
// inout distance
distance = 50;
// number of finger
n_fingers = 50;
// should be 50-70
finger_length = 60;
// for tweaking the design
gap = 0;
// for tweaking the design
thickness = 0;
has_id_number = true;
// ================= IDT =================
// ================= bond pad =================
leg_length = 0.003;
leg_width = 0.00001875;
leg_angle = 10;
size = 0.002;
bond_pad_shape = "square";
// ================= bond pad =================
// ================= text =================
info_block_offset_x=7;
info_block_offset_y=30;
info_block_scale=0.3;
title_text_size = 4;
prop_text_size = 2.5;
id_text_size = 1;
// ================= text =================
// ================= array spacings =================
number_of_idts_per_quadrent=4;
idt_x_spacing = 10;
idt_y_spacing = 12.5;
// ================= array spacings =================
// ================= wafers =================
wafer_size_inch = 4;
// ================= wafers =================
module params() {
parameter_text(
str("IDT ", substrate, "#", test_number),
[
str("c (ms): ", c),
str("freq (Hz): ", freq),
str("distance : ", distance),
str("n_fingers : ", n_fingers),
str("finger_length : ", finger_length),
str("gap : ", gap),
str("thickness : ", thickness),
str("leg_length : ", leg_length),
str("leg_angle : ", leg_angle),
str("size : ", size),
str("feat. size (mm): ", (c/freq)*1e3 / 4),
str("version : ", SCRIPT_VERSION)
]
);
}
translate([info_block_offset_x, -info_block_offset_y, 0]) {
rotate([0, 0, -90])
scale([info_block_scale, info_block_scale, info_block_scale]) {
params();
}
}
rotate([0, 0, 180])
translate([info_block_offset_x, -info_block_offset_y, 0]) {
rotate([0, 0, -90])
scale([info_block_scale, info_block_scale, info_block_scale]) {
params();
}
}
if ($preview)
wafer(wafer_size_inch*0.0254*scale_unit);
// echo(str("number_of_idts_per_quadrent : ", number_of_idts_per_quadrent));
for (i=[0:number_of_idts_per_quadrent-1]) {
translate([idt_x_spacing/4, 0, 0]) {
translate([i * idt_x_spacing, idt_y_spacing/2, 0]) {
bi_directional_idt(
c,
freq,
n_fingers,
distance,
finger_length,
gap,
thickness,
post_scale=scale_unit,
has_bond_pads = true,
bond_pad_angle = leg_angle,
bond_pad_leg_width = leg_width,
bond_pad_leg_length = leg_length,
bond_pad_size = size,
has_id = has_id_number,
id_number = i
);
}
translate([i * idt_x_spacing, -idt_y_spacing/2, 0]) {
scale([1, -1, 1]) {
bi_directional_idt(
c,
freq,
n_fingers,
distance,
finger_length,
gap,
thickness,
post_scale=scale_unit,
has_bond_pads = true,
bond_pad_angle = leg_angle,
bond_pad_leg_width = leg_width,
bond_pad_leg_length = leg_length,
bond_pad_size = size,
has_id = has_id_number,
id_number = i + number_of_idts_per_quadrent,
id_scale = [1, -1, -1]
);
}
}
}
scale([-1, 1, 1])
translate([idt_x_spacing/4, 0, 0]) {
translate([i * idt_x_spacing, idt_y_spacing/2, 0]) {
bi_directional_idt(
c,
freq,
n_fingers,
distance,
finger_length,
gap,
thickness,
post_scale=scale_unit,
has_bond_pads = true,
bond_pad_angle = leg_angle,
bond_pad_leg_width = leg_width,
bond_pad_leg_length = leg_length,
bond_pad_size = size,
has_id = has_id_number,
id_number = i + number_of_idts_per_quadrent*2,
id_scale = [-1, 1, 1]
);
}
translate([i * idt_x_spacing, -idt_y_spacing/2, 0]) {
scale([1, -1, 1]) {
bi_directional_idt(
c,
freq,
n_fingers,
distance,
finger_length,
gap,
thickness,
post_scale=scale_unit,
has_bond_pads = true,
bond_pad_angle = leg_angle,
bond_pad_leg_width = leg_width,
bond_pad_leg_length = leg_length,
bond_pad_size = size,
has_id = has_id_number,
id_number = i + number_of_idts_per_quadrent*3,
id_scale = [-1, -1, 1]
);
}
}
}
}
// bond_pad(
// leg_length = 0.0075,
// leg_width = 0.00001875,
// leg_angle = 20,
// size = 0.0075,
// bond_pad_shape = "square",
// post_scale = scale_unit
// );

View File

@@ -0,0 +1,176 @@
include <../modules/bidirectional_idt.scad>
include <../modules/parameter_text.scad>
include <../modules/wafer.scad>
// ================= README =================
// these are the normal parameters used by
// each one of the layout scripts
// however they do dont directly use them
// and instead have thier own copy
//
// this was done in order to have more control
// over each of the scripts themsevels
// allowing each to have even more parameters
// and having them show up in the open scad
// parameters window
// ================= README =================
// ================= openscad prams =================
// min angle
$fa = 0.1;
// min size
$fs = 0.01;
// ================= openscad prams =================
// ================= meta =================
// version number of the current script
SCRIPT_VERSION="0.0.1";
// font for layout
FONT="Ubuntu Sans Mono:style=Regular";
// the test number ref number for this set of IDTs
test_number = 1;
// this is needed due to the min size value
// a pre scaler for the given values
scale_unit = 1e3;
// ================= meta =================
// ================= IDT =================
// the underlying substrate
substrate = "SI";
// linbo
// the acoustic wave speed in the substrate
c = 3992.0;
// si
// c = 3159.0;
// the target frequency of the IDT
freq = 10.0e6;
// the distance between the input and output IDT
// should be between 100-200
distance = 50;
// the number of fingers the IDT has
n_fingers = 50;
// the length of the figure or aperture should be 50-70
finger_length = 50;
// the gap between both sides of the IDT (should be used for tweaking)
gap = 0;
// the thickness of the wire the connects all the fingers
thickness = 0;
// adds an ID number to an IDT, useful if you have multiple on a wafer
has_id_number = false;
// ================= IDT =================
// ================= bond pad =================
// the length of the bond pad leg from the edge of the IDT to the center of the bond pad
leg_length = 0.003;
// the width of the leg
leg_width = 0.00001875;
// the angle the leg comes off from the IDT,
// positive angle means the leg is angled away
// negitive angle means the leg is angled inwards
leg_angle = 10;
// the size of the bond pad
size = 0.002;
// the shape of the bond pad (not implemented)
bond_pad_shape = "square";
// ================= bond pad =================
// ================= text =================
info_block_offset_x=25;
info_block_offset_y=10;
// total scale of infoblock
info_block_scale=0.3;
// the text size of the heading in the info block
title_text_size = 4;
// the size of all the sub items in the info block
prop_text_size = 2.5;
// the size of the ID numbers in on the IDTS
id_text_size = 1;
// ================= text =================
// ================= wafers =================
// the size of the wafer in inchs (why inch and not metric like everything else because its standard)
wafer_size_inch = 4;
// ================= wafers =================
// ================= IDT Pos =================
// the x offset of the IDT from the center
idt_x_offset = 0;
// the y offset of the IDT from the center
idt_y_offset = 0;
// ================= IDT Pos =================
module params() {
parameter_text(
str("IDT ", substrate, "#", test_number),
[
str("c (ms): ", c),
str("freq (Hz): ", freq),
str("distance : ", distance),
str("n_fingers : ", n_fingers),
str("finger_length : ", finger_length),
str("gap : ", gap),
str("thickness : ", thickness),
str("leg_length : ", leg_length),
str("leg_angle : ", leg_angle),
str("size : ", size),
str("feat. size (mm): ", (c/freq)*1e3 / 4),
str("version : ", SCRIPT_VERSION)
]
);
}
translate([info_block_offset_x, -info_block_offset_y, 0])
scale([info_block_scale, info_block_scale, info_block_scale])
params();
wafer(wafer_size_inch*25.4);
translate([0, 0, 0])
bi_directional_idt(
c,
freq,
n_fingers,
distance,
finger_length,
gap,
thickness,
post_scale=scale_unit,
has_bond_pads = true,
bond_pad_angle = leg_angle,
bond_pad_leg_width = leg_width,
bond_pad_leg_length = leg_length,
bond_pad_size = size,
center = true,
echo_stats = true
);