Для калибровки Input Shaping в Klipper есть возможность использовать акселерометр. На данный момент поддерживается adxl345 с подключением по SPI, а так же MPU-6000/9000 с подключением по I2C. Подключить акселерометр можно к любому mcu, в том числе к хосту с клиппером (через linux proccess mcu). Можно подключить к плате принтера и, если нет свободного аппаратного SPI, использовать программную эмуляцию. В обоих случаях (при подключении к хосту и при подключении к плате принтера) длина проводов до датчика получается достаточно большой. Иногда это приводит к проблемам с подключением. Для решения этой проблемы можно использовать отдельный mcu, который будет подключаться только для работы с акселерометром и подключать его к хосту по USB.
Наиболее удобным способом, на мой взгляд, является использование RP2040-Zero. Эта плата не очень распространена и её может не быть под рукой. В этом отношении, отладочная плата на stm32f103 BluePill гораздо доступнее.
В этом описании я предполагаю, что у целевой аудитории нет опыта программирования stm32 и работы с stlink. Поэтому для прошивки платы будет использоваться UART, а все операции сделаны непосредственно с хоста с клиппером (в данном случае Orange Pi 3 LTS).
Для начала нужно собрать прошивку, которая будет работать внутри BluePill:
cd ~/klipper
make clean
make menuconfig
make
- "cd ~/klipper" - перейдет в каталог klipper в домашнем каталоге текущего пользователя ( "~" будет заменена на /home/username)
- "make clean" - очистит от результатов предыдущих сборок
- "make menuconfig" - запуск графического конфигуратора
- "make" - запустит процесс сборки прошивки
Параметры для сборки:
- Microcontroller Architecture: STMicroelectronics STM32
- Processor Model: STM32F103
- Bootloader offset: No bootloader
- Communication interface: USB on PA11/PA12
После сборки, готовая прошивка будет находится в ~/klipper/out/klipper.bin
Микроконтроллеры семейства STM32 имеют встроенный загрузчик, записанный при производстве. Этот загрузчик невозможно стереть или повредить, он находится в отдельной области памяти. Этот загрузчик позволяет прошивать МК без использования программатора, через различные интерфейсы, в том числе USB, UART, CAN. К сожалению, в STM32F103 нет поддержки прошивки через USB. Встроенный загрузчик поддерживает прошивку только через UART. Используется USART1 на выводах PA10 (RX) и PA9 (TX).
Для работы с UART на Orange PI 3 LTS необходимо включить его поддержку. Как видно из схемы выводов, доступен только UART3 на выводах PD24 и PD23. Для включения UART нужно добавить overlay в device tree. Для этого нужно в файл /boot/armbianEnv.txt добавить параметр "overlays=uart3".
Открываем для редактирования:
sudo nano /boot/armbianEnv.txt
Если параметра overlays нет, то просто нужно добавить строку "overlays=uart3":
verbosity=1
bootlogo=false
console=both
disp_mode=1920x1080p60
overlay_prefix=sun50i-h6
rootdev=UUID=744f5f5c-30b2-4c6e-baf2-e77811681450
rootfstype=ext4
overlays=uart3
Если параметр overlays уже есть, то нужно добавить "uart3" через пробел, например:
verbosity=1
bootlogo=false
console=both
disp_mode=1920x1080p60
overlay_prefix=sun50i-h6
rootdev=UUID=744f5f5c-30b2-4c6e-baf2-e77811681450
rootfstype=ext4
overlays=spi-spidev1 uart3
После перезагрузки проверяем, что появился UART3:
sergey@orangepi3-lts:~$ dmesg |grep serial
[ 2.717967] 5000000.serial: ttyS0 at MMIO 0x5000000 (irq = 35, base_baud = 1500000) is a 16550A
[ 2.722228] 5000c00.serial: ttyS3 at MMIO 0x5000c00 (irq = 36, base_baud = 1500000) is a 16550A
[ 4.786858] systemd[1]: Created slice system-serial\x2dgetty.slice.
- "dmesg" - выводит отладочные сообщения от ядра
- "grep serial" - сортирует вывод от dmesg и выводи только строки в которых есть слово serial
Как видно, есть два serial устройства ttyS0 и ttyS3. ttyS0 это отладочная консоль на UART0 (3 пина рядом с hdmi разъемом). А ttyS3 это добавленный UART3.
Соединение BluePill и Orange PI 3 LTS для прошивки:
BluePill | OrangePI 3 LTS |
---|---|
3.3V | 3.3V |
GND | GND |
PA10 (RX) | PD23 (TX) |
PA9 (TX) | PD24 (RX) |
Для запуска BluePill в режиме загрузчика нужно перед подачей питания ногу обозначенную как boot0 притянуть к 3.3в. На bluepill для этого сделана отдельная перемычка. Её нужно переставить в положение "1", как на картинке:
Удобнее всего сделать все подключения при выключенной Orange PI 3 LTS, поставить перемычку на BluePill, но не подключать линию 3.3В. После включения Orange Pi и подключени по ssh, подключить 3.3в и проверить, что плата подключается:
sergey@orangepi3-lts:~/klipper$ sudo stm32flash /dev/ttyS3
stm32flash 0.5
http://stm32flash.sourceforge.net/
Interface serial_posix: 57600 8E1
Version : 0x22
Option 1 : 0x00
Option 2 : 0x00
Device ID : 0x0410 (STM32F10xxx Medium-density)
- RAM : Up to 20KiB (512b reserved by bootloader)
- Flash : Up to 128KiB (size first sector: 4x1024)
- Option RAM : 16b
- System RAM : 2KiB
Если подключение удалось, можно прошить плату собранной прошивкой:
sergey@orangepi3-lts:~/klipper$ sudo stm32flash -w ~/klipper/out/klipper.bin -v -g 0x0 /dev/ttyS3
stm32flash 0.5
http://stm32flash.sourceforge.net/
Using Parser : Raw BINARY
Interface serial_posix: 57600 8E1
Version : 0x22
Option 1 : 0x00
Option 2 : 0x00
Device ID : 0x0410 (STM32F10xxx Medium-density)
- RAM : Up to 20KiB (512b reserved by bootloader)
- Flash : Up to 128KiB (size first sector: 4x1024)
- Option RAM : 16b
- System RAM : 2KiB
Write to memory
Erasing memory
Wrote and verified address 0x08006400 (100.00%) Done.
Starting execution at address 0x08000000... done.
Если запись и проверка завершилась успешно, можно отключить BluePill от Orange PI, переставить обратно перемычку boot0 и попробовать подключить по USB. Перед подключением можно открыть лог, для отображения новых сообщений:
sergey@orangepi3-lts:~$ sudo tail -f /var/log/syslog
Mar 7 13:10:00 orangepi3-lts systemd[1]: sysstat-collect.service: Succeeded.
Mar 7 13:10:00 orangepi3-lts systemd[1]: Finished system activity accounting tool.
Mar 7 13:12:22 orangepi3-lts kernel: [ 1164.531003] usb 5-1: new full-speed USB device number 2 using ohci-platform
Mar 7 13:12:22 orangepi3-lts kernel: [ 1164.766041] usb 5-1: New USB device found, idVendor=1d50, idProduct=614e, bcdDevice= 1.00
Mar 7 13:12:22 orangepi3-lts kernel: [ 1164.766083] usb 5-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
Mar 7 13:12:22 orangepi3-lts kernel: [ 1164.766103] usb 5-1: Product: stm32f103xe
Mar 7 13:12:22 orangepi3-lts kernel: [ 1164.766118] usb 5-1: Manufacturer: Klipper
Mar 7 13:12:22 orangepi3-lts kernel: [ 1164.766133] usb 5-1: SerialNumber: 35FF71064241393658391657
Mar 7 13:12:22 orangepi3-lts kernel: [ 1164.791274] cdc_acm 5-1:1.0: ttyACM0: USB ACM device
Mar 7 13:12:22 orangepi3-lts kernel: [ 1164.791359] usbcore: registered new interface driver cdc_acm
Mar 7 13:12:22 orangepi3-lts kernel: [ 1164.791365] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters
После подключения USB кабеля с BluePill появятся сообщения от ядра (в примере выше после Mar 7 13:12:22). Как видно, появилось новое USB устройство с Manufacturer: Klipper. Проверяем доступные serial устройства:
sergey@orangepi3-lts:~$ ls -l /dev/serial/by-id/
итого 0
lrwxrwxrwx 1 root root 13 мар 7 13:12 /dev/serial/by-id/usb-Klipper_stm32f103xe_35FF71064241393658391657-if00 -> ../../ttyACM0
В моем случае, это тестовый стенд и есть всего одно устройство, подключенный BluePill. На реальном устройстве, может быть несколько устройств (например подключенная по USB плата принтера). Определить нужное устройство можно по серийному номеру, который был в выводе при подключении устройства и в его имени (SerialNumber: 35FF71064241393658391657).
Для того, чтобы можно было отключать bluepill, когда adxl не нужен, все настройки вынесены в отдельный файл adxl345.cfg:
[mcu bluepill]
serial: /dev/serial/by-id/usb-Klipper_stm32f103xe_35FF71064241393658391657-if00
[adxl345]
spi_bus: spi1
cs_pin: bluepill:PA4
[resonance_tester]
accel_chip: adxl345
probe_points:
100, 100, 50
В printer.cfg нужно добавить "[include adxl345.cfg]". Когда акселерометр не нужен и bluepill отключена, достаточно закомментировать эту строку.
Доступные шины "spi_bus" можно посмотреть в коде klipper. В данном случае используется набор spi1 и CS на PA4.
ADXL345 | BluePill | Описание |
---|---|---|
VCC | 3.3V или 5V | Питание датчика, 3.3В Если на плате с ADXL345 есть регулятор напряжения, можно использовать 5В. |
GND | GND | Питание датчика, GND |
CS | PA4 | линия CS (Chip Select) |
SDO | PA6 | линия MISO (Master In Slave Out) |
SDA | PA7 | линия MOSI (Master Out Slave In) |
SCL | PA5 | линия тактирования CLK (CLOCK) |
Проверить работу акселерометра можно командой ACCELEROMETER_QUERY в консоли klipper:
14:35:58 $ ACCELEROMETER_QUERY
14:36:00 // accelerometer values (x, y, z): 6365.771101, 6069.688724, 995.924147