Блок управления для самодельного станка с ЧПУ

Эта история началась в далеком 2012 году и с перерывами продлилась несколько лет. Блок создавался, в первую очередь, для проведения времени с удовольствием и последующего применения с небольшим домашним станком с ЧПУ или с каким-либо другим устройством, в котором была бы необходимость управлять шаговыми двигателями. К сожалению, станок так и не был собран. По той же причине и физический доступ к блоку управления отсутствует, как и возможность его вывезти.

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

Начало

Началось всё с того, что Александр похвастался мне, что собрал самодельный станок с ЧПУ из стальных уголков и прочих металлических элементов. И теперь будет делать всякие штуки на нём. А может и не будет. Но и показать он его через Интернет не может, так как в наличии только веб-камера и та имеет крайне скверное разрешение и качество картинки.

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

Самодельный станок с ЧПУ от Александра

В гостях разговор зашел об управлении шаговыми двигателями и Александр меня просветил, что использование малодоступных микросхем нежелательно, в том числе и выковырянных из старых принтеров. А в Интернете есть вариант биполярного драйвера на микроконтроллере PIC16F628 и полевых транзисторах IRFZ44. Что и было предложено повторить.

А почему бы и нет? Интересно попробовать. Тем более, что два двигателя после разборки советского матричного принтера у меня уже имелись. И направляющие тоже.

Двигатели большие, массивные, похожи на ДШИ-200-1. Вот и стало интересно их покрутить и посмотреть на этот процесс.

Драйвер для биполярного шагового двигателя

Драйвер имеет режим полушага и удержания. Ток удержания — 50% от номинала.

Схема

Для управления вращением двигателя на разъём J2 подаются управляющий сигнал STEP (поворот вала двигателя на один шаг или в нашем случае полушаг) и DIR (определяет направление вращения).

Принципиальная схема драйвера биполярного шагового двигателя на PIC16F628 и IRFZ44
Схема драйвера биполярного шагового двигателя на PIC16F628 и IRFZ44 (источник)

Коммутация питающего напряжения на обмотки двигателя осуществляется с помощью N-канальных полевых транзисторов IRFZ44N. Так как транзисторы открываются напряжением на затворе относительно истока, а потенциал истока у транзисторов верхнего и нижнего плеча относительно «земли» разный, то для управления транзисторами используются специализированные полумостовые драйверы IR2101.

Применение готового драйвера заметно упрощает схему. Так как если транзистором нижнего плеча ещё можно достаточно просто управлять, то для управления транзистором верхнего плеча пришлось бы городить «велосипед».

Ограничение тока в обмотках двигателя реализовано программно с использованием встроенного в микроконтроллер компаратора. Для этого падение напряжения на токоизмерительных шунтах сравнивается с опорным.

В качестве шунтов используются мощные резисторы R8, R16 с сопротивлением 0,25 Ом. Напряжения с шунтов через интегрирующие RC-цепочки R13, C10 и R17, C11 попадают на входы компаратора.

Опорное напряжение (Ref) формируется с помощью ШИМ (широтно-импульсной модуляции) и интегрирующей RC-цепочки R9, C5. Установка тока обмоток осуществляется резистором R10.

Кварцевый резонатор можно применять обычный с двумя выводами, не забыв добавить на каждую ножку по конденсатору ёмкостью 15 — 30 пФ на «землю».

Печатная плата

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

Интересной особенностью этой платы является использование в качестве шунта четырёх параллельно включенных резисторов типоразмера 2512 с рассеиваемой мощность каждого — 1 Вт.

После прогулки по радиорынку выяснилось, что микроконтроллеры продавались только в DIP корпусе, а микросхемы драйверов IR2101 — в SMD. Ну что же, нам не привыкать. В итоге, были внесены соответствующие изменения в печатную плату. Так же был заменён подстроечный SMD резистор на выводной многооборотный.

Файл с модифицированной версией печатной платы в формате Sprint-Layout можно скачать тут.

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

Так как у меня имелось только два двигателя, было принято решение собрать и две платы драйверов. Для создания плат использовался метод ЛУТ:

Ну а дальше остаётся собрать платы, тем более что детали уже куплены:

Несмотря на все страшилки о поддельных IR2101, платы запустились сразу и без каких-либо проблем. Радиаторы на транзисторы устанавливать не пришлось, так как даже при сильном разогреве двигателя, транзисторы оставались полностью холодными. Ну это и не удивительно, все-таки сопротивление открытого перехода сток-исток у транзистора IRFZ44N составляет всего 17,5 мОм.

Контроллер был прошит программатором Extra-PIC, схема и плата которого легко находится в Интернете. Сейчас же я использую программатор PICkit2, приобретённый в процессе сборки автоматического антенного тюнера ATU-100. А на тот момент у меня был простой и самодельный Extra-PIC:

Самодельный программатор Extra-PIC
Программатор Extra-PIC

Кстати, о прошивках. Если ссылка на проект недоступна, то архив с прошивками можно скачать здесь. В моём случае была прошита микропрограмма версии 1.07. А версии 1.08 и 1.08а появились позже:

Прошивка версии 1.08 (Отключен опрос 8-й ноги пика, удержание включается всегда после секунды неактивности по Step, учитывайте это при настройке тока).

Прошивка версии 1.08а (То же, что и 1.08, только после подачи питания силовая часть включается с задержкой в 3 секунды — для тех у кого большие пусковые токи).

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

Первое включение платы

Оба имеющихся у меня двигателя — униполярные. Их можно было включить «обмотками впараллель» и это бы ещё сильнее повысило момент на валу. Но, если честно, я не смог сорвать вал двигателя с удержания подручными инструментами. И это при том, что питание на двигатель подавалось не 36 В, а всего-лишь 12 В.

Возможно, при работе в реальном станке я мог бы столкнулся с нехваткой момента на валу или пропуском шагов. С другой стороны, в качестве первой версии станка скорее всего был бы небольшой станочек из МДФ или что-то подобное. Его жёсткости должно с лихвой хватить для сверления печатных плат или выжигания лазером, а нагрузка на двигатели была бы небольшой. И только потом следовало бы замахиваться на что-нибудь более серьёзное и металлическое.

Итак, двигатель подключен к плате. А плата подключена к блоку питания:

Шаговый двигатель подключен к плате драйвера на PIC16F628
Двигатель подключен к плате драйвера

Для проверки вращения двигателя, на беспаечной макетной плате была собрана схема генератора импульсов на микросхеме таймера NE555.

Вращение двигателя с разной частотой импульсов на входе STEP можно наблюдать на видео:

Вращение двигателя с разной частотой STEP

Как видно, всё работает. Остаётся купить детали, вытравить плату, собрать третий драйвер и приобрести ещё один шаговый двигатель. После этого все три оси будущего станка можно будет задействовать.

Три собранные платы биполярного драйвера шагового двигателя для станка с ЧПУ
Собранные платы драйверов для всех трёх осей станка

После покупки деталей для сборки третей платы возникли некоторые опасения. Дело в том, что маркировка на микросхемах IR2101 была нанесена белой краской, а не лазером как на предыдущих платах. Но ничего страшного не произошло. Микросхемы оказались оригинальными и всё заработало так же стабильно. Хотя и добавило определённого негодования.

После проверки всех трёх драйверов, можно переходить к следующему важному этапу освоения ЧПУ — интерфейсной плате, позволяющей управлять шаговыми двигателями с помощью компьютера.

Управление станком с ЧПУ через LPT-интерфейс

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

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

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

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

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

Одной из самых известных операционных систем реального времени является QNX. И да, она не бесплатная. Про соответствующее управляющее станком ПО в свободном доступе я и не говорю. Хотя, может оно и есть. Но это явно не путь строительства небольшого домашнего самодельного станка.

В итоге, мой выбор пал на открытый проект LinuxCNC. И это не только управляющая программа для станка EMC2. Это готовый Linux-дистрибутив для управления станком, в котором используется модифицированное ядро Linux, содержащее realtime-расширения. Дистрибутив так же содержит всё необходимое, включая графический интерфейс, оконный менеджер, поддержку сети и т. д.

Схема интерфейса

Наряду с ссылкой на драйверы шаговых двигателей, Александром был прислан и вот этот архив. В нём содержатся два файла 2009 года со схемой в формате SPlan и платой в формате Sprint-Layout устройства управления станком с ЧПУ через LPT-интерфейс. Какой-либо источник или ссылку на автора этой конструкции мне найти не удалось.

4-axis-optointerface-v4.0: схема оптически развязанного LPT-интерфейса управления станком с ЧПУ
Схема оптически развязанного LPT-интерфейса управления станком с ЧПУ

Для питания левой части схемы используется гальванически развязанный DC-DC преобразователь AM1D-0505SZ. На момент сборки платы его стоимость на местном рынке была более 10$. Поэтому, в качестве питания для отвязанной части было использовано обычное трансформаторное зарядное устройство от мобильного телефона.

Топология интерфейсной платы

Плата содержит исключительно выводные компонентах. Но я никогда не искал лёгких путей и заменил резисторы R31-R35 и R45-R49 на резисторы поверхностного монтажа типоразмера 0805. Шелкографию для них не добавлял, так как для домашнего производства это не имеет значения.

Топология платы оптически развязанного LPT-интерфейса c SMD резисторами вместо выводных
Топология интерфейсной платы для управления станком с ЧПУ

Данную версию печатной платы в формате Sprint-Layout 6 можно скачать здесь.

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

Для пытливых умов отвечу сразу: в чашке не тот же «напиток», что в ёмкости для травления. Хотя и оба они имеют зелёный цвет.

Следующим шагом снимаю тонер (я использую для этого средство для снятия лака «Ноготок»). А далее произвожу сверление и лужение дорожек.

После того, как плата готова, наступает процесс сборки:

Интерфейсная плата собрана и пришло время её испытать и покрутить двигателем с помощью управляющей программы, запущенной на компьютере (в моём случае это EMC2):

Управление двигателем через интерфейсную плату

Полная проверка интерфейсной платы показала, что всё работает как и было задумано. Состояние входов (сигналов с концевиков) в программе отображается. Управляющие сигналы всех четырёх осей поступают на соответствующие выходы. Реле переключаются. Светодиод — горит. Красота!

Корпус для блока управления

И вот лежали себе платы, двигатели, направляющие и другие компоненты для сборки самодельного станка с ЧПУ долгое время в коробках. Металлические части в одних коробках, электронные — в других:

Направляющие, шаговые двигатели, осевые подшипники, муфты, платы биполярных драйверов шаговых двигателей, интерфейсная плата LPT
Компоненты для сборки станка

А потом в один прекрасный день, во время прогулки по радиорынку, я увидел ЭТО! Металлический корпус от какого-то устройства. И цена была приемлемой. Заглянув внутрь я сразу понял, что он отлично подойдет в качестве корпуса для блока управления станком с ЧПУ.

На задней стенке имеются четыре расположенные в ряд отверстия. Они просто отлично подходят для установки разъёмов типа GX-16, к которым будут подключаться шаговые двигатели и концевые выключатели. Задняя и боковая стенка содержат вентиляционные отверстия, на которые можно установить компьютерный вентилятор. А на передней панели расположен огромный поворотный выключатель питания!

Ну что же, время приступать к примерке плат и разъёмов:

Разъёмы GX-16 в имеющиеся отверстия проходить отказались: слишком уж большим оказалось сужение отверстий по бокам. Не беда. На помощь пришел круглый напильник.

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

Осталась самая малость — просверлить все необходимые отверстия, закрыть ненужные, установить стойки, проделать окно для LPT-разъема и обработать его контур надфилем…

Итак, за работу! Первым делом растачиваю все четыре отверстия круглым напильником и устанавливаю в них разъёмы GX-16.

Далее сверлю отверстия в боковой стенке и закрепляю вентилятор:

В отверстии, расположенном ниже разъемов GX-16, был установлен держатель для предохранителя сетевого питания 220 В.

Настало время сделать в задней стенке окно для LPT разъёма. Там пока что имеется только небольшое прямоугольное окно, подписанное как X3.

Растачивать напильником это окно до размеров разъёма DRB-25M было бы совсем дико. Поэтому я использовал старый метод — насверлить отверстий и выломать ненужный кусок металла. А затем напильником уже придавать необходимую форму. Процесс этот отнюдь не быстрый, но и спешить мне некуда.

Размечаю и сверлю на дне корпуса отверстия под стойки, на которых будут крепиться печатные платы. А так же резиновые ножки.

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

Ввожу кабель питания 220 В через кабельный ввод на задней стенке корпуса. В качестве кабеля использую обычный компьютерный кабель питания с отрезанным разъемом.

Заземляющий контакт подключаю к клемме заземления на корпусе. А само питание на плату БП пропускаю через выключатель на передней панели и предохранитель на задней стенке.

Включил в розетку. Блок питания запустился. Необходимые напряжения на выходе присутствуют. Можно продолжать.

На задней стенке корпуса ещё остались свободные отверстия, которые хорошо бы было использовать. И решил я в этих отверстиях расположить индикацию — два светодиода.

Первый (зелёный) будет показывать наличие питания на гальванически отвязанной части LPT-интерфейса. Тем более, что он уже имеется на плате. Остаётся его только оттуда выпаять и установить вместо него разъём. А сам светодиод вынести на заднюю панель.

Второй (красный) — отображать наличие на выходе блока питания напряжения 12 В, которое подаётся на платы драйверов шаговых двигателей в качестве силового питания.

Светодиоды решено было припаять к макетной плате, которая на стойках будет крепиться к задней стенке. Тем более, что для стоек уже имеются два отверстия и осталось просверлить ещё два.

Как можно видеть, на макетной плате кроме светодиодов появилась ещё одна плата. Это повышающий DC-DC преобразователь с +5 В до +12 В. Он необходим для питания интерфейсной и управляющей частей плат драйверов шаговых двигателей. В качестве источника +5В используется дежурное питание БП ATX.

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

Таким образом, после включения блока управления станка с ЧПУ выключателем на передней панели, запускается лишь источник дежурного питания. Дежурное питание попадает на интерфейсную плату и плату DC-DC преобразователя, а далее на платы драйверов шаговых двигателей. Основная часть блока питания не запускается и силовое питание для шаговых двигателей отсутствует.

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

Остаётся дело за ещё более малым — припаять и развести по корпусу все силовые и сигнальные провода.

Блок практически закончен. Осталось решить вопрос включения силовой части БП. До сих пор этим заведовал оранжевый тумблер, замыкающий сигнал PS_ON на GND.

Задержка включения силовой части

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

Схема отсутствует и даже не рисовалась. Но она достаточно простая и исходит из комментариев в коде.

К выводу PINB3 подключается сигнал PS_ON блока питания. Он может подключаться как напрямую, так и через буферный NPN транзистор. В программе необходимо выбрать соответствующую опцию просто закомментировав один участок кода и раскомментировав другой. В моём случае использовался транзистор. А так как транзистор инвертирует выходной сигнал, то и программно он тоже инвертируется. Задержка включения силовой части составляет 2 секунды.

К выводу PINB0 подключаются критические концевики или любое другое устройство, замыкающее вывод на «землю» при наступлении критической ситуации. При этом, для предотвращения физического разрушения конструкции станка, производится аварийное выключение питания двигателей.

К выводу PINB1 подключается кнопка, замыкающая на «землю». Эта кнопка используется если по какой-то причине нужно восстановить питание на выходе БП после аварийного отключения. В итоге, место оранжевого тумблера на задней панели заняла советская кнопкой с микропереключателем.

Программа для микроконтроллера крайне простая и незамысловатая:

/*
 * CNC_power.c
 */ 

// FUSES
// low: 71
// high: FF
// INTRC Osc. 4.8MHz 0ms, CKDIV8=1 (do not divide the frequency)

#define F_CPU 4800000L

#include <avr/io.h>
#include <util/delay.h>

#define AVR_PORT PORTB
#define AVR_DDR  DDRB
#define AVR_PIN  PINB

#define PS_ON PB3       // output connected to PS_ON (green) wire
#define E_OFF    PINB0  // emergency off
#define E_CANCEL PINB1  // restart the power supply after the emergency off

// PS_ON directly connected to microcontroller
//#define pwr_on() AVR_PORT &= ~(1<<PS_ON)
//#define pwr_off() AVR_PORT |= (1<<PS_ON)

// PS_ON connected via NPN transistor
#define pwr_on() AVR_PORT |= (1<<PS_ON)
#define pwr_off() AVR_PORT &= ~(1<<PS_ON)


int main(void)
{
    char e_status = 0;            // emergency status
	
    pwr_off();                    // PS_ON = 1;
    AVR_DDR |= (1<<PS_ON);

    AVR_DDR &= ~(1<<E_CANCEL)&~(1<<E_OFF);
    AVR_PORT |= (1<<E_CANCEL)|(1<<E_OFF);    // turn on the pull-up resistors

    _delay_ms(2000);    // wait for a 2 seconds before turn on the power 
	
    pwr_on();
    while (1) 
    {
        if (~AVR_PIN & (1<<E_OFF)) {
            e_status = 1;
            pwr_off();
        } else {
            if (e_status) {
                if (~AVR_PIN & (1<<E_CANCEL)) {
                    e_status = 0;
                    pwr_on();
                }
            }				
        }
    }
}

Фьюзы указаны в программе (low: 71, high: FF). Исходный код и откомпилированный hex-файл можно скачать здесь.

Для питания гальванически отвязанной части LPT-интерфейса было использовано трансформаторное зарядное устройство от телефона. Об этом уже писалось выше. Само зарядное устройство с демонтированной вилкой крепится на боковую стенку корпуса металлической скобой.

Окончательно собранный блок управления станком с ЧПУ имеет следующий вид:

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

Обзорное видео блока управления

Заключение

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

Мне нечего об этом сказать. Я ни с какими проблемами не столкнулся. Возможно из-за низкого напряжения питания двигателей или исправных компонентов. Или потому, что я не использовал этот блок управления с реальным станком. А может из-за того, что прошивка к тому времени была уже версии 1.07.

Если бы я собирал этот блок сейчас, я бы соединил все «земли» проводами хорошего сечения в одной точке заземления. С другой стороны, в собранном устройстве они, по сути, и так все соединяются достаточно толстыми проводами в блоке питания.

В завершении статьи предлагаю посмотреть видео, в котором происходит исполнение G-кода для станка. И пусть реального станка так и не появилось, но само вращение двигателей никого не оставит равнодушным, даже самых далеких от ЧПУ людей:

Исполнение G-кода