В данной статье мы рассмотрим как подключить акселерометр ADXL345 к плате Raspberry Pi и измерить ускорение с помощью программы на Python. Raspberry Pi — это небольшой, мощный компьютер, а ADXL345 — это датчик, который может обнаруживать движение. В сочетании они создают отличную пару для всевозможных забавных проектов, таких как сигнализация движения или интерактивные игры.
Мы рассмотрим шаги по подключению двух устройств, а затем покажем, как написать простой код Python для считывания данных с акселерометра. Также ранее на нашем сайте мы рассматривали подключение акселерометра ADXL345 к плате Arduino.
Необходимые компоненты
- Плата Raspberry Pi 4 Model B (или другая) (купить на AliExpress).
- Акселерометр (ADXL345) (купить на AliExpress).
- Макетная плата.
- Соединительные провода.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Цифровой акселерометр ADXL345
ADXL345 — это 3-осевой акселерометр, разработанный компанией Analog Devices. Этот датчик предназначен для точного измерения ускорения по осям X, Y и Z, что делает его пригодным для различных приложений. Он особенно популярен в таких областях как робототехника, игры, виртуальная реальность, носимые устройства и устройства IoT, среди прочих.
Этот акселерометр способен обнаруживать как статическое ускорение, например силу тяжести, так и динамическое ускорение, возникающее в результате движения или вибраций. ADXL345 имеет регулируемую чувствительность, что позволяет ему удовлетворять ряду приложений с различными требованиями к ускорению.
ADXL345 взаимодействует с микроконтроллерами с помощью интерфейсов I2C или SPI, что делает его совместимым с широким спектром платформ разработки, таких как Arduino, Raspberry Pi и др. Благодаря низкому энергопотреблению и малому форм-фактору ADXL345 идеально подходит для приложений с питанием от батареи и ограниченным пространством.
Более подробно про данный акселерометр вы можете прочитать в его техническом описании.
Технические характеристики ADXL345
ADXL345 — это трехосевой акселерометр со следующими основными характеристиками:
- Оси: 3 оси (X, Y, Z).
- Чувствительность: выбирается пользователем, ±2g, ±4g, ±8g или ±16g.
- Разрешение: 10-бит или 13-бит, по выбору пользователя.
- Скорость передачи выходных данных (ODR): от 0,10 Гц до 3200 Гц.
- Интерфейсы связи: I2C (до 400 кГц) и SPI (4-проводной и 3-проводной, до 5 МГц).
- Диапазон напряжения питания: от 2,0 В до 3,6 В.
- Потребляемый ток: от 23 мкА до 130 мкА в зависимости от скорости выходных данных и режима измерения.
- Диапазон рабочих температур: от -40°C до +85°C.
- Упаковка: 3 мм × 5 мм × 1 мм LGA.
Распиновка ADXL345
Модуль 3-осевого цифрового акселерометра ADXL345 имеет 8 контактов.
- GND: Заземление модуля.
- VCC: Вход питания, обычно 3,3 В, но может принимать напряжение в диапазоне от 2,0 В до 3,6 В.
- CS (Chip Select): используется для связи по SPI. При низком уровне включает связь по SPI; при высоком уровне переключается на связь по I2C.
- INT1 (прерывание 1): этот вывод можно настроить на вывод сигналов прерывания для определенных событий, таких как обнаружение активности/бездействия, обнаружение одиночного/двойного нажатия или обнаружение свободного падения.
- INT2 (прерывание 2): этот вывод можно настроить на вывод сигналов прерывания для определенных событий, таких как обнаружение активности/бездействия, обнаружение одиночного/двойного нажатия или обнаружение свободного падения.
- SDO (Serial Data Out): линия Master In Slave Out (MISO) для связи по протоколу SPI.
- SDA (последовательные данные): последовательные данные (I2C)/последовательный ввод данных (SPI 4-Wire)/последовательный ввод и вывод данных (SPI 3-Wire).
- SCL (Serial Clock): тактовый сигнал последовательной связи. SCL — это тактовый сигнал для I2C, а SCLK — это тактовый сигнал для SPI.
Взаимодействие акселерометра ADXL345 с Raspberry Pi 4
Чтобы использовать акселерометр ADXL345 с платой Raspberry Pi 4, вам нужно будет выполнить необходимые аппаратные подключения, а затем написать скрипт Python для связи с датчиком. Давайте начнем с понимания процедуры подключения. Выполните следующие шаги, чтобы подключить акселерометр к Raspberry Pi 4.
Подключите ADXL345 к Raspberry Pi 4 следующим образом:
- VCC от ADXL345 к 3,3 В на Raspberry Pi 4 (контакт 1).
- GND от ADXL345 к GND на Raspberry Pi 4 (контакт 6).
- SDA от ADXL345 к SDA (GPIO 2, Pin 3) на Raspberry Pi 4.
- SCL от ADXL345 к SCL (GPIO 3, Pin 5) на Raspberry Pi 4.
Код Python для измерения ускорения и углов наклона
Теперь давайте напишем код Python для сопряжения ADXL345 с платой Raspberry Pi 4 и измерения ускорения по осям X, Y, Z, а также углов наклона. Мы не использовали никакую библиотеку для этого кода. Для использования этого кода вам сначала нужно включить связь I2C на плате.
Этот скрипт Python предназначен для взаимодействия с акселерометром ADXL345 с использованием протокола связи I2C. ADXL345 — это 3-осевой акселерометр, и этот скрипт позволяет считывать с него данные об ускорении и рассчитывать углы наклона (тангаж и крен) на основе значений ускорения.
Скопируйте следующий код и вставьте его в окно редактора Thonny IDE.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
import smbus import time import math # ADXL345 I2C Address ADXL345_I2C_ADDR = 0x53 # ADXL345 Registers POWER_CTL = 0x2D DATA_FORMAT = 0x31 DATAX0 = 0x32 DATAX1 = 0x33 DATAY0 = 0x34 DATAY1 = 0x35 DATAZ0 = 0x36 DATAZ1 = 0x37 class ADXL345: G = 9.81 # Earth's gravity in m/s^2 def __init__(self, bus_num=1): self.bus = smbus.SMBus(bus_num) # Set range to +/- 16g and FULL_RES bit self.bus.write_byte_data(ADXL345_I2C_ADDR, DATA_FORMAT, 0x0B) # Turn on the accelerometer self.bus.write_byte_data(ADXL345_I2C_ADDR, POWER_CTL, 0x08) def read_acceleration(self): # Read acceleration data bytes = self.bus.read_i2c_block_data(ADXL345_I2C_ADDR, DATAX0, 6) # Convert to 2's complement and then to m/s^2 x = (bytes[1] << 8 | bytes[0]) if x & (1 << 15): x = x - (1 << 16) x = (x / (2**15)) * 16 * self.G y = (bytes[3] << 8 | bytes[2]) if y & (1 << 15): y = y - (1 << 16) y = (y / (2**15)) * 16 * self.G z = (bytes[5] << 8 | bytes[4]) if z & (1 << 15): z = z - (1 << 16) z = (z / (2**15)) * 16 * self.G return (x, y, z) def get_tilt_angles(self): x, y, z = self.read_acceleration() pitch = math.degrees(math.atan2(y, math.sqrt(x**2 + z**2))) roll = math.degrees(math.atan2(-x, z)) return pitch, roll if __name__ == "__main__": accelerometer = ADXL345() while True: x, y, z = accelerometer.read_acceleration() pitch, roll = accelerometer.get_tilt_angles() print(f"Acceleration - X: {x:.3f} m/s^2, Y: {y:.3f} m/s^2, Z: {z:.3f} m/s^2") print(f"Pitch: {pitch:.2f}°, Roll: {roll:.2f}°") time.sleep(0.5) |
Объяснение работы кода
1 2 3 |
import smbus import time import math |
Эти строки импортируют три модуля Python:
smbus
: Предоставляет функции для связи с устройствами по протоколу связи I2C.time
: Используется для различных задач, связанных со временем. В этом коде, в частности, для введения задержек.math
: Предоставляет доступ к математическим функциям. Здесь он используется для тригонометрии и преобразования углов.
1 2 3 4 5 6 7 8 |
# ADXL345 I2C Address ADXL345_I2C_ADDR = 0x53 # ADXL345 Registers POWER_CTL = 0x2D DATA_FORMAT = 0x31 DATAX0 = 0x32 ... |
В этом разделе определяются константы:
ADXL345_I2C_ADDR
: Адрес I2C акселерометра ADXL345.- Следующие строки (например
POWER_CTL
,DATA_FORMAT
, и т.д.) — это адреса регистров в устройстве ADXL345. Эти регистры хранят конфигурации и данные. Например,POWER_CTL
— это адрес регистра управления питанием, который можно использовать для включения/выключения акселерометра.
1 2 |
class ADXL345: G = 9.81 # Earth's gravity in m/s^2 |
Эта строка начинает определение класса, называемого ADXL345
. В этом классе определена константа, G
представляющая силу тяготения Земли (9,81 м/с^2). Эта константа будет использоваться позже для расчетов ускорения.
1 2 3 4 5 6 |
def __init__(self, bus_num=1): self.bus = smbus.SMBus(bus_num) # Set range to +/- 16g and FULL_RES bit self.bus.write_byte_data(ADXL345_I2C_ADDR, DATA_FORMAT, 0x0B) # Turn on the accelerometer self.bus.write_byte_data(ADXL345_I2C_ADDR, POWER_CTL, 0x08) |
Функция __init__
является конструктором, который автоматически вызывается при создании объекта класса ADXL345
. Здесь она инициализирует шину I2C для связи и отправляет команды акселерометру:
- Устанавливаем диапазон ±16g и устанавливаем бит FULL_RES.
- Включение акселерометра.
1 |
bytes = self.bus.read_i2c_block_data(ADXL345_I2C_ADDR, DATAX0, 6) |
Эта строка считывает 6 байт данных, начиная с DATAX0
регистра. Эти байты содержат значения ускорения для осей X, Y и Z.
1 2 3 4 |
x = (bytes[1] << 8 | bytes[0]) if x & (1 << 15): x = x - (1 << 16) x = (x / (2**15)) * 16 * self.G |
Здесь 2 байта, соответствующие ускорению по оси X, объединяются для формирования 16-битного числа. Значения ускорения представлены в виде дополнения до 2, поэтому для отрицательных значений выполняется проверка и преобразование. Затем значение масштабируется для получения ускорения в м/с^2.
1 2 |
pitch = math.degrees(math.atan2(y, math.sqrt(x**2 + z**2))) roll = math.degrees(math.atan2(-x, z)) |
В этом разделе рассчитываются углы тангажа и крена на основе значений ускорения с использованием тригонометрических соотношений.
1 2 3 4 5 6 7 8 |
if __name__ == "__main__": accelerometer = ADXL345() while True: x, y, z = accelerometer.read_acceleration() pitch, roll = accelerometer.get_tilt_angles() print(f"Acceleration - X: {x:.3f} m/s^2, Y: {y:.3f} m/s^2, Z: {z:.3f} m/s^2") print(f"Pitch: {pitch:.2f}°, Roll: {roll:.2f}°") time.sleep(0.5) |
Если скрипт запускается как основная программа, он входит в этот цикл:
- Создается объект ADXL345.
- Затем он непрерывно считывает значения ускорения и вычисляет углы наклона.
- Эти значения распечатываются каждые 0,5 секунды.
Тестирование работы проекта
Сохраните код Python под любым именем. Затем нажмите кнопку «Выполнить».
В Thonny Shell вы увидите значение ускорения по осям X, Y, Z в единицах м/с^2 . Вы также увидите значения тангажа и крена в градусах.
Чтобы наблюдать изменение значений, можно вращать или наклонять акселерометр.
В этих результатах видно, что значение рыскания не рассчитывается.
Рассчитать рыскание, используя только акселерометр типа ADXL345, напрямую невозможно. Причина в том, что рыскание — это вращение вокруг вертикальной (гравитационной) оси, а акселерометр измеряет линейное ускорение. Без опорного значения (например, магнитного севера от магнитометра или компаса) нет никаких изменений в силе гравитации на датчиках для определения угла рыскания.
Таким образом, используя 3-осевой акселерометр ADXL345, вы можете рассчитать ускорение по осям X, Y, Z , а также измерить значения тангажа и крена.
9 просмотров