Загрузка данных


/* =================================================================
   10" 1.5U РЭК-ПАНЕЛЬ: 6 KEYSTONES + ST7789 1.69" + ESP32 (M3)
   Правильная геометрия фиксации замков Keystone (Snap-in Latch)
   Высота: 1.5U (65.7 мм) | Крепеж: M3 | Допуск: tol = 0.43 мм
   ================================================================= */

tol             = 0.43;   // Зазор на посадку FDM
$fn             = 50;

// --- Габариты 10" 1.5U рэка ---
rack_w          = 254.0;  // 10 дюймов
rack_hole_dist  = 236.5;  // Межосевое креплений
u_count         = 1.5;
rack_h          = (u_count * 44.45) - 1.0; // 65.68 мм
panel_thick     = 4.0;    // Толщина лицевой панели
rack_slot_w     = 5.5 + tol; // 5.93 мм (M5/M6)
rack_slot_h     = 9.0;

// --- Крепеж M3 ---
m3_insert_d     = 4.2;    // Под латунные втулки M3 (или 2.9 под саморез)

// --- Блок из 6 Keystone модулей ---
ks_count        = 6;
ks_pitch        = 19.5;   // Шаг между портами (стандарт 18.5 - 20.0 мм)
ks_start_x      = 22.0;   // Отступ первого порта слева
ks_y            = rack_h / 2; // Центрирование по высоте

// --- Дисплей ST7789V2 1.69" ---
disp_win_w      = 24.5 + tol;
disp_win_h      = 28.5 + tol;
disp_glass_w    = 27.5 + tol;
disp_glass_h    = 32.0 + tol;
disp_glass_d    = 1.8;
disp_hole_dx    = 26.0;
disp_hole_dy    = 35.0;
disp_x          = 155.0;  // Правее блока кейстоунов
disp_y          = 41.0;

// --- ESP32 Terminal Board ---
esp_shelf_w     = 82.0;
esp_shelf_d     = 70.0;
esp_shelf_y     = 4.0;
esp_shelf_thick = 3.0;
esp_hole_dx     = 72.0;
esp_hole_dy     = 57.0;
esp_x           = 148.0;
esp_z_offset    = 8.0;

// =================================================================
// МОДУЛЬ ПРАВИЛЬНОГО ПОСАДОЧНОГО ГНЕЗДА KEYSTONE
// =================================================================
module keystone_cutout(tol = 0.43, total_thick = 8.0) {
    ks_front_w = 14.8 + tol;  // 15.23 мм (лицевое окно)
    ks_front_h = 16.1 + tol;  // 16.53 мм (лицевое окно)
    lip_thick  = 1.6;         // Рабочая толщина упора под защелку

    ks_back_w      = 16.0 + tol; // 16.43 мм (ширина тела защелки)
    ks_latch_top_h = 4.5;        // Карман под верхний подпружиненный язычок
    ks_latch_bot_h = 2.2;        // Карман под нижний фиксированный зуб
    ks_back_h      = ks_front_h + ks_latch_top_h + ks_latch_bot_h; // ~23.2 мм

    union() {
        // 1. Сквозное лицевое окно под выход разъема
        translate([-ks_front_w/2, -ks_front_h/2, -1])
            cube([ks_front_w, ks_front_h, total_thick + 2]);

        // 2. Внутренняя выборка под распрямление защелок (Undercut)
        translate([-ks_back_w/2, -ks_front_h/2 - ks_latch_bot_h, lip_thick])
            cube([ks_back_w, ks_back_h, total_thick - lip_thick + 1]);

        // 3. Заходной скос на верхнем упоре для плавного ввода защелки
        translate([-ks_front_w/2, ks_front_h/2, lip_thick])
            rotate([-40, 0, 0])
                cube([ks_front_w, 2.5, 2.5]);
    }
}

// Овальный паз крепления рэка
module oval_slot(w, h, depth) {
    hull() {
        translate([0, -(h - w)/2, 0]) cylinder(d=w, h=depth);
        translate([0,  (h - w)/2, 0]) cylinder(d=w, h=depth);
    }
}

// Треугольное ребро жесткости
module triangle_rib(w, y_len, z_len) {
    hull() {
        cube([w, y_len, 0.1]);
        cube([w, 0.1, z_len]);
    }
}

module panel_keystone_1_5u() {
    difference() {
        // ---------------------------------------------------------
        // 1. ТЕЛО
        // ---------------------------------------------------------
        union() {
            // Лицевая панель
            cube([rack_w, rack_h, panel_thick]);

            // Усиливающие направляющие буртики сзади каждого кейстоуна
            for (i = [0 : ks_count - 1]) {
                kx = ks_start_x + i * ks_pitch;
                translate([kx - (16.0 + tol + 4.0)/2, ks_y - 13.0, panel_thick])
                    cube([16.0 + tol + 4.0, 26.0, 3.5]); // Утолщение сзади до 7.5 мм
            }

            // Полка под ESP32 (внизу под экраном)
            translate([esp_x, esp_shelf_y, panel_thick])
                cube([esp_shelf_w, esp_shelf_thick, esp_shelf_d]);

            // Ребра жесткости полки ESP32
            translate([esp_x - 2.5, esp_shelf_y, panel_thick])
                triangle_rib(2.5, 20.0, 25.0);
            translate([esp_x + esp_shelf_w, esp_shelf_y, panel_thick])
                triangle_rib(2.5, 20.0, 25.0);

            // Стойки под ESP32 на полке (M3)
            for (dx = [0, esp_hole_dx]) {
                for (dz = [0, esp_hole_dy]) {
                    translate([
                        esp_x + (esp_shelf_w - esp_hole_dx)/2 + dx,
                        esp_shelf_y + esp_shelf_thick,
                        panel_thick + esp_z_offset + dz
                    ])
                        rotate([-90, 0, 0])
                            cylinder(d = 7.0, h = 4.0);
                }
            }

            // Стойки под винты дисплея M3 сзади панели
            for (dx = [-disp_hole_dx/2, disp_hole_dx/2]) {
                for (dy = [-disp_hole_dy/2, disp_hole_dy/2]) {
                    translate([disp_x + disp_win_w/2 + dx, disp_y + dy, panel_thick])
                        cylinder(d = 7.0, h = 3.5);
                }
            }
        }

        // ---------------------------------------------------------
        // 2. ВЫРЕЗЫ
        // ---------------------------------------------------------

        // Овальные пазы рэка
        for (x = [(rack_w - rack_hole_dist)/2, (rack_w + rack_hole_dist)/2]) {
            for (y_off = [-15.875, 15.875]) {
                translate([x, rack_h/2 + y_off, -1])
                    oval_slot(rack_slot_w, rack_slot_h, panel_thick + 2);
            }
        }

        // 6 гнезд Keystone с упорами и пазами под защелки
        for (i = [0 : ks_count - 1]) {
            kx = ks_start_x + i * ks_pitch;
            translate([kx, ks_y, 0])
                keystone_cutout(tol = tol, total_thick = panel_thick + 4.0);
        }

        // Окно активной зоны экрана
        translate([disp_x, disp_y - disp_win_h/2, -1])
            cube([disp_win_w, disp_win_h, panel_thick + 2]);

        // Ступенчатый карман под стекло дисплея
        translate([
            disp_x - (disp_glass_w - disp_win_w)/2,
            disp_y - disp_glass_h/2,
            panel_thick - disp_glass_d
        ])
            cube([disp_glass_w, disp_glass_h, disp_glass_d + 1]);

        // Крепежные отверстия дисплея M3 (под втулки 4.2 мм)
        for (dx = [-disp_hole_dx/2, disp_hole_dx/2]) {
            for (dy = [-disp_hole_dy/2, disp_hole_dy/2]) {
                translate([disp_x + disp_win_w/2 + dx, disp_y + dy, panel_thick - 1])
                    cylinder(d = m3_insert_d, h = 6.0);
            }
        }

        // Отверстия под втулки ESP32 M3
        for (dx = [0, esp_hole_dx]) {
            for (dz = [0, esp_hole_dy]) {
                translate([
                    esp_x + (esp_shelf_w - esp_hole_dx)/2 + dx,
                    esp_shelf_y + esp_shelf_thick - 1.0,
                    panel_thick + esp_z_offset + dz
                ])
                    rotate([-90, 0, 0])
                        cylinder(d = m3_insert_d, h = 6.0);
            }
        }
    }
}

panel_keystone_1_5u();