UNPKG

@typecad/rd_esp32s3

Version:

rd-ESP32S3 typeCAD package

271 lines (234 loc) 14.4 kB
import * as _0603 from '@typecad/passives/0603'; import { PCB, Component, TrackBuilder } from '@typecad/typecad'; import { ESP32_S3_MINI_1_N8 } from './ESP32_S3_MINI_1_N8'; import { I2C, UART, USB, Power } from '@typecad/typecad'; // Configuration options for the ESP32S3 module interface ESP32Options { pcb: PCB; reference?: string; externalPower?: Power; passives?: typeof _0603; } /** * ### rd_esp32s3 - ESP32-S3 Development Module * * #### Input Connections * externalPower: Power - Optional 3.3V external power supply * * #### Available Interfaces * - i2c: I2C interface on pins IO8/IO9 * - uart_0: Primary UART on RXD0/TXD0 * - uart_1: Secondary UART on IO18/IO17 * - usb: USB interface on IO20/IO19 */ export class rd_esp32s3 { // PCB and component management pcb: PCB; passives: typeof _0603; // Main components esp32: ESP32_S3_MINI_1_N8; powerCap: _0603.Capacitor; // C1: Main power capacitor filterCap: _0603.Capacitor; // C3: Power filter capacitor enableCap: _0603.Capacitor; // C2: Enable pin capacitor buttonCap: _0603.Capacitor; // C4: Button debounce capacitor pullupResistor: _0603.Resistor; // R1: Enable pullup resistor buttonResistor: _0603.Resistor; // R2: Button resistor resetButton: Component; // SW1: Reset button // Power management internalPower: Power; externalPower?: Power; // Communication interfaces i2c: I2C; uart_0: UART; uart_1: UART; usb: USB; // PCB elements components: (Component | TrackBuilder)[] = []; // All PCB elements including components and tracks constructor(options: ESP32Options) { // Extract configuration options this.pcb = options.pcb; this.passives = options.passives || _0603; this.externalPower = options.externalPower; // Create the main ESP32 chip this.esp32 = new ESP32_S3_MINI_1_N8(options.reference); this.esp32.pcb = { x: 158.085, y: 89.75, rotation: 0 }; // Set up power management this.setupPower(); // Create all passive components this.createPassiveComponents(); // Create the reset button this.createResetButton(); // Set up communication interfaces this.setupCommunication(); // Add all components to the components list this.components.push( this.esp32, this.powerCap, this.filterCap, this.enableCap, this.buttonCap, this.pullupResistor, this.buttonResistor, this.resetButton ); // Connect all the electrical nets this.connectNets(); // Route the PCB tracks (adds tracks to components array) this.routeTracks(); // Group everything together on the PCB this.pcb.group('rd_esp32s3', ...this.components); } private setupPower() { // Create internal 3.3V power from ESP32 pins this.internalPower = new Power({ power: this.esp32._3V3, gnd: this.esp32.GND_1, voltage: 3.3 }); // Validate external power if provided if (this.externalPower) { if (this.externalPower.voltage !== 3.3) { throw new Error(`External power must be 3.3V, got ${this.externalPower.voltage}V`); } } } private createPassiveComponents() { // Main power supply capacitors this.powerCap = new this.passives.Capacitor({ value: '22uF', description: 'Main power capacitor', pcb: { x: 146.685, y: 83.82, rotation: 180 } }); this.filterCap = new this.passives.Capacitor({ value: '0.1uF', description: 'Power filter capacitor', pcb: { x: 146.685, y: 85.725, rotation: 180 } }); // Enable pin components this.enableCap = new this.passives.Capacitor({ value: '1uF', description: 'Enable pin capacitor', pcb: { x: 169.05, y: 82.55, rotation: 0 } }); this.pullupResistor = new this.passives.Resistor({ value: '10kΩ', description: 'Enable pullup resistor', pcb: { x: 169.1, y: 84.455, rotation: 180 } }); // Reset button components this.buttonCap = new this.passives.Capacitor({ value: '0.1uF', description: 'Button debounce capacitor', pcb: { x: 169.05, y: 88.265, rotation: 0 } }); this.buttonResistor = new this.passives.Resistor({ value: '100kΩ', description: 'Button resistor', pcb: { x: 169.1, y: 86.36, rotation: 180 } }); } private createResetButton() { this.resetButton = new Component({ footprint: 'Button_Switch_SMD:SW_SPST_TL3342', prefix: 'SW', pcb: { x: 170.82, y: 94.005, rotation: 90 } }); } private setupCommunication() { // Set up communication interfaces this.i2c = new I2C(this.esp32.IO8, this.esp32.IO9); this.uart_0 = new UART(this.esp32.RXD0, this.esp32.TXD0, this.esp32.IO15, this.esp32.IO16); this.uart_1 = new UART(this.esp32.IO18, this.esp32.IO17, this.esp32.IO19, this.esp32.IO20); this.usb = new USB(this.esp32.IO20, this.esp32.IO19); } private connectNets() { // Connect external power if provided if (this.externalPower) { this.pcb.net(this.externalPower.power!, this.internalPower.power!); this.pcb.net(this.externalPower.gnd!, this.internalPower.gnd!); } // Connect all ground pins together this.connectAllGrounds(); // Connect power supply capacitors this.connectPowerCapacitors(); // Connect reset button circuit this.connectResetButton(); // Connect enable pin circuit this.connectEnablePin(); } private connectAllGrounds() { // Connect all ESP32 ground pins together this.pcb.net( this.esp32.GND_1, this.esp32.GND_2, this.esp32.GND_3, this.esp32.GND_4, this.esp32.GND_5, this.esp32.GND_6, this.esp32.GND_7, this.esp32.GND_8, this.esp32.GND_9, this.esp32.GND_10, this.esp32.GND_11, this.esp32.GND_12, this.esp32.GND_13, this.esp32.GND_14, this.esp32.GND_15, this.esp32.GND_16, this.esp32.GND_17, this.esp32.GND_18, this.esp32.GND_19, this.esp32.GND_20, this.esp32.GND_21, this.esp32.GND_22, this.esp32.GND_23, this.esp32.GND_24, this.esp32.GND_25, this.esp32.GND_26, this.esp32.GND_27, this.esp32.GND_28, this.esp32.GND_29, this.esp32.GND_30, this.esp32.GND_31, this.esp32.GND_32 ); } private connectPowerCapacitors() { // Connect power capacitors to 3.3V rail this.pcb.net(this.powerCap.pin(1), this.filterCap.pin(1), this.esp32._3V3); // Connect power capacitors to ground this.pcb.net(this.powerCap.pin(2), this.filterCap.pin(2)); } private connectResetButton() { // Connect reset button to debounce capacitor this.pcb.net(this.resetButton.pin(1), this.buttonCap.pin(1)); this.pcb.net(this.resetButton.pin(2), this.buttonCap.pin(2), this.buttonResistor.pin(1)); // Connect button to enable pin this.pcb.net(this.buttonResistor.pin(2), this.esp32.EN); } private connectEnablePin() { // Connect enable pullup resistor this.pcb.net(this.esp32._3V3, this.pullupResistor.pin(1)); // Connect enable RC circuit this.pcb.net(this.pullupResistor.pin(2), this.enableCap.pin(1), this.esp32.EN); // Connect enable capacitor to ground this.pcb.net(this.esp32.GND_1, this.enableCap.pin(2)); } private routeTracks() { // PCB routing - these define the copper traces between components // Each track connects specific points on the PCB // All tracks are added to the components array this.components.push(this.pcb.track().from({ x: 156.435, y: 91.4 }, "F.Cu", 0.2).to({ x: 159.735, y: 91.4, layer: "F.Cu", width: 0.2 })); this.components.push(this.pcb.track().from({ x: 166.061, y: 81.774 }, "F.Cu", 0.2).to({ x: 169.049, y: 81.774, layer: "F.Cu", width: 0.2 })); this.components.push(this.pcb.track().from({ x: 158.085, y: 88.1 }, "F.Cu", 0.2).to({ x: 158.085, y: 91.4, layer: "F.Cu", width: 0.2 })); this.components.push(this.pcb.track().from({ x: 156.435, y: 89.75 }, "F.Cu", 0.2).to({ x: 159.735, y: 89.75, layer: "F.Cu", width: 0.2 })); this.components.push(this.pcb.track().from({ x: 151.085, y: 84.65 }, "F.Cu", 0.2).to({ x: 151.085, y: 82.75, layer: "F.Cu", width: 0.2 })); this.components.push(this.pcb.track().from({ x: 165.085, y: 85.5 }, "F.Cu", 0.2).to({ x: 164.885, y: 85.5, layer: "F.Cu", width: 0.2 })); this.components.push(this.pcb.track().from({ x: 159.735, y: 88.1 }, "F.Cu", 0.2).to({ x: 159.735, y: 91.4, layer: "F.Cu", width: 0.2 })); this.components.push(this.pcb.track().from({ x: 151.085, y: 82.75 }, "F.Cu", 0.2).to({ x: 165.085, y: 82.75, layer: "F.Cu", width: 0.2 })); this.components.push(this.pcb.track().from({ x: 164.035, y: 84.65 }, "F.Cu", 0.2).to({ x: 164.035, y: 82.75, layer: "F.Cu", width: 0.2 })); this.components.push(this.pcb.track().from({ x: 156.435, y: 88.1 }, "F.Cu", 0.2).to({ x: 159.735, y: 88.1, layer: "F.Cu", width: 0.2 })); this.components.push(this.pcb.track().from({ x: 156.435, y: 88.1 }, "F.Cu", 0.2).to({ x: 156.435, y: 91.4, layer: "F.Cu", width: 0.2 })); this.components.push(this.pcb.track().from({ x: 164.885, y: 85.5 }, "F.Cu", 0.2).to({ x: 164.035, y: 84.65, layer: "F.Cu", width: 0.2 })); this.components.push(this.pcb.track().from({ x: 165.085, y: 82.75 }, "F.Cu", 0.2).to({ x: 166.061, y: 81.774, layer: "F.Cu", width: 0.2 })); this.components.push(this.pcb.track().from({ x: 165.085, y: 86.35 }, "F.Cu", 0.2).to({ x: 165.085, y: 85.5, layer: "F.Cu", width: 0.2 })); this.components.push(this.pcb.track().from({ x: 169.049, y: 81.774 }, "F.Cu", 0.2).to({ x: 169.825, y: 82.55, layer: "F.Cu", width: 0.2 })); this.components.push(this.pcb.track().from({ x: 159.735, y: 91.4 }, "F.Cu", 0.2).to({ x: 165.085, y: 96.75, layer: "F.Cu", width: 0.2 })); this.components.push(this.pcb.track().from({ x: 158.085, y: 82.75 }, "F.Cu", 0.2).to({ x: 158.085, y: 88.1, layer: "F.Cu", width: 0.2 })); this.components.push(this.pcb.track().from({ x: 151.085, y: 96.75 }, "F.Cu", 0.2).to({ x: 156.435, y: 91.4, layer: "F.Cu", width: 0.2 })); this.components.push(this.pcb.track().from({ x: 170.576, y: 82.07589 }, "F.Cu", 0.2).to({ x: 169.87311, y: 81.373, layer: "F.Cu", width: 0.2 })); this.components.push(this.pcb.track().from({ x: 169.925, y: 84.455 }, "F.Cu", 0.2).to({ x: 170.576, y: 83.804, layer: "F.Cu", width: 0.2 })); this.components.push(this.pcb.track().from({ x: 147.46, y: 85.725 }, "F.Cu", 0.4).to({ x: 147.46, y: 83.82, layer: "F.Cu", width: 0.4 })); this.components.push(this.pcb.track().from({ x: 151.06, y: 81.373 }, "F.Cu", 0.2).to({ x: 149.86, y: 82.573, layer: "F.Cu", width: 0.2 })); this.components.push(this.pcb.track().from({ x: 148.59, y: 85.725 }, "F.Cu", 0.4).to({ x: 147.46, y: 85.725, layer: "F.Cu", width: 0.4 })); this.components.push(this.pcb.track().from({ x: 149.86, y: 82.573 }, "F.Cu", 0.2).to({ x: 149.86, y: 85.5, layer: "F.Cu", width: 0.2 })); this.components.push(this.pcb.track().from({ x: 170.576, y: 83.804 }, "F.Cu", 0.2).to({ x: 170.576, y: 82.07589, layer: "F.Cu", width: 0.2 })); this.components.push(this.pcb.track().from({ x: 169.87311, y: 81.373 }, "F.Cu", 0.2).to({ x: 151.06, y: 81.373, layer: "F.Cu", width: 0.2 })); this.components.push(this.pcb.track().from({ x: 148.815, y: 85.5 }, "F.Cu", 0.4).to({ x: 148.59, y: 85.725, layer: "F.Cu", width: 0.4 })); this.components.push(this.pcb.track().from({ x: 151.085, y: 85.5 }, "F.Cu", 0.4).to({ x: 149.86, y: 85.5, layer: "F.Cu", width: 0.4 }).to({ x: 148.815, y: 85.5, layer: "F.Cu", width: 0.4 })); this.components.push(this.pcb.track().from({ x: 145.91, y: 83.82 }, "F.Cu", 0.2).to({ x: 145.91, y: 85.725, layer: "F.Cu", width: 0.2 })); this.components.push(this.pcb.track().from({ x: 168.92, y: 89.545 }, "F.Cu", 0.2).to({ x: 168.92, y: 97.155, layer: "F.Cu", width: 0.2 })); this.components.push(this.pcb.track().from({ x: 168.275, y: 88.9 }, "F.Cu", 0.2).to({ x: 168.92, y: 89.545, layer: "F.Cu", width: 0.2 })); this.components.push(this.pcb.track().from({ x: 168.275, y: 88.265 }, "F.Cu", 0.2).to({ x: 168.275, y: 88.9, layer: "F.Cu", width: 0.2 })); this.components.push(this.pcb.track().from({ x: 172.085, y: 88.265 }, "F.Cu", 0.2).to({ x: 172.72, y: 88.9, layer: "F.Cu", width: 0.2 })); this.components.push(this.pcb.track().from({ x: 172.72, y: 90.855 }, "F.Cu", 0.2).to({ x: 172.72, y: 97.155, layer: "F.Cu", width: 0.2 })); this.components.push(this.pcb.track().from({ x: 169.925, y: 88.165 }, "F.Cu", 0.2).to({ x: 169.825, y: 88.265, layer: "F.Cu", width: 0.2 })); this.components.push(this.pcb.track().from({ x: 172.72, y: 88.9 }, "F.Cu", 0.2).to({ x: 172.72, y: 90.855, layer: "F.Cu", width: 0.2 })); this.components.push(this.pcb.track().from({ x: 169.825, y: 88.265 }, "F.Cu", 0.2).to({ x: 172.085, y: 88.265, layer: "F.Cu", width: 0.2 })); this.components.push(this.pcb.track().from({ x: 169.925, y: 86.36 }, "F.Cu", 0.2).to({ x: 169.925, y: 88.165, layer: "F.Cu", width: 0.2 })); this.components.push(this.pcb.track().from({ x: 167.005, y: 82.55 }, "F.Cu", 0.2).to({ x: 168.275, y: 82.55, layer: "F.Cu", width: 0.2 })); this.components.push(this.pcb.track().from({ x: 165.085, y: 83.8 }, "F.Cu", 0.2).to({ x: 165.755, y: 83.8, layer: "F.Cu", width: 0.2 })); this.components.push(this.pcb.track().from({ x: 168.275, y: 82.55 }, "F.Cu", 0.2).to({ x: 168.275, y: 86.36, layer: "F.Cu", width: 0.2 })); this.components.push(this.pcb.track().from({ x: 165.755, y: 83.8 }, "F.Cu", 0.2).to({ x: 167.005, y: 82.55, layer: "F.Cu", width: 0.2 })); } }