Всем привет! Сегодня мы поговорим о схемотехнике. А чтобы было интереснее, приплетем сюда Node.js. Внимательный читатель тут же спросит, какая же между ними связь? А такая, что мы попытаемся, используя современные технологии, немного облегчить жизнь тем, кто дружит с паяльником, любит программировать всякие там Arduino/BeagleBoard ну и вообще увлекается электроникой чуть больше, чем на потребительском уровне. Если кратко, то мы попытаемся немного автоматизировать процесс создания библиотеки электронных элементов.

Если стало интересно, то добро пожаловать под кат.

Предисловие


У многих из нас иногда возникает непреодолимое желание разработать какое-нибудь электронное устройство. Будь то робот, гаджет или хотя бы шилд для Arduino, который выполняет специфичные, близкие нашему сердцу функции. И приходит время разрабатывать печатную плату. Как обычно происходит этот процесс? Мы продумываем необходимый функционал, подбираем элементную базу, примерно прикидываем структурную и функциональную схему. Затем скачиваем и устанавливаем какую-нибудь EDA-программу (EDA — Electronic Design Automation). Ваяем принципиальную схему, потом разводим печатную плату (некоторые предпочитают автотрассировщики, но настоящие хардкорщики признают только handmade). Заказываем изготовление платы (ну или утюжим сами), покупаем элементы, паяем, запускаем и наслаждаемся нашим новым творением. Ну или мучаемся с ним, тут уж как получится.

Те, для кого этот процесс знаком, думаю, согласятся, что одна из муторных, рутинных и затратных по времени операций, это создание библиотеки необходимых элементов в формате той EDA, в которой вы обычно работаете. Собственно об автоматизации этого процесса далее и пойдет речь.

И в чем же соль?


Тот же внимательный читатель снова спросит, но ведь во всех современных EDA уже есть встроенные библиотеки элементов, ну а на случай, если нужного элемента не нашлось, есть соответствующий редактор в составе того же пакета программ. Трудно спорить, но все-таки встроенные библиотеки не охватывают всего многообразия этого мира, а удобство редакторов зачастую оставляет желать лучшего. А если вам нужно оформлять схемы по ГОСТ, то тут библиотеки вам редко помогут (почему-то большинство западных производителей софта нагло игнорируют наши стандарты или банально не знают о них). Зачастую сформированная с любовью за долгие годы библиотека мешает перейти вам на более современный пакет EDA только из-за того, что вам придется проходить весь этот тернистый путь заново.

Больше конкретики, Карл


И тогда у меня возникла мысль. Почему бы нам каким-то простым образом не описать электронные компоненты, а генерацию библиотеки доверить машине? Притом предусмотреть какие-нибудь простые, но гибкие средства настройки этого процесса, чтобы конечная библиотека выглядела именно так, как мы этого хотим. В идеале, чтобы мы могли контролировать каждый шаг процесса генерации с возможностью подкручивания того или иного параметра. Проделав настройку один раз, получить результат на всю жизнь. Генерировать библиотеку в формате именно той программы EDA, в которой нам захотелось поработать сегодня.

Так и родился проект под названием QEDA.js. Но перед тем, как начать подробное повествование о нем, пробежимся по терминологии.

С точки зрения разработчика электронный радио элемент (ЭРЭ) в общем случае состоит из условного графического обозначения (УГО) и посадочного места на плате.

УГО (иностранцы называют его schematic symbol) это изображение элемента, которое используется на принципиальной схеме, и которое позволяет нам отличать резистор от конденсатора, микросхему от разъема ну и так далее.

Посадочное место (land pattern, footprint, иногда pad layout в англоязычной терминологии) — это изображение того места на плате, куда элемент будет установлен физически. Есть замечательный стандарт IPC-7351, который регламентирует расчет посадочного места в зависимости от корпуса микросхемы. Собственно он и используется в QEDA.js.

Позиционное обозначение (reference designator) — идентификатор каждого элемента на схеме/плате, состоящий как правило из букв (характеризуют класс элементов) и цифр (порядковый номер элемента на конкретной схеме). Например C4 это 4-й по счету конденсатор, а VT21 — 21й транзистор.

Цоколёвка, или жаргонное распиновка (pinout) — описание расположения и назначения выводов элемента.

Встречайте: QEDA.js


Итак, хватит воды, переходим к сути. Перед тем, как заглянуть под капот, проделаем ряд нехитрых операций.

  1. Установим Node.js (если он у вас еще не установлен). Подробности на сайте производителя: nodejs.org
  2. Установим CoffeeScript (конечно же можно пропустить этот шаг и использовать ванильный JavaScript, но приведенные далее примеры будут написаны именно на CoffeeScript):

    npm install -g coffee-script

  3. Установим QEDA.js:

    npm install -g qeda

  4. Создадим файл script.coffee и наполним его следующими строками:

    Qeda = require 'qeda'
    
    lib = new Qeda.Library
    lib.add 'Altera/5M1270ZT144' # Add Altera MAX V CPLD
    lib.add 'Analog/AD9393' # Add Analog Devices HDMI interface
    lib.add 'ST/L3GD20H' # Add STMicroelectronics gyroscope
    lib.add 'TI/ISO721' # Add Texas Instruments digital isolator
    lib.add 'TI/ISO722' # Add Texas Instruments digital isolator
    lib.generate 'mylib'

  5. Выполним скрипт:

    coffee script.coffee


В директории, где был размещен скрипт, появится субдиректория kicad, которая собственно и содержит свежеиспечённую библиотеку в формате бесплатной, свободной и открытой EDA-программы под названием KiCad. Вы можете скачать дистрибутив этой программы с официального сайта: kicad-pcb.org

Теперь немного вернемся и попытаемся разобраться, что же происходит при выполнении этого скрипта? После подключения модуля QEDA.js и создания объекта — контейнера для наших ЭРЭ, мы добавляем в этот контейнер пару элементов из списка готовых (откроем завесу тайны, фактически это просто YAML-файлы, которые хранятся в специальном репозитории). При первом запуске скрипт подкачивает описания этих элементов в поддиректорию library. Последняя строка отвечает за генерирование библиотечных файлов в формате KiCad. Это и суть наши целевые файлы, ради которых все затевалось.

Однако с вероятностью 99,(9)% вы не найдёте нужный вам компонент в репозитории готовых элементов (дело в том, что в настоящее время он находится в стадии заполнения). Значит нам нужно научиться добавлять свои элементы.

Что ж, сделаем это! Создадим поддиректорию library, если её ещё нет, а в ней создадим файл dummy.yaml со следующим содержимым:

name: Dummy
pinout:
  DIN: 1
  ~DOUT: 2
  Vcc: 3
  GND: 4, 5
  NC: 6-8

properties:
  power: Vcc
  ground: GND
  in: DIN
  out: ~DOUT
  nc: NC
  inverted: ~DOUT

schematic:
  symbol: IC
  left: DIN, NC
  right: ~DOUT, NC
  top: Vcc
  bottom: GND

housing:
  pattern: SOIC
  outline: JEDEC MS-012 AA

Создадим файл custom.coffee (он должен находиться на одном уровне с директорией library) и напишем в нем:

Qeda = require 'qeda'
lib = new Qeda.Library
lib.add 'Dummy' # Adding custom element
lib.generate 'dummy'

Запускаем:

coffee custom.coffee

Получаем:





Ну что ж, надеюсь, мне удалось вас немного заинтересовать. Теперь погрузимся немного глубже в происходящие процессы.

Как я уже упоминал выше, вся необходимая и достаточная информация об ЭРЭ содержится в его YAML-описании. В нем отражаются такие параметры, как:

  • Распиновка (pinout) — названия выводов и соответствующие им номера. Номера могут быть перечислены через запятую или заданы диапазоном, причем эти два варианта можно комбинировать. Пример:

    pinout:
      DATA: 1, 3-6, 10

    Номера могут содержать и буквы (например, для BGA):

    pinout:
      GND: B1, C10-C13, AA1-AC3

    Так же можно объединять несколько выводов в группу:

    pinout:
      SPI:
        CS: 1
        CLK: 2
        MOSI: 3
        MISO: 4

    Группировать можно и названия выводов, они автоматически преобразуются в список (при этом их количество должно совпадать с количеством номеров справа):

    pinout:
      D16-0, CLK: 1-18

  • Свойства выводов (properties) — строго говоря, это тоже часть распиновки, но только не обязательная. Позволяет пролить немного света на тип выводов. Эта информация используется многими EDA-программами как для отображения символа, так и для проведения некоторых проверок (например, чтобы вы не пустили питание на ножку земли).

    properties:
      power: Vcc # Питание
      ground: GND # Земля
      in: DIN # Вход
      out: ~DOUT # Выход
      nc: NC # Не подсоединенный вывод
      inverted: ~DOUT # Инвертированный сигнал

  • Описание УГО (schematic) — указываем скрипт, ответственный за отрисовку элемента плюс некоторые настройки того, как символ должен выглядеть.

    schematic:
      symbol: IC # Отрисовывать будет скрипт 'ic.coffee'
      left: DIN, NC # Выводы с левой стороны
      right: ~DOUT, NC # Выводы с правой стороны ('NC' будут сбалансированно распределены на обе стороны)
      top: Vcc # Выводы сверху
      bottom: GND # Выводы снизу

  • Описание корпуса (housing) — приводим размеры корпуса или ссылку на файл со стандартными размерами, а также указываем скрипт, который будет отрисовывать посадочное место.

    housing:
      pattern: SOIC # Отрисовывать будет 'soic.coffee'
      outline: JEDEC MS-012 AA # Размеры брать из файла 'jedec/ms-012.yaml', группа 'AA'

    Но можно задать размеры прямо из datasheet:

    housing:
      pattern: SOIC # Отрисовывать будет 'soic.coffee'
      pitch: 1.27 # Шаг вывода
      bodyWidth: 3.80-4.00 # Ширина корпуса
      bodyLength: 4.80-5.00 # Длина корпуса
      height: 1.75 # Габаритная высота
      leadSpan: 5.80-6.20 # Габаритная ширина (от края до края вывода)
      leadLength: 0.40-1.27 # Длина вывода
      leadWidth: 0.31-0.51 # Ширина вывода
      leadCount: 8 # Количество выводов

Ну а что же с ГОСТ? Все просто, немного дополняем код script.coffee:

Qeda = require 'qeda'

lib = new Qeda.Library
  symbol:
    style: 'GOST'

lib.add 'Altera/5M1270ZT144' # Add Altera MAX V CPLD
lib.add 'Analog/AD9393' # Add Analog Devices HDMI interface
lib.add 'ST/L3GD20H' # Add STMicroelectronics gyroscope
lib.add 'TI/ISO721' # Add Texas Instruments digital isolator
lib.add 'TI/ISO722' # Add Texas Instruments digital isolator
lib.generate 'mylib'

Запускаем. Для сравнения приведем результат «до и после» для части Altera 5M1270ZT144 (заметьте, что позиционное обозначение так же изменилось в соответствии с ГОСТ):

До:


После:


Ну и на десерт пара реальных, а не гипотетических примеров результата работы:

Analog Devices AD9393
ad9393.yaml:
name: AD9393
description: Low power HDMI display interface

pinout:
  PD: B9
  VIDEO:
    Rx0+: K5
    Rx0-: K4
    Rx1+: K8
    Rx1-: K7
    Rx2+: J10
    Rx2-: K10
    RxC+: K2
    RxC-: K1
  OUTPUTS:
    D23-0: B6, A6, B5, A5, B4, A4, B3, A3-A1, B1-H2
    DCLK: A7
    HSOUT: A8
    VSOUT: B8
    O/E: A9
  FILT: D10
  Vd: E7, F7
  Vdd: D4, D5
  PVdd: F9, G9
  DVdd: G6, G7
  GND: C9, C10, D6, D7, D9, E4, E9, E10, F4, H10, J1, K3, K6, K9
  CONTROL:
    SCL: B10
    SDA: A10
  HDCP:
    DDC_SCL: H9
    DDC_SDA: J9
    MCL: G10
    MDA: F10
  AUDIO:
    S/PDIF: J7
    I2S0-3, MCLK: J6-J2
    SCLK: G4
    LRCLK: G5
  DE: B7
  RTERM: J8

properties:
  in: PD, Rx0+, Rx0-, Rx1+, Rx1-, Rx2+, Rx2-, Rx3+, Rx3-, RxC, RxC, SCL, DDC_SCL, MCL, DE
  out: D23-0, DCLK, HSOUT, VSOUT, O/E, S/PDIF, I2S0-3, MCLK, SCLK, LRCLK
  bidir: SDA, DDC_SDA, MDA
  power: Vd, Vdd, PVdd, DVdd
  ground: GND
  analog: FILT, RTERM

schematic:
  symbol: IC
  left: PD, VIDEO, FILT, CONTROL, HDCP, AUDIO, DE
  right: OUTPUTS, RTERM
  top: Vd, Vdd, PVdd, DVdd
  bottom: GND

housing:
  pattern: BGA

  pitch: 0.5
  rowCount: 10
  columnCount: 10
  leadCount: 76
  lead: 0.25-0.35

  bodyWidth: 5.90-6.10
  bodyLength: 5.90-6.10
  height: 1.40

keywords: IC, digital, receiver, converter

УГО:



Посадочное место:



STMicroelectronics L3GD20H
l3gd20h.yaml:

name: L3GD20H
description: Three-axis digital output gyroscope

pinout:
  Vdd_IO: 1
  I2C:
    SCL: 2
    SDA: 3
    SA0: 4
  SPI:
    SPC: 2
    SDI: 3
    SDO: 4
  3WIRE:
    SDO: 3
  CS: 5
  DRDY: 6
  INT:
    INT1: 7
    INT2: 6
  DEN: 8
  RES: 9-11, 15
  GND: 12, 13
  Cap: 14
  Vdd: 16

properties:
  power: Vdd_IO, Vdd
  ground: GND, RES
  in: CS, DEN
  out: INT1-2, SCL, SDO
  bidir: SDA
  analog: Cap

schematic:
  symbol: IC
  left: CS, I2C, DEN
  right: INT, RES, Cap
  top: Vdd_IO, Vdd
  bottom: GND

housing:
  pattern: QFN

  pitch: 0.5
  bodyLength: 2.85-3.15
  bodyWidth: 2.85-3.15
  height: 1
  pullBack: 0.1
  rowCount: 5
  columnCount: 3
  leadLength: 0.29-0.41
  leadWidth: 0.19-0.31

УГО:



Посадочное место:



Заключение


Я коснулся лишь малой части API, чтобы статья не получилась чересчур длинной, и не отразил всего многообразия настроек и параметров, которыми можно варьировать.

Что еще предстоит сделать? По сути проект находится сейчас на стадии proof of concept. Сделать надо ещё вагон и маленькую тележку. Что планируется:

  • Расширить количество поддерживаемых типов элементов
  • Углубить диагностику ошибочных ситуаций
  • Пройти весь путь до изготовления платы
  • Генерировать 3D-модели
  • Поддержать форматы и других EDA-программ
  • Наконец-таки все это хорошенько задокументировать

Исходный код


Github: https://github.com/qeda
Пользовались бы ли вы подобной библиотекой?

Проголосовало 54 человека. Воздержалось 43 человека.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Комментарии (6)


  1. a97
    18.11.2015 11:01

    Где фичи? То что вы показали давно есть — kicad.rohrbacher.net/quicklib.php


    1. shamilsan
      18.11.2015 11:52

      По приведенной ссылке все-таки wizard, а не генератор. Wizard'ов существует достаточное количество, но лично для меня они неудобны по нескольким причинам:

      • Генерируют один раз (если со временем мне наскучит текущий размер шрифта или толщина линии, то придется заново переделывать всю библиотеку)
      • Как правило для одной EDA (у меня пока тоже, но планируется расширить)
      • Попробуйте в wizard'е сделать что-то типа TI 66AK2H12 с его 1500 выводами. По опыту на подобный элемент уходит минимум день. Я же пытаюсь создать механизм для эффективного описания и больших элементов, правда насколько удачно, еще предстоит проверить.
      • Ну и не такая гибкость в стилизации (то есть того, как будут выглядеть symbol и pattern)

      Для pattern'ов есть очень крутая программа под названием PCB Library Expert (собственно по ее мотивам многое делается в моей библиотеке в области генерации посадочных мест), но она покрывает только pattern'ы. Ну и немного платная, хотя цены посильные.


  1. MrYuran
    18.11.2015 18:31

    DD?A это не ГОСТ, а смесь французского с нижегородским.
    Нужно DD?.1
    Вообще, ничего не понял, но интересно :) совершенно случайно, мы тоже используем кикад. И библиотеки — больное место. Десятки библиотек с десятками элементов.

    … Глянул ещё раз.
    Да, киллер-фичей была бы возможность кросс-трансляции компонентов из одной системы в другую.
    Через общее промежуточное описание.


    1. shamilsan
      18.11.2015 19:58

      Да, насчет DD?A не поспоришь. Но это особенность KiCad, которую решить можно только, влезая в исходный код (вроде бы был в одно время отечественный форк, ориентиованный на ГОСТ, давно не следил, сейчас я от этого далёк).

      Когда-то давно пользовались PCAD 200x, так вот он вместо DD?.1 писал DD?:1. И вот из-за этого двоеточия (ну и из-за прочих мелочей) наш workflow был таким: Проектирование в PCAD -> Экспорт в DXF -> Доводка в AutoCAD. Иначе нормоконтроль не пропускал. Поэтому когда я говорю о ГОСТ, я имею в виду максимальное к нему приближение, чтобы меньше потом править.


      1. MrYuran
        19.11.2015 20:43

        Проектирование в PCAD -> Экспорт в DXF -> Доводка в AutoCAD

        Упал пацтол :)
        Ну вы блин даете… А просто RefDes финально на текст заменить по месту?


        1. shamilsan
          20.11.2015 11:04

          Там просто еще были кое-какие нюансы, в общем так оказалось проще. Даже был составлен специальный чек-лист по процессу подготовки документации, и специально обученные люди отлично справлялись с этой работой.