In this tutorial learn how to connect the ADXL345 to the Raspberry Pi Pico to get real acceleration values.
You can purchase this sensor here:
1-) Step One: Physical Connection

Setup pins as follows for I2C connection, you only need 4 jumper wires
2-) Step Two: Code
Run the following code in MicroPython:
from machine import Pin, I2C
import time
import ustruct
# Constants
ADXL345_ADDRESS = 0x53 # address for accelerometer
ADXL345_POWER_CTL = 0x2D # address for power control
ADXL345_DATA_FORMAT = 0x31 # configure data format
ADXL345_DATAX0 = 0x32 # where the x-axis data starts
# Initialize I2C
i2c = I2C(0, sda=Pin(0), scl=Pin(1), freq=400000)
# Initialize ADXL345
def init_adxl345():
i2c.writeto_mem(ADXL345_ADDRESS, ADXL345_POWER_CTL, bytearray([0x08])) # Set bit 3 to 1 to enable measurement mode
i2c.writeto_mem(ADXL345_ADDRESS, ADXL345_DATA_FORMAT, bytearray([0x0B])) # Set data format to full resolution, +/- 16g
# Read acceleration data
def read_accel_data():
data = i2c.readfrom_mem(ADXL345_ADDRESS, ADXL345_DATAX0, 6)
x, y, z = ustruct.unpack('<3h', data)
return x, y, z
# Main loop
init_adxl345()
while True:
x, y, z = read_accel_data()
print('--------------------')
print(x, y, z)
print("X: {}, Y: {}, Z: {}".format(x*0.0039, y*0.0039, z*0.0039))
time.sleep(0.5)
# if you do get OSError: [Errno 5] EIO, try unplug and plug
# if you do set different resolution 0.0039 may not be the constant (check data sheet)
If you set everything up properly you should start seeing values in x, y, and z in units of g (9.81 m/s^2).
Sensor calibration may be needed to produce more accurate values, you can find that on my channel.
Conclusion:
Please consider subbing to the channel if this helped you in any way, would help us create more content for you! Let me know if you have any questions. Thanks!