Серия «Расстановщик SMD компонентов»

ReferenceLoosePartFeeder или компьютерное зрение для утилизации рассыпухи

Приветствую всех. Продолжаю знакомить вас с возможностями OpenPNP.
Сегодня поговорим об автоматическом распознавании элементов в ячейке.
До того как обзавестись станком и начать собирать устройства в более-менее большом объеме, я затаривался резисторами и конденсаторами в маленьких партиях и ссыпал их в ручной "расстановщик".

ReferenceLoosePartFeeder или компьютерное зрение для утилизации рассыпухи Электроника, 3D принтер, Автоматизация, 3D печать, Своими руками, Видео, Длиннопост

Но хранить элементы в катушках гораздо удобнее если ты планируешь их потом использовать в расстановщике. Да и когда покупаешь не 100-200, а 2000-4000 компонентов одного номинала высыпать их куда-то - очень глупо.
Но все же некоторые номиналы я успел раскидать по "ящичкам" и их надо бы как-то утилизировать. Загружать в пустые ленты - вариант, но очень муторно. Особенно, если в каждой плате их больше 10 штук используется.
На помощь приходит "Фидер для рассыпухи". Сегодня расскажу как я его настраивал для распознавания SMD резисторов и конденсаторов с "отфильтровкой" резисторов, лежащих "пузом" вверх.

Первым делом печатаем подложку. Я использовал квадратные коробочки, сделанные на 3Д принтере. "Зеленка" - тоже отпечатанная на принтере пластинка с включенным "разглаживанием" верхнего слоя и в последствии обработанная наждачкой для придания матовости. Это важно. Можно использовать любую яркую цветную бумагу. Но зеленка - классический хромакей и на нее рассчитаны стандартные пайплайны (о них позже) компьютерного зрения в OpenPNP.

ReferenceLoosePartFeeder или компьютерное зрение для утилизации рассыпухи Электроника, 3D принтер, Автоматизация, 3D печать, Своими руками, Видео, Длиннопост

Любое распознавание в OpenPNP, будь то элементы, как в нашем случае, ленты с компонентами, реперные точки для центровки платы и т.д. настраиваются в так называемых Пайплайнах (Pipeline), в которых путем комбинации стандартных шагов и настройки их параметров можно добиться нужного Вам результата. Жмем Edit Pipeline и переходим к редактированию. (Далее я буду пояснять картинки, чтобы меньше писать и больше показывать).

Первым делом идет захват изображения и применение гауссового размытия (BlurGaussian) для фильтрации невидимых нашему глазу артефактов (как видим, у нас 2 резистора вверх тормашками лежат):

ReferenceLoosePartFeeder или компьютерное зрение для утилизации рассыпухи Электроника, 3D принтер, Автоматизация, 3D печать, Своими руками, Видео, Длиннопост

Далее делаем картинку серой (ConvertColor), а после черно-белой (Threshold), задавая порог яркости (шаги gray и highlights). Получаем белые контакты (отражают свет) и "пузики" резисторов.
После мы "ищем все контуры" (FindContours). Каждый замкнутый контур на картинке помечается "к работе"
Но нам сейчас нужно найти резисторы лежащие ненправильно, поэтому фильтруем контуры(FilterContours) по размеру, задав минимальный размер больше, чем контактные площадки, но ограничивая максимальный, чтобы при необходимости отфильтровать засветку.

ReferenceLoosePartFeeder или компьютерное зрение для утилизации рассыпухи Электроника, 3D принтер, Автоматизация, 3D печать, Своими руками, Видео, Длиннопост

Далее для поста я включил пункт отрисовки контуров (DrawContours), чтобы видно было какие остались "в работе".

ReferenceLoosePartFeeder или компьютерное зрение для утилизации рассыпухи Электроника, 3D принтер, Автоматизация, 3D печать, Своими руками, Видео, Длиннопост

Отлично. Мы получили контуры резисторов, которые нам не нужны. Теперь переходим к тем, которые было бы неплохо использовать. Вызываем ImageRecall. Конвертируем цвета из RGB в HSVFull (это важно) и вырезаем на зеленке все резисторы (MaskHSV).

ReferenceLoosePartFeeder или компьютерное зрение для утилизации рассыпухи Электроника, 3D принтер, Автоматизация, 3D печать, Своими руками, Видео, Длиннопост

Тут видно Все наши резисторы. Теперь небольшая магия, Вызываем MaskModels и в качестве параметра modelStageName указываем имя(!) шага, где мы отфильтровали неправильные резисторы (counturingResistors). Вуаля:

ReferenceLoosePartFeeder или компьютерное зрение для утилизации рассыпухи Электроника, 3D принтер, Автоматизация, 3D печать, Своими руками, Видео, Длиннопост

Шик? Уже видно, что резисторы, лежащие неправильно сильно отличаются. Теперь нужно обрезать картинку (MaskRectangle) просто чтобы лишнее убрать. И после применения еще одного размытия (BlurMedian посильней, чем в самом начале Гаусс). И все. Наши контурочки ненужных резисторов почти пропали.

ReferenceLoosePartFeeder или компьютерное зрение для утилизации рассыпухи Электроника, 3D принтер, Автоматизация, 3D печать, Своими руками, Видео, Длиннопост

Осталось сделать определение контуров (FindContours + FilterContours), применить несколько шагов из стандартного Pipeline:
Поиск Прямоугольников + их ориентация. Ну и отрисовать все это дело:

ReferenceLoosePartFeeder или компьютерное зрение для утилизации рассыпухи Электроника, 3D принтер, Автоматизация, 3D печать, Своими руками, Видео, Длиннопост
ReferenceLoosePartFeeder или компьютерное зрение для утилизации рассыпухи Электроника, 3D принтер, Автоматизация, 3D печать, Своими руками, Видео, Длиннопост

Собственно, на этом все. Надеюсь было интересно. ;)

P.S. спасибо @Pas.Ratunkow, за мотивацию :)

Показать полностью 10

Автоматические питатели

Ну что же, я вернулся и добрался до офиса. Пришло время выполнять обещанное. Сегодня я расскажу про свою версию автоматических питателей для подачи компонентов (Без настройки софта). Но сначала, ответим на вопрос: "А нафига оно?"

Самыми простыми питателями в OpenPNP являются ленточные (они же линейные) питатели. Это просто распечатанные или фрезерованные пазы, в которые заряжаются кусочки ленты с компонентами. Далее настраиваются координаты первого и последнего элемента и шаг с которым они расположены (на самом деле чуть не так, но для понимания пойдет, про них, надеюсь, выйдет отдельный пост). Станок по очереди берет компоненты с ленты по очереди до тех пор, пока они берутся или пока он не упрется в заданный лимит. Есть возможность использования компьютерного зрения для улучшения позиционирования сопла. Но об этом в другой раз. Выглядят они примерно вот так:

Автоматические питатели Электроника, Автоматизация, Своими руками, 3D моделирование, 3D печать, Видео, Вертикальное видео, Длиннопост

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

Сегодня же речь пойдет о питателях автоматических. Это такие, когда у вас в него заряжена лента с компонентами и сопло всегда берет элемент в одной, заранее известной точке. Очевидные плюсы по сравнению с линейными:
1. Не нужно постоянно заряжать, катушки на 3-4 тысячи компонентов хватит надолго (мы же о начальном уровне автоматизации говорим, а не о массовом производстве).
2. Сопло всегда знает где компонент. Всегда берет его в одной точке, не нужно перенастраивать или как-то выставлять ленту (у линейных может быть смещение при перезарядке). Экономия времени.
3. Компоненты в катушке всегда под покровной лентой и снимается она только для одного "очередного" радиоэлемента. Что уменьшает шанс усеять пол нужными мелкими деталями.
Минусы же:
1. Более сложная и дорогая конструкция.
2. Настройка сложнее (хотя и не критично).
3. Не все конструкции достаточно надежны. Могут быть сбои.

Конструкций автоматических питателей просто дохренища, я их пересмотрел очень много, и остановился на конструкции от alexavr2. Он мне показался самым доступным и простым в исполнении, а главное - самым узким (ширина ленты + 2.5мм). Версия к которой я пришел, сейчас выглядит так:

Автоматические питатели Электроника, Автоматизация, Своими руками, 3D моделирование, 3D печать, Видео, Вертикальное видео, Длиннопост

Скачать можно тут.

Главная проблема, с которой я столкнулся - конструкция моего станка, а точнее - основание из ЛДСП. Из-за этого было возможно выбрать 2 пути:
1. Сделать паз в ЛДСП для отвода пустой ленты.
2. Выводить ленту буквой S за пределы ЛДСП.
Я выбрал второй, и тут же столкнулся с тем, что натяжения резинки для денег не хватало, чтобы пропихнуть ленту по столь извилистой траектории. Пришлось складывать резинки в 4 раза и увеличивать расстояние между "крючками". Но вроде бы стало работать более-менее стабильно..

Вторая часть фидера - механизм снятия покровной ленты:

Автоматические питатели Электроника, Автоматизация, Своими руками, 3D моделирование, 3D печать, Видео, Вертикальное видео, Длиннопост
Автоматические питатели Электроника, Автоматизация, Своими руками, 3D моделирование, 3D печать, Видео, Вертикальное видео, Длиннопост

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

К чему сводится суть работы фидера:
1. Голова толкателем двигает рычаг фидера, который переставляет подающий "шип" на 4мм назад в очередное отверстие.
2. Резинка возвращает шип обратно, проталкивая ленту вперед и подставляя новый компонент.
3. Снимается покровная лента.
4. Берется компонент в заданной координате.

Автоматические питатели Электроника, Автоматизация, Своими руками, 3D моделирование, 3D печать, Видео, Вертикальное видео, Длиннопост
Автоматические питатели Электроника, Автоматизация, Своими руками, 3D моделирование, 3D печать, Видео, Вертикальное видео, Длиннопост

Общий вид станка:

Автоматические питатели Электроника, Автоматизация, Своими руками, 3D моделирование, 3D печать, Видео, Вертикальное видео, Длиннопост

Он все еще в режиме "Доработок". Спасибо всем, кто дочитал до конца. Задавайте вопросы. Постараюсь ответить.

Немного максимально "шакальных" видосов. Это из архива. Прошу сильно не пинать. Небольшие комментарии для тех, кто решится вдруг повторить.

Показать полностью 7 4

Расстановщик SMD компонентов. Калибр SMD

Ну раз уж я заикнулся пилить пост про мой расстановщик, то поехали.
На работе встал вопрос, что собирать платы в Китае еще не интересно, а самому руками уже муторно. И если 10-20 номиналов я наловчился паять, то сборка 5 плат из 90 номиналов и 200+ компонентов стала просто пыткой. Потому что, во-первых, велик шанс накосячить, запаять не тот номинал или вообще одну площадку не запаять по запаре, во-вторых, есть более интересные вещи, куда пустить мои руки и время.
Думал заказывать кит из китая, в итоге вышел на Эдуарда, канал которого мелькал в одном из недавних постов про инструкцию к openPnP от @RedKa.
Оказалось он их собирает на продажу. Поэтому заказал у него.
приехало это добро россыпью (потому что мне так было удобнее, обычно отправляется станок собранным) и я начал сборку

Расстановщик SMD компонентов. Калибр SMD Электроника, Автоматизация, Своими руками, Видео, Вертикальное видео, Длиннопост

На первоначальную сборку у меня ушло пара недель. Хотя "на коленке" все запустилось и первые миллиметры голова проехала уже на второй день.

Расстановщик SMD компонентов. Калибр SMD Электроника, Автоматизация, Своими руками, Видео, Вертикальное видео, Длиннопост

Станок собран на ЛДСП 800х500 в качестве основания. Направляющие - валы 16мм. Может и не самое идеальное решение, но люфтов нет, прогибаний нет, а это 90% успеха. Такая конструкция не выдержит бешеных ускорений и рывков в работе и это я учитывал при покупке.

Следующие несколько месяцев я занимался калибровкой и "тюнингом".
В целом, работа с openPnP для меня показалась не сильно сложнее работы с 3д-принтером через какой-нибудь октопринт или клиппер с мейнсейлом. Разве что "крутилок" побольше.

Компьютерное зрение - отдельный прикол. Нужно понять как оно устроено, и разобраться с инструментами, потом можно будет легко писать пайплайны хоть с нуля, хоть изменяя дефолтные.

Расстановщик SMD компонентов. Калибр SMD Электроника, Автоматизация, Своими руками, Видео, Вертикальное видео, Длиннопост

Главное - если у вас зеленые сопла - делайте белую подсветку, если черные - красные.
вот так работает красная подсветка на зеленом сопле

Расстановщик SMD компонентов. Калибр SMD Электроника, Автоматизация, Своими руками, Видео, Вертикальное видео, Длиннопост

Видно все и никакого хромокея не получится, как ни старайся. Красный все сделает серым.
А вот так начало работать, когда я сделал подсветку белой:

Расстановщик SMD компонентов. Калибр SMD Электроника, Автоматизация, Своими руками, Видео, Вертикальное видео, Длиннопост
Расстановщик SMD компонентов. Калибр SMD Электроника, Автоматизация, Своими руками, Видео, Вертикальное видео, Длиннопост
Расстановщик SMD компонентов. Калибр SMD Электроника, Автоматизация, Своими руками, Видео, Вертикальное видео, Длиннопост

Вот такой вводный пост получился. Фотки все из архива вынул, какие получилось
Вернусь из отпуска, постараюсь собраться с мыслями и выдать мои страдания по:
- созданию автоматических питаталей
- калибровке (базовой и продвинутой)
- настройке различных видов питателей, с которыми я работал. (Strip, lever, looseParts)

Пишите, что еще было бы интересно еще об этом деле узнать.

Ну и видео для затравки.

Показать полностью 7 1
Отличная работа, все прочитано!