====== RP2040 Input Shaper Hardware ======
In Anlehnung an https://klipper.discourse.group/t/raspberry-pi-pico-adxl345-portable-resonance-measurement/1757
===== YouTube Video #92 =====
{{youtube>kQLxwlsdaKs?half}}
\\
===== Kommerziell =====
* Fysetc \\ https://github.com/FYSETC/FYSETC-PortableInputShaper \\ https://de.aliexpress.com/item/1005006079473058.html direkt an Nozzle
* BTT \\ https://github.com/bigtreetech/ADXL345 \\ https://github.com/bigtreetech/LIS2DW
* Mellow 3D \\ https://mellow-3d.github.io/fly_adxl345_usb_general.html
* 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
* https://www.printables.com/de/model/586008-nozzle-bracket-for-adxl345-accelerometer
==== 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.
* Diese Boards verfügen oft über zusätzliche Pullup Widerstände an den Signalleitungen (SDA, SCL). Es ist möglich die Boards umzulöten. (Siehe Klipper Github Issue #3637) \\ {{:klipper_faq:pasted:20240221-142733.png}}
* Grundsätzlich sollte man aber darauf achten eine SPI Version zu kaufen.
==== Sensoren Beispiele ====
* **Kein** Spannungsregler, **kein** Levelshifter \\ {{:klipper_faq:pasted:20240220-200224.png}} \\ https://www.sparkfun.com/datasheets/Sensors/Accelerometer/ADXL345-BreakoutBoard-v13.pdf
* Spannungsregler, **kein** Levelshifter \\ {{:klipper_faq:pasted:20240220-200424.png}} \\ https://www.roboter-bausatz.de/media/image/c1/f0/e2/GY-291-Schaltplan.jpg
* Spannungsregler, Levelshifter \\ {{:klipper_faq:pasted:20240220-201141.png}} \\ https://learn.adafruit.com/adxl345-digital-accelerometer/downloads
===== 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 dann ''Y'' 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. \\ {{:klipper_faq:flash_guide:stm32g0b1:pasted:20231111-152555.png}}
===== RP2040 SPI Ports =====
{{:klipper_faq:pasted:20240221-153651.png?800}}
==== 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 \\
[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'' und ''spi_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 =====
https://www.klipper3d.org/Measuring_Resonances.html#installation-instructions
===== 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
* Discourse \\ https://klipper.discourse.group/t/raspberry-pi-pico-adxl345-portable-resonance-measurement/1757
* 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