Raspberry Pi Pico + ADXL345: Portable resonance measurement

The Raspberry Pi (RPi) Pico offers a convenient and cost efficient way to create a portable resonance measurement device that can be used across different Klipper printers.

ADXL345/343 boards

There are different ADXL345 boards on the market and also the ADXL343 board is a valid alternative.
Depending on the board layout and used components a few things should be considered when connecting the board.

General

The boards can be mainly distinguished by potentially having a Voltage Regulator or a Level Shifter.

Voltage Regulator

  • The Voltage Regulator allows the board to be connected to either 3.3V or to 5V
  • The ADXL chip itself requires 3.3V. The voltage regulator ensures that only 3.3V actually reach the chip
  • In the following images, a Voltage Regulator is marked with a green rectangle

:warning:WARNING: Boards without such a Voltage Regulator must not be connected to 5V or the board will be destroyed

Level Shifter

  • Digital electronics, like MCUs (aka printer boards) or RPis require a certain voltage on their pins
  • Typical voltages in 3D printing are either 3.3V (most common) or 5V
  • A Level Shifter allows to translate between 3.3V and 5V or vice versa
  • The ADXL family is in the 3.3V domain by default. This means that it outputs only 3.3V even when connected to 5V (see voltage regulator).
  • A Level Shifter changes this: When the ADXL is connected to 5V (see Voltage Regulator) it will also output 5V on the board’s connecting pins
  • In the following images, a Level Shifter is marked with a yellow rectangle

:warning:WARNING: RPIs and many MCU boards are designed for 3.3V only. A board with Level Shifter must not be connected to 5V and to a partner tolerant only to 3.3V. This will destroy the partner.

I2C Boards

  • Most boards use the SPI as communication bus. SPI is fast enough to deliver up to 3200 samples/s, as it is needed for resonance measurement
  • Some boards seem to be forced into I2C mode (another bus type) with a pull-down resistor
  • Such boards do not work for resonance measurement but can potentially be reworked by removing the pull-down resistor
  • Refer to ADXL345 Invalid ID · Issue #3637 · Klipper3d/klipper · GitHub with special thanks to @JanKolibri

:warning:WARNING: Avoid such boards, if you do not feel comfortable with soldering on such a board.

ADXL345 with Voltage Regulator and Level Shifter

ADXL345 with Voltage Regulator

ADXL345 without Voltage Regulator

ADXL343 with Voltage Regulator and Level Shifter

ADXL345 with Voltage Regulator and forced to I2C

Wiring

ADXL345 pin RPi Pico pin RPi Pico pin name
VIN (or VCC) 36 3V3 Out
GND 38 GND
CS 2 SPI0 CSn (GP 1)
SDO 1 SPI0 RX (GP 0)
SDA 5 SPI0 TX (GP 3)
SCL 4 SPI0 SCK (GP 2)

Compiling & flashing the firmware for the Pico

Compile the firmware

cd ~/klipper/
make menuconfig

grafik

make

Flash the firmware

  1. Conncect the Pico to the regular Klipper Raspberry Pi (or other SBC) USB port, while holding down the BOOTSEL button
  2. Given no other mass storage devices are existing, the Pico should register as block device /dev/sda
  3. Mount the block device and copy the Klipper firmware file to it
sudo mount /dev/sda1 /mnt
sudo cp out/klipper.uf2 /mnt
sudo umount /mnt
  1. After un-mounting, the Pico should automatically reboot with the new firmware

Configuring Klipper

  1. Get the correct serial path with ls /dev/serial/by-id/*
  2. Add the following to the printer.cfg file:
[mcu pico]
serial: /dev/serial/by-id/usb-Klipper_rp2040_mySerial

[adxl345]
spi_bus: spi0a
cs_pin: pico:gpio1

[resonance_tester]
accel_chip: adxl345
probe_points:
    100,100,20 # an example
  1. Restart Klipper with the RESTART command.

:grey_exclamation:Important: The first measurement, after freshly connecting the RPi Pico or restarting Klipper, will fail. This is due to some issues with the SPI initialization. Subsequent measurements will work.

Available SPI buses on the RPi Pico

It is possible to connect multiple ADXL boards to one RPi Pico:

ADXL345 pin RPi Pico pin name spi0a spi0b spi0c spi1a spi1b
VIN (or VCC) 3V3 Out 36 36 36 36 36
GND GND 38 38 38 38 38
CS CSn 2 (GP1) 7 (GP5) 22 (GP17) 12 (GP9) 17 (GP13)
SDO SPI RX 1 (GP0) 6 (GP4) 21 (GP16) 11 (GP8) 16 (GP12)
SDA SPI TX 5 (GP3) 10 (GP7) 25 (GP19) 15 (GP11) 20 (GP15)
SCL SPI SCK 4 (GP2) 9 (GP6) 24 (GP18) 14 (GP10) 19 (GP14)

Notes:

3 Likes

See my post on Reddit for a nice snap-together (printable) case for the Pico (and an alternate wiring/config for this setup).

1 Like

@glabifrons thanks for sharing.
One comment: There are many different ADXL boards out there. Some are only 3.3V tolerant.
Your wiring will potentially kill such boards as you are using a 5V pin

2 Likes

@Sineos Very good to point out!
Yes, mine is a 5V-tolerant version.

Edit: I edited my Reddit post (in bold) to warn people about the wiring. Thanks!

2 Likes

I configured everything as per instructions, however I’m getting an error when querying the ADXL345. ‘got f2 vs e5’

I know that the PICO and ADXL345 are working because I can access it via microPython (via SPI) just fine.

Few questions:
Where does spi0a come from? Given gpio notation, it seems to me it should be pico:spi0? Could it be that my other mcu SPI is being used?
EDIT: as per reddit linked above CS pin determines mcu being used, so I suppose the correct SPI port is being opened…
How can I bypass device ID detection?
Is there anything else I can try to troubleshoot this?

EDIT2: turns out I just needed to give it some time before spi starts working.

For reference it appears it took about 30 seconds for SPI port to be available for some reason:

00:30:02  !! Lost communication with MCU 'pico'
00:30:09  $ FIRMWARE_RESTART
00:30:34  // Klipper state: Ready
00:30:42  $ ACCELEROMETER_QUERY
00:30:42  // Invalid adxl345 id (got f2 vs e5).
// This is generally indicative of connection problems
// (e.g. faulty wiring) or a faulty adxl345 chip.
00:30:42  !! Invalid adxl345 id (got f2 vs e5).
00:31:04  $ ACCELEROMETER_QUERY
00:31:05  // adxl345 values (x, y, z): 2677.215450, -1988.788620, 15910.308960

Heh, I take it back. It appears that first access after reboot results in an error. No matter the time that have passed.

Initial post amended by further available SPI buses. Mind the notes

1 Like

Initial post amended by information on various board configurations

@glabifrons: For your guide: There is another potential pitfall with connecting to 5V. Some boards have a Level Shifter which will bring the output to 5V. In this case not the ADXL might get destroyed but the Pico.