Mi librería de componentes de código abierto de Altium contiene centenares de símbolos esquemáticos, que suministra a más de 100.000 componentes para su uso. Las personas se sorprenden cuando les digo que, utilizando Altium, sólo toma un par de minutos crear un símbolo esquemático. Aún más cuando les comento que la parte posee una gran cantidad de pines. En este artículo, quiero mostrarte cómo puedes aprovechar algunas de las herramientas de Altium para poder crear rápidamente tus propios símbolos.
Antes de comenzar, necesitarás tener en cuenta estos puntos:
Para encontrar una parte para utilizar en este artículo, me dirigí a Digi-Key y busqué en la categoría de Integrados-Microcontroladores un microcontrolador en stock ARM Cortex M con FLASH integrado y más de 100 pines de GPIO. Luego, ordené esta lista por cantidad disponible, y el ganador es un NXP MK64FN1M0VLQ12. Parecería ser un buen microcontrolador en un paquete LQFP-144. El copiar y pegar las descripciones de los pines para cada pin en este paquete sería aburrido, propenso a errores y tomaría mucho tiempo, así que no haremos eso.
Si miramos la hoja de datos para esta parte, la tabla de pines (5.1, página 68) no es ideal para este proceso, pero está bien. Las hojas de datos rara vez son ideales para crear símbolos.
Antes de ver en detalle cómo crear este componente, hice todo el proceso por mi cuenta para asegurarme de no olvidar ningún paso a medida que escribía este artículo. Me tomó un poco más de 7 minutos el crear esta parte de 144 pines, lo cual es un poco lento para mí. Si los datos en la hoja de datos no hubiesen necesitado tanto pulido, me hubiese tomado alrededor de 4-5 minutos. Sin embargo, he creado alrededor de 500 símbolos de esta manera, ¡por lo que tengo experiencia que me permite trabajar rápidamente!
Lo primero que haremos en Altium es crear una nueva biblioteca de esquemáticos dirigiéndonos a "Archivo-> Nuevo -> Biblioteca -> Biblioteca de esquemáticos"
Luego, en el nuevo componente, colocaremos un rectángulo. Colocar primero el rectángulo para el cuerpo del componente, evitará que tengamos que moverlo detrás de los pines luego. Esto nos hace ganar un poco de tiempo. El tamaño del rectángulo no importa. ¡El que creé terminará siendo demasiado pequeño para el componente final!
Luego del rectángulo, crearemos nuestro primer pin, que servirá como semilla para los demás.
Es preferible establecer las propiedades del pin en este momento para que nos resulte más fácil el utilizarlo después, por lo que estableceremos el número del pin ("Designator") en 1, y el nombre en "P1". La porción numeral del nombre puede auto-incrementarse, y la letra P me indicará, en los pasos posteriores, que este es el nombre del pin.
En este momento, deberías tener algo así:
Todavía nos faltan 143 pines, así que arreglemos eso. Primero, copiemos el pin.
Luego, utilizaremos la potente función "Pegar arreglo" del menú "Edición".
Necesitamos 143 pines más, así que ingresa 143 en la casilla "Cantidad de ítems", y asegúrate que el espaciamiento vertical esté en -100mil. Esto generará pines a partir de donde hagas clic, y hacia abajo (en vez de hacia arriba).
Dado que hay una gran cantidad de pines aquí, ¡te sugiero que disminuyas el zoom y hagas clic en algún lado alrededor de 7000mil arriba en el símbolo esquemático!
He ordenado los pines en columnas, ¡pero ahora tenemos 144 pines para utilizar!
Tener todos estos pines no es de mucha utilidad para el símbolo, dado que todavía tenemos que agregar nombres a los pines. Para hacer esto, iremos a la hoja de datos.
Selecciona la tabla de pines, y luego copia y pega toda la información en un documento de notepad++. Se verá horrible; ¡no te preocupes!
Como mencioné anteriormente, esta no es la hoja de datos ideal, por lo que antes de hacer más cosas quiero pulir un poco la información pegada. En primer lugar, muchas de las funciones han sido partidas en múltiples líneas en las que aparece un / o _ en su nombre. El tener datos de calidad como punto de inicio hará que todo sea más fácil luego.
Utilizaré la función "Buscar y reemplazar" para buscar _\r\n, y lo reemplazaré por _. El modo extendido de búsqueda encontrará los nombres en los que el _ partió la función en dos líneas, y lo reemplazará con un solo _. Haz clic en "Reemplazar todos" para realizar los cambios en una sola vez.
Haz lo mismo para /\r\n
, reemplazándolos con un solo /
.
La hoja de datos también tiene muchas columnas con la palabra "DISABLED", por lo que buscaré y reemplazaré el término "DISABLED " con un espacio al final, y lo reemplazaré por nada.
Ahora, utilizaremos las expresiones regulares para organizar este desastre de letras y números en una bonita tabla de números y descripciones de pines.
Utilizaré la página de prueba de expresiones regulares en RegexStorm para procesar la lista de pines. Puedes también chequear la referencia de expresiones regulares si necesitas ponerte al día con tu sintaxis.
Antes de hacer coincidir los datos, sería bueno tener todos los ítems de descripciones de los pines en una única fila, en vez de tenerlos separados en múltiples líneas. Podemos utilizar un simple patrón en RegexStorm para arreglar el texto con el que estamos trabajando.
Utilizaré el patrón \r\n(\D)
para encontrar cualquier nueva línea que no esté seguida por un dígito (\D
es la secuencia de expresiones regulares para "no un dígito"). El "no es un dígito" que se hace coincidir necesita ir a un grupo, lo cual se hace con los paréntesis, así podemos reemplazar lo que se hace coincidir con ese único carácter. Luego, nuestro reemplazo es $1
, dado que $1
especifica el primer grupo que se hizo coincidir.
Luego de hacer clic en "Reemplazar", la pestaña de contenidos contiene los datos fijos de entrada, así que podemos copiarlos de la pestaña de contexto para seguir trabajándolos.
No hemos terminado todavía: Hay una gran cantidad de lugares (127) en los que el nombre del pin, su función por defecto, y la función ALT0 son todos lo mismo. No quisiéramos crear un pin 5 VDD VDD VDD, ¿verdad? Que el pin 5 se llame VDD ya sería suficiente.
Podemos utilizar una expresión regular para limpiar estos nombres duplicados, utilizando el siguiente patrón:\b([A-Z\d/_]{3,})\s*\1\s*\1? *
Esto encontrará un borde en la palabra con el \b, y luego hará coincidir un grupo de tres o más letras en mayúsculas, dígitos (\d
), barras / o guiones bajos con ([A-Z\d/_]
). Luego, busca un número opcional de caracteres de espacio en blanco con \s* seguido por lo mismo que el primer grupo (\1
), otro espacio opcional, y finalmente, se coloca el primer grupo opcionalmente (el ?) seguido por cualquier número de espacios. De esta forma, no hará coincidir el patrón con pines repetidos como EE EE, pero coincidirá 2-3 de lo mismo seguidos, como por ejemplo VDD VDD VDD.
Podemos luego reemplazar esto con ‘$1
‘, de la misma forma que hicimos anteriormente, pero con un espacio después del $1
. Finalmente, podemos copiar esto en el "Input".
Patrón de búsqueda
Estamos intentando encontrar esto haciéndolo coincidir con un patrón:115 C7 C6 82 PTC10 ADC1_SE6b
ADC1_SE6b
PTC10 I2C1_SCL FTM3_CH6 I2S0_RX_FS
FB_AD5
O
89 F10 D11 — PTB8 PTB8 UART3_RTS_b
FB_AD21
La principal diferencia entre los dos, al menos lo que nos importa a nosotros, es el carácter ‘—’ presente en donde ese paquete no tiene el pin.
Mi expresión para hacer coincidir lo buscado es esta:
(?:(?<Pin>\d{1,3})\s+(?:[A-Z\d—]{1,2}\s+){2}(?:[\d—]{1,3}\s+)
)
Esto hace un buen trabajo encontrando lo buscado en la tabla de más abajo. Ahora, tengo una tabla para los pines, y tengo la sección completa de los datos de los números de los pines de la hoja de datos coincidida. Esto significa que todo lo demás será sencillamente las descripciones.
He estado utilizando expresiones regulares desde que programaba en PERL aproximadamente 20 años atrás siendo adolescente, ¡por lo que me siento muy cómodo con ellas! Analicemos esta primera coincidencia paso por paso, por si eres un principiante en expresiones regulares, o necesitas un repaso.
(?:\b(?<Pin>\d{1,3})\s+(?:[A-Z\d—]{1,3}\s+){2}(?:[\d—]{1,3}\s+))
(?:)
significa que es un grupo de no captura. Me permite agrupar todo junto sin terminar en la vista de Tabla en RegexStorm. ¡El agrupar cosas juntas es muy importante para lograr lo que queremos!
\b
es un borde de palabra. Por ejemplo, una nueva línea, espacio, tab, etc. Esto previene que algo como:LPTMR0_ALT1
74 L12 J11 52
haga coincidir el 1 al final de ALT1, previniendo que los primeros tres designantes coincidan.
(?<Pin>\d{1,3})
captura un grupo con nombre "Pin" gracias a la porción ?<Pin>. No todos los motores de expresiones regulares soportan los grupos con nombres, y esta es una de las razones por las que uso RegexStorm. Ese grupo hará coincidir los dígitos (\d) que estén entre 1 y 3 ({1,3})
. Nuestro número de pines tendrá siempre entre 1 y 3 dígitos (de 1 a 144), entonces esos son los valores que tenemos que buscar.
\s+
Hace coincidir cualquier grupo de uno o más caracteres de espacio en blanco consecutivos. De esta forma, si los datos que copiamos de la hoja de datos tienen espacios, tabs o caracteres de nueva línea (line break) entre los pines, todos coincidirán con este patrón, aun si hay múltiples espacios o tabs.
A continuación, queremos hacer coincidir los dos designantes de los pines del paquete BGA. (?:[A-Z\d—]{1,3}\s+){2}
hace esto. El cuantificador del final ({2})
dice que queremos dos del grupo que no es capturado. Ese grupo es el encontrar dos o tres de lo que sea que esté dentro de los corchetes. Los corchetes en las expresiones regulares indican la coincidencia de 'lo que sea que esté adentro'. En nuestro caso, lo que hay dentro de los corchetes son todas las letras en mayúsculas (A-Z), todos los números (\d), y la raya (emdash) que se usa en la hoja de datos para decir que la función no está en esa opción de paquete. Finalmente, tenemos uno o más espacios al igual que cuando hicimos coincidir los pines.
(?:[\d—]{1,3}\s+)
está haciendo coincidir nuestro número final de pin. Es básicamente lo mismo que la coincidencia anterior de los pines, pero necesitamos que esté la raya también, en caso de que esa funcionalidad no esté en nuestro paquete.
Si no tienes mucha experiencia con las expresiones regulares, ¡no te preocupes! ¡Dejan de quemarte el cerebro después de que las lees regularmente durante algunos años!
Encontrando la descripción del pin
Para encontrar la descripción de los pines haciéndola coincidir con nuestro patrón, podemos añadir una porción extra a la sintaxis que tenemos para que todo esté en un solo grupo. Ahora, mi patrón es este:
(?:\b(?<Pin>\d{1,3})\s+(?:[A-Z\d—]{1,3}\s+){2}(?:[\d—]{1,3}\s+)(?<Desc>[\w\d_/\s]+?\b(?=\d{1,3}\b)))
El patrón añadido para hacer coincidir solamente la parte de la descripción del pin es este:(?<Desc>[\w\d_/\s]+?\b(?=\d{1,3}\b))
Al fin. Tenemos una tabla que contiene 144 coincidencias con datos relativamente limpios. Ahora, puedo copiar y pegar esto en una hoja de cálculos de Google.
Volviendo a Altium Designer, podemos ahora incorporar algunos datos en el arreglo de pines que ya creamos. Selecciona todos los pines (pero no el rectángulo) en la ventana de símbolo esquemático.
Abre el panel de lista SCHLIB haciendo clic en el botón "Paneles" en la parte inferior derecha de la ventana de Altium.
Ahora, verás todos los pines seleccionados del símbolo esquemático.
Si haces clic derecho en cualquier lugar de la grilla, puedes elegir cambiar a modo de edición.
Ahora, puedes hacer clic en la grilla y presionar CTRL-A o hacer clic derecho y elegir "Seleccionar Todos".
Luego, copia y pega todo en tu hoja de cálculo un poco más abajo que la tabla que pegaste de RegexStorm.
Ahora que tienes las dos tablas en la hoja de cálculo, puedes copiar la columna del número de pin de los datos que copiaste de RegexStorm sobre los números de pin de Altium Designer, y luego hacer lo mismo para la columna de las descripciones.
Antes de llevar estos datos a Altium Designer, quiero rápidamente arreglar la columna de los nombres, reemplazando cualquier espacio por / para seguir el estándar de mi biblioteca. Para hacer esto, selecciona toda la columna en la tabla de Altium Designer, y ahora, puedes usar la herramienta de Buscar y Reemplazar para buscar los espacios y reemplazarlos con la barra. Aprieta "Reemplazar Todos" luego de chequear que la búsqueda está establecida únicamente para el rango específico de celdas que has seleccionado.
Ahora, tenemos una tabla con todos los nombres de pines y designantes listos para ser llevados a Altium Designer. Simplemente selecciona toda la tabla, y luego pégala en tu tabla de lista SCHLIB. Sobrescribirá todo en la tabla, ¡lo cual dejará un desorden importante en tu editor de símbolos esquemáticos!
Lo más importante es que ya tenemos todos los datos en Altium Designer, y costó mucho menos y ocasionó menos errores que intentar copiar todos los detalles de la hoja de datos pin por pin.
Prefiero agrupar todos los pines alrededor de la hoja del símbolo esquemático. Así puedo decidir si mantendré el símbolo como una parte única, o si necesito crear un símbolo con múltiples partes. Para esta parte de 144 pines, tendré que crear un símbolo multipartes, pero de todas formas, agruparé todo de forma bonita para tener grupos de pines para copiar y pegar en cada parte nueva.
Podemos usar el panel de filtros SCHLIB para seleccionar mediante una máscara grupos de pines de a vez. No hay una herramienta para ordenar rápidamente grupos de pines, pero con todos los pines seleccionados es sencillo arrastrarlos a todos a un área en blanco de la hoja esquemática y ordenarlos manualmente.
Para encontrar todos los pines, como por ejemplo VSS o VSSA, puedo utilizar el filtro: Name LIKE 'VS*', que hará coincidir con un carácter comodín (wildcard match) para seleccionar todos esos pines.
YouPuedes repetir esto con otros filtros como Name LIKE ‘VD*’ para coger los pines de alimentación. Los pines de puerto de este componente comienzan con PTA/PTB/PTC, etc, por lo que puedes usar el mismo estilo de filtro para encontrar todos los pines del puerto A, y demases.
Luego de arreglar un poco rápidamente, tengo a todos mis pines ya agrupados.
Quiero todos los pines ADC, DAC, Voltaje, Tierra, USB y cristal en la parte principal del componente, por lo que los moví al rectángulo que creé como primer paso en este proceso. Y, luego, cambié su tamaño para que entren todos los pines. Siempre coloco mis pines VDD en la parte izquierda superior, y los pines VSS/GND en la parte izquierda inferior, y agrupo los pines por función en vez de agruparlos según su posición en el símbolo. Creo que esto logra un símbolo más utilizable en un esquemático en vez de copiar los pines según su disposición física.
Ahora que la parte principal está finalizada, necesitamos agregar las subpartes al símbolo esquemático. Puedes agregar una nueva parte al símbolo esquemático yendo a Herramientas -> Nueva Parte.
La nueva parte aparecerá en el panel de biblioteca SCH, anidado dentro de tu componente principal.
Una vez que tienes las subpartes, lo que resta es crear un rectángulo en cada subparte, y luego cortar y pegar los pines en cada uno desde la parte principal. El dividir un microcontrolador enorme en partes pequeñas permitirá que el ingeniero que utilice el símbolo cree un esquemático más prolijo y limpio, en vez de tener su hoja dominada por un único símbolo esquemático enorme.
El símbolo que acabo de crear quizás sea perfecto para tu biblioteca, pero yo siempre prefiero ir más allá. He juntado algunas expresiones regulares más a las que les puedes echar un vistazo si quieres limpiar los nombres aún más, o agregar barras para distinguir los bajos activos en las funciones que comienzan con _n o terminan con _b, como tiene la parte en la que hemos trabajado.
Al tener estos patrones ya listos en mano, puedes lograr tener nombres de símbolos de mayor calidad, y solo toma un minuto o dos de trabajo adicional. Adicionalmente, puedes usarlos como base para tus propios patrones de limpieza.
He quitado manualmente las funciones duplicadas en los pines en las imágenes de arriba, pero puedes hacerlo automáticamente si encuentras que tienes muchos de ellos, y que es poco eficiente quitar todos los duplicados manualmente.
Primero, quita los duplicados de la función inicial, como por ejemplo ‘PTA12’
. Usa la siguiente expresión regular:^([A-Z\d/_]{3,})/(?<inbetween>(?:(?:[^/])+/){1,5})\1/?
Con la opción Options -> Multiline. Esto tratará cada línea en el campo de entrada como una entidad propia para el carácter ^ para hacer coincidir el patrón al principio de la línea.
Reemplaza lo coincidido con el patrón por:$1/${inbetween}
Luego, reemplaza todas las funciones luego de la primer función con la expresión regular:/([A-Z\d/_]{3,})/(?<inbetween>(?:(?:[^/])+/){1,5})\1/?
Puedes apagar la opción de multilínea nuevamente, pero dejarla encendida no hará que la expresión deje de funcionar. Nuevamente, reemplaza lo coincidido con el patrón por:
/$1/${inbetween}
Continúa reemplazando lo coincidido con el patrón hasta que no encuentres ninguna más. Para esta parte, tuve que correr este proceso tres veces para quitar todos los duplicados.
Hay dos expresiones para reemplazar los duplicados dado que la expresión necesita saber en dónde empezar a buscar para lograr una coincidencia. No querrás reemplazar /RMII0_RXER/MII0_RXER/ con solamente /RMII0_RXER/, dado que la segunda función es la misma que la primera, salvo por la R. Al tener dos funciones, podemos usar / como un carácter inicial, o como principio de la línea.
El agregar barras para distinguir bajos activos al nombre de una función está más en línea con los estándares de Altium Designer en vez de tener n_ o b_ en la función. Puedes hacer esto agregando un \ luego de cada carácter, y una expresión regular puede encontrarlos por ti con grupos de "revisar delante" (lookahead)
Para aquellas funciones que terminen con _b, usa la expresión:([^/](?=[A-Z\d_]*_b[/\r]))
Y reemplaza todas las coincidencias con: $1\
Luego, usa la expresión:\_b
Y reemplaza todas las coincidencias con: \
Para las funciones que comiencen con n_, puedes usar la expresión:((?<=/n_[A-Z\d_]*)[^/])
Y reemplazar todas las coincidencias con: $1\
Luego de esto, necesitarás buscar utilizando la expresión:n_(\w)
Y reemplazar lo obtenido por: $1
Para quitar la parte n_ del principio del nombre de la función.
Las expresiones regulares son una herramienta muy poderosa para tener si estás creando símbolos en Altium Designer a partir de hojas de datos. Puedes rápidamente convertir copiados y pegados inentendibles de un PDF en una hoja de cálculos utilizable utilizando algunas expresiones. Los nuevos usuarios me dicen que la sintaxis se ve extremadamente intimidante, dado que a primera vista parecería ser una mezcla de símbolos y números, pero en realidad, es una sintaxis muy bien definida que es bastante sencilla de aprender. Luego de un par de horas de limpiar hojas de datos copiadas a tablas de pines, verás que la sintaxis te irá resultando cada vez más cómoda.
Esta parte en particular fue esencialmente elegida al azar para crear este artículo. A pesar de que los datos necesitaron de mucha limpieza -y eso puede tomar más tiempo que la propia importación de los datos a Altium Designer- espero que te haya mostrado algunas nuevas formas de trabajar con símbolos esquemáticos.
Si tienes sugerencias para crear símbolos esquemáticos más rápidamente, deja un comentario debajo con tus sugerencias de modo que otras personas puedan sacar ventaja de tu experiencia.
Ve más guías Altium, o lee más artículos escritos por el experto en la industria, Mark Harris. ¿Quisieras saber más acerca de cómo Altium puede ayudarte con tu próximo diseño de PCB? Habla con un experto en Altium.