Table of Contents
RP2040 Input Shaper Hardware
In Anlehnung an https://klipper.discourse.group/t/raspberry-pi-pico-adxl345-portable-resonance-measurement/1757
YouTube Video #92
Kommerziell
- Provok3d Nozzle Adxl (STM32 !)
https://provok3d.com/product/nozzle-adxl-board/?v=0a10a0b3e53b - Fly3d Drucker CNC V6 Düsen Halter
https://de.aliexpress.com/item/1005006425869823.html
DIY
- RP2040 + ADXL Sensor
Kabel
- mit kurzen Kabeln (~ 20cm) initial testen um Verbindungsprobleme zu vermeiden
- Im nächsten Schritt dann mit längeren Kabeln testen.
- Die Kabel sollten mindestens gedrillt sein.
- Einige nutzen auch geschirmtes CAT 6a Kabel
- Grundsätzlich sollte das Kabel so kurz wie eben möglich sein, um Verluste und Störungen gering zu halten.
Spannungsregler
- Der ADXL345 Chip braucht für den Betrieb 3,3V. Er ist nicht 5V kompatibel!
- Durch den Spannungsregler (meist ein IC mit 5 Pins) kann das Board mit 5V versorgt werden. Der ADXL wird dann mit den 3,3V des Spannungsreglers betrieben.
Boards ohne Spannungsregler dürfen nicht mit 5V betrieben werden, da sonst der ADXL zerstört wird.
- Boards mit Spannungsregler funktionieren in der Regel auch, wenn sie mit 3,3V an VCC betrieben werden. Am ADXL liegen dann eher 2,8-3,0V an, was aber kein Problem darstellt.
- Faustregel Boards immer erst mit 3,3V testen!
Level Shifter
- Der ADXL ist so designed das er normalerweise mit 3,3V Signalen arbeitet.
- Auch die STM32, RP2040, Raspberry Pi, … arbeiten im Normalfall mit diesen Spannungen.
- Es gibt aber Controller wie mit 5,0 oder gar geringeren Spannungen wie 1,8V arbeiten. Und hier kommen dann Levelshifter zum Einsatz, die ein Signal in beide Richtungen umformen können.
- Im Bereich des 3D Druck sind ADXL Boards mit Level Shifter in der Regel unnötig. Sollte man doch ein Board mit Levelshifter haben, sollten beide Spannungsversorgungen mit 3,3V belegt werden.
Wird ein Levelshifter mit 5V betrieben kann dies einen Controller zerstören, der nur mit 3,3V arbeitet!
- Levelshifter sind in der Regel zu erkennen an zwei kleinen 3 Pin Mosfets nahe den Signalleitungen.
I2C
- Einige ADXL Boards werden mit I2C anstatt SPI ausgeliefert. I2C ist aber (ohne 400kbit/s fast mode) zu langsam um die 3200 Samples/s für die Resonanz Messung zu liefern.
- Grundsätzlich sollte man aber darauf achten eine SPI Version zu kaufen.
Sensoren Beispiele
- Kein Spannungsregler, kein Levelshifter
https://www.sparkfun.com/datasheets/Sensors/Accelerometer/ADXL345-BreakoutBoard-v13.pdf - Spannungsregler, kein Levelshifter
https://www.roboter-bausatz.de/media/image/c1/f0/e2/GY-291-Schaltplan.jpg
Klipper flashen
cd ~/klipper
make menuconfig
[*] Enable extra low-level configuration options Micro-controller Architecture (Raspberry Pi RP2040) ---> Bootloader offset (No bootloader) ---> Flash chip (W25Q080 with CLKDIV 2) ---> Communication interface (USB) ---> USB ids ---> () GPIO pins to set at micro-controller startup
- Mit
Q
und dannY
beenden
make clean && make -j4
- Die Boot Taste gedrückt halten (!) und den USB-C Stecker anschließen.
- Meistens haben die Boards eh nur eine Taste. Sollten es zwei Tasten sein, muss man schauen was Boot und was Reset ist.
dmesg
im Terminal eingeben
[126509.556147] usb 1-1.4: new full-speed USB device number 13 using dwc_otg [126509.688730] usb 1-1.4: New USB device found, idVendor=2e8a, idProduct=0003, bcdDevice= 1.00 [126509.688767] usb 1-1.4: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [126509.688783] usb 1-1.4: Product: RP2 Boot [126509.688795] usb 1-1.4: Manufacturer: Raspberry Pi [126509.688807] usb 1-1.4: SerialNumber: E0C9125B0D9B [126509.689785] usb-storage 1-1.4:1.0: USB Mass Storage device detected [126509.690375] scsi host0: usb-storage 1-1.4:1.0 [126510.727183] scsi 0:0:0:0: Direct-Access RPI RP2 3 PQ: 0 ANSI: 2 [126510.727877] sd 0:0:0:0: Attached scsi generic sg0 type 0 [126510.728901] sd 0:0:0:0: [sda] 262144 512-byte logical blocks: (134 MB/128 MiB) [126510.729746] sd 0:0:0:0: [sda] Write Protect is off [126510.729766] sd 0:0:0:0: [sda] Mode Sense: 03 00 00 00 [126510.730619] sd 0:0:0:0: [sda] No Caching mode page found [126510.730636] sd 0:0:0:0: [sda] Assuming drive cache: write through [126510.744971] sda: sda1 [126510.746027] sd 0:0:0:0: [sda] Attached SCSI removable disk
Es muss sowas am Ende stehen … Product: RP2 Boot, Manufacturer: Raspberry Pi
Wird kein Board gefunden, dann kann der Speichertyp (Flash Chip) falsch sein. In dem Fall welchseln auf GENERIC:
( ) W25Q080 with CLKDIV 2 (X) GENERIC_03H with CLKDIV 4
- Das Board mit Klipper flashen
make flash FLASH_DEVICE=2e8a:0003
- Das Board sollte sich dann schon mit Klipper melden …
ls -lR /dev/ | grep -v '\->\s../tty' | grep -e 'tty[[:alpha:]]' -e serial
/dev/serial: /dev/serial/by-id: lrwxrwxrwx 1 root root 13 Jan 22 20:26 usb-Klipper_rp2040_E66138935F3C6B28-if00 -> ../../ttyACM0 /dev/serial/by-path: lrwxrwxrwx 1 root root 13 Jan 22 20:26 platform-3f980000.usb-usb-0:1.4:1.0 -> ../../ttyACM0
- Wenn nicht einfach mal USB raus und wieder rein und fertig
kurzer Test
Ob das Board korrekt mit Klipper läuft, lässt sich mit folgendem Befehl schnell testen:
~/klippy-env/bin/python ~/klipper/klippy/console.py /dev/serial/by-id/usb-Klipper_rp2040_E6625C05E7A17228-if00
Der Pfad am Ende muss natürlich mit dem übereinstimmen was ihr im vorherigen Schritt ermittelt habt!
Wenn ihr ein connected
am Anfang des Textes seht, ist das Board richtig geflasht.
RP2040 SPI Ports
Hardware SPI
Der RP2040 verfügt theoretisch über 7 nutzbare SPI Ports. Dafür sind aber meistens nicht alle Pins rausgeführt, oder Pins haben eine unglückliche Doppelbelegung.
spi0d und spi1c sind nur eingeschränkt verfügbar / nutzbar!
SPI Bus | CS | SDO (MISO) | SDA (MOSI) | SCL (CLK) | getestet | Konfiguration |
---|---|---|---|---|---|---|
RPi Pico pin Name | CSn | SPI RX | SPI TX | SPI SCK | ||
spi0a | gpio1 | gpio0 | gpio3 | gpio2 | OK | cs_pin : RP2040:gpio1 spi_bus : spi0a |
spi0b | gpio5 | gpio4 | gpio7 | gpio6 | OK | cs_pin : RP2040:gpio5 spi_bus : spi0b |
spi0c | gpio17 | gpio16 | gpio19 | gpio18 | OK | cs_pin : RP2040:gpio17 spi_bus : spi0c |
spi0d | gpio ? | gpio20 | gpio23 | gpio22 | ||
spi1a | gpio9 | gpio8 | gpio11 | gpio10 | OK | cs_pin : RP2040:gpio9 spi_bus : spi1a |
spi1b | gpio13 | gpio12 | gpio15 | gpio14 | OK | cs_pin : RP2040:gpio12 spi_bus : spi1b |
spi1c | gpio ? | gpio24 | gpio27 | gpio26 |
Software SPI
SPI Bus | CS | SDO (MISO) | SDA (MOSI) | SCL (CLK) | Konfiguration | Notes |
---|---|---|---|---|---|---|
Fysetc Portable Input Shaper | gpio13 | gpio12 | gpio11 | gpio10 | cs_pin : RP2040:gpio13 spi_software_sclk_pin: RP2040:gpio10 spi_software_mosi_pin: RP2040:gpio11 spi_software_miso_pin: RP2040:gpio12 axes_map: x,-z,y | |
BTT ADXL345 V2.0 | gpio9 | gpio8 | gpio11 | gpio10 | cs_pin : RP2040:gpio9 spi_software_sclk_pin: RP2040:gpio10 spi_software_mosi_pin: RP2040:gpio11 spi_software_miso_pin: RP2040:gpio8 axes_map: -x,-y,-z | Alternativ spi_bus: spi1a |
BTT LIS2DW V1.0 | gpio9 | gpio8 | gpio11 | gpio10 | cs_pin : RP2040:gpio9 spi_software_sclk_pin: RP2040:gpio10 spi_software_mosi_pin: RP2040:gpio11 spi_software_miso_pin: RP2040:gpio8 axes_map: -y,x,-z | Alternativ spi_bus: spi1a |
BTT EBB SB2209 | gpio1 | gpio3 | gpio0 | gpio2 | cs_pin: EBBCan:gpio1 spi_software_sclk_pin: EBBCan:gpio2 spi_software_mosi_pin: EBBCan:gpio0 spi_software_miso_pin: EBBCan:gpio3 axes_map: z,-y,x | |
Mellow Fly-ADXL345-USB | gpio9 | gpio12 | gpio11 | gpio10 | cs_pin : RP2040:gpio9 spi_software_sclk_pin: RP2040:gpio10 spi_software_mosi_pin: RP2040:gpio11 spi_software_miso_pin: RP2040:gpio12 |
Hinweis
Wenn Software SPI verwendet wird, können beliebige gpio Pins verwendet werden!
Bei den Kaufversionen sind die Pins allerdings fest vorgegeben!
Konfiguration
- Eigene Konfigurations-Datei für den ADXL anlegen
- adxl345.cfg
[mcu RP2040] serial : /dev/serial/by-id/usb-Klipper_rp2040_E66138935F717729-if00 baud : 250000 restart_method : command [resonance_tester] accel_chip : adxl345 # adxl345 / lis2dw probe_points : 150, 150, 20 # an example of the center of the bed, check yours [adxl345] # [lis2dw] axes_map : x,y,z # Default # axes_map : x,z,y # Installed with vertical ADXL # axes_map : x,-z,y # Fysetc Portable Input Shaper # axes_map : -y,x,-z # BTT LIS2DW V1.0 cs_pin : RP2040:gpio1 # Hardware SPI Bus spi_bus : spi0a # Software SPI Bus # spi_software_sclk_pin: RP2040:gpio10 # spi_software_mosi_pin: RP2040:gpio11 # spi_software_miso_pin: RP2040:gpio12
- folgende Anpassungen sind nötig:
- seriellen Port eintragen
- Den Chip Typ
accel_chip
anpassen - Die Bettmitte bei
probe_points
ggf. ändern - Evtl. die
axes_map
anpassen - Den Bus korrekt konfigurieren mit
cs_pin
undspi_bus
(bzw.spi_software_…
)
Dual ADXL
Es ist möglich, mehrere ADXL an einem Controller zu betreiben, z.B. für Drucker mit beweglichem Bett. In dem Fall werden die Achsen über unterschiedliche ADXL vermessen.
https://www.klipper3d.org/Measuring_Resonances.html#bed-slinger-printers
Eine Konfiguration dafür könnte so aussehen
[mcu RP2040] serial : /dev/serial/by-id/usb-Klipper_rp2040_E66138935F717729-if00 baud : 115200 # 250000 restart_method : command [resonance_tester] accel_chip_x : adxl345 hotend accel_chip_y : adxl345 bed probe_points : 150, 150, 20 [adxl345 hotend] cs_pin : RP2040:gpio1 spi_bus : spi0a [adxl345 bed] cs_pin : RP2040:gpio5 spi_bus : spi0b
Test
- in der MainSail Konsole mittels
ACCELEROMETER_QUERY
Als Ergebnis sollte in etwa sowas kommen:
accelerometer values (x, y, z): -1110.308913, 1184.329507, 11414.822920
- Sollte der Test folgenden Fehler bringen ist die Verkabelung oder die Konfiguration falsch!
Invalid adxl345 id (got 0 vs e5)
Auswertung
Einbauposition
Grundsätzlich sollte der ADXL345 so nah wie möglich an der Nozzle platziert werden. Am besten direkt an der Nozzle montiert …
Links
- Klipper Dokumentation
https://www.klipper3d.org/Measuring_Resonances.html - Klipper with ADXL345 + Raspberry Pi clone (RP2040 zero)
https://travis90x.altervista.org/klipper-adxl345-raspberry-pi-rp2040-zero/?doing_wp_cron=1708409012.1427578926086425781250 - Connect your ADXL345 to your host Raspberry Pi via a RP2040-Zero
https://github.com/bassamanator/rp2040-zero-adxl345-klipper - ADXL Nozzle Mount
https://www.teamfdm.com/files/file/720-adxl345-nozzle-mount/ - Fysetc Input Shaper
https://github.com/FYSETC/FYSETC-PortableInputShaper/tree/main - Beschleunigungssensor ADXL345 hinzufügen
https://de.ifixit.com/Anleitung/Beschleunigungssensor+ADXL345+hinzuf%C3%BCgen/147745 - Vergleich der Position
https://www.youtube.com/watch?v=ufmUmeDnr0Y