Домашний CNC. Часть 1. Драйвер шагового двигателя для мини-станка с ЧПУ

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

↑ Привод

Нужно двигать собственно фрезер в 3-х направлениях — XYZ, значит нужно 3 привода — 3 мотора с передачей вращения вала двигателя в линейное перемещение. О передаче… Для фрезерного станка, где есть боковые усилия резания материала, желательно не применять ременные передачи, очень популярные в 3D принтерах. Буду применять передачу «винт-гайка». Самая бюджетная передача — обычный стальной винт и безлюфтовая, желательно бронзовая, гайка. Более правильная — винт с трапециевидной резьбой и гайка из капролона. Самая хорошая (и, увы, самая дорогая) шарико-винтовая пара, или ШВП. Об этом подробнее я еще расскажу далее… У каждой передачи есть свой коэффициент, свой шаг — то есть насколько линейно по оси переместится фрезер за один оборот двигателя, например, на 4 мм.

↑ Двигатель (мотор)

В качестве двигателя для привода определил шаговый двигатель (ШД) Почему шаговый? Что это вообще такое? Двигатели есть переменного и постоянного тока, коллекторные и бесколлекторные, и так называемые «шаговые». В любом случае нам надо обеспечить какую-то точность позиционирования, например 0,01 мм. Как это сделать? Если двигатель имеет прямой привод — вал двигателя соединяют напрямую с винтом, то для обеспечения такой точности нужно повернуть его на некоторый угол. В данном случае, при шаге передачи 4 мм и желаемой точности перемещения 0,01 мм это… всего 1/400 оборота, или 360/400=0,9 градуса! Ерунда, возьмем обычный моторчик…
С «обычным» моторчиком без обратной связи никак не получится. Не вдаваясь в подробности, схема управления двигателем должна «знать», на какой угол повернулась ось. Можно конечно поставить редуктор — потеряем в скорости, и все равно без гарантии, без обратной связи вообще никак! На ось ставится датчик угла поворота. Такое решение надежное, но дорогое.

Альтернатива — шаговый двигатель (как он работает, почитайте сами). Можно считать, что за одну «команду» он повернет свою ось на определенный градус, обычно это 1,8 или 0,9 градуса (точность обычно не хуже 5%) — как раз то, что нужно. Недостаток такого решения — при большой нагрузке двигатель будет пропускать команды — «шаги» и может вообще остановиться. Вопрос решается установкой заведомо мощного двигателя. На шаговых двигателях и делается большинство любительских станочков.

Сравнение двухфазных и трёхфазных микрошаговых двигателей

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

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

↑ Выбираем шаговый двигатель

2 обмотки, с минимальным током, минимальной индуктивностью и максимальным моментом — то есть максимально мощный и экономичный двигатель.
Противоречивые требования. Малый ток — значит большое сопротивление, значит много витков провода обмотки двигателя, значит большая индуктивность. А большой момент — это большой ток и много витков. Выбираем в пользу большего тока и меньшей индуктивности. А момент надо выбирать исходя из нагрузки, но об этом потом.

Характеристики некоторых двигателей приведены в таблице:

L298 + DC двигатели + Raspberry Pi

Для данного эксперимента к модулю на L298 были подключены два двигателя постоянного тока. Питание всего модуля осуществляется от одного аккумулятора на +6В.

Поскольку это напряжение меньше +12В (смотрим выше описание) то перемычку внутреннего стабилизатора оставляем установленной и дополнительное питание +5В для логики не потребуется.

В этом эксперименте перемычки «ENA» и «ENB«, которые разрешают подачу питания на выходные мосты, оставлены установленными — питание на выходные каскады H-мостов микросхемы L298 будет поступать постоянно.

Таким образом, для управления каждым из двигателей используем оставшиеся четыре входа: IN1, IN2, IN3, IN4.

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

Где взять +5В? — в данном случае это напряжение присутствует на разъеме питания, справа около GND. Для теста можно воспользоваться кусочком проволоки — перемычкой.

Теперь подключим наш модуль к Raspberry Pi и напишем простую тестовую программу на Python. Для подключения управления я использовал выводы GPIO вот в таком соответствии:

Raspberry Pi GPIOМодуль L298
Вывод 7 (GPIO4)IN1
Вывод 9 (GND)GND (разъем питания)
Вывод 11 (GPIO17)IN2
Вывод 13 (GPIO27)IN3
Вывод 15 (GPIO22)IN4

Рис. 7. L298 + Raspberry Pi + электродвигатели постоянного тока.

Мини-компьютер у меня питается через понижающий импульсный стабилизатор от второго аккумулятора на +6В (для малинки нужно +5В).

Перейдем к написанию программы для нашего эксперимента. Наша цель — управлять вращением вала каждого из двигателей с помощью подключенной к Raspberry Pi клавиатуры, или же удаленно по SSH, VNC.

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

Загружаем малинку, открываем Терминал или же подключаемся к ней удаленно при помощи SSH. Создаем новый файл и открываем его для редактирования при помощи команды:

nano /home/pi/l298_dc_motors_test.py

Вставляем в редактор код скрипта на Python, который приведен ниже:

#!/usr/bin/env python # -*- coding: utf-8 -*- import time import RPi.GPIO as GPIO # Подготавливаем пины GPIO. GPIO.cleanup() GPIO.setmode(GPIO.BCM) GPIO.setup(4, GPIO.OUT) GPIO.output(4, GPIO.LOW) GPIO.setup(17, GPIO.OUT) GPIO.output(17, GPIO.LOW) # Включаем вращение двигателя 1 в одну сторону. GPIO.output(4, GPIO.HIGH) # ждем 5 секунд. time.sleep(5) # Выключаем двигатель 1. GPIO.output(4, GPIO.LOW) # ждем 10 секунд. time.sleep(10) # Включаем вращение двигателя 1 в другую сторону. GPIO.output(17, GPIO.HIGH) # ждем 5 секунд. time.sleep(5) # Выключаем двигатель 1. GPIO.output(17, GPIO.LOW)

Выходим из редактора (CTRL+X) перед этим подтвердив запись содержимого в файл (жмем «Y» — yes). Делаем скрипт исполняемым и запускаем его:

chmod +x /home/pi/l298_dc_motors_test.py /home/pi/l298_dc_motors_test.py

После запуска один из двигателей начнет вращаться в одну сторону на протяжении пяти секунд, потом он выключится и после 10 секунд ожидания на протяжении следующих 5-ти секунд начнет вращаться в другую сторону.

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

Аналогично первому упрощенному скрипту, программу можно сохранить в тот самый файл или же создать новый.

Важно чтобы в данном примере кода соблюдались отступы, об этом я уже писал раньше вот тут.

#!/usr/bin/env python # -*- coding: utf-8 -*- import os import sys import curses import time import RPi.GPIO as GPIO # Установим номера пинов GPIO, с которыми будем работать M1_RIGHT = 4 M1_LEFT = 17 M2_RIGHT = 27 M2_LEFT = 22 # Функция для подготовки пинов GPIO def setup(*ports): GPIO.cleanup() # Режим именования пинов по названию, а не по номеру на плате GPIO.setmode(GPIO.BCM) for port in ports: # Установка пина на вывод + низкий уровень «0» GPIO.setup(port, GPIO.OUT) GPIO.output(port, GPIO.LOW) # Функция для установки низкого уровня на всех пинах (выключение) def stop_all(): GPIO.output(M1_LEFT, GPIO.LOW) GPIO.output(M1_RIGHT, GPIO.LOW) GPIO.output(M2_LEFT, GPIO.LOW) GPIO.output(M2_RIGHT, GPIO.LOW) # Функция для управления вращением движков def rotate(motor=1, mode=’s’): # Выключаем все пины stop_all() # Для мотора 1 if motor == 1: if mode == ‘r’: # Устанавливаем высокий уровень на пине M1_RIGHT (4) GPIO.output(M1_RIGHT, GPIO.HIGH) elif mode == ‘l’: # Устанавливаем высокий уровень на пине M1_LEFT (17) GPIO.output(M1_LEFT, GPIO.HIGH) # Для мотора 2 elif motor == 2: if mode == ‘r’: GPIO.output(M2_RIGHT, GPIO.HIGH) elif mode == ‘l’: GPIO.output(M2_LEFT, GPIO.HIGH) # Выполним инициализацию пинов GPIO setup(M1_RIGHT, M1_LEFT, M2_RIGHT, M2_LEFT) # Инициализация экрана (модуль curses) stdscr = curses.initscr() # Реагировать на нажатие клавиш без подтверждения при помощи ENTER curses.cbreak() # Разрешить использование стрелочек на клавиатуре stdscr.keypad(1) # Не блокировать программу по времени при опросе событий stdscr.nodelay(1) # Отобразим на экране данные по умолчанию stdscr.addstr(0, 10, «Hit ‘q’ to quit») stdscr.addstr(2, 10, «A — M1 Left, D — M1 Right») stdscr.addstr(3, 10, «< — M2 Left, > — M2 Right») stdscr.addstr(4, 10, «S — stop») stdscr.refresh() # Главный цикл while True: # Получаем код нажатия клавиши и проверяем его key = stdscr.getch() if key != -1: # Если клавиша «стрелка влево» то вращаем движок 2 влево if key == curses.KEY_LEFT: # Выводим на экран строку «M2 <—» в позиции 6, 10 stdscr.addstr(6, 10, «M2 <—«) rotate(2, ‘l’) # Если клавиша «стрелка вправо» то вращаем движок 2 вправо elif key == curses.KEY_RIGHT: stdscr.addstr(6, 10, «M2 —>») rotate(2, ‘r’) # Если клавиша «а» то вращаем движок 1 влево elif key == ord(‘a’): stdscr.addstr(6, 10, «M1 <—«) rotate(1, ‘l’) # Если клавиша «d» то вращаем движок 1 вправо elif key == ord(‘d’): stdscr.addstr(6, 10, «M1 —>») rotate(1, ‘r’) # Если клавиша «s» то останов всех движков elif key == ord(‘s’): stdscr.addstr(6, 10, «STOP 12») stop_all() # Если клавиша «s» то выходим из программы elif key == ord(‘q’): # Восстановление прежних настроек терминала stdscr.keypad(0) curses.echo() curses.endwin() # Очистка и выход os.system(‘clear’) sys.exit() # Обновляем текст на экране и делаем небольшую задержку stdscr.refresh() time.sleep(0.01)

Запустив скрипт можно поклацать стрелочки клавиатуры «влево» и «вправо», а также клавиши с буквами «A» и «D» — двигатели должны вращаться поочередно и в разные стороны, а программа будет отображать их текущий режим работы.

Рис. 8. Программа на Python для управления двигателями при помощи драйвера L298 (терминал Konsole, KDE).

Краткая видео-демонстрация работы данного эксперимента приведена ниже:

Хочу заметить что управлять скоростью вращения вала электродвигателя постоянного тока можно с использованием широтно-импульсной модуляции (ШИМ, PWM).

О том как использовать этот метод для GPIO вы можете узнать из подробной статьи, посвященной модулю «RPi.GPIO».

↑ Драйвер шагового двигателя

Двигатель есть. Теперь нужен драйвер — переключать напряжение на обмотках двигателя определенным образом, при этом не превышая установленный ток.
Самое простое решение — источник заданного тока и две пары транзисторных ключей на каждую обмотку. И четыре защитных диода. И логическая схема чтобы менять направление. И… Такое решение обычно делают на микросхеме ULN2003A для двигателей с малым током, имеет много недостатков, не буду на них останавливаться.

Альтернатива — специализированные микросхемы «всё в одном» — с логикой, транзисторами и диодами защиты внутри (или снаружи). А еще такие микросхемы контролируют ток обмоток и регулируют его с помощью ШИМ-а, а так же могут реализовывать режим «полушаг», а некоторые режимы 1/4 шага, и 1/8 шага и т. д. Эти режимы позволяют повысить точность позиционирования, повысить плавность движения и снизить резонанс. Обычно достаточно режима «полушаг», что позволит повысить теоретическую точность линейного позиционирования (в моем примере до 0,005 мм).

Что внутри микросхемы драйвера шагового двигателя? Блок логики и управления, источники питания, ШИМ со схемами формирования момента и времени коммутации обмоток, выходные ключи на полевых транзисторах, компараторы обратной связи — ток контролируется по падению напряжения на резисторах (Rs) в цепи питания обмоток. Ток двигателя задается опорным напряжением.

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

Плавный пуск и регулировка оборотов электродвигателя с помощью таймера NE555

Частотозадающая цепь состоит из С1 и R1, а соотношение лог. 1 и 0 – скважность – от положения ползунка R1, точнее, от соотношения сопротивлений верхней и нижней частей резистора. Эти части управляют скорость заряда или разряда конденсатора, зависит от диода. Когда они равны, длительность свечения и «несвечения» светодиода будут равны. В одном из крайних положений ползунка будет длительное свечение при коротком времени погасания, в другом – короткие вспышки.

От себя добавлю, что если напряжение на 5 ноге равно или больше напряжения питания, генерация срывается, на выходе единица, ключ полностью открыт (что нам и надо).

Рассмотрим реальные схемы. Самая первая серийная схема, разработанная и изготовленная на биполярных транзисторах. (Под словом «серийная» подразумевается, что их я изготовил более 10 штук).

Далее основная серийная схема. Эту рассмотрим подробнее. Обеспечивает плавное трогание вперед, задний ход включается рывком. Для экономии заказчик с этим согласился. От звукового иммитатора отказались. Полевые транзисторы 55N06, выписанные из Китая, на 20% ушли в брак, но оставшиеся работали настолько хорошо (малые потери и нагрев), что от РВ не сразу, но отказались (детали K1, VD4, VT2, C5 и R5 не устанавливались). Интенсивность разгона определяется конденсатором С3 (от 1000,0 до 4700,0 мкФ) и резистором R1, номинал подобран экспериментально. Получить ограничение или возможность регулировки оборотов несложно, надо подключить параллельно С3 переменный или подстроечный резистор номиналом около 10…20 кОм, ползунок которого соединить с 5 ножкой таймера.

↑ Богатство выбора

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

Из готовых — наиболее распространённые и недорогие драйверы на микросхемах Allegro A4988 (до 2А), Texas Instruments DRV8825 (до 2,5А). Поскольку модули изначально разрабатывались для использования в 3D принтерах типа Rep-rap проекта Arduino, они не являются законченными модулями (например, им нужно еще питание логики (+5V), которое подается с так называемой рампы (Ramp).

Еще есть решения на DRV8811 (до 1,9 А), A3982 (до 2 А), A3977 (до 2,5 А), DRV8818 (до 2,5 А) DRV8825 (до 2,5 А), Toshiba TB6560 (до 3 А) и другие.

Поскольку мне интересно что-то сделать самому, плюс появилась возможность «попробовать на вкус» микросхемы Allegro A3982 и A3977, решил сделать пару драйверов самостоятельно.

Готовые решения на A4988 не понравились, прежде всего, из-за миниатюризации размеров печатной платы в ущерб хорошему охлаждению. Типовое сопротивление открытых транзисторов у A4388 при токе 1,5А 0,32+0,43 Ом, плюс 0,1-0,22 Ома «измерительный» резистор — получается около 0,85 Ом. А таких каналов два, и хотя и работают они импульсно, но 2-3 Ватта тепла надо рассеивать. Ну не верю я в многослойную плату и малюсенький радиатор охлаждения — в даташите нарисована плата гораздо больших размеров.

Провода мотора нужно сделать короткими, драйвер устанавливать рядом с двигателем. Существует 2 технических решения в звукотехнике: длинный сигнальный кабель к усилителю + короткие провода к акустической системе, или короткий сигнальный кабель к усилителю + длинные провода, а акустической системе. Оба решения имеют свои плюсы и минусы. С моторами — так же. Я выбрал длинные провода управления и короткие провода к мотору.

Управляющие сигналы — «шаг» (step), «направление» (dir), «включение» (enable), индикация состояния сигналов управления. Некоторые схемы не используют сигнал «Enable», но это приводит в режиме простоя к ненужному нагреву и микросхемы и двигателя.

Одно питание 12-24 вольта, источник питания логики (+5B) — на плате. Размеры платы — достаточные для хорошего охлаждения, двухсторонняя печать с большой областью «меди», возможность приклеить на микросхему радиатор (применяемой для охлаждения памяти видеокарт).

Усилитель звука с ШИМ-таймером 555

В широко распространенной звуковой ШИМ-схеме 555 используется микросхема NE555 в нестабильном режиме, где частота переключения может изменяться от 65 кГц до 188 кГц.

555 Таймер ШИМ аудиоусилитель

Последовательный таймер для управления двигателем постоянного тока.

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

Последовательный таймер для управления двигателем постоянного тока Схема последовательного таймера управления двигателем постоянного тока

Бесконтактный таймер

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

Бесконтактный переключатель таймера

Линейный таймер общего назначения

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

Линейный таймер для общего применения

Таймер инфракрасного дистанционного управления.

Здесь представлена ​​схема таймера с инфракрасным дистанционным управлением. Схема состоит из двух секций, а именно секции передатчика и секции приемника.

↑ Схема и прототип

Отечественные и зарубежные производители

Микросхема-таймер 555 серии настолько популярна, что ее аналоги изготавливаются мощностями практически всех известных брендов микроэлектронной промышленности. Причем территориально расположенных не только в США, но и других странах мира. Среди них: Texas Instrument, Sanyo, RCA, Raytheon, NTE Silvania, National, Motorola, Maxim, Lithic Systems, Intersil, Harris, Fairchild, Exar ECG Phillips и множество других.

Зачастую номер серии от конкурентов содержит отсылку к оригинальной NE555. Встречается маркировки NE555N, НЕ555Р или им подобные.

Российская КР1006ВИ1

Производится таймер и в России, с маркировкой микросхемы КР1006ВИ1 с биполярными транзисторами и КР1441ВИ1 по КМОП технологии. Национальный вариант немного отличается от классического 555 серии – в нем вход остановки обладает большим приоритетом, чем сигнал запуска.

Рейтинг
( 2 оценки, среднее 4.5 из 5 )
Понравилась статья? Поделиться с друзьями:
Для любых предложений по сайту: [email protected]