Найти в Дзене
Руслан Демиров

Выносной пульт для CNC (MPG pendant) на базе контроллера джойстика freejoy для linuxcnc

Разработка "Лаборатории Электроники", г. Евпатория После сборки станка ЧПУ, возникла необходимость удобного оперативного управления для подготовки станка к работе. В мире ЧПУ давно используют для этой цели выносные пульты с энкодером, так называемые MPG pendant. Например вот такой пульт имеет полную поддержку в linuxcnc: Однако, покупать подобный пульт не интересно. Во-первых, цена. Сложно найти подобный пульт дешевле 10 тысяч рублей. Во-вторых, функционал. Хочется, чтобы пульт был "под себя", максимально удобный согласно своих предпочтений. В-третьих, зачем покупать дорого то, что можно сделать дешево самому? В итоге, эта статья, как я делал подобный пульт и что из этого получилось :) В качестве аппаратной платформы используется замечательный проект freejoy. Кстати, создатель - наш соотечественник, что примечательно, так как в FreeJoyWiki есть подробнейшее описание на русском языке. Freejoy представляет из себя реализацию джойстика на микроконтроллере stm32f103. Данная реализация поз
Оглавление

Разработка "Лаборатории Электроники", г. Евпатория

Предисловие:

После сборки станка ЧПУ, возникла необходимость удобного оперативного управления для подготовки станка к работе. В мире ЧПУ давно используют для этой цели выносные пульты с энкодером, так называемые MPG pendant. Например вот такой пульт имеет полную поддержку в linuxcnc:

Популярный пульт xhc-hb04
Популярный пульт xhc-hb04

Однако, покупать подобный пульт не интересно.

Во-первых, цена. Сложно найти подобный пульт дешевле 10 тысяч рублей.

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

В-третьих, зачем покупать дорого то, что можно сделать дешево самому?

В итоге, эта статья, как я делал подобный пульт и что из этого получилось :)

1. Аппаратное обеспечение

1.1. Основа

В качестве аппаратной платформы используется замечательный проект freejoy. Кстати, создатель - наш соотечественник, что примечательно, так как в FreeJoyWiki есть подробнейшее описание на русском языке.

Freejoy представляет из себя реализацию джойстика на микроконтроллере stm32f103. Данная реализация позволяет делать игровые контроллеры с впечатляющими возможностями, для примера одних только кнопок может быть до 128 штук! Ну очень большое пространство для творчества. Также к контроллеру есть очень удобная утилита для его настройки.

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

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

1.2. Реализация

В пульте используются следующие компоненты:

  • MPG энкодер. На 100 положений на оборот. Самая дорогая часть пульта. Куплен на озоне, но можно и с Али заказать, но не факт что будет дешевле. Вот такой:
-2
  • Малогабаритный галетный переключатель на 6 положений. Ограничитель переставлен на 5 положений. Используется в выборе оси управления (X, Y, Z, A) и положение 0 (оси отключены).
  • 18 кнопок:
  1. Кнопка Пауза/Продолжить.
  2. Кнопка Старт программы обработки.
  3. Кнопка "Probe"
  4. Кнопка аварийной остановки.
  5. Уменьшение скорости холостого хода.
  6. Увеличение скорости холостого хода.
  7. Уменьшение скорости подачи
  8. Увеличение скорости подачи.
  9. Включение/выключение шпинделя.
  10. Уменьшение скорости шпинделя.
  11. Увеличение скорости шпинделя.
  12. Парковка в домашнюю позицию всех осей (homing).
  13. Установка оси X в 0 в относительных координатах.
  14. Установка оси Y в 0 в относительных координатах.
  15. Установка оси Z в 0 в относительных координатах.
  16. Шаг энкодера 1 см / оборот. Выбор режима подсвечивается светодиодом.
  17. Шаг энкодера 0.1 см / оборот. Выбор режима подсвечивается светодиодом.
  18. Шаг энкодера 0,01 см / оборот. Выбор режима подсвечивается светодиодом.

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

Схема пульта
Схема пульта

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

1.3. Результат

Пульт получился удобным и компактным.

При подключении к компьютеру (с записанной прошивкой) пульт определяется как джойстик с двумя осями и 23 кнопками. Осталось "подружить" пульт с linuxcnc.

2. Программное обеспечение

2.1. Общее описание

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

1. Записать прошивку в контроллер и настроить контроллер пульта утилитой FreeJoyQt. Это все скачивается свободно с гитхаба. Я прошивал контроллер через st-link, но можно (вроде как) и через usb в режиме dfu и, даже, через утилиту настройки. По крайней мере возможность такая там есть. Прошивку лучше брать свежую, не ниже версии 1.7.

2. Настроить джойстик в Linux.

3. Настроить сам linuxcnc путем внесения изменений в файл конфигурации и файл custom.hal

Сам linuxcnc установлен на старенький компьютер с Intel Сore2duo и 4GB оперативной памяти. Образ самый свежий на момент написания данной статьи, версия 2.9.3 на debian 12.

Дальше по порядку с описанием "подводных камней" (куда уж без них :)

2.2. Настройка FreeJoy

Будем считать, что контроллер мы прошили удачно, и в системе появился джойстик. Linux, кстати, безо всяких проблем сразу подхватывает джойстик и он видится в системе как freejoy.

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

В процессе сопряжения контроллера с linuxcnc было несколько неприятных моментов, связанных с передачей сигнала от энкодера. "Сквозное" подключение выводов энкодера как кнопок работало нестабильно и только на малых скоростях перемещения энкодера. По моему мнению, связано это с тем, что при передаче информации через USB, фронты сигналов квадратурного энкодера сглаживались freejoy-ем, и стандартный компонент подсистемы hal: encoder начинал сбоить. Все-таки не предназначен игровой контроллер для точной передачи фаз нажимания кнопок :(

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

2.3. Настройка джойстика в linux

Хоть контроллер и определяется автоматически в системе как джойстик, но настройки его типичные для джойстика и нам не подходят. Связано это с тем, что в системе значения мертвой зоны и сглаживания устанавливаются очень высокими. А у нас перемещения точные, до единицы.

Решается это несколькими путями. Можно перекомпилировать модуль ядра с нужными параметрами. Можно написать правило udev для настройки контроллера в момент включения (самый правильный вариант). А можно давать команду через evdev-joystick для установки нужных параметров.

С udev сразу не срослось, разбираться было некогда, поэтому создал скрипт freejoy-set.sh в каталоге /usr/local/bin с командой exec /usr/bin/evdev-joystick --e /dev/input/by-id/usb-FreeJoy_Handwhell-emc2-event-joystick --d 0 --f 0 и добавил ссылку на скрипт в начало файла /usr/bin/linuxcnc вида:

exec /usr/local/bin/freejoy-set.sh &

Теперь при каждом запуске linuxcnc применяются параметры для настройки контроллера. В принципе, команду настройки джойстика можно вставить прямо в файл linuxcnc, только не забыть добавить & в конце команды.

2.4. Настройка linuxcnc

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

К моей большой радости, так как сама система linuxcnc является свободной разработкой, у нее очень развитая документация, в том числе, частично на русском языке. Правда, не все работает так как описано :) Со свободным ПО так бывает.

Для связи пульта с linuxcnc, необходимо сделать следующее (linuxcnc должна быть настроена и создана конфигурация станка):

  1. Отредактировать файл custom.hal в каталоге с конфигурацией станка, либо просто скопировать с заменой прилагаемый к статье файл.
  2. Добавить в ini файл из каталога конфигурации секцию [HALUI] со следующими командами MDI режима:
[HALUI]
MDI_COMMAND = G10 L20 P0 X0 ( Set X to zero )
MDI_COMMAND = G10 L20 P0 Y0 ( Set Y to zero )
MDI_COMMAND = G10 L20 P0 Z0 ( Set Z to zero )

3. Заключение

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

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