Хабрахабр

ЧПУ в хоббийной мастерской (часть 3)

Но, тема оказалась многим интересной, поэтому, немного ее еще пораскрываю. Изначально, планировал ограничиться двумя постами (раз, два) про мои ЧПУшные эксперименты. В этом посте пойдет речь про написание самодельного софта для управления любительским ЧПУ.

Предисловие

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

Собравшись с силами, на выходных навел что-то отдаленно напоминающее порядок и сделал, наконец, 2 вещи которые собирался сделать еще пол-года назад.

Этой фанерой я пользовался с момента покупки станка, прикручивая саморезами к ней заготовки и сооружая всякие безумные конструкции из палок и клиньев. Во-первых, заменил кусок фанеры который выполнял роль жертвенного стола. Все для того, чтобы деталь не отправилась в непредсказуемый полет при фрезеровке.

Может кому пригодится лайфхак: новый стол сделал из пластиковой террасной доски (продается в Кастораме):

Бонусом получились удобные пазы для фиксаторов заготовки и быстрого монтажа присадочного стола. Доски болтами прикрутил прямо к алюминиевому родному столу. На все про все ушло пара часов и ~1100р.

Про это и будет основной рассказ. И во-вторых, наконец, написал более-менее юзабильный софт для управления нестандартными функциями ЧПУ.

Постановка задачи

G-code для операций, которые описаны во второй части простейший. Тем не менее, сам процесс наладки нельзя назвать быстрым.

Как это происходило

Например, для присадки нужно было: зная ширину панели посчитать сколько должно быть отверстий, рассчитать точное расстояние между ними, создать файл, написать g-code, загрузить его в Mach3. Все это занимает, в лучшем случае, минут 15 — 20. В этом свете, преимущества цифрового станка значительно меркнут по сравнению с ручным инструментом, которым за это же время можно навертеть целую кучу дырок.

Что хотелось получить

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

Поиск решения

Первое что пришло в голову было написание автономной программы, которая напрямую бы взаимодействовала с параллельным портом. Беглый гуглинг показал, что задача записи в lpt вполне решаемая, но черт, как известно, прячется в деталях. При дальнейшем изучении вопроса я понял, что застрять тут можно всерьез и надолго. К тому же, такое решение было бы не гибким: для другого станка, например с USB, оно не работало бы.

В процессе сбора информации про создание mach-плагинов я натолкнулся на интересное решение. Оставался вариант разобраться с SDK Mach3. Я не эксперт в технологиях Microsoft, но после просмотра по диагонали мануала по SDK Mach3, если я правильно уловил основную идею, никакой серебренной пули не существует, плагины используют те же публичные методы COM-объектов Mach3. В нем описывалось как используя OLE-механизмы можно дергать Mach3 из стороннего приложения. Перекраивать интерфейс Mach3 я не собирался, таким образом, разница для пользователя между плагином и standalon приложением получалась только в том, что плагин доступен из меню Mach3, а приложение — через иконку на рабочем столе XP.

В этом случае, теоретически, я мог сразу после загрузки компьютера запускать свою программу, которая паровозом загружала бы Mach3 (вместо того, чтобы сначала грузить Mach3 и потом копаться в его меню для запуска плагина). Отдельное приложение мне показалось предпочтительней.

Берем в руки шашку

Последний раз нативное десктопное приложение для Windows мне приходилось писать году, эдак, в 2006 и было оно на Delphi. С тех пор веб-технологии с их Линуксом окончательно поглотили меня. Поэтому, сейчас особых предпочтений на каком языке ваять windows-программу у меня не было. Найденный простенький пример был написан на C#, этот язык и был выбран в качестве подопытного кролика.

Поясню основные вещи. Я не буду здесь выкладывать весь код получившегося приложения (при желании можете его найти на github по ссылке внизу поста). 043. Все эксперименты я проделывал на виртуалке с WinXP SP3, VS 2003 и Mach3 Version R3. Для тех кто считает, что лучше один раз увидеть ссылка на ролик в Youtube по которому разбирался я. 062. Ниже расшифровка основных моментов.

Подготовка

  1. Чтобы Visual Studio нормально подхватила компонент Mach3 нужно чтобы он корректно был прописан в реестре. Для этого качаем файл Mach3Registry.reg
  2. Запускаем Mach3Registry.reg
  3. Запускаем VS, создаем проект оконного приложения на C#
  4. В блоке Solution Explorer правый клик по References, в меню выбираем Add Reference. В открывшимся окне нажимаем Browse и ищем Mach3.exe

    Если все правильно, в списке References должна появиться строка, кто бы мог подумать, Mach4...

  5. 5. Далее рисуем UI, вешаем обработчики, реализуем алгоритмы...

Взаимодействие с Mach3

Подключаем нужные библиотеки, объявляем переменные (Form1.cs)

...
using System.Runtime.InteropServices;
using Mach4; // Подключаем компонент Mach namespace Cnc
catch { _mach = null; _mInst = null; } }
...

Использование:

GetMachInstance(); // if(_mInst != null) { _mInst.DoOEMButton(1003); // Нажатие на кнопку Stop в Mach3 _mInst.Code("G00 X100"); // Выполнение G-code _mInst.GetOEMDRO(800); // Получить текущее значение координаты X
}

Коды кнопок и значений параметров можно посмотреть в вики: OEM_DROs и OEM_Buttons (Wiki у них подглючивает, значения параметров в таблице не выводится, я смотрел на вкладке «View source»).

построчно) выполнялся методом _mInst. Первая версия программы работала так: по установленным параметрам генерировался g-code который покадрово (т.е. И это было моей ошибкой. Code. В Mach3 бежали правильные цифры в координатах. В отладочной среде на виртуалке все прекрасно работало. Каретка перемещалась правильно, но шпиндель не включался. Но при переносе на станочный компьютер возникли проблемы.

Получалась ситуация, что команды перемещений (G...) выполнялись последовательно как они поступали в метод _mInst. Похоже, что управление роутером и шпинделем в Mach работает в разных потоках. В результате, шпиндель включался (M3) и тут же выключался (M5), при этом перемещение каретки шло своим чередом. Code в одном потоке, а команды управления шпинделем (M3, M5), не зависимо от первых, выполнялись в другом потоке.

Code. Я пробовал разные варианты, подключал задержки, пробовал загнать весь управляющий g-code в одну строку и отправлять одним куском в _mInst. Фрагмент работающего кода: В результате, остановился на решении «в лоб»: просто загоняю сгенерированный код в файл, этот файл программно открываю в Mach3 и там же программно нажимаю кнопку «Старт».

_mInst.LoadFile("C:\\tmp\\gcode.txt");
System.Threading.Thread.Sleep(2000);
_mInst.DoOEMButton(1000);

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

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

Что в итоге получилось

Далее, в двух словах о получившемся приложении. Отдельно расскажу о UI для каждой операции.

Раскрой

Параметр S нужен для компенсации размера L если заготовка закреплена не в нулевой точке по Х (или по Y при распиле вдоль). Тут все достаточно прозрачно.

Присадка

Для присадки возможны 2 конфигурации оснастки. Первая с болгаркой для сверления торцевых отверстий. И вторая с обычным шпинделем для сверления в плоскости щита (почему-то я назвал ее «Присадка фронтальная»).

Присадка торцевая

Со сверлом по дереву это сделать не сложно — там есть острый наконечник которым и надо попасть в этот угол. При торцевой присадке важно точно выставить ноль в правом нижнем углу заготовки (у меня там находится угол бокового упора и стола). Закрепляя заготовку на столе я просто упираю ее в сверло.

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

Параметр X нужен для того, чтобы соединять панели разной ширины (например, когда нижняя и верхняя панели шкафа шире боковых на толщину дверей).

Присадка фронтальная

Этот вид присадки используется когда нужно насверлить отверстий в горизонтальной поверхности не только по краям но и где-то посередине. Оснастка для фронтальной — это обычный шпиндель. Если длина панели больше длины станка, присадку можно сделать в 2 подхода с разворотом детали на 180 градусов. Например, если в шкафе несколько отделений и кроме боковых стенок есть внутренние. В этом случае, так же пригодится параметр X.

Токарная обработка

Дело в том, что на выходе из Inkscape получается одна линия и точение происходит в один проход. Для меня основной сложностью при подготовке g-code с токарной траекторией было не переборщить с максимальной глубиной погружения диска. И были некоторые ограничения на эту форму. Из-за этого, мне приходилось делать отдельный код для цилиндрования заготовки и только после этого запускался основной проход создающий форму. Я старался не выходить за рамки 10 — 15мм от уровня первоначального цилиндра. В частности, нужно было следить, чтобы траектория не уходила слишком глубоко.

Работает это так: загружаем «сырой» g-code полученный из Inkscape, задаем размер стороны бруска заготовки и указываем максимальную глубину обработки за 1 проход (чем тверже деревяшка, тем меньше эта глубина). Все перечисленные проблемы удалось решить в новой программе. На базе исходного g-code и параметров программка посчитает безопасную траекторию и отправит ее в ЧПУ.

Планы на будущее

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

Ссылки

→ Mach3Registry.reg
→ Mach3 SDK и другие программы
→ Репозиторий проекта на Github (заранее прошу прощения у шарповиков за архитектурные косяки — это моя первая программа на С#).

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть