GRBL 1.1 на китайской отладочной плате SMT32F103C8T6 (она же generic она же bluepill)

Эта статья будет разбита на несколько частей. В основном речь пойдет о настройке и использовании самой популярной платы на микроконтроллере stm32c8t6 в качестве 4х (от 3х до 6и) осевого контроллера ЧПУ с прошивкой GRBL 1.1f, портированной с Arduino. Также в этой статье я расскажу немного о личном опыте применения этого контроллера, немного об используемых драйверах шаговых двигателей и немного о программном обеспечении для работы с GRBL.

Отладочный стенд

Драйверы шаговых двигателей для любительского использования.

Для управления контроллером подойдут любые драйверы шаговых двигателей (ШД) с входными сигналами шаг/направление (step/dir). Обратной связи (ОС или FB (feedback)) по положению на контроллер разумеется нет. Если ОС есть и замкнута через драйвер – это норм и даже хорошо, можно вывести сигнал ошибки на контроллер. Но это, конечно, дорого.

Итак, какие конкретно драйверы можно использовать? Для маленьких движков на небольшую мощность отлично подойдут drv8825 (polopu), A4988 и другие этого же класса. Основная область применения: 3d принтеры, хоббийные лазерные гравировщики, в общем – что-то, что не требует особых нагрузок. Для движков с током до 4А и напряжением БП до 40В подойдут TB6600 (я гоняю на них двигатели с 57 посадкой максимального размера и даже с 86 посадкой). Не рекомендую брать что-либо с названием TB6560, это более старая модификация драйвера, на многих форумах она фигурирует как проблемная. Проблемы я так понимаю связаны с пропуском шагов, низкой частотой сигнала «шаг» и повышенной сгораемостью при определенных условиях. Также вполне нормально работают драйверы от отечественной конторы pl, в некоторых присутствует подстройка фазы, что очень неплохо, но для хобби дороговато. Работал с этим контроллером GRBL и с серводвигателями, но об этом позже.

Особое внимание на повышенных частотах работы (от 50кГц и выше) стоит обратить на правильно проведенные как сигнальные, так и силовые провода, экранирование, подведение питания. На мой взгляд хорошим решением для сигнальных проводов является витая пара, при этом экран рекомендуется подключать только со стороны модуля контроллера. Провода делать по возможности короче, драйверы ШД располагать по возможности вблизи ШД, два провода каждой обмотки ШД скрутить как витую пару вплоть до подключения к драйверу, контроллер убрать в отдельную металлическую коробочку, в некоторых случаях не повредят ферритовые фильтры (на сигнальные провода можно надеть ширпотребные покупные и успокоиться), ну и т.д. Не забудьте про дамперы, если речь идет о быстром торможении приличных масс. Короче говоря, если хотите сделать что-то более-менее серьезное (быстрое, защищенное и безотказное), то обязательно потратьте хотя бы неделю исключительно на вдумчивое изучение вопроса, материалов в интернете очень много. Если хотите просто попробовать и приобрести начальный опыт, не рассчитывая сразу на грандиозный результат (на мой взгляд – это самый правильный способ для начала), то тоже потратьте время на изучение и постарайтесь не прибегать к дорогим комплектующим.

Опыт использования GRBL

Постараюсь коротко. Около года назад мне понадобилось (по работе) сделать 4х осевой станок с ЧПУ с «гибко настроенным» интерфейсом. Все мы понимаем, что отличным вариантом было бы использование для этих целей LinuxCNC. Однако расчетная частота сигналов step должна была быть 60-80кГц. Для этого LPT уже не подходит и потребовалось бы приобретать плату типа mesa. Адекватный вариант с LinuxCNC на Raspberry Pi у меня не получился. Однако, Raspberry Pi как интерфейсный компьютер меня очень прельщал. На тот момент я уже знал о проекте GRBL на Arduino. Но GRBL дает только 30кГц выходной частоты и 3 оси.

Первая мысль: портировать GRBL на STM32, вторая – поискать готовый порт в интернете. После некоторых усилий нашел проект одного бравого канадского парня, вот он: https://github.com/usbcnc/grbl/wiki. GRBL 1.1f аккуратно портированный на stm32f103 с сохранением исходного кода и комментариев от родного GRBL. Огромное ему спасибо, почет и уважение. Тут тоже имеем 3 оси, но уже, как утверждается, до 180кГц! (однако покопавшись в коде могу сказать, что на это рассчитывать не стоит, остановимся на 100кГц) Естественно сразу собрал и залил. Заработало с первого раза! Хороший знак. В последствии оказалось, что есть ошибочки, но мы их конечно подправили. Оказалось, что разработчики GRBL планировали расширение до большего количества осей, но ресурсы контроллера atmega328p этого уже не позволяли. Я добавил 4 ось (5 и 6, но их как следует не тестировал). Далее мы будем рассматривать проект с исправленными ошибками и добавленной осью.

Колесотокарный ЧПУ

Мы успешно воплотили в жизнь проект на этом контроллере. Был собран промышленный мобильный блок управления с сенсорным экраном, написан свой интерфейс работы с GRBL и беспроводным пультом ДУ, сделана промежуточная плата для контроллера (реле, согласование сигналов, гальванически развязанные входы и т.д.) и все это работает с драйверами серводвигателей. Уже на протяжении длительного времени всё это безотказно работает в боевых условиях (грязь, масло, вода, «цеховское» питание, постоянные перемещения и переподключения коммуникаций). При этом одно время были некоторые вопросы к механике, к сенсорному экрану, но контроллер работал без сбоев. После некоторой работы с интерфейсом связка заработала великолепно. Считаю, что удалось добиться уровня включил-и-работай и данное решение при грамотном монтаже можно и нужно рассматривать как промышленное.

Отладочная плата SMT32F103C8T6 (она же generic она же bluepill) плюсы и минусы.

На сегодняшний день это одна из самых распространенных отладочных плат с микроконтроллером stm32 семейства CORTEX M3. Чего только на ней не делают. Стоит эта плата около 120р (06.2018) на алиэкспресс и программатор st-link v2 около 150р (я использую именно его) или «настоящий» st-link v2 около 500р там же. Программировать ее можно и через USART (RS232), например через переходник RS232 < — > USB(VCP), такой, например, как FTDI FT232 или недорогой китайский вариант CH340.

Об этой плате сказано уже очень много, так что повторяться не вижу смысла. Поговорим о ней с точки зрения контроллера ЧПУ. Мы имеем 180кГц (это по заявлениям автора переноса grbl на bluepill, по моим данным реально, что можно выжать — около 120кГц) на 3х осях против 30кГц на GRBL Arduino. Также есть возможность подключать до 6 осей (с падением максимальной частоты конечно же) и/или некоторого количества своих дополнительных входов или выходов, но для этого конечно придется менять прошивку. В моих планах добавить поддержку кодов M62-M65 и M66 как в LinuxCNC.

По сравнению с LinuxCNC (без использования доп. плат) плюсом опять идет максимальная частота (100 против 25-40 кГц) и отсутствие привязки к интерфейсному железу. Если в случае с LinuxCNC (без использования доп. плат) интерфейс и сам контроллер (исполнитель) объединены в одном компьютере и обязательно требуется один или несколько портов LPT для взаимодействия с драйверами ШД, концевиками и оборудованием, то в случае нашего контроллера мы подключаемся физически через USB (как VCP (Virtual COM Port) устройство) к любому компьютеру с любимой ОС. Я вполне успешно использую его с Raspberry Pi.

Однако есть и минусы: во-первых это пользовательский интерфейс, и там и там их несколько, но в LinuxCNC они гибко настраиваются; во-вторых LinuxCNC сразу поддерживает различную кинематику устройств и это супер, вы можете собрать 6 осевого шарнирно-сочленённого робота манипулятора без проблем; в-третьих поддержка у LinuxCNC до 9 осей (сомнительный для нас плюс); в-четвертых возможность подключать серводвигатели с ОС замкнутой через контроллер (т.е. ПИД регулятор реализован в LinuxCNC) это дает возможность подключать двигатели постоянного тока с ОС, синхронные двигатели переменного тока с ОС, да вообще всё что угодно!; в-пятых HAL, который превращает LinuxCNC во всё что угодно, в том числе в ПЛК, ну и думаю еще можно несколько пунктов придумать. А с какой-нибудь платой mesa LinuxCNC превращается в монстра и на выходе мы имеем если не ошибаюсь до 100 входов/выходов с частотой до 1МГц.

Но в целом будущее я всё же вижу за устройством похожим на рассматриваемый нами контроллер и вот почему: данный контроллер семейства CORTEX-M3 имеет частоту 72МГц. Семейство M3 не поддерживает аппаратного деления, а вот уже M4 c частотой до 180МГц или M7 с частотой до 400МГц – поддерживают. Там значительно больше инструкций, которые позволяют сделать многое за меньшее количество тактов и core coupled memory. В целом всё это значительно повышает производительность. Также есть ЦАП, нет никаких препятствий исполнять код с флешки как в 3d принтерах, ну и при таких вычислительных мощностях уже можно встраивать интерфейс в этот же контроллер, и ту же кинематику считать при необходимости и еще много чего интересного. Ну и перенос с M3 не является особо сложной задачей (Вроде даже он уже в какой-то степени есть, но я не проверял).

Конфигурация проекта, прошивка контроллера

В целом наш GRBL сконфигурирован так, что можно его залить и всё будет работать «из коробки». Причем проект можно не собирать заново, а воспользоваться файлом прошивки «.hex», залив его через утилиту STM32 ST-LINK Utility (при установке этой программы драйвера для программатора установятся автоматически), и перейти сразу к следующему подразделу этой статьи,  что и рекомендую вам сделать в первую очередь. А здесь далее мы разберем тонкую настройку проекта перед его компиляцией.

Pinout diagram
Первоначально проект собирался в CooCox IDE, но я перенес его в Atollic true studio. Всё что вам надо – установить true studio, скачать проект, открыть его в Atollic true studio и нажать build. Проект должен успешно собраться. Для заливки проекта вам понадобится программатор st link v2 или его китайский клон или, менее предпочтительно, через устройство с интерфейсом USART/UART (RS232).

Всё что вам может понадобиться для настройки лежит в нескольких файлах: config.h, cpu-map.h, defaults.h.

В файле defaults.h лежат начальные настройки контроллера GRBL, которые будут прописаны в память при прошивке микроконтроллера. В дальнейшем их можно будет переназначить командами уже прошитому контроллеру, но вы можете уже сразу сделать их теми, которые вам необходимы. Подробнее смотри раздел «Настройки контроллера GRBL».

В файле cpumap.h (в нем лучше ничего не изменять без особой нужды и понимания) хранится карта подключения выводов контроллера (какой вывод контроллера за что отвечает (например: вход от концевика Х, выход Step Z и т.д.)). Здесь же вы можете переназначить эти входы/выходы, но делать вам это крайне не рекомендую. На переназначение накладывается много ограничений. Например: ножки управления (CTRL pins) можно переназначать только в пределах 5-9 ножек порта A или B, при этом они все должны находиться на каком-либо одном порте. То же правило для входов от концевиков 10-15 ножки, и т.д.

Наконец самый интересный файл config.h. Обязательно пробегите его глазами. Он очень хорошо прокомментирован. Тут находятся важные настройки, которые нельзя настроить после прошивки. Вы сможете настроить скорость передачи данных; коды (символы) команд (лучше не менять); запрет/разрешение работы без базирования (#define HOMING_INIT_LOCK); количество осей; очередность базирования по осям (HOMING_CYCLE); два или один концевик на оси; разрешить M7; разрешить сигнал от двери безопасности; инвертирование выводов охлаждения, шпинделя; пределы изменения скорости подачи и скорости шпинделя во время работы; отключение аппаратных подтяжек входов; настройки управления шпинделем и многое другое!

 

Как работать с GRBL

После того как вы залили прошивку на контроллер, проверьте, что всё работает:

Во-первых, не забудьте переподключить контроллер простым отключением и подключением USB.

Во-вторых, в Windows вам надо поставить драйвер STM32 Virtual COM Port Driver STSW-STM32102 (для Linux не требуется) чтобы наш конроллер определился операционной системой как COM порт (VCP).

В-третьих, воспользуйтесь любой программой терминалом COM порта. Я пользуюсь программой Terminal v1.9b или встроенным в Arduino IDE монитором COM порта. Скорость передачи данных надо поставить 115200. В Terminal поставьте галочку «+CR» для передачи. Символ «$» надо отправлять как «$$», соответственно для отправки двух символов их надо вбить 4 раза. В Arduino IDE подходящий режим NL или CR (оба сразу и «нет конца строки» не подходит). Если всё сделано правильно, то при отправке команды «?» (без кавычек естественно) придет ответ о текущем статусе типа: <Idle,MPos:0.000,0.000,0.000,WPos:0.000,0.000,0.000>. И уже с самого начала на контроллер можно отправлять команды перемещения, настроек, запросов. Например: х10 или в классическом виде G0 X10.

При перезаливке прошивки с измененными настройками в defaults.h необходимо выполнить full chip erase, иначе перезаписаться может только сама прошивка без настроек. Я делаю это через STM32 ST-LINK Utility.

Настройки контроллера GRBL

Пришло время настроить наш контроллер. Это можно сделать как вручную через терминал, так и через некоторые интерфейсы. Через терминал отправляем команду «$$» и контроллер вернет нам текущие настройки, сохраненные в его памяти. Их немного, вот они:

$0=10 – Время подачи сигнала Step (шаг), мкс
$1=25 – Задержка перед уходом в Idle (режим простоя), мс. Если $1=255 то сигнал STEPPER_DISABLE_BIT будет всегда держать драйверы включенными после первой команды перемещения
$2=0 – Маска инвертирования сигналов Step (шаг)
$3=0 – Маска инвертирования сигналов Dir (направление)
$4=0 – Инвертировать сигнал Enable (включен)
$5=0 – Инвертировать входы концевых датчиков
$6=0 – Инвертировать сигнал Probe (датчик касания)
$10=0 – Маска параметров статуса от GRBL (Тип возвращаемых контроллером координат: MPos: — 1; WPos: — 0)
$11=0.010 – Отклонение при прохождении углов, мм (грубо говоря будет скругление, по сути аналогично G64)
$12=0.002 – Величина отрезка аппроксимированной до отрезков дуги, мм
$13=0 – Координаты от контроллера будут приходить в дюймах (если 1)
$20=0 – Разрешить программное ограничение рабочей области
$21=0 – Разрешить ограничение рабочей области по концевым датчикам
$22=0 – Разрешить процедуру базирования
$23=0 – Маска инвертирования направления поиска концевых датчиков
$24=25.000 – Скорость движения к начальной точке после базирования мм/мин
$25=500.000 – Скорость поиска концевых датчиков при базировании мм/мин
$26=250 – Задержка против электрического «дребезга» при срабатывании концевых датчиков, мс
$27=1.000 – Расстояние отъезда от концевых датчиков, мм
$30=1000 – Максимальная скорость шпинделя, об/мин
$31=0 – Минимальная скорость шпинделя, об/мин
$32=0 – Включить режим лазера
$100=250.000 – Число шагов на 1 мм по оси X, шаг/мм
$101=250.000 – Число шагов на 1 мм по оси Y, шаг/мм
$102=250.000 – Число шагов на 1 мм по оси Z, шаг/мм
//$103=250.000 – Число шагов на 1 мм по оси A, шаг/мм
//$104=250.000 – Число шагов на 1 мм по оси B, шаг/мм
//$105=250.000 – Число шагов на 1 мм по оси C, шаг/мм
$110=500.000 – Максимальная скорость перемещения по оси X, мм/мин
$111=500.000 – Максимальная скорость перемещения по оси Y, мм/мин
$112=500.000 – Максимальная скорость перемещения по оси Z, мм/мин
//$113=500.000 – Максимальная скорость перемещения по оси A, мм/мин
//$114=500.000 – Максимальная скорость перемещения по оси B, мм/мин
//$115=500.000 – Максимальная скорость перемещения по оси C, мм/мин
$120=10.000 – Ускорение по оси X, мм/с2
$121=10.000 – Ускорение по оси Y, мм/с2
$122=10.000 – Ускорение по оси Z, мм/с2
//$123=10.000 – Ускорение по оси A, мм/с2
//$124=10.000 – Ускорение по оси B, мм/с2
//$125=10.000 – Ускорение по оси C, мм/с2
$130=200.000 – Максимальное перемещение по оси X, мм
$131=200.000 – Максимальное перемещение по оси Y, мм
$132=200.000 – Максимальное перемещение по оси Z, мм
//$133=200.000 – Максимальное перемещение по оси A, мм
//$134=200.000 – Максимальное перемещение по оси B, мм
//$135=200.000 – Максимальное перемещение по оси C, мм

Изменить необходимый параметр можно отправив команду $номер параметра=новое значение, например: $100=300.

 Подробнее об остальных командах и о многом другом вы можете почитать в wiki GRBL или в файлах в папке doc/markdown проекта. Однако это не обязательно для обычного пользователя, скорее эта информация предназначена для разработчиков интерфейса.

Программное обеспечение для работы с контроллером

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

Самый, наверное, популярный проект Universal Gcode Sender, о нем мы еще поговорим в следующих статьях. Я попробовал «Universal Gcode Platform 2.0 [nightly] / Jul 15, 2018» — все работает из коробки, даже для версии с четырьмя осями. Хотя отображение и управление четвертой осью отсутствует, но код из файла выполняется корректно. Готовится поддержка четвертой оси. Также можно посылать команды вручную. Приятным дополнением является пульт на смартфоне! Достаточно просто распознать QR-код и перейти по ссылке в браузере! С классической версией Universal Gcode Sender всплывают ошибки, но тоже вроде всё работает.

Вторая программа совсем простенькая: GcodeSender. Все работает.

Третья программа совсем свежая OpenCNCPilot и мне она понравилась. Вроде тоже работает, поддержка четвертой оси скоро будет включена в релиз, пока работает, но неудобно. Релиз тут.

Ярослав Власов

P.S.

  1. ПРОШУ ВОПРОСЫ ПО ВОЗМОЖНОСТИ ЗАДАВАТЬ В ОБСУЖДЕНИИ ТЕМЫ НА ФОРУМЕ
  2. ТЕПЕРЬ ДОСТУПНЫ ВСЕ 6 ОСЕЙ! (29.12.2018)

13
Отправить ответ

Пожалуйста зарегистрируйтесь чтобы оставить комментарий
5 Comment threads
8 Thread replies
6 Followers
 
Most reacted comment
Hottest comment thread
6 Comment authors
deusex25Ilyaruslan_markivNespamЯрослав Recent comment authors
  Подписаться  
Notify of
shdn777
Участник
shdn777

Всё здорово — но почему то не включен ни один из сом портов(или я не нашёл на каких он ногах) — очень не хватает.
не подскажете как это сделать — а то я в программировании не силен . я использую grbl c блютузом и
https://play.google.com/store/apps/details?id=in.co.gorest.grblcontroller&hl=ru — комп для резки оказался не нужен и удобство сильно возрасло .

ruslan_markiv
Участник
ruslan_markiv

Привет!
«…Первоначально проект собирался в CooCox IDE, но я перенес его в Atollic true studio…» А можно перенести проект в Keil а то с Atollic true studio не могу никак разобратся что и как!

Nespam
Участник
Nespam

Привет! У меня тоже есть вопрос! Почему-то, появляется такое: Invalid project path: Include path not found (stm32grbl11\stm_lib\inc). в Atollic TrueSTUDIO for STM32 9.0.1!!!!! Что, это? Я бы не спрашивал, будь я хакером, или пенсионером-новатором, но я далек от того и от другого и вообще от программирования. А здесь потому, что наконец-то нашёл хоть что-то внятное для моих мозгов по bluepill — делаю первые шаги и мне не нужно как купить на Али а нужен CORTEX M3. А у вас прям вообще полный piout! И по этому мне ещё нужно узнать где(в какой папке) прячется этот: «.hex»? Я нашёл: C:\Atollic TrueSTUDIO… Read more »

Ilya
Участник
Ilya

Здравствуйте. Очень все классно сделано, наверняка повозиться пришлось с порОм из ардуинки на стм..
У меня вопрос, или даже скорее просьба, не могли бы вы подсказать, как бы добавить поддержку G95, для меня это важно, так как я собираю токарный по металлу с ЧПУ, а там иногда.. очень часто требуется синхронизация со шпинделем,
Конечно было бы неплохо еще и поддержку G76 )))
Или хотя бы подскажите, в какую сторону можно «копать», для самостоятельной реализации g95? можно принебреть доп. осями, например, в угоду расширения возможностей программной части..

deusex25
Участник
deusex25

Здравствуйте.
Скажите пожалуйста, а можно ли использовать GRBL в ЧПУ с порталом (т.н. gantry)? Например запараллелить оси Y и А без перекомпиляции проекта.
Можно ли в этом случае «заставить» их базироваться одновременно?