Введение
CNC-станки на базе прошивок GRBL (Arduino) и Marlin (3D-принтеры/ЧПУ) — основа современной мелкосерийной обработки. Однако ручное написание G-кода, мониторинг состояния шпинделя и коррекция траекторий требуют квалификации и времени. AI-агент ASI Biont решает эту проблему: вы просто описываете в чате, что нужно сделать — и агент сам генерирует G-код, отправляет его на станок через последовательный порт (Hardware Bridge), следит за выполнением и оповещает об ошибках. В статье разберём, как за 10 минут связать CNC-станок с AI-агентом и превратить его в «умный» станок с голосовым/текстовым управлением.
1. Что такое CNC-станок с GRBL/Marlin и зачем подключать к AI?
GRBL — open-source прошивка для контроллеров на Arduino, управляющая шаговыми двигателями по G-коду. Используется в гравировальных, фрезерных и лазерных станках. Marlin — более функциональная прошивка, популярна в 3D-принтерах, но также применяется в ЧПУ-станках. Обе прошивки принимают команды через последовательный порт (USB‑UART) и возвращают статусы (ok, error:..., позиции).
Зачем подключать к AI?
- Автоматическая генерация G-кода: вместо ручного написания «G00X10Y10Z5» вы пишете «сделай квадрат 50×50 мм с глубиной 2 мм» — AI с помощью LLM формирует нужные строки.
- Удалённый мониторинг: AI опрашивает станок каждые N секунд, логирует координаты, температуру шпинделя, фиксирует ошибки.
- Автоматизация цепочек: «обработай деталь A, затем отправь уведомление в Telegram, включи подсветку через MQTT».
- Интеграция с CAD/CAM: AI может сконвертировать SVG/DFX в G-код (через скрипты с библиотеками типа svg‑to‑gcode) и сразу отправить на станок.
2. Как ASI Biont подключается к CNC-станку?
Устройства на GRBL/Marlin общаются по последовательному порту (RS-232 через USB). ASI Biont подключается к ним двумя основными способами:
| Способ | Когда использовать | Что требуется |
|---|---|---|
| Hardware Bridge (COM-порт) | ПК напрямую подключен к станку через USB | bridge.py на том же ПК, Python 3.10+, websockets+pyserial |
| SSH + локальный агент | Станок подключён к Raspberry Pi / Jetson Nano по UART | Доступ к Pi по SSH, на Pi установлен pyserial |
| MQTT / HTTP | Станок оснащён ESP32 с прошивкой, ретранслирующей команды (редко) | MQTT-брокер или HTTP API |
На практике чаще всего используется Hardware Bridge — приложение, которое пользователь запускает на своём компьютере. Оно создаёт постоянное WebSocket-соединение с облаком ASI Biont и транслирует команды от AI в COM-порт. AI не имеет прямого доступа к порту (из-за безопасности облачной среды), поэтому bridge выступает доверенным посредником.
Установка и запуск bridge
- Зайдите в дашборд ASI Biont → Devices → Create API Key → скачайте
bridge.py. - Установите зависимости:
pip install pyserial requests websockets. - Запустите bridge с параметрами вашего порта:
bash python bridge.py --token=ВАШ_ТОКЕН --ports=COM3 --baud=115200
На Linux порт будет/dev/ttyUSB0. Можно указать несколько портов через запятую. - Bridge подключается к облаку и теперь готов принимать команды.
3. Управление станком через чат: примеры сценариев
3.1. Отправка G-кода одной командой
Пользователь пишет в чате: «Отправь на станок команду G90 (абсолютное позиционирование) и передвинь шпиндель в точку X=10 Y=20».
AI выполняет два последовательных вызова инструмента industrial_command:
# Шаг 1: переключение в абсолютный режим
industrial_command(
protocol="serial",
command="serial_write_and_read",
data="4739300d0a" # hex для "G90\\r\
"
)
# Шаг 2: движение в точку
industrial_command(
protocol="serial",
command="serial_write_and_read",
data="4730305831305932300d0a" # hex для "G00X10Y20\\r\
"
)
Как это работает? Bridge получает команду, преобразует hex-строку в байты через _parse_data_field(), отправляет в COM-порт через pyserial и сразу читает ответ (обычно ok или error:...). Ответ возвращается AI, который показывает его пользователю. Если станок не ответил в течение тайм-аута, bridge возвращает Error: timeout.
3.2. Чтение текущей позиции (опрос статуса)
GRBL/Marlin поддерживают команду ? (знак вопроса), возвращающую `<Idle
|Run|Hold|...|WPos:10.0,20.0,5.0|...>`.
AI может выполнять опрос через serial_write_and_read:
response = industrial_command(
protocol="serial",
command="serial_write_and_read",
data="3f0d0a" # hex для "?\\r\
"
)
# Парсим ответ в коде execute_python (если нужно дальше анализировать)
3.3. Автоматизация задачи по расписанию (с использованием execute_python)
Допустим, вам нужно каждые 10 минут проверять, не произошла ли ошибка на станке, и при появлении ALARM:... отправлять уведомление в Telegram.
AI пишет execute_python-скрипт (запускается в sandbox-окружении ASI Biont, таймаут 30 секунд):
import requests
# Функция отправки в Telegram (реальный токен и chat_id должны быть заданы пользователем)
def send_telegram(text):
url = f"https://api.telegram.org/bot{TOKEN}/sendMessage"
requests.post(url, json={"chat_id": CHAT_ID, "text": text})
# Симулируем опрос (на практике надо через industrial_command, но в этом скрипте его нет;
# лучше использовать комбинацию: ранее сохранённый ответ)
# Показываем логику:
last_response = "<Idle
|MPos:...|...>" # допустим, получен ранее
if "ALARM" in last_response:
send_telegram(f"Станок сообщил об ошибке: {last_response}")
Этот скрипт выполняется однократно; для периодического запуска используются расписания (cron-подобная система, встроенная в ASI Biont, настраиваемая через чат).
3.4. Генерация G-кода из текстового описания
Пользователь: «Напиши G-код для фрезеровки прямоугольника 100×60 мм, глубина 0.5 мм, центр в X=0 Y=0, сначала черновая, потом чистовая. Используй G17 (плоскость XY)».
AI (используя LLM) генерирует код вида:
G21 ; миллиметры
G90 ; абсолютное позиционирование
G17 ; плоскость XY
G00 Z5 ; безопасная высота
G00 X-50 Y-30 ; в левый нижний угол
G01 Z-0.5 F100 ; опускание
G01 X50 F200 ; грань 1
G01 Y30 ; грань 2
G01 X-50 ; грань 3
G01 Y-30 ; грань 4
G00 Z5
Затем вызывает industrial_command для каждой строки (или отправляет многострочный блок с паузами, изучая ответ ok). Bridge поддерживает атомарную запись+чтение, но для отправки последовательности AI может написать скрипт на execute_python, который через pyserial отправит список команд. Однако execute_python не имеет доступа к COM-порту — для этого нужен bridge. В текущей архитектуре AI может использовать serial_write_and_read много раз, ожидая ok после каждой строки. Это корректно.
Пример полной последовательности через чат:
1. AI: «Начинаю отправку G-кода. Отправляю G21...»
2. Вызов industrial_command(data="4732310d0a") → ответ ok
3. Вызов industrial_command(data="4739300d0a") → ответ ok
4. ...
5. AI: «Код выполнен. Станок закончил работу.»
4. Реальные кейсы автоматизации ЧПУ
Кейс 1. Малая мастерская
Мастер гравирует шильдики на лазерном станке с GRBL. Раньше он вручную писал G-код в Notepad. Теперь он говорит AI: *«Сделай гравировку текста
Комментарии