Обращаю Ваше внимание, что при использовании шин SPI, i2c на одноплатных микрокомпьютерах семейств ROpi[1], они должны быть уже настроены и подключены как MCU. Так как Klipper позволяет использовать только шины и пины правильно сконфигурированных и подключенных MCU.
Для конфигурации и использования шин i2c, SPI и Pins/GPIO с MCU необходимо подключиться к компьютеру с установленным Klipper по ssh.
В данной статье считается, что вся настройка идет от имени пользователя
pi
, а также, что утилитаsudo
настроена должным образом.
Первым делом нужно проверить наличие прав доступа, для этого выполняем следующую команду в консоли:
id
Вывод будет выглядеть так:
uid=1000(pi) gid=1000(pi) groups=1000(pi),4(adm),5(tty),20(dialout),24(cdrom),27(sudo),29(audio),44(video),46(plugdev),60(games),100(users),105(input),109(netdev),997(gpio),998(i2c),999(spi)
Если в списке, который выйдет после выполнения команды, отсутствует: i2c
, spi
, gpio
то добавляем пользователя в данные группы.
На системах Orange и Armbian, группы
i2c
,spi
,gpio
отсутствуют, и этот шаг можно пропустить.
sudo usermod -aG i2c,spi,gpio pi
После данной команды рекомендуется перезагрузиться.
Широкие возможности прошивки Klipper позволяют нам подключать дополнительные устройства по шине i2c и взаимодействовать с ними.
К таким устройствам относятся экраны, ЦАП (MCP4728), контроллеры LED лент (PCA9533), а так же сенсоры температуры или влажности (HTU21D, LM75, BMP280/BME280/BME680) и многое другое, что ещё не описано базовым Config_Reference.
Для включения i2c шины нам потребуется запустить конфигуратор и включить её в нем.
sudo raspi-config
В основном интерфейсе выбираем: 5 Interface Option
Затем: P5 I2C
Подтверждаем выбор, получаем контрольное сообщение, что шина активирована и перезагружаемся
Для удобства представления информации используются вкладки с указанием шагов.
После выполнения перезагрузки одноплатного компьютера проверяем наличие i2c шины:
ls -al /dev/i2c*
И проверяем наличие подключенных устройств на шине, где цифра 1 - это номер шины по которой будет идти опрос устройств:
i2cdetect -y 1
На изображении выше видно, что найдено одно устройство с номером 0x3C, значит все работает верно.
Среди устройств которые можно подключить по SPI шине можно выделить: датчик акселерометра, датчики температуры в том числе с усилителями для PT100, а так же экраны.
Архитектура Klipper позволяет использовать данную шину как аппаратную на RoPi host или MCU, так и эммулировать SPI шину через spi_software
, создавая на любых 4 свободных PinOut MCU програмный SPI с последующим подключением к нему устройств.
Для включения i2c шины, нам потребуется запустить конфигуратор и включить ее в нем.
sudo raspi-config
В основном интерфейсе выбираем: 3 Interface Option
Затем: P4 I2C
Подтверждаем выбор, получаем контрольное сообщение, что шина активирована, выходим из конфигуратора и перезагружаемся
Для удобства представления информации используются вкладки с указанием шагов.
В данном примере рассматривается Orange Pi 3 LTS
Распиновка нашей платы выглядит следующим образом:
На данной схеме видно, что на GPIO выведен SPI1
, его и будем включать.
Для включения SPI шины нам потребуется запустить конфигуратор и включить ее в нем.
sudo armbian-config
Или если вы используете Orange то:
sudo orangepi-config
В основном интерфейсе выбираем: System
Затем: Hardware
Выбираем необхоидимые интерфейсы
сохраняем, выходим и перезагружаем систему.
Для удобства представления информации используются вкладки с указанием шагов.
В некоторых случаях не удается сконфигурировать SPI
шину через конфигуратор описаный выше, поэтому открываем файл конфигураций и вручную редактируем его.
Для Armbian:
sudo nano /boot/armbianEnv.txt
Для Orange:
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=spi-spidev1
param_spidev_spi_bus=1
param_spidev_spi_cs=0
Если же, в файле присутствует строка overlays
например:
overlays=i2c3
То в данном случае, добавлем через пробел от последней записи spi-spidev1
, так как пробел является разделителем оверлев.
overlays=i2c3 spi-spidev1
param_spidev_spi_bus=1
param_spidev_spi_cs=0
В случае использования уже прошитого модуля MCU, плата принтера или отдельная плата Arduino
, STM32
, Raspberry Pi Pico
, можно сразу обращаться к SPI данного модуля. Например для подключенного и прошитого MCU Raspberry Pi Pico
:
[mcu pico]
serial: /dev/serial/by-id/usb-Klipper_rp2040_E660REDACTED-if00
[adxl345]
cs_pin: pico:gpio1
spi_bus: spi0a
В данном случае используется шина SPI0a модуля Raspberry Pi Pico
, к которому подключается датчик акселерометра ADXL345 в соответсвии с разводкой платы:
Pico Pin | ADXL Pin | Klipper Func |
---|---|---|
GPIO_1 - SPI0_CSn | CS | CS_pin |
GPIO_0 - SPI0_RX | SDO | miso |
GPIO_3 - SPI0_TX | SDA | mosi |
GPIO_2 - SPI0_SCK | SLC | slck |
В случае, если модуль MCU не обладает собственной аппаратной шиной SPI
, или она по каким то причинам недоступна, то имея 4 свободных pin
можно эмулировать её.
Для этого при конфигурации периферийного модуля использующего для свой работы SPI
указываются следующие ДОПОЛНИТЕЛЬНЫЕ параметры:
cs_pin: PB14
spi_software_sclk_pin: PB13
spi_software_mosi_pin: PB15
spi_software_miso_pin: PB12
После подключаем периферийный SPI
модуль в соответствии с указанными pin
.
После перезагрузки проверяем, что у нас появилась SPI
шина:
ls /dev/spi*
Вывод будет выглядеть (приблизительно) так:
После прошивки и конфигруации MCU часть плат принтера или плат Arduino, STM32, Raspberry Pico сразу предоставляют доступ к своим pin
. Единственным условим их корректного использования будет четкое указание к какому Pin
идет обращение, например, у нас есть MCU Pico
:
# Raspberry Pico
[mcu pico]
serial: /dev/serial/by-id/usb-Klipper_rp2040_E660REDACTED-if00
Обращение к его 'Pin' внутри конфигурационного файла будет выглядеть следующим образом:
pico:gpio1
Взаимодействие с pin
MCU, не используемых в других частях конфигурационного файла, определяется блоком:
pin:
Для использования GPIO_1 с MCU Pico приведем его к виду:
# Raspberry Pico
[mcu pico]
serial: /dev/serial/by-id/usb-Klipper_rp2040_E660REDACTED-if00
[output_pin my_pin]
pin: pico:gpio1
Для последующего изменения состояния GPIO_1
используется команда
SET_PIN PIN=my_pin VALUE=1
Где VALUE
– это необходимое значение.
Более детально в Config_Reference#output_pin.
Рассмотрим подключение OLED дисплея, в частности это будет I2C 128X64 I2C SSD1306.
Для подключения данного экрана к шине i2c может использоваться следующий пример:
OLED Pin | Цвет | Raspberry Pi Pin |
SDA | GPIO2_SDA | |
SLC | GPIO3_SLC | |
GND | GND | |
VCC | VCC_3.3V |
После подключения опрашиваем i2c шину:
i2cdetect -y 1
На изображении выше видно, что найдено одно устройство с номером 0x3C, значит все работает верно, экран подключен. Осталось сконфигурировать Klipper, для этого добавляем в printer.cfg блок указанный ниже. В дальнейшем для правильного указания данного устройства в конфигурации Klipper, нам нужно перевести число из hex формата: 0x3C в десятичное, например через онлайн конвертер. Также можно использовать встроенный калькулятор в Bash:
pi@raspberry$ echo $(( 16#3C ))
60
В данном случае адрес устройства в десятичном формате: 60
#LCD Config
[display]
lcd_type: ssd1306
i2c_mcu: rpi
i2c_bus: i2c.1
i2c_address: 60
В данном блоке указывается: Тип экрана ssd1306, который подключен к MCU RPI на которой запущен klipper_host_mcu. Шина данных i2c.1, это наша шина i2c-1 которую мы раньше опрашивали. Адрес устройства: 60 это десятичное представления ранее определённого экрана 0x3C.
Перезагружаем Klipper и радуемся выводу на экран:
На примере Orange Pi Zero 2.
На этой плате пользователю доступно i2c3, но нужно его активировать:
В файл /boot/orangepiEnv.txt добавить overlays=i2c3.
После перезагрузки появится устройство i2c-3.
[display]
lcd_type: ssd1306
i2c_mcu: host
i2c_bus: i2c.3
i2c_address: 60
Данный блок рассматривается на примере платы Creality 4.2.2 используемой в принтерах Creality Ender 3, Creality Ender 3 Pro, Creality Ender 3v2 и других.
Данная плата не обладает управляемым охлаждением радиатора хотенда, а вентилятор охлаждающий MCU завязан логикой на основной радиатор. Таким образом при печати ABS без обдува модели, вентилятор MCU отключен, что может привести к перегреву драйверов.
С целью сокращение шума от принтера в простое, а так же принудительном охлаждении платы MCU и драйверов в работе, предлагается реализовать управляемое охлаждение MCU и радиатора хотенда.
Реализовывать управляемое охлаждение мы будем через модуль LM2596.
Если обратиться к схеме LM2596 то можно увидеть что 5 нога отвечает за включение и выключение самого модуля. Таким образом если на 5 ногу подать GND то модуль включится, а если подать VCC более 1,3 то выключится. Согласно разным документациям идет разброс VCC от 1.3В до 1.6В для отключения модуля, но так как мы оперируем пином с платы принтера то VCC будет равным логике платы - 3.3В (5В для Atmega) и гарантированно выше точки срабатывания, стоит отметить что согласно документации максимальный VCC для данной ноги должен быть ниже VCC_IN - который в нашем случае 24В.
Отпаиваем 5 ногу от платы, или аккуратно срезаем ее посередине и выпрямляем для удобства пайки в дальнейшем. Затем припаиваем к 5 ноге провод и обжимаем его с другого конца. К выходу LM2596 подключаем (припаиваем) провода вентиляторов обдува радиатора хотэнеда и платы принтера.
Входные цепи питания модуля LM2596 подключаем к блоку питания принтера, при этом проверяем полярность.
Исходя из распиновки выше, выбираем свободный и пока не используемый мною пин PB2 и подключаем к нему провод от 5 ноги LM2596. А так же вносим изменения в конфигурационный файл, добавляя:
#Enable LM2596 for cooling
[heater_fan System]
pin: !PB2
fan_speed: 1
heater: extruder
heater_temp: 50.0
Теперь указанные выше вентиляторы будут включаться при:
А так же отключаться при:
С данной модификацией вы получите тишину при простое принтера, а при его работе не будете слышать завывания старых и достаточно шумных вентиляторов что идут в комплекте с принтером.
Данным пример показывает что одним пином и управляемой ногой реле, можно совершать различные действия, как то включение или отключение подсветки, вентиляторов и других интересных решений.
Вам необходимо подключить ADXL345 к Raspberry Pi через SPI.
Обратите внимание, что соединение I2C, которое предлагается в документации ADXL345, имеет слишком низкую пропускную способность и не будет работать Поэтому в статье рассматривается подключение ТОЛЬКО по SPI.
Рекомендуемая схема подключения:
ADXL345 пин | RasbberryPi пин | название пина RasbberryPi |
---|---|---|
3V3 (or VCC) | 01 | 3V3 |
GND | 06 | GND |
CS | 24 | GPIO08 (SPI0_CE0_N) |
SDO | 21 | GPIO09 (SPI0_MISO) |
SDA | 19 | GPIO10 (SPI0_MOSI) |
SCL | 23 | GPIO11 (SPI0_SCLK) |
Схемы подключения некоторых плат ADXL345:
Проверьте провода, качество пайки, а так же корректную разводку несколько раз, перед включением RoPi. Неправильное подключение с высокой долей вероятности повредит Ваше оборудование.
Кроме того, большая часть проблем с подключением датчика Акселерометра связана с проводами/некачественной пайкой.
Добавьте в файл printer.cfg
следующие параметры:
[adxl345]
cs_pin: rpi:None
[resonance_tester]
accel_chip: adxl345
probe_points:
100,100,20 # X100, Y100, Z20
Данный блок рассматривается на примере платы Creality 4.2.2 используемой в принтерах Creality Ender 3, Creality Ender 3 Pro, Creality Ender 3v2 и других.
Рассмотрим частный случай, когда хочется получить два ADXL для раздельного измерения, или на случай если на RoPi не получается установить ADXL.
К сожалению, на текущий момент запустить датчик по аппаратной шине SPI от STM32F103 не представлялось технически возможным. Поэтому в данном случае мы рассматриваем вариант программного SPI.
Учитывая что для USART подключения с плашки IDC10 зарезервированы пины PB10 и PB11, в распоряжении остаются: PB14, PB13, PB12, PB15 - которые расположены вместе и идеально подходят для использования. Единственный сложный момент, это то что для питания датчика ADXL требуется 3.3В и GND, но на плашке IDC10 такого напряжения, а GND занят для USART подключения. Выход рядом с IDC10 есть диагностический разъем JTAG на котором есть необходимые 3.3В и GND
Creality Pin | Цвет | ADXL Pin | Klipper Func | STM32F103 Func |
---|---|---|---|---|
JTAG_GND | BLACK | GND | none | |
JTAG_VCC (3V3) | RED | VCC | none | |
PB14 | BLUE | CS | CS_pin | SPI2-MISO |
PB12 | GREEN | SDO | miso | SPI2-NSS (CS) |
PB15 | YELLOW | SDA | mosi | SPI2-MOSI |
PB13 | BROWN | SCL | slck | SPI2-SLCK |
В случае если это единственный Акселерометр в конфигурации, то блок конфигурационного файла будет выглядеть следующим образом:
#ADXL on MCU
[adxl345]
cs_pin: PB14
spi_software_sclk_pin: PB13
spi_software_mosi_pin: PB15
spi_software_miso_pin: PB12
[resonance_tester]
accel_chip: adxl345
probe_points:
100,100,20 # X100, Y100, Z20 an example
В случае если используется несколько датчиков Акселерометра ADXL, то конфигурационный файл будет выглядеть следующим образом:
#ADXL on Pi4
[adxl345 adxl_x]
cs_pin: rpi: None
#ADXL on MCU
[adxl345 adxl_y]
cs_pin: PB14
spi_software_sclk_pin: PB13
spi_software_mosi_pin: PB15
spi_software_miso_pin: PB12
[resonance_tester]
#accel_chip: my_chip_name
accel_chip_x: adxl345 adxl_x
accel_chip_y: adxl345 adxl_y
probe_points:
100,100,20 # X100, Y100, Z20 an example
В данном случае считается что первый датчик подключен к RoPi host.
Обратите внимание, что измерения резонанса и автокалибровка шейпера требуют дополнительных программных зависимостей, не установленных по умолчанию. Во-первых, вам нужно будет запустить на своем RoPi следующую команду и установить пакет numpy:
~/klippy-env/bin/pip install -v numpy
Обратите внимание, что в зависимости от производительности процессора это может занять много времени, до 10-20 минут. Наберитесь терпения и дождитесь завершения установки. В некоторых случаях, если на плате слишком мало оперативной памяти, установка может завершиться ошибкой, и вам потребуется включить swap.
Затем выполните следующие команды, чтобы установить дополнительные зависимости:
sudo apt update
sudo apt install python3-numpy python3-matplotlib libatlas-base-dev libopenblas-dev
Перезапустите Клиппер командой RESTART
.
После перезагрузки выполняем следующую команду в Web интерфейсе Klipper.
MEASURE_AXES_NOISE
Вывод команды для одного датчика акселерометра будет:
$ MEASURE_AXES_NOISE
// Axes noise accelerometer: 12.282279 (x), 15.304118 (y), 30.408056 (z)
Для двух датчиков акселерометра:
$ MEASURE_AXES_NOISE
// Axes noise for x-axis accelerometer: 12.282279 (x), 15.304118 (y), 30.408056 (z)
// Axes noise for y-axis accelerometer: 39.800257 (x), 39.757298 (y), 78.517822 (z)
Акселерометр должен быть жестко закреплен на печатающей головке. Необходимо разработать подходящее крепление для вашего 3D-принтера. Лучше выровнять оси акселерометра с осями принтера (но если это будет проблематично, оси можно поменять местами, то есть нет необходимости выравнивать ось X акселерометра с осью X принтера), Это будет работать, даже если ось Z акселерометра соответствует оси X принтера и т.д.).
Переопределение осей акселерометра делается через настройку axes_map
.
Подробнее в Config_Reference.
Внимание: убедитесь, что акселерометр и все крепящие его винты не касаются металлических частей принтера. По сути, крепление должно быть спроектировано таким образом, чтобы обеспечить электрическую изоляцию акселерометра от корпуса или металлических частей принтера. Несоблюдение этого требования может создать контур заземления в системе, который может повредить электронику!
ROpi это сокращение для одноплатных компьютеров семейств Raspberry Pi и Orange Pi ↩︎