-----
Before we get into it, consider subscribing or supporting the channel. Also, be sure to checkout our various stores to shop products for Raspberry Pi, Arduino, ESP32, and DIY electronics at ShillehTek!
Subscribe:
Support:
https://www.buymeacoffee.com/mmshilleh
Hire me at UpWork to build your IoT projects:
https://www.upwork.com/freelancers/~017060e77e9d8a1157
Visit ShillehTek Store for Arduino and Raspberry Pi Sensors and Pre-Soldered Components:
ShillehTek Website (Exclusive Discounts):
https://shillehtek.com/collections/all
ShillehTek Amazon Store:
ShillehTek Amazon Store - Canada
ShillehTek Amazon Store - Japan
1-) Step One: Physical ConnectionSetup pins as follows for I2C connection, you only need 4 jumper wires. You can get the sensor and Raspberry Pi pre-soldered or solder them yourself. This is sufficient enough to start getting sensor values! Be sure not to mix power connections as this can fry the sensor.
2-) Step Two: CodeRun 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) # raw values from sensor
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).
Some takeaways from the code:- Gives you acceleration values up to 16g. You can adjust this by changing the bytearray you pass into the DATA_FORMAT register.
- You can calibrate your sensor for more accurate results. ShillehTek has a video on this already here.
- If you do get OSError trying unplugging and plugging the Pico in.
- 0.0039 is retrieved from the ADXL345 datasheet, this value changes depending on the resolution you select
- You can extend this and calculate the angle with some trigonometry, another tutorial will be made on this topic.
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!
Comments