DÍA 284 DE 365

Fase 5: Diseño Industrial y Hardware

📖 Teoría a Estudiar

El BOM (Bill of Materials) Industrial

El BOM es la lista de compras exacta de tu máquina. Contiene la cantidad, las referencias en la placa (ej. R1, R2, C1) y la descripción de cada pieza. Pero el atributo rey absoluto del BOM es el MPN (Manufacturer Part Number).

Un MPN es una cadena alfanumérica unívoca creada por el fabricante. Por ejemplo, en lugar de pedir "Un capacitor cerámico de 100nF", el ingeniero exige el MPN CC0805KRX7R9BB104 (Marca Yageo). Ese código garantiza matemáticamente:

Gestión de Trazabilidad y el Flag DNP (Do Not Populate)

En el diseño industrial, a menudo incluimos componentes "por si acaso" (resistencias de pull-up opcionales, conectores de depuración JTAG, filtros extra). Para la placa final de producción, no queremos gastar dinero soldando esos conectores, pero tampoco queremos borrarlos del esquemático por si los necesitamos en el futuro.

La solución es el atributo DNP (Do Not Populate) o DNI (Do Not Install). Un componente marcado como DNP aparecerá en la PCB con sus pads de cobre vacíos, y el robot de la fábrica simplemente saltará esa posición porque la ignorará en el archivo BOM.

ARQUITECTURA DE DATOS: DEL ESQUEMÁTICO AL PCBA SÍMBOLO EN ESQUEMÁTICO R14 10k CAMPOS PERSONALIZADOS (Properties) Value : 10k Footpr: R_0805_2012Metric MPN : RC0805FR-0710KL Mfr : Yageo DNP : False LCSC : C17414 Export BOM.csv (Bill of Materials) Ref Qty Value MPN Mfr DNP U1 1 STM32F4 STM32F401RET6 STMicro - R14, R15 2 10k RC0805FR-0710KL Yageo - J2 1 JTAG 61201021621 Wurth DNP Agrupación Automática: R14 y R15 comparten el mismo MPN

⚙️ Pasos Prácticos en KiCad 8

Paso 1: Agregar Campos Personalizados (Symbol Fields).
Hacerlo componente por componente haciendo doble clic es una locura. KiCad tiene un editor de hojas de cálculo masivo.

  1. En el Esquemático, abre la herramienta Symbol Fields Table (Icono de tabla en la barra superior).
  2. Haz clic en "Add Field" y crea dos columnas nuevas llamadas exactamente MPN y Manufacturer.
  3. Agrupa todos los capacitores de 100nF juntos. Pega el MPN CC0603KRX7R9BB104 en todos ellos de un solo golpe.

Paso 2: Marcar Componentes como DNP.
En la misma tabla (Symbol Fields Table), verás una columna nativa llamada DNP. Si tienes conectores de programación (SWD) que solo usas en el laboratorio, marca su casilla DNP. En el esquemático aparecerán atenuados con una X roja. Cuando exportes los archivos de fabricación, el robot sabrá ignorar esos agujeros en la placa.

Paso 3: Exportar el BOM.
Ve a Tools -> Generate BOM. KiCad incluye varios scripts en Python. Selecciona bom_csv_grouped_by_value. Esto generará un archivo Excel/CSV donde R14 y R15 no están en dos líneas separadas, sino en una sola línea que dice "Cantidad: 2, MPN: RC0805FR-0710KL, Ref: R14,R15", que es exactamente lo que el departamento de compras necesita para hacer el pedido a DigiKey o Mouser.

💻 CI/CD de Hardware: Auditoría de Cadena de Suministro

Nunca confíes en que llenaste toda la tabla a mano. Un solo componente sin MPN detendrá la línea de ensamblaje en China por tres días mientras te envían correos electrónicos pidiendo aclaraciones. Añadiremos un script a nuestro pipeline DevOps (Día 277) para leer el archivo del esquemático y fallar el *build* si falta algún MPN crítico.


#!/usr/bin/env python3
"""
@file audit_bom_mpn.py
@brief Script CI/CD (DevOps) para garantizar que todo componente tenga un MPN válido.
"""

import sys
import xml.etree.ElementTree as ET

def auditar_bom_xml(xml_path):
    print(f"[*] Auditando Supply Chain (BOM MPNs) en: {xml_path}")
    try:
        tree = ET.parse(xml_path)
    except Exception as e:
        print(f"[!] Error al abrir XML exportado de KiCad: {e}")
        sys.exit(1)
        
    root = tree.getroot()
    errores = 0
    ignorados_dnp = 0
    
    # Buscamos todos los componentes en el XML generado por KiCad
    for comp in root.findall('./components/comp'):
        ref = comp.attrib.get('ref', 'UNKNOWN')
        
        # Ignorar Mounting Holes, Fiduciales o Logos
        if ref.startswith('H') or ref.startswith('FID') or ref.startswith('LOGO'):
            continue
            
        # Comprobar si tiene el atributo DNP (Do Not Populate) activo
        dnp = False
        property_dnp = comp.find("./property[@name='dnp']")
        if property_dnp is not None:
            dnp = True
            
        if dnp:
            ignorados_dnp += 1
            continue
            
        # Extraer campos personalizados (Fields)
        mpn_value = None
        fields = comp.find('fields')
        if fields is not None:
            for field in fields.findall('field'):
                if field.attrib.get('name') == 'MPN':
                    mpn_value = field.text
                    
        # Validación de Negocio
        if not mpn_value or mpn_value.strip() == "":
            print(f"    [X] ERROR DFM: El componente {ref} no tiene un MPN (Manufacturer Part Number) asignado.")
            errores += 1

    print("--------------------------------------------------")
    print(f"Componentes DNP (Ignorados de compra): {ignorados_dnp}")
    print(f"Errores críticos de MPN detectados:    {errores}")
    print("--------------------------------------------------")

    if errores > 0:
        print("\n[!] CI/CD ABORTADO. Faltan números de parte. La fábrica no sabrá qué comprar.")
        sys.exit(1)
    else:
        print("\n[V] AUDITORÍA SUPPLY CHAIN EXITOSA. El BOM está 100% definido y rastreable.")
        sys.exit(0)

if __name__ == "__main__":
    if len(sys.argv) < 2:
        print("Uso: python audit_bom_mpn.py <archivo_bom.xml>")
        print("Nota: Usa 'kicad-cli sch export python-bom' primero.")
        sys.exit(1)
    auditar_bom_xml(sys.argv[1])
        

🚀 Avance del Proyecto Tesis: Despachador de Gas LP

Objetivo del día: Industrialización, Trazabilidad y Gestión del Ciclo de Vida (PLM).

Un Despachador de Gas LP no es un proyecto de fin de semana; es un activo de capital (CAPEX) diseñado para estar a la intemperie durante 10 años. Durante el calor del verano de 40°C en México o los inviernos bajo cero, los componentes genéricos sufren "deriva térmica". Si el resistor de medición del sensor 4-20mA no es de precisión, el Despachador contará litros fantasma.

Al forzar la inclusión estricta del MPN (Manufacturer Part Number) mediante tu script automatizado de Integración Continua, le has quitado el poder de decisión al ensamblador chino. Tú eres el Arquitecto. Si indicaste que el capacitor de la fuente de poder (Día 272) es un TDK C3216X7R1H105K160AB, garantizas matemáticamente el tipo de cerámica (X7R) y el voltaje de ruptura. Además, al dominar el uso táctico de los atributos DNP (Do Not Populate), permites que tu misma placa física contenga funciones opcionales (como un módulo Bluetooth extra) que solo se soldarán en las versiones "Premium" del despachador, ahorrándole miles de dólares en componentes no deseados a tu línea estándar sin tener que diseñar dos placas distintas.

📝 Resumen del Día