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:
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.
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.
MPN y Manufacturer.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.
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])
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.