MCU - это micro-controller unit, то есть устройство, через которое в дальнейшем можно получить доступ к его портам, шинам, GPIO.
Каждый MCU предоставляет Klipper свои порты ввода-вывода, а так же шины данных, таких как SPI, i2c.
То есть к каждой MCU можно подключить различные устройства и управлять ими централизованно. Сама прошивка оперирует ими через блок [mcu]
в printer.cfg
.
Типовой пример блока выглядит следующим образом для Первого MCU:
[mcu]
serial: /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0
restart_method: command
Типовой пример последующих блоков MCU выглядят сделующим образом:
[mcu NAME]
serial: /dev/serial/by-id/usb-1a88_USB_Serial-if00-port0
restart_method: command
В данных блоках описывается:
serial
- Путь к MCU, для разных видов подключения он будет уникальным для каждого из MCUrestart_method
- метот перезапуска MCU Klipper'омДетальное описание данного блока приведено в Config_Reference#mcu
Перед началом подключения MCU - УБЕДИТЕСЬ что в прошивке MCU выбран соответствующий метод подключения, а так же что MCU плата ДЕЙСТВИТЕЛЬНО прошита соответствующей прошивкой.
В противном случае оно просто не будет работать!
В данном разделе рассмотрены основные моменты настройки подключения платы MCU по USB.
Из плюсов подключения по USB можно выделить следующие:
Из минусов можно выделить следующие:
Для определения и конфигурации плат необходимо подключиться к компьютеру с установленным Klipper по ssh.
В данной статье считается, что вся настройка идет от имени пользователя
pi
, а также, что утилитаsudo
настроена должным образом.
Первым делом нужно проверить наличие прав доступа, для этого выполняем следующую команду в консоли:
id
Вывод будет выглядить так:
uid=1000(pi) gid=1000(pi) groups=1000(pi),5(tty),20(dialout),27(sudo),44(video)
Если в списке, который выйдет после выполнения команды, отсутствует: tty
или dialout
, то добавляем пользователя в данные группы:
sudo usermod -aG tty,dialout $USER
Ниже рассмотрены несколько вариантов определения и конфигурации подключенных MCU через USB. Варианты ранжированы от наиболее рекомендуемого до нежелательного.
Для определения подключенных USB-устройств выполните следующую команду:
ls /dev/serial/by-id/*
Если плата уже прошита Клиппером, то вывод должен быть примерно следующим:
/dev/serial/by-id/usb-Klipper_lpc1769_22400019871C4AAFF9697C5DC22000F5-if00
Принтер определился как /dev/serial/by-id/usb-Klipper_lpc1769_22400019871C4AAFF9697C5DC22000F5-if00, запоминаем это.
Если плата определяется как
/dev/serial/by-id/usb-1a88_USB_Serial-if00-port0
то она работает через CH340 USB-UART конвертер, или аналогичный. Помните, что две платы с USB-UART конвертером будут определяться как одна. И для их правильной работы необходимо описывать их черезby-path
.
Если плата определяется в
lsusb
но при этом не видна в/dev/serial
, то возможно проблема в сервисеbrltty
. Проверить можно по наличию строчек сbrltty
в выводеdmesg
, проверить можно командой:sudo dmesg | grep brltty
. Проблема лечится двумя командами:
sudo systemctl mask brltty-udev.service
sudo systemctl stop brltty-udev.service
В случае если вы используете несколько однотипных плат, у которых нет собственных ids (Данная проблема присутствует для плат с USB основанном на чипе CH340), рекомендуется указывать подключение через путь (по номеру порта).
Для определения подключенных USB устройств выполните следующую команду:
ls /dev/serial/by-path/*
Результат выполнения должен быть примерно следующим:
ls /dev/serial/by-path/
platform-fd500000.pcie-pci-0000:01:00.0-usb-0:1.3:1.0-port0
pi@fluiddpi:~/klipper $
Принтер определился как /dev/serial/by-path/platform-fd500000.pcie-pci-0000:01:00.0-usb-0:1.3:1.0-port0, запоминаем это.
Также доступен вариант когда вы используете ссылку на USB устройства, которая создается в папке /dev. Данный метод является крайне нерекомендуемым, потому что при наличии нескольких USB устройств и/или в результате сбоя или любого подключения/отключения у вас может изменяться имя устройства например с /dev/ttyUSB0 на /dev/ttyUSB1, и делается это крайне непредсказуемым образом.
Для определения подключенных USB устройств выполните следующую команду:
ls /dev/ttyUSB*
Результат выполнения должен быть примерно следующим:
ls /dev/ttyUSB*
/dev/ttyUSB0
pi@fluiddpi:~/klipper $
Принтер определился как /dev/ttyUSB0, запоминаем это.
Обращаем Ваше внимание, что путь к принтеру /dev/ttyUSB0 может измениться из-за сбоя в прошивке, перезагрузке системы и в других интересных случаях. При этом он может начать определяться как /dev/ttyUSB1 или /dev/ttyUSB2. Выбирая этот метод, Вы сами создаете себе проблемы в будущем.
После определения платы, необходимо скопировать полный путь и с данной инфомацией переходить в Внесение изменений в конфигурацию
В данном разделе рассмотрены основные моменты по настройке соединения через UART.
Из плюсов подключения через UART можно выделить следующие:
Из минусов следующие:
Для определения и конфигурации плат необходимо подключиться к компьютеру с установленным Klipper по ssh.
В данной статье считается что вся настойка идет для пользователя
pi
, а также что утилитаsudo
настроена должным образом.
Первым делом нужно проверить наличие прав доступа, для этого выполняем следующую команду в консоли:
id
Вывод будет примерно следующий:
uid=1000(pi) gid=1000(pi) groups=1000(pi),5(tty),20(dialout),27(sudo),44(video)
Если в списке, который выйдет после выполнения команды, отсутствует tty
или dialout
, то добавляем пользователя в данные группы.
sudo usermod -aG tty,dialout $USER
Подключаемся к Raspberry по ssh и выполняем следующую команду:
sudo raspi-config
Для удобства представления информации используются вкладки с указанием шагов.
Выберите Interfacing Options
После выберите Serial
, чтобы включить UART;
Выберите No
, чтобы отключить консоль на последовательном порту;
Включить аппаратный последовательный порт, выберите Yes
;
Сообщение на экране будет выглядить так:
Необходимо внести изменения в /boot/config.txt
, для этого открываем его и вносим изменения:
sudo nano /boot/config.txt
Либо (Рекомендуемый способ для Raspberry Pi 4):
enable_uart=1 #включить UART
dtoverlay=miniuart-bt #переключить Bluetooth на miniuart
core_freq=250
Либо (Рекомендуемый способ для Raspberry Pi 2/3 ):
enable_uart=1 #включить UART
dtoverlay=disable-bt #выключить Bluetooth
core_freq=250
И теперь перезагружаем Rasperry Pi
sudo reboot
После выполнения этих действий и перезагрузки
ROpi
вы получите доступ к UART
Перед началом настройки проверьте распиновку Вашей платы, определите конкретный номер UART который выведен на пины вашей платы.
У каждой эти параметры отличаются, а следовательно будет отличаться настройка.
Рассмотрим на примере платы Orange Pi Zero2 подключение по UART:
Согласно официальной pinout таблице, у нее на гребенку выведен UART5
, таким образом для работы с ним, его необходимо включить в системе.
Для включения UART необходимо внести изменения в /boot/orangepiEnv.txt
(или armbianEnv.txt
в зафисимости от установленной системы) для это выполняем следующую команду:
sudo nano /boot/orangepiEnv.txt
Он может выглядеть следующим образом:
verbosity=1
bootlogo=false
console=both
disp_mode=1920x1080p60
overlay_prefix=sun50i-h6
rootdev=UUID=a98fbc77-5e00-45c3-b26a-6ac74f74412a
rootfstype=ext4
usbstoragequirks=0x2537:0x1066:u,0x2537:0x1068:u
Если строка overlays
отсутствует, то добавляем в конец файла строчку
overlays=uart5
Если же, в файле присутствует строка overlays
например:
overlays=spi-spidev i2c3
То в данном случае, добавлем через пробел от последней записи uart5
, так как пробел является разделителем оверлев.
overlays=spi-spidev i2c3 uart5
Если файл будет содержать несколько строк
overlays=
, то вторая строка и все последующие строчки с оверлеями будут игнорироваться. Система работает только с первой строкойoverlays
.
После сохранения изменений, для того чтобы они вступили в силу - перезагружаем систему:
sudo reboot
OrangePi 3 LTS для UART подключения использует оверлей
uart3
и устройство/dev/ttyS3
OrangePi Zero 3 для UART подключения использует оверлей
ph-uart5
и устройство/dev/ttyS5
Для определения подключенных UART устройств выполните следующую команду:
ls -al /dev/ttyAMA*
Вывод будет содержать следующую информацию:
pi@fluiddpi:~ $ ls -al /dev/ttyAMA*
crw-rw---- 1 root dialout 204, 64 Oct 19 17:56 /dev/ttyAMA0
pi@fluiddpi:~ $
Устройство определилось как /dev/ttyAMA0
. В случае если устройства /dev/ttyAMA
не определились, проверяем второй командой:
ls -al /dev/ttyS*
Вывод будет содержать следующую информацию:
pi@fluiddpi:~ $ ls -al /dev/ttyS*
crw-rw---- 1 root dialout 4, 64 Sep 19 17:27 /dev/ttyS0
pi@fluiddpi:~ $
Устройство определилось как /dev/ttyS0
.
На одноплатных компьютерах Orange Pi номер
UARTN
будет соответствовать устройству/dev/ttySN
, то есть если используетсяUART3
то устройство будет находиться по адресу/dev/ttyS3
После определения платы, необходимо скопировать полный путь и с данной инфомацией переходить в Внесение изменений в конфигурацию
Другой метод, набирающий популярность с точки зрения подключения MCU
к Klipper
. Из основных приемуществ для CAN нужно 4 провода: VCC, GND, CAN-L и CAN-H. А дальше уже сам модуль из VCC на 12/24V сделает все сам, для себя получит VCC_3.3, для концевиков и датчиков VCC_5V, некоторые ревизии плат позволяют даже получать для вентиляторов 5/12/24V.
К минусам же CAN можно отнести то, что почти все одноплатные компьютеры не умеют взаимодействовать с CAN шиной напрямую без дополнительных модулей или плат расширений. Толчком к дополнительной популярности этой шины стали изменения которые прошли в самой прошивке Klipper
которая позволила использовать CAN модули на платах, таких как BTT Octopus, чтобы создать мост USB-CAN и уже потом подключать к шине дополнительные MCU.
В отличии от UART подключения, где обязательно подключать сигнальные провода TX-RX / RX-TX, для CAN шины важно чтобы все устройства подключенные к шине подключались CAN-L к CAN-L и CAN-H к CAN-H.
Схематику шины можно представить следующим образом:
В данном примере мы рассмотрим вариант подключения CAN шины на примере следующей связки:
BTT Octopus в состоянии работать как USB to CAN bus bridge
, что позволяет отказаться от использования BTT U2C
модуля или его аналогов среди других производителей. Учитывая это у нас будет прямая связь между BTT Octopus и BTT Ebb36 по проводам CAN шины.
Для удобства представления информации используются вкладки с указанием шагов
Подготавливаем прошивку для платы BTT Octopus
cd ~./klipper
make menuconfig
Данные настройки подходят исключительно к BTT Octopus STM32F446, для других чипов настройки будут отличаться!
Из конфигурации выше видно:
Сохраняем, выходим, компилируем:
make
и прошиваем плату. После чего переходим к следующему шагу.
После успешного выполнения предыдущего шага, проверяем:
lsusb
В результате мы должны увидеть CAN adapter
В данном случае видно что у нас появился CAN адаптер, теперь необходимо его сконфигурировать, для этого выполняем следующую команду:
sudo nano /etc/network/interfaces
И прописываем в него следующее:
allow-hotplug can0
iface can0 can static
bitrate 500000
up ifconfig $IFACE txqueuelen 256
pre-up ip link set can0 type can bitrate 500000
pre-up ip link set can0 txqueuelen 256
Обратите внимание, что в двух местах здесь (после слова bitrate
) необходимо вставить скорость, которая была указана при конфигурации прошивки на предыдущем этапе (параметр CAN bus speed
).
После этого сохраняем и перезагружаем host.
После перезагрузки проверяем наличие can0
шины:
ip a
Переходим к заключительному этапу - второму MCU на CAN шине.
В целом, методы прошивки MCU идентичны первому шагу, за исключением того что у нас будет:
cd ~klipper
make menuconfig
make
и последующая прошивка ebb36.
После перезагрузки проверяем наличие can0 шины
~/klippy-env/bin/python ~/klipper/scripts/canbus_query.py can0
В моем случае нашлось два устройства:
Поэтому на данном этапе нормально что у Вас только одно устройство и один номер, если вывод будет 0, то это означает только два вариванта:
Если ранее обнаруженная плата является единственной подключенной к Klipper, то открываем файл printer.cfg.
restart_method определяется процессором используемым MCU. И отличается для разных плат. Для правильной конфигурации этого поля обратитесь к Config_Reference. А так же к типовым конфигурациям плат.
Для удобства представления информации используются вкладки с указанием вариантов.
Считаем что устройство определилось как: /dev/serial/by-id/usb-Klipper_lpc1769_22400019871C4AAFF9697C5DC22000F5-if00
В нем ищем секцию:
[mcu]
serial: /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0
restart_method: command
и приводим ее к виду:
[mcu]
serial: /dev/serial/by-id/usb-Klipper_lpc1769_22400019871C4AAFF9697C5DC22000F5-if00
restart_method: command
В случае если используется несколько MCU (например две платы BTT SKR 1.4), необходимо созать новый раздел [MCU] в printer.cfg.
Для этого в файле printer.cfg создадим новый раздел [MCU]
и назовем нашу дополнительную плату secMCU:
[mcu secMCU]
serial: /dev/serial/by-id/usb-Klipper_lpc1769_22400019871C4AAFF9697C5DC22000F5-if00
restart_method: command
В дальнейшем для обращения ко второй плате необходимо будет прописывать ее пины следующим образом: secMCU:PA11
или secMCU:P.02
, в зависимости от названия этих пинов на самой плате.
Обращаю внимание, что количество MCU, которым может управлять Klipper
ограничивается только количеством доступных портов.
Считаем что устройство определилось как: /dev/ttyAMA0
В нем ищем секцию:
[mcu]
serial: /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0
restart_method: command
и приводим ее к виду:
[mcu]
serial: /dev/ttyAMA0
restart_method: command
В случае если используется несколько MCU (например две платы BTT SKR 1.4), необходимо созать новый раздел [MCU] в printer.cfg.
Для этого в файле printer.cfg создадим новый раздел [MCU]
и назовем нашу дополнительную плату secMCU:
[mcu secMCU]
serial: serial: /dev/ttyAMA0
restart_method: command
В дальнейшем для обращения ко второй плате необходимо будет прописывать ее пины следующим образом: secMCU:PA11
или secMCU:P.02
, в зависимости от названия этих пинов на самой плате.
Обращаю внимание, что количество MCU, которым может управлять Klipper
ограничивается только количеством доступных портов.
Считаем что устройство определилось как: 45ecebfa5182
В нем ищем секцию:
[mcu]
serial: /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0
restart_method: command
и приводим ее к виду:
[mcu]
canbus_uuid: 45ecebfa5182
В случае если используется несколько MCU (например несколько CAN устройствов на одной шине), необходимо созать новый раздел [MCU] в printer.cfg.
Для этого в файле printer.cfg создадим новый раздел [MCU]
и назовем нашу дополнительную плату secMCU:
[mcu secMCU]
canbus_uuid: 45ecebfa5182
Для использования микроконтроллера ROpi
[1] как MCU
с целью получения доступа к его шинам SPI, i2c и просто к GPIO, необходимо установить и запустить исполняемый модуль Klipper и на нем.
Для этого необходимо чтобы исполняемая часть MCU
на ROpi
запускалась раньше, чем загрузится Klipper
, для этого выполняем следующие действия:
cd ~/klipper/
sudo cp ./scripts/klipper-mcu.service /etc/systemd/system/
sudo systemctl enable klipper-mcu.service
Действиями выше, был создан новый элемент автозапуска, и добавлен в скрипты загрузки.
Далее необходимо создать прошивку для ROpi
контроллера, для этого можно воспользоваться пунктом 4. Advanced в KIAUH, либо вручную выполняем:
cd ~/klipper/
make menuconfig
В меню конфигурации, следует выбрать архитектуру процессора как Linux process
, нажимаем Q и сохраняем изменения.
Теперь установим исполняемую часть на ROpi
:
make
sudo service klipper stop
make flash
sudo service klipper start
Теперь необходимо внести изменения в printer.cfg
, чтобы Klipper
смог получить доступ к MCU ROpi
[mcu host]
serial: /tmp/klipper_host_mcu
После выполнения этих действий и перезагрузки
ROpi
вы получите доступ к шинам и GPIO вашего одноплатного компьютера.
Если в логе
klippy.log
указывается об невозможности открыть файл/tmp/klipper_host_mcu
по причине отсутствия прав (Permission denied), добавьте права доступа:
sudo usermod -aG tty,dialout $USER
Если во время печати вы регулярно получаете ошибку следующего плана:
"Lost communication with MCU 'mcu'
Once the underlying issue is corrected, use the
"FIRMWARE_RESTART" command to reset the firmware, reload the
config, and restart the host software.
Printer is shutdown"
То это значит, что у вас рвётся соединение между платой MCU и микрокомпьютером. Проблем может быть несколько:
В этом случае мы рекомендуем первоначально изучиить log файл klippy.log
. А так же вывод команды:
dmesg
Для соединения плат используется 3 провода с DuPont разъемами.
SKR 1.3 Pin | Цвет | Raspberry Pin |
---|---|---|
GND | Черный | GPIO6_GND |
P0.3_RXD | Красный | GPIO8_TXD |
P0.2_TXD | Желтый | GPIO10_RXD |
Помни, Люк, они — не пидары, поэтому TX тыкает в чужую RX, а ТХ в TX не тыкает!
Конфигурируем прошивку
cd ~/klipper/
make menuconfig
Устанавливаем настройки как на картинке ниже:
И собираем прошивку:
make
Копируем файл klipper.bin
на sd-карту, переименовываем в firmware.bin
, вставляем в принтер и включаем его.
Подключение к плате MKS RobinNano 1.2 осуществляется через порт UART, который расположен на разъеме, предназначенном для Wi-Fi Карты. Естественно, Wi-Fi плата при этом снимается.
Со стороны Raspberry Pi подключаем пины 8, 10 и 9.
Помни, Люк, они — не пидары, поэтому в твой RX тыкает чужой TX, и в чужой RХ тыкает твой TX
MSK RobinNano 1.2 Pin | Цвет | Raspberry Pin |
---|---|---|
GND | Коричневый | GPIO6_GND |
TX-PA9 | Красный | GPIO10_RXD |
RX-PA10 | Оранжевый | GPIO8_TXD |
Далее пересобираем прошивку MCU:
cd ~/klipper
make menuconfig
И устанавливаем параметры как на скриншотах:
Выбираем в Communication interface
USART1:
Baud rate оставляем 250000.
Выходим, собираем прошивку и конвертируем в файл Robin nano:
make
./scripts/update_mks_robin.py out/klipper.bin out/Robin_nano.bin
Скорее всего файл Robin_nano.bin придётся переименовать в ROBIN_NANO35.bin для прошивки в принтер. Заливаем файл на sd карту и перешиваем принтер.
Для подключения по UART платы Chitu V6 нам нужны пины на Wi-Fi разъёме:
Таблица соединения следующая:
Chitu V6 Pin | Цвет | Raspberry Pin |
---|---|---|
WiFi_Pin1_GND | Черный | GPIO9_GND |
WiFi_Pin2_RX | Белый | GPIO8_TXD |
WiFi_Pin7_TX | Серый | GPIO10_RXD |
Помни, Люк, они — не пидары, поэтому в твой RX тыкает чужой TX, и в чужой RХ тыкает твой TX
На практике это будет выглядить так:
Настраиваем прошивку
cd ~/klipper/
make menuconfig
Параметры устанавливаем как на скриншотах:
Выставляем Baud rate 230400
Собираем и конвертируем прошивку:
make
./scripts/update_chitu.py ./out/klipper.bin ./out/update.cbd
Заливаем update.cbd на sd карту и прошиваете принтер. Не забываем после прошивки принтер перезапустить.
Так как используемый
Baud rate
отличается от значения по умолчанию - то вносим изменения в конфигурационный файлprinter.cfg
[mcu]
serial: /dev/serial0
restart_method: command
baud: 230400
Для подключения используются три провода, то необходимые для нас GPIO на Raspberry это: 6-GND,8-TXD,10-RXD. Подключаем их к плате принтера на IDC10 - EXP1:
Creality Pin | Цвет | Raspberry Pin |
---|---|---|
GND | Черный | GPIO6_GND |
PB11_RXD | Коричневый | GPIO8_TXD |
PB10_TXD | Красный | GPIO10_RXD |
Помни, Люк, они — не пидары, поэтому в твой RX тыкает чужой TX, и в чужой RХ тыкает твой TX
Цоколевка колодки IDC_10 - EXP1 (ключ по левую руку) следующая:
IDC_10 - EXP1 | |
---|---|
PC6 | PB2 (LM2596) |
PB10 (USART) | PB11 (USART) |
PB14 (ADXL) | PB13 (ADXL) |
PB12 (ADXL) | PB15 (ADXL) |
GND (USART) | VCC_5V |
Необходимые контакты выделены жирным
Настраиваем прошивку:
cd ~/klipper
make menuconfig
Включаем low-level configuration options
:
В разделе communication interface
выбираем Serial (on USART3 PB11/PB10)
Нужно запомнить Baud rate, потом эта цифра перейдет в конфиг Klipper
Собираем прошивку и заливаем файл в принтер.
make
Вносим коррективы в printer.cfg
, тут в параметре baud
указываем то же значение, что и на этапе прошивки.
[mcu]
serial: /dev/ttyAMA0
baud: 115200
restart_method: command
ROpi это сокращение для одноплатных компьютеров семейств Raspberry Pi и Orange Pi ↩︎