Ruteo Cuatro Airwires


Trabaja directamente en el proyecto original. NO mover componentes. U2 y T1 están ya separados; no tocar placement. Checks actuales: no hay dangling/floating/overlap/invalid/outside en el filtro, queda SOLO Airwires con 4 errores:
  • Trace 9c3c uids 9c3cbb2b-afaa-425b-b5ce-d4652c0ff546,22fa4d80-1cd2-4723-97c8-b845671bb7a6
  • Trace b7ae uids b7ae9ddd-02c9-430b-b15e-4ec3e2abf0d4,1613efc4-46bb-4bd3-88f9-cfd66b1c6e3a__880f28ef-cf41-0acc-4a98-ce0afa37b0c2
  • Trace 2afa uids 2afaa84b-b464-408d-aa1f-af950c0a7deb,52092b06-ddf0-4867-93dc-2db39dab7c1a__880f28ef-cf41-0acc-4a98-ce0afa37b0c2
  • Trace 6c9e uids 6c9e5483-2fc2-4ff7-873a-228f2c925c58,2afaa84b-b464-408d-aa1f-af950c0a7deb Objetivo: cerrar SOLO estos 4 airwires con ruteo quirúrgico. No autoroute completo salvo que el enrutador quirúrgico no pueda conectar y solo si es absolutamente necesario para dejar la placa fabricable. Si al rutear aparecen overlaps, elimina/re-rutea solo las trazas recién creadas, no borres grandes partes del board. Al finalizar corre checks de airwires, overlapping copper, dangling, floating, invalid layer, component outside board. Devuelve resumen conciso con resultado limpio o remanentes exactos.
Voy a trabajar solo sobre esos 4 airwires, sin mover componentes ni hacer autoroute completo; primero inspecciono el estado/rutas afectadas, luego aplicaré ruteo quirúrgico y validaré únicamente los checks indicados.
Bloqueado por falta de ACUs: no pude continuar ejecutando ruteo ni aplicar cambios.
Hecho:
  • Confirmé con checks actuales que quedan exactamente 4 errores de Airwires: Trace 9c3c, b7ae, 2afa y 6c9e.
  • Verifiqué que no aparecieron errores en dangling, floating, overlapping copper, invalid layer ni component outside board en el filtro solicitado.
  • Corrí precheck de ruteo: detectó solo una advertencia de vía duplicada removida automáticamente en (24.9625 mm, 29.0 mm).
Pendiente:
  • Rutear quirúrgicamente solo esos 4 airwires.
  • Revalidar los 6 checks finales pedidos.
  • No se movió ningún componente ni se ejecutó autoroute completo.
Resolver ACUs
Ruteo manual
Ver airwires exactos
Checks finales

Firmware Starter — ESP32-S3 IoT Relay Controller
Platform & Toolchain
  • MCU: ESP32-S3-MINI-1U-N8
  • Framework: Arduino on PlatformIO
  • Programming: USB-C native USB Serial/JTAG / ROM downloader using BOOT + RESET
Pin Mapping

Table


FunctionGPIONet
Relay SET pulse4RELAY_SET_GPIO
Relay RESET pulse5RELAY_RESET_GPIO
WiFi/status LED6LED_WIFI_GPIO
Relay/status LED7LED_RELAY_GPIO
I2C SCL8I2C_SCL
I2C SDA9I2C_SDA
ACS732 overcurrent fault10ACS_FAULT
Current ADC1ADC_CURRENT
AC voltage ADC2ADC_AC_VOLTAGE
UART TX expansionTXD0UART0_TX_EXP
UART RX expansionRXD0UART0_RX_EXP
BOOT0ESP_BOOT
platformio.ini

Ini


[env:esp32-s3]
platform = espressif32
board = esp32-s3-devkitc-1
framework = arduino
monitor_speed = 115200
upload_speed = 921600
build_flags =
  -DARDUINO_USB_MODE=1
  -DARDUINO_USB_CDC_ON_BOOT=1
Complete Firmware Source

Cpp


#include <Arduino.h>
#include <Wire.h>
#include <WiFi.h>

#define RELAY_SET_PIN        4
#define RELAY_RESET_PIN      5
#define LED_WIFI_PIN         6
#define LED_RELAY_PIN        7
#define I2C_SCL_PIN          8
#define I2C_SDA_PIN          9
#define ACS_FAULT_PIN        10
#define ADC_CURRENT_PIN      1
#define ADC_AC_VOLTAGE_PIN   2

#define TMP102_ADDR          0x48
#define RELAY_PULSE_MS       50
#define SAMPLE_INTERVAL_MS   1000

const char* WIFI_SSID = "YOUR_SSID";
const char* WIFI_PASSWORD = "YOUR_PASSWORD";

bool relayOn = false;
uint32_t lastSample = 0;

void pulseRelay(bool turnOn) {
  const int pin = turnOn ? RELAY_SET_PIN : RELAY_RESET_PIN;
  digitalWrite(pin, HIGH);
  delay(RELAY_PULSE_MS);
  digitalWrite(pin, LOW);
  relayOn = turnOn;
  digitalWrite(LED_RELAY_PIN, relayOn ? HIGH : LOW);
}

bool readTMP102(float &tempC) {
  Wire.beginTransmission(TMP102_ADDR);
  Wire.write(0x00);
  if (Wire.endTransmission(false) != 0) return false;
  if (Wire.requestFrom(TMP102_ADDR, 2) != 2) return false;
  int16_t raw = (Wire.read() << 4) | (Wire.read() >> 4);
  if (raw & 0x800) raw |= 0xF000;
  tempC = raw * 0.0625f;
  return true;
}

float readAdcVolts(int pin) {
  uint16_t raw = analogRead(pin);
  return (raw / 4095.0f) * 3.3f;
}

float estimateLoadCurrentA() {
  float vadc = readAdcVolts(ADC_CURRENT_PIN);
  float sensorVout = vadc * 1.5f;       // R22=10k, R23=20k divider
  return (sensorVout - 2.5f) / 0.050f;  // ACS732-40AB: 50 mV/A typ
}

float readAcVoltageAdcVolts() {
  return readAdcVolts(ADC_AC_VOLTAGE_PIN); // Calibration required for RMS mains voltage
}

void initWiFi() {
  WiFi.mode(WIFI_STA);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  uint8_t tries = 0;
  while (WiFi.status() != WL_CONNECTED && tries++ < 20) {
    digitalWrite(LED_WIFI_PIN, !digitalRead(LED_WIFI_PIN));
    delay(250);
  }
  digitalWrite(LED_WIFI_PIN, WiFi.status() == WL_CONNECTED ? HIGH : LOW);
}

void setup() {
  Serial.begin(115200);
  delay(300);
  pinMode(RELAY_SET_PIN, OUTPUT);
  pinMode(RELAY_RESET_PIN, OUTPUT);
  pinMode(LED_WIFI_PIN, OUTPUT);
  pinMode(LED_RELAY_PIN, OUTPUT);
  pinMode(ACS_FAULT_PIN, INPUT_PULLUP);
  digitalWrite(RELAY_SET_PIN, LOW);
  digitalWrite(RELAY_RESET_PIN, LOW);
  digitalWrite(LED_RELAY_PIN, LOW);
  analogReadResolution(12);
  Wire.begin(I2C_SDA_PIN, I2C_SCL_PIN);
  initWiFi();
  Serial.println("ESP32-S3 IoT Relay Controller ready");
}

void loop() {
  if (millis() - lastSample >= SAMPLE_INTERVAL_MS) {
    lastSample = millis();
    float tempC = NAN;
    bool tempOk = readTMP102(tempC);
    float currentA = estimateLoadCurrentA();
    float acAdc = readAcVoltageAdcVolts();
    bool fault = digitalRead(ACS_FAULT_PIN) == LOW;
    Serial.printf("relay=%d temp=%s%.2fC current=%.2fA ac_adc=%.3fV fault=%d wifi=%d\n",
      relayOn, tempOk ? "" : "ERR ", tempOk ? tempC : NAN, currentA, acAdc, fault, WiFi.status() == WL_CONNECTED);
    if (fault || (tempOk && tempC > 85.0f)) {
      pulseRelay(false);
      Serial.println("Safety trip: relay reset");
    }
  }
  if (WiFi.status() != WL_CONNECTED) initWiFi();
}
Build & Flash

Bash


pio run
pio run -t upload
pio device monitor
Hold BOOT, tap RESET, release BOOT if the USB bootloader is not detected automatically.
  • Platform & Toolchain

  • Pin Mapping

  • platformio.ini

  • Complete Firmware Source

  • Build & Flash