vibe-openscad

pdf-page/gpt-6-astra / tier-4-gp2y0a21yk

success tier 4

pdf-page (gpt 6 astra)

render
bare render of tier-4-gp2y0a21yk
loading STL…
success 80.9s · 2680/4677t · $0.2606
SCAD (331 lines)
/*
 * Sharp GP2Y0A21YK0F
 * 単位: mm
 *
 * X: 本体長手方向(発光側が -X、受光側が +X)
 * Y: コネクタ突出方向が -Y
 * Z: 光学面が +Z、PWB / 取付面側が -Z
 *
 * 原点は、取付耳・コネクタを除く本体外形
 * 29.5 × 13 × 13.5 mm の中心。
 *
 * 図面に寸法のない肉厚、内部形状、レンズ曲率、
 * コネクタ細部は外観に基づく近似。
 */

$fn = 80;
eps = 0.02;

// ---------- 主要寸法 ----------
body_x = 29.5;
body_y = 13;
body_z = 13.5;

z_back       = -body_z / 2;
z_front      =  body_z / 2;
z_shoulder   = z_back + 7.2;
z_lens_base  = z_front - 2;

mount_pitch  = 37;
mount_radius = 3.75;
mount_hole_d = 3.2;
mount_t      = 1.5;

bridge_y = 8.4;

emitter_x  = -body_x / 2 + 4.5;
receiver_x = emitter_x + 20;

emitter_case_x = 7.5;
receiver_case_x = 16.3;
case_gap = 4.15;
lens_case_y = 7.2;

emitter_case_left  = emitter_x - emitter_case_x / 2;
receiver_case_left = emitter_case_left
                   + emitter_case_x + case_gap;

connector_width = 10.1;
overall_y = 18.95;
connector_end_y = body_y / 2 - overall_y;

pcb_t = 1.2;
pcb_back_z = z_back + 3.3;
pcb_front_z = pcb_back_z + pcb_t;

// ---------- 色 ----------
case_color      = [0.055, 0.058, 0.065];
lens_color      = [0.095, 0.045, 0.070];
pcb_color       = [0.28, 0.18, 0.075];
connector_color = [0.89, 0.88, 0.81];
metal_color     = [0.72, 0.73, 0.75];

// ---------- 基本形状 ----------
module box_between(x0, x1, y0, y1, z0, z1) {
    translate([x0, y0, z0])
        cube([x1-x0, y1-y0, z1-z0]);
}

// XY 面内の長円形。軸方向は Z。
module capsule_z(x0, x1, y, radius, z0, height) {
    hull() {
        translate([x0, y, z0])
            cylinder(r=radius, h=height);
        translate([x1, y, z0])
            cylinder(r=radius, h=height);
    }
}

// 球面キャップ付きレンズ。最大 Z は z_front 未満。
module domed_lens(x, y, radius=2.9) {
    cap_h = 0.55;
    cap_base = z_front - 0.62;
    sphere_r = (radius*radius + cap_h*cap_h) / (2*cap_h);

    union() {
        translate([x, y, z_lens_base + 0.3])
            cylinder(
                r=radius,
                h=cap_base - (z_lens_base + 0.3) + eps
            );

        intersection() {
            translate([x, y, cap_base + cap_h - sphere_r])
                sphere(r=sphere_r);

            translate([x, y, cap_base])
                cylinder(r=radius, h=cap_h + eps);
        }
    }
}

// ---------- 取付耳 ----------
module mounting_ear_positive() {
    // 半円形端部と本体への接続部
    translate([0, 0, z_back])
        linear_extrude(height=mount_t)
            union() {
                translate([mount_pitch/2, 0])
                    circle(r=mount_radius);

                translate([body_x/2 - eps, -mount_radius])
                    square([
                        mount_pitch/2 - body_x/2 + eps,
                        2*mount_radius
                    ]);
            }

    // 本体側の斜め補強。詳細寸法は図面外形からの近似。
    hull() {
        box_between(
            body_x/2 - 0.3, body_x/2 + eps,
            -mount_radius, mount_radius,
            z_back, z_back + 5.25
        );

        box_between(
            mount_pitch/2 - 0.15, mount_pitch/2,
            -mount_radius, mount_radius,
            z_back, z_back + mount_t
        );
    }
}

module mounting_ears() {
    mounting_ear_positive();
    mirror([1, 0, 0])
        mounting_ear_positive();
}

// ---------- 黒色ケース ----------
module housing() {
    color(case_color)
        difference() {
            union() {
                // 後部ケース:全幅 13 mm
                box_between(
                    -body_x/2, body_x/2,
                    -body_y/2, body_y/2,
                    z_back, z_shoulder
                );

                // 光学部側の段付きケース:幅 8.4 mm
                box_between(
                    -body_x/2, body_x/2,
                    -bridge_y/2, bridge_y/2,
                    z_shoulder - eps, z_lens_base
                );

                mounting_ears();

                // 発光側レンズケース
                box_between(
                    emitter_case_left,
                    emitter_case_left + emitter_case_x,
                    -lens_case_y/2, lens_case_y/2,
                    z_lens_base - eps, z_front
                );

                // 受光側レンズケース
                box_between(
                    receiver_case_left,
                    receiver_case_left + receiver_case_x,
                    -lens_case_y/2, lens_case_y/2,
                    z_lens_base - eps, z_front
                );
            }

            // 2-φ3.2 貫通穴、中心間距離 37
            for (x = [-mount_pitch/2, mount_pitch/2])
                translate([x, 0, z_back - 1])
                    cylinder(d=mount_hole_d, h=body_z + 2);

            // 背面の PWB 収容部
            box_between(
                -body_x/2 + 1.2, body_x/2 - 1.2,
                -body_y/2 + 1.2, body_y/2 - 1.2,
                z_back - eps, pcb_back_z + 0.1
            );

            // コネクタ/基板タブ用切欠き
            box_between(
                -connector_width/2 - 0.1,
                 connector_width/2 + 0.1,
                -body_y/2 - eps, -4.15,
                pcb_back_z - 0.1, z_shoulder + eps
            );

            // 発光側開口
            translate([emitter_x, 0, z_lens_base + 0.25])
                cylinder(
                    r=3.05,
                    h=z_front-z_lens_base + 1
                );

            // 受光側開口:図の外観に合わせた長円形
            capsule_z(
                receiver_x - 1.8, receiver_x,
                0, 3.05,
                z_lens_base + 0.25,
                z_front-z_lens_base + 1
            );

            // 受光側の浅い矩形リセス
            box_between(
                receiver_case_left + 0.65,
                receiver_case_left + receiver_case_x - 0.65,
                -lens_case_y/2 + 0.6,
                 lens_case_y/2 - 0.6,
                z_front - 0.14, z_front + eps
            );
        }
}

// ---------- 光学レンズ ----------
module lenses() {
    color(lens_color) {
        domed_lens(emitter_x, 0);

        hull() {
            domed_lens(receiver_x - 1.8, 0);
            domed_lens(receiver_x, 0);
        }
    }
}

// ---------- PWB ----------
module pwb() {
    color(pcb_color)
        union() {
            box_between(
                -body_x/2 + 0.9, body_x/2 - 0.9,
                -body_y/2 + 0.9, body_y/2 - 0.9,
                pcb_back_z, pcb_front_z
            );

            // コネクタ下の突出タブ
            box_between(
                -connector_width/2, connector_width/2,
                connector_end_y, -body_y/2 + 1.3,
                pcb_back_z, pcb_front_z
            );
        }
}

// ---------- 3極コネクタ(外観近似) ----------
module connector() {
    socket_front_y = connector_end_y + 0.12;
    socket_back_y  = -4.8;

    socket_width = 8.0;
    socket_z0 = pcb_front_z;
    socket_z1 = z_back + 9.3;

    color(connector_color)
        difference() {
            union() {
                box_between(
                    -socket_width/2, socket_width/2,
                    socket_front_y, socket_back_y,
                    socket_z0, socket_z1
                );

                // 側方の取付フランジ
                for (s = [-1, 1])
                    translate([
                        s*(socket_width/2 + 0.45),
                        (socket_front_y + socket_back_y)/2,
                        socket_z0 + 0.55
                    ])
                        cube([
                            0.95,
                            socket_back_y-socket_front_y,
                            1.1
                        ], center=true);
            }

            // 嵌合口は -Y に開口
            box_between(
                -3.25, 3.25,
                socket_front_y - eps, socket_back_y - 1.0,
                socket_z0 + 0.75, socket_z1 - 0.7
            );

            // 上側のラッチ逃げ
            box_between(
                -1.45, 1.45,
                socket_front_y - eps, socket_front_y + 1.7,
                socket_z1 - 0.85, socket_z1 + eps
            );
        }

    // 2 mm ピッチのコンタクトと基板側端子(近似)
    color(metal_color)
        for (x = [-2, 0, 2]) {
            box_between(
                x-0.25, x+0.25,
                socket_front_y + 0.8, socket_back_y - 0.6,
                socket_z0 + 2.0, socket_z0 + 2.5
            );

            box_between(
                x-0.25, x+0.25,
                socket_back_y - 1.1, socket_back_y - 0.6,
                z_back + 1.2, socket_z0 + 2.5
            );

            // 背面側のはんだランド
            translate([x, socket_back_y - 0.85, pcb_back_z - 0.07])
                cylinder(d=1.25, h=0.1);
        }
}

// ---------- アセンブリ ----------
module GP2Y0A21YK0F() {
    housing();
    lenses();
    pwb();
    connector();
}

GP2Y0A21YK0F();
パラメータ (16) —
スライダを動かすと openscad-wasm で再レンダリング

meta

runIdpdf-page_gpt-6-astra-7007c6f0df1f-2026-09-05T14-36-18-057Z
matrixIdpdf-page/gpt-6-astra
signature7007c6f0df1fe852…
provideropenai
modelgpt-6-astra
harnesspdf-page
statussuccess
duration80.91s (wallclock: load + prompt eval + generation + network)
tokens2680 in / 4677 out
wallclock tok/s57.8 tok/s (end-to-end)
cost$0.2606
createdAt2026-09-05T14:36:18.057Z
gitCommit7ec961914ad4
openscadOpenSCAD version 2026.04.27

prompt

添付画像は Sharp 製測距センサ GP2Y0A21YK0F のデータシートのページです。
OpenSCAD でモデリングしてください。

座標系: 単位 mm、本体の中心を原点とし、取付面(PWB / コネクタ側)を -Z に向ける。

完成したコード全体を ```openscad ... ``` のフェンスで囲んで出力してください。