Сложно найти радиолюбителя, который не занимался бы монтажом печатных плат. Ещё сложнее — того, кто задумывается об удобном хранении деталей прежде, чем поиск чего-то нужного среди запасов превращается в сущий кошмар. Инструменты для ведения проектов, написания кода и контроля версий в последние десятилетия развиваются очень быстро. ПО, упрощающее монтаж, тоже обновляется, хотя и не так стремительно. А вот системы хранения электронных компонентов практически не изменились с 90-х: помните кассетницы из спичечных коробков?
Мне часто случается вооружаться паяльником — например, дорабатывать или монтировать отдельные радиоэлектронные блоки — с проблемой бессистемного хранения столкнулся и я. Под катом вас ждёт рассказ о том, как я пытаюсь решить её с помощью «умного» органайзера, который понимает речь и запоминает своё содержимое.
Чем мне не угодили существующие решения
Чем сложнее радиоэлектронные блоки, тем больше компонентов требуется для их сборки. Уменьшить хаос в размещении деталей на рабочем месте помогает использование органайзеров с подписанными ячейками. Однако поиск необходимого компонента по наименованию или параметрам среди сотен похожих требует времени, а десятки секунд или минут, посвящённые этому неблагодарному занятию, складываются в часы впустую потраченного времени. Не меньше усилий придётся потратить на составление и актуализацию базы данных: какие компоненты были использованы, сколько осталось, что закончилось. Скрупулёзно вести такой учёт, чтобы описание запасов соответствовало их реальному состоянию, довольно тяжело и безрадостно.
Поиск по «складским остаткам» — зло неизбежное, но не единственное. Тем, кто проводил за монтажным столом несколько часов подряд, наверняка знакомо желание обзавестись дополнительной парой рук. Одновременно оперировать всеми необходимыми инструментами, такими как паяльник или термофен, пинцеты разного калибра, увеличительное стекло или USB-микроскоп для оптической инспекции — невозможно. А ещё надо как-то переворачивать страницы конструкторской документации (сборочного чертежа и перечня устанавливаемых на печатную плату компонентов), либо переключать режимы работы программного обеспечения, помогающего в пайке.
Использование педалей для поиска компонентов — идея безусловно новаторская, но на практике сложно реализуемая. Нейроинтерфейсы для «чтения мыслей» — штука диковинная, капризная и медленная. Остаются голосовые команды: освобождают руки, уменьшают шансы опечататься, редактировать перечень оставшихся деталей можно не отрываясь от пайки. Да и испустив крик отчаянья при поиске очередной детали, приятно услышать в ответ не звенящую тишину, а где найти искомое. А если добавить подсветку…
Удивительно, но проекты «умных» органайзеров с голосовым интерфейсом можно пересчитать по пальцам. Между «продвинутыми» кассетницами из спичечных коробков, которые известны радиолюбителям прошлого века, и современными системами оперативного хранения — пропасть. Профессиональное оборудование умеет многое, но вряд ли подойдёт радиолюбителю: настолько же дорогое, насколько технологичное.
Доступные решения существуют, но не лишены недостатков. Делюсь наиболее интересными:
- Chipseasy — проект с Kickstarter. Хранилище состоит из нескольких поддонов, каждый из которых разделён на прямоугольные ячейки. «Умное» хранение компонентов реализовано за счёт матричной адресации ячеек.
Плюсы
Можно вести учёт компонентов путем создания и редактирования списков доступных позиций, а также оперативно оценивать количество оставшихся деталей. Предусмотрено голосовое управление, есть подсветка. Хранилище компактно — оно не займёт много места на рабочем столе и при необходимости его можно легко переместить.Минусы
Проект не собрал необходимой для производства суммы, последние пару лет не обновляется. - FindyBot3000 — хранилище от энтузиастов-радиолюбителей. Упрощает поиск деталей в объёмных запасах. Использует сервис Google Assistant и вычислитель Particle Photon для взаимодействия с облаком.
Плюсы
Помогает вести учёт компонентов. Управляется голосом. Искомые детали подсвечиваются светодиодными лентами на WS2812B.Минусы
Хранилище громоздкое: для долговременного хранения это не проблема, но для сортировки компонентов, нужных в работе, может быть неудобным. Система не модульная масштабировать её под свои нужды будет сложно. - Component database with LED indicators взаимодействует с базой данных, расположенной в облаке, с помощью SQL-запросов через Raspberry Pi и приёмопередатчика на базе ESP8266. Взаимодействие с внешними устройствами осуществляется при помощи библиотеки aREST и MySQL-запросов.
Плюсы
Удобная система учёта компонентов: картотека с возможностью добавлять фотографии. Умеет подсвечивать несколько ячеек одновременно теми же светодиодными лентами на WS2812B.Минусы
В текущей версии управление голосом не реализовано. Также больше подходит для долговременного хранения и плохо масштабируется.
Думаю, вы обратили внимание: ни одно из этих решений не защищено от неправильной установки лотков в органайзеры, а сами ячейки понятия не имеют о своём содержимом. А зря.
Что хотелось улучшить
Отказываться от проверенной временем механический конструкции я не стал. Модульные органайзеры в виде каркаса с извлекаемыми лотками-ячейками — недорогие и практичные. Управляемая подсветка, индицирующая результаты поиска — удобная. Если добавить в каждый лоток ассоциативную память, которая будет хранить описание содержимого, текущее количество компонентов и прочую необходимую для работы информацию — осуществление учёта станет намного проще. Для создания базы данных всех компонентов с нуля (например, на устройстве, где никакой информации о компонентах вашего хранилища нет), достаточно опросить все доступные лотки. Чтобы обновить базу — действовать аналогично.
Доступные на рынке кассетницы для радиоэлектронных компонентов
В рамках первых тестов я всё-таки решил применить прогрессивный подход NoSQL. В моей реализации его следует понимать буквально: не «Not only SQL», а «совсем никакого SQL». Информация обо всех радиоэлектронных компонентах, счастливым владельцем которых я являюсь, хранилась в виде старых добрых электронных таблиц — это исторически сложившийся подход. Но кроме базы данных во время монтажа радиоэлектронного блока нужен BOM (перечень используемых в проекте элементов). Почти все современные САПР для разработки печатных плат «из коробки» позволяют сформировать перечень в удобном формате .csv.
В качестве уникального ключа в системах хранения радиодеталей обычно используется его номенклатурный номер (PartNo). Чаще всего это набор букв и цифр, который сложно запомнить и воспроизвести, поэтому в базе данных лучше дополнительно хранить развернутое описание. Удобный вариант — текст с основными параметрами компонента: например, типоразмер, сопротивление и точность, если это резистор.
Лотки с памятью должны быть взаимозаменяемы, т.е. их перестановка внутри органайзера не нарушит целостность базы данных. Переселение лотка между органайзерами (например, из «склада долговременного хранения» в «оперативное хранилище» компонентов для работы здесь и сейчас) тоже не должно ничего ломать. Для этого управляющей системе необходимо отслеживать извлечение или установку лотков: проверять фактическое наличие лотков в органайзере.
Чтобы реализовать голосовой интерфейс, я принял решение использовать команды с жёстко заданным форматом. Минимальная функциональность управления может быть организована при помощи следующего набора:
- Найти — отыскать компонент по его описанию. Например, Найти конденсатор 0603 на 10 микрофарад напряжение 50 В диэлектрик X7R.
- Ячейка — подсветить лоток по его индексу. Например, Ячейка X1A1, где X
— кодовое значение органайзера, — индекс ячейки по пересечению её в колонке и столбце.
- Где — подсветить лоток по его позиционному обозначению на печатной плате. Например, Где C1.
- Содержимое — перечислить звуком содержимое лотка по его индексу. Например, Содержимое X1A1.
- Поместить/Взять/Добавить/Очистить — отредактировать информацию о количестве компонентов в лотке по его индексу: задать, уменьшить, увеличить или очистить. Например, Очистить X1A1.
- Свободное место — индикация лотков, которые в настоящее время не заняты радиоэлектронными компонентами.
К сожалению, приведенная выше система команд не лишена минусов. Например, команду вида Где R1 (по которой компонент ищется в органайзере) быстрее произнести, чем набрать текстом, а вот выговорить Добавить в ячейку X1A2 10 штук RC0603FR-7W100RL — резистор на 100 Ом типоразмер 0603 точность 1 процент, мощность 0,2 Вт получится существенно медленнее, чем скопировать описание элемента из электронного каталога, отыскав его по номенклатурному номеру или считав штрих/QR-код с упаковки.
Кроме того, использование набора команд с жестким форматом — вариант далеко не лучший на практике. Редко используемые команды легко забыть, а перебор синонимов будет отнимать время и огорчать репликами голосового ассистента, извещающего вас о том, что команда не распознана.
Как это реализовано
Аппаратные блоки, использующиеся в реализации органайзера:
1 — ячейка памяти (memcell),
2 — кросс-плата (backplane) для коммутации электрических сигналов,
3 — контроллер органайзера (orgController), реализующий определение наличия ячеек, управление индикацией, взаимодействие с памятью и вышестоящими сервисами
1) Механика и электроника
Аппаратно хранилище состоит из следующих модулей:
1. «Ячейка памяти» — оконечное устройство с I2C памятью M24512-RMN6TP и светодиодными индикаторами. Главный «кубик», на основе которого строится органайзер. Электрическое сопряжение производится при помощи пары разъёмов PLD/PBD с шагом 2,54 мм.
Два светодиода (зеленый и красный) обеспечивают бинарную индикацию запросов в рамках используемой системы команд. Например, при поиске по содержимому те лотки, в которых находится искомый элемент, подсветятся зелёным, а где его нет — красным. Даже если один из светодиодов перегорит, вы сможете однозначно выбрать нужную ячейку.
Печатная плата ячейки памяти фиксируется в лотке термоклеем. Для корректного механического сопряжения с кассетницей разъём должен выходить за пределы лотка: пришлось выфрезерововать окно соответствующего размера.
Внешний вид аппаратных блоков органайзера
2. «Кросс-плата» — элемент, который электрически коммутирует линии питания, управления светодиодной индикацией, линию определения наличия лотка и I2C-интерфейс с контроллером органайзера. С помощью кросс-плат также реализуется адресация микросхем памяти. На тыльной стороне кассетницы кросс-платы зафиксированы винтовым соединением.
Адресация кросс-платы — единственная жёсткая точка привязки устройства к положению. В настоящее время хранилище предполагает матричную адресацию каждого лотка, т. е. «адрес» лотка задаётся пересечением колонки (кодируемой буквой латинского алфавита, т. е. A, B, C, D, …) и строки (кодируемой цифрой 1, 2, 3, 4, …). Цифро-буквенное значение однозначно определяет положение ячейки памяти и лотка в массиве. Но поскольку память у каждого лотка своя, в виде ответа на запрос хранилище подсветит именно тот, который вы искали, даже если ранее вы поменяли его местами с соседним.
Схема адресации ячеек памяти в кросс-плате
3. «Контроллер органайзера». Отслеживает извлечение или добавление лотков в кассетницу, реализует управление индикацией, а также обеспечивает информационный обмен с облачными средствами через Wi-Fi-модуль WROOM по протоколу MQTT. Кросс-платы сопряжены с контроллером проводами МГТФ, обжатыми под штыревые разъемы.
Готовый «умный» органайзер
К сожалению, качество изготовления бюджетных кассетниц для радиолюбительских мелочей далеко от прецизионного, и это не позволило добиться полной взаимозаменяемости лотков. Однако некоторые из них всё-таки можно перемещать без дополнительных усилий. Возможно, технически было бы дешевле заказать уже спаянную версию, но вопрос оптимизации по цене не стоял, да и сам процесс мне нравится.
Готовое устройство питается от лабораторного источника при напряжении 12 В. Среднее потребление по току всей установки при включенной индикации не превышало 0,4 А.
2) Информационный обмен
После подготовки аппаратного обеспечения, возникает следующая цепочка задач: передать голосовой запрос с пользовательского устройства (смартфон, планшет или органайзер), распознать его (STT — Speach-to-text), проверить на соответствие необходимому шаблону, распарсить поля запроса, передать управляющие команды на оконечные устройства (действия с ячейками памяти), оповестить о результате запроса светодиодами и голосовым сообщением.
Проброс голосовой команды до оконечных устройств я реализовал с помощью сервисов Yandex.Cloud. Можно было использовать любой другой SDK для распознавания речи, но Yandex.Cloud уже содержит все необходимые компоненты, поэтому создавать велосипед я не стал.
Схема информационного обмена выглядит так:
Схема информационного обмена, применяемая в работе с органайзером
- Фронтенд голосового интерфейса разработан на базе навыков голосового помощника Яндекса — Алисы. Можно было бы использовать альтернативные решения или stand-alone библиотеки для распознавания голоса, но связь «навыков» с бэкендом в виде Cloud Functions осуществлялась на удивление просто — путём выбора соответствующей навыку функции. Используя serverless подход, вместо более привычных для web, я сэкономил немало времени на настройке и администрировании.
- Data Gatherer — скрипт на Python, который контролирует информационный обмен между голосовым интерфейсом и оконечными устройствами: знает состав всей базы данных компонентов и карту сети, владеет всем необходимым (адреса, пароли/корневые сертификаты) для передачи и приёма данных органайзеров по протоколу MQTT.
Data Gatherer фильтрует STT-сообщения, проверяет, соответствуют ли голосовые команды формату, рефакторит запросы и ищет необходимые компоненты в локальной базе данных, формирует управляющие команды для индикации или модификации.
Пока рефакторинг самый простой: удаление лишних пробелов и знаков препинания. В планах использовать что-то более интеллектуальное, чтобы исправлять частые ошибки распознавания: например, заменять компенсатор на конденсатор, с помощью встраиваемого словаря сложных слов.
В настоящее время DG выполняется с ноутбука, но можно запускать его из облака или на любом выделенном сервисе.
- Органайзеры — электронные устройства, имеющие доступ к MQTT-брокеру — отображают результат запроса при помощи светодиодной индикации. Также они хранят информацию о своем содержимом: текстовые описания компонентов и данные об их количестве.
В качестве основного протокола информационного обмена я выбрал MQTT, который часто используется для управления «умными» устройствами. Он не заточен для управления базами данных, но настолько простой, гибкий и удобный, что доработка его под нужный функционал не представляет особых сложностей. Протокол реализует концепцию «публикация/подписка» (pub/sub), поддерживает передачу сообщений в текстовом и бинарном виде, а также имеет удобную и расширяемую систему адресации при помощи механизма топиков.
Функционал MQTT-брокера реализован с помощью Yandex IoT Core. Для корректной работы информацию (ключи шифрования или пароли для аутентификации) о каждом устройстве необходимо добавить через web-консоль или CLI-утилиту.
Стоит отметить использование концепций «реестра» и «устройства» в реализации MQTT в IoT Сore, для организации сети (с одним реестром могут быть связаны несколько устройств) передачи одиночных и широковещательных сообщений при использовании топиков вида ‘$devices/
Для установки/получения параметров или идентификации событий, которые связаны с составными частями устройства (в нашем случае — лотками), удобно использовать сабтопики (в виде расширения исходного топика путем добавления дополнительной информации от него через слэш справа). Например, содержимое конкретного лотка может быть прописано при использовании сабтопика вида ‘$devices/
В целях безопасности авторизация устройств должна выполняться при помощи использования сертификатов x509 или пароля. Есть возможность создать бинд для имени устройства, чтобы сменить имя вида «are9f7p0igla52rp88k7» на что-то более читабельное.
Для взаимодействия с брокером MQTT с помощью скриптов Python использовалась библиотека PAHO MQTT. Она позволяет авторизироваться, если для подключения к брокеру задан пароль. Wi-Fi-адаптер на базе ESP8266 реализует MQTT-клиент при помощи библиотеки MQTT client от Adafruit.
При реализации голосового интерфейса через навыки Алисы стоит учитывать следующие нюансы:
- голосовые сообщения воспроизводятся только в ответ на запрос (т. е. невозможно реализовать голосовое оповещение в произвольный момент времени),
- скрипт управления должен вернуть сообщение для озвучивания до таймаута, то есть за 3-5 секунд, иначе соединение с Алисой будет потеряно.
Помимо функций передачи сообщений и взаимодействия с импровизированной базой данных компонентов, скрипт управления обеспечивает парсинг и простейшую фильтрацию STT-запроса, а также проверку соответствия формата запроса требуемому синтаксису. В частности, STT-запрос разбивается по кодовым словам (таким как „на“, „напряжение“, „диэлектрик“). В полях, отвечающих за наименования компонента, русскоязычные сочетания, обозначающие буквы, заменяются на англоязычные (например, джей = J, кей = K, кью = Q).
Ещё одна неочевидная проблема, которую решает скрипт — восприятие цифровых обозначений и перевод их в числа. Система распознавания не понимает контекст произнесенного, и число 125 (сто двадцать пять) иногда может распознаваться как 100, 20, 5 — в виде отдельных чисел вместо одного многоразрядного. Дробные числа (например, 55,89 в форме пятьдесят пять и восемьдесят девять распознаются отдельными числами.
В случае несоответствия голосовой команды заданному формату голосовой ассистент даст отклик Неверный формат запроса.
Ожидание vs реальность
Мне удалось реализовать голосовой интерфейс, чтобы искать нужные компоненты без помощи рук. Использовать его можно на любом устройстве с Алисой (смартфон, планшет, ноутбук, стационарный компьютер, умная колонка).
Реализация поиска компонентов по описанию на практике не впечатлила. Время, которое тратится на произнесение голосовой команды Найти конденсатор 0603 на 4.7 микрофарад напряжение 50В диэлектрик X7R соизмеримо с набором той же фразы текстом.
А вот скорости работы системы с оповещением в режиме Где X хватает для удобной работы — задержки системы не раздражают. Искать компоненты, когда ячейки, в которых они располагаются, подсвечиваются — быстрее, чем текстом.
Кстати, недавно для Я.Железа я показал функциональность органайзера в прямом эфире.
Чтобы приблизить DIY-поделку к устройству, полезному в быту, планирую некоторые доработки:
- Установить в каждое оконечное устройство бюджетный микроконтроллер (предположительно семейств STM32L0 или STM32G0), который позволит отказаться от проброса линий индикации и идентификации наличия лотка, а ресурса его Flash при циклической перезаписи хватит надолго, что избавит от необходимости использования внешней микросхемы памяти.
- Заменить два отдельных дискретных светодиода одним многоцветным, что при использовании микроконтроллера в каждой ячейке памяти позволит сделать индикацию более гибкой. Можно будет настраивать яркость и цвета свечения светодиодов для реакции на события.
- Существенно упростить кабельную сеть внутри устройства (сейчас каждая ячейка памяти требует 3 выделенных линии для светодиодных индикаторов и детекции ее наличия, а также 2 линии питания и 2 линии под интерфейс I2C).
- Упростить систему адресации устройств, например, используя сдвиговые регистры и счет импульсов вместо выделенных адресных линий (которые позволяют адресовать не более 2^N устройств при использовании N линий).
- Заменить промежуточный Wi-Fi-модуль на дискретный, установленный на печатную плату контроллера органайзера. По возможности отказаться от интерфейса UART для передачи данных в пользу чего-то более могучего (например, SDIO), что позволит прокачать большие объемы данных и сокращать задержки.
- Оптимизировать систему голосовых команд для работы с органайзером. Возможно, разграничить использование команд для различных режимов: «логистика» — перемещение ячеек, изменение количества элементов в них, добавление новых компонентов в базу; «пайка» — поиск компонентов по позиционному обозначению; «поиск» — нахождение компонентов с необходимыми параметрами).
- Перенести управляющий скрипт Python в Cloud Functions, вести базу данных по компонентам средствами сервисов Yandex.Cloud. Это может упростить инфраструктуру.
- Использовать библиотеки NLP (Natural Language Processing) для обработки STT-запросов и упрощения обработки некорректных голосовых команд, т. к. при быстром или нечетком произношении запроса голосовой ассистент может некорректно распознать команду или параметр (например, «конденсатор — компенсатор», «резистор — регистр»).
Блок-схема органайзера версии 2.0, компенсирующего основные аппаратные недоработки
Эксперимент с использованием голосового ассистента для поиска радиоэлектронных компонентов буду считать удачным. С базовым функционалом (поиском компонентов по позиционным обозначениям или кодовым словам в описании) система выполняет, индикация работает, наличие ячеек в кассетнице проверяет.
Чтобы сделать органайзер ещё удобнее, предстоит существенно доработать все его подсистемы: усовершенствовать систему голосовых команд, голосовой интерфейс поиска дополнить графическим, улучшить аппаратное обеспечение и упорно тестировать получившуюся систему на практических задачах.
Спасибо, что дочитали до конца. С удовольствием отвечу на все вопросы в комментариях. Или в чате нашего сообщества в телеграме, где мы обсуждаем подобные проекты.