[Из песочницы] Полуавтоматический сверлильный комплекс для печатных плат на arduino и python
В настоящее время в любительской практике освоены самые разнообразные методы изготовления печатных плат, от простейших «утюжных» технологий с использованием распечаток лазерного принтера, до высокоточных, с использованием пленочного фоторезиста. В то же время сверление печатных плат осуществляется вручную или с использованием простейших приспособлений. Вот мы и подумали, а почему бы не попытаться немного автоматизировать этот процес и изготовить станок, который будет сверлить отверстия в печатных платах автоматически. Заинтересовавшихся приглашаем под кат.
Прежде, чем приступить к изготовлению станка, нужно обдумать многие детали. Сложность станка высока, бюджет маленький, исправление каких-то косяков может затянуться надолго. Проще говоря, стоимость исправления ошибки большая.
Чтобы немного упростить устройство мы решили, что обрабатываемая печатная плата будет перемещаться только по условной оси Х (вдоль корпуса станка), по оси Y же будет двигаться само сверло. Сверло и плата будут перемещаться с помощью шаговых электродвигателей, управляемых Arduino. Команды на Arduino будут отправляться по эмулируемому поледовательному интерфейсу из клиентского приложения, где пользователь будет указывать точки для сверления.
Изготовление фрезера подразумевает под собой большой объем работы над механической частью. Именно тут мы столкнулись с большинством проблем и именно на нее потратили большую часть времени. С програмной стороны необходимо было разработать прошивку для устройства, реализующую минимальный набор простых команд для управления станком, и клиентское приложение, позволяющее составить и выполнить программу сверления.
Механика
Для перемещения по осям Х и Y применены пары винт — гайка с резьбой. Применение резьбы с шагом 1 мм удобно тем, что за один оборот винта осуществляется перемещение на 1 мм. Учитывая, что для примененных шаговых электродвигателей требуется 48 импульсов на один оборот вала, то шаг перемещения по Х и по оси Z составил примерно 0,02 мм. Существует много факторов, из-за которых величина шага может отличаться от расчётного. Например, неровности винта, неточности в изготовлении деталей, люфт некоторых элементов и т.д. Поэтому в конструкции станка были приняты некоторые меры, для уменьшения влияния наиболее существенных из них (дополнительные самодельные полимерные гайки; плавающая посадка электродвигателей, позволяющая им при работе перемещаться в определенных пределах). Каретки для платы и узла сверления перемещаются вдоль осей Х и Y, соответственно, по направляющим из DIN-рейки. Вместе соприкосновения каретки для платы и направляющих для уменьшения трения применена фторопластовая лента.
Для оси Z применен имеющийся маломощный электродвигатель со встроенным редуктором. В связи с этим при применении пары винт — гайка получается слишком медленное перемещение. Т.к. высокая точность в данном случае не требуется, то вместо этого используется перемещение каретки, с установленным на ней электродвигателем, по неподвижно закрепленной капроновой нити. Для предотвращения поломок сверла, а также для определения расстояния до платы, например, при замене сверления фрезерованием, механизм сверления соединен с кареткой пружинным механизмом с возможностью регулировки усилия пружины. При соприкосновении сверла с поверхностью платы механизм сверления остановится, а каретка продолжит движение вниз, сжимая пружину. Небольшое сжатие пружины приведет к размыканию микропереключателя упора и посылке соответствующего сигнала в электрическую часть станка.
Перемещения по всем осям ограничены концевыми выключателями, подающими соответствующие электрические сигналы. Т.к. применяемые сверла могут иметь разную длину, предусмотрена регулировка положения верхнего (дискретно) и нижнего (плавно) концевых выключателей. Для остальных концевых выключателей регулировка положения не предусмотрена.
Электроника
Плата Arduino питается непосредственно от USB порта. Напряжение 5 В с платы Arduino используется в станке для питания датчиков.
Для упрощения схемы и по соображениям электробезопасности для питания электродвигателей использован готовый внешний источник питания от нотбука с выходной мощностью 75 Вт (19 В; 3,9 А).
Для подключения шаговых электродвигателей выбраны типовые микросхемы драйверов (D2, D3) с ключами на составных транзисторах и выводами с открытым коллектором. Аналогичная микросхема D1 применена для согласования выходов платы Arduino с транзисторными ключами. Имеющиеся электродвигатели рассчитаны на различные рабочие напряжения. Для их питания от одного источника были применены гасящие резисторы R9… R11. Рабочий ток электродвигателя М3 превышает рабочий ток одного канала выбранных микросхем, поэтому для питания каждой из его обмоток задействовано по два канала микросхемы D3, соединенных параллельно.
Привод сверления М1 имеет рабочий диапазон напряжений от 6 до 24 В и избыточную мощность и скорость вращения. Для обеспечения нужного режима сверления на ключ VT1 подается не постоянный сигнал, а ШИМ с подобранными параметрами.
Состояние концевых выключателей SB2… SB7 важно только во время движения вдоль определенной оси, поэтому для экономии входов/выходов контроллера они попарно объединены в матрицу 3×2 и включены между входом и выходом управления одним из каналов. При движении по осям Х и Y сверло должно находится в верхнем положении во избежание поломки. Исходя из этого, концевой выключатель SB1 подключен непосредственно между входом и источником 5В, для контроля во время любого из движений.
Прошивка устройства написана на языке Arduino, а клиенское приложение разрабатывалось на Python для GNU/Linux.
Прошивка устройства
Был разработан простой протокол управления станком. Формат команды следующий:
. После выполнения команды станок возвращает результат. Обычно это 0 или 1 (False или True).
Система команд:
Команда | Описание команды | Возвращаемые значения |
---|---|---|
connect: | Команда выполняется в 2 этапа. При получении станок сразу же отправляет в ответ res: 1 . это позволяет клиентскому приложению определить, к какому именно COM порту подключен станок. Затем станок инициирует процедуру запуска, по окончании которой отправляет ready: 1 . |res: 1 + ready: 1 в случае успеха; res: 1 + error: 1 в случае отсутствия питания |
|
touch: | Попытка коснуться платы сверлом. | res: 1 при касании; res: 0 если плата не обнаружена |
move: x y | Перемещает сверло на заданные координаты | res: 1 при успешном завершении; res: 0 при ошибке (координаты ошибочны; обрыв питания при выполнении) |
drill: x y | Перемещает сверло на заданные координаты и сверлит отверстие | res: 1 при успешном завершении; res: 0 при ошибке (ошибки команды move ; отсутствие платы) |
coords: | Возвращает координаты местоположения сверла | res: x y |
Возращаемые ошибки:
Ошибка | Описание ошибки |
---|---|
error: 0 |
Команда не распознана |
error: 1 |
Отсутствует питание |
При разработке прошивки внимание, в первую очередь, уделялось безопасности. При выполнении любой команды станок руководствуется следующими правилами:
- любые команды кроме
connect
должны игнорироваться, если с момента включения не была выполнена процедура запуска (откат всех осей и сброс координат в ноль) - запрещено двигаться по осям X и Y с опущенным сверлом
- необходимо сразу прекращать движение по оси при достижении концевого выключателя
- необходимо возвращать
error: 1
, если на момент получения команды, связанной с работой двигателей, отсутствует питание - при исчезновении питании при выполнении команды, связанной с работой двигателей, необходимо завершить команду и вернуть 0 (False)
Клиентское приложение
Изначально планировалось установить на станке камеру, с помощью которой можно было бы делать фотографии платы и определять точки для сверления с помощью OpenCV, однако поиск небольших окружностей на реальной протравленной плате оказался достаточно сложным занятием, да и преобретать новую камеру немного затратно. Поэтому, на первое время, мы решили ограничиться тем, что пользователь будет сам расставлять необходимые точки для сверления на чертеже платы, который загружается в приложение. Типичный рабочий процесс следующий:
- пользователь запускает приложение и указывает картинку (чертеж платы) для работы
- указывает на чертеже 2 любые точки
- переходит в режим указания точек на станке. В этом режиме можно управлять положением сверла, а также касаться платы. Пользоватль должен последовательно навестись на каждую из точек, указанных ранее на чертеже. Это позволяет сопоставить системы координат чертежа и станка
- пользователь расставляет точки для сверлния на чертеже
- приложение составляет программу сверления и начинает управление станком
Для связи со станком использовался модуль pyserial. При запуске приложение получает список всех доступных серийных интерфейсов (/dev/ttyACM*). На каждый из интерфейсов отправляется команда connect
. Если в ответ будет получено res: 1
, значит станок найден.
GUI реализован при помощи PyQt5.
Планируется добавить модуль автоматического распознавания точек для сверления в клиентское приложение. При этом, после сопоставления координат, приложение автоматически найдет точки на чертеже, пользователю останется только удалить ошибочные и добавить нераспознанные.
Ссылка на репозиторий