Надо в первую очередь, придумать как останавливать при отпускании кнопки.
А если попробовать через это:
$~ — Начать цикл
Начало цикла или команда возобновления, которая может быть введена в любой момент, так как это
команда реального времени. Когда Grbl имеет движения в очереди в буфере и готов идти,
$~ команда запуска цикла начнет выполнение буфера и Grbl начнет перемещение осей. Однако,
по умолчанию, запуск автоматического цикла включен, так что новые пользователи не будут
нуждаться в этой команде, если только не выполняется блокировка подачи . Когда блокировка
подачи выполняется, запуск цикла возобновит программу. начало цикла будет эффективным только
при наличии движения в буфере готового пойти и не будет работать с любым другим процессом, как цикл самонаведения.
$! — Удерживать подачу
Команда блокировки подачи приведет активный цикл к остановке с помощью контролируемого замедления,
чтобы не потерять позиции. В режиме реального времени и может быть активировано в любое время.
После завершения или паузы, Grbl будет ждать, Начала цикла до появления команды, чтобы возобновить
программу. Удержание подачи может только приостановить цикл и не повлияет на самонаведение или любой
другой процесс.
Если вам нужно остановить цикл в середине программы и не можете позволить себе потерять позиции,
выполните удержание подачи, чтобы помочь Grbl довести все до контролируемой остановки. После завершения,
вы можете сделать перезагрузку. Всегда старайтесь выполнить захват подачи, когда машина работает до
резкого сброса, за исключением, конечно, если есть какая-то чрезвычайная ситуация.
То есть организовать замкнутый цикл ($~G1 X1) по условию кнопки. Иначе выйти ($!)