Разработка "Лаборатории Электроники", г. Евпатория
Предисловие:
После сборки станка ЧПУ, возникла необходимость удобного оперативного управления для подготовки станка к работе. В мире ЧПУ давно используют для этой цели выносные пульты с энкодером, так называемые MPG pendant. Например вот такой пульт имеет полную поддержку в linuxcnc:
Однако, покупать подобный пульт не интересно.
Во-первых, цена. Сложно найти подобный пульт дешевле 10 тысяч рублей.
Во-вторых, функционал. Хочется, чтобы пульт был "под себя", максимально удобный согласно своих предпочтений.
В-третьих, зачем покупать дорого то, что можно сделать дешево самому?
В итоге, эта статья, как я делал подобный пульт и что из этого получилось :)
1. Аппаратное обеспечение
1.1. Основа
В качестве аппаратной платформы используется замечательный проект freejoy. Кстати, создатель - наш соотечественник, что примечательно, так как в FreeJoyWiki есть подробнейшее описание на русском языке.
Freejoy представляет из себя реализацию джойстика на микроконтроллере stm32f103. Данная реализация позволяет делать игровые контроллеры с впечатляющими возможностями, для примера одних только кнопок может быть до 128 штук! Ну очень большое пространство для творчества. Также к контроллеру есть очень удобная утилита для его настройки.
В пульте используется реализация на базе широко распространенного модуля, известного как bluepill. В принципе, можно использовать микроконтроллер с обвязкой, но это дольше, а время, как известно, самый ценный ресурс.
В этой реализации используется ограниченный набор кнопок, удобный лично мне. Но никто не мешает добавить еще кнопок к контроллеру.
1.2. Реализация
В пульте используются следующие компоненты:
- MPG энкодер. На 100 положений на оборот. Самая дорогая часть пульта. Куплен на озоне, но можно и с Али заказать, но не факт что будет дешевле. Вот такой:
- Малогабаритный галетный переключатель на 6 положений. Ограничитель переставлен на 5 положений. Используется в выборе оси управления (X, Y, Z, A) и положение 0 (оси отключены).
- 18 кнопок:
- Кнопка Пауза/Продолжить.
- Кнопка Старт программы обработки.
- Кнопка "Probe"
- Кнопка аварийной остановки.
- Уменьшение скорости холостого хода.
- Увеличение скорости холостого хода.
- Уменьшение скорости подачи
- Увеличение скорости подачи.
- Включение/выключение шпинделя.
- Уменьшение скорости шпинделя.
- Увеличение скорости шпинделя.
- Парковка в домашнюю позицию всех осей (homing).
- Установка оси X в 0 в относительных координатах.
- Установка оси Y в 0 в относительных координатах.
- Установка оси Z в 0 в относительных координатах.
- Шаг энкодера 1 см / оборот. Выбор режима подсвечивается светодиодом.
- Шаг энкодера 0.1 см / оборот. Выбор режима подсвечивается светодиодом.
- Шаг энкодера 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 должна быть настроена и создана конфигурация станка):
- Отредактировать файл custom.hal в каталоге с конфигурацией станка, либо просто скопировать с заменой прилагаемый к статье файл.
- Добавить в 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. Заключение
Получился вполне себе удобный функциональный пульт. К тому-же, еще и недорогой совсем.
Файлы для самостоятельного изготовления и подключения пульта можно скачать по ссылке с Яндекс диска. Там же есть небольшое видео с демонстрацией работы пульта. К сожалению, дзен не дает вставить видео в статью напрямую.