В данной статье мы рассмотрим как подключить модуль акселерометра ADXL375 к плате Arduino для измерения ускорения по осям X, Y и Z.
ADXL375 является очень мощным и высокотехнологичным акселерометром, способным измерять ускорение до ±200 g. Возможно, вам знакомы модули акселерометров, такие как ADXL335 или ADXL345, а также MPU6050. Эти модули хороши для простых проектов, но совершенно не подходят для приложений, требующих высокой точности, высокого разрешения и экстремальных диапазонов.
Модуль ADXL375 — это цифровой MEMS-акселерометр от Analog Devices. Датчик небольшой и тонкий, с ультранизким энергопотреблением — всего 35 мкА в режиме измерения. Самое замечательное в этом датчике — это возможность измерения ускорения до ±200 g. Представьте себе измерение силы гравитационного притяжения Земли или ускорения очень быстро движущегося объекта — здесь ADXL375 идеально подходит.
В статье мы сначала рассмотрим особенности, возможности, распиновку и другие детали датчика ADXL375. Затем мы покажем, как использовать этот датчик с платой Arduino, используя код на C++. Этот же датчик можно также подключить к ESP32 и Raspberry Pi Pico.
Также на нашем сайте вы можете можете посмотреть другие проекты на акселерометрах серии ADXL:
- определение ориентации с помощью акселерометра ADXL345 и Arduino;
- подключение акселерометра ADXL335 к Raspberry Pi Pico;
- измерение ускорения с помощью акселерометра ADXL345 и Raspberry Pi.
Необходимые компоненты
- Плата Arduino Nano.
- Акселерометр ADXL375.
- OLED дисплей 128х64 (купить на AliExpress — для данного проекта можно покупать модель с 4-мя контактами поскольку используется его подключение по интерфейсу I2C).
- Макетная плата.
- Соединительные провода.
Реклама: ООО «АЛИБАБА.КОМ (РУ)» ИНН: 7703380158
Акселерометр ADXL375
ADXL375 — это небольшой, тонкий 3-осевой акселерометр, обеспечивающий низкое энергопотребление и высокое разрешение измерений до ±200 g.
Выходные цифровые данные акселерометра форматируются как 16-битные данные в дополнительном коде и доступны через цифровой интерфейс SPI или I2C. Поддерживается полоса пропускания до 1 килогерца. Полоса пропускания выбирается с помощью последовательной команды. Для хранения данных может использоваться интегрированная система управления памятью с 32-уровневым буфером FIFO, что минимизирует активность главного процессора и снижает общее энергопотребление системы.
Функциональная схема ADXL375 представлена на следующем рисунке.
Датчик способен определять удары, а также может использоваться в системах мониторинга активности или бездействия. Удивительно, что этот модуль выдерживает удары силой до 10 000 g, что просто поразительно. Согласно техническим характеристикам, его можно использовать для обнаружения сотрясений мозга и травм головы, а также для обнаружения событий с высокой силой воздействия. Чтобы узнать больше о модуле ADXL375, вы можете ознакомиться с техническим описанием ADXL375.
Характеристики и спецификации ADXL375
- Диапазон измерения: ±200 г (фиксированный) с 13-битным выходом в дополнительном коде.
- Чувствительность: 49 мг/LSB (0,049 г/LSB) → разрешение ~0,4805 мг при переводе в м/с²
- Потребляемая мощность:
- Режим измерения: типичный ток 35 мкА.
- Режим ожидания: типичный ток 0,1 мкА (VS = 2,5 В)
- Примечание: сила тока питания изменяется в зависимости от настройки скорости передачи/полосы пропускания выходных данных.
- Скорость передачи выходных данных / Пропускная способность:
- Выбирается пользователем через последовательные регистры.
- Полоса пропускания до 1 кГц (ODR до 1 кГц)
- Буфер FIFO: FIFO с водяным знаком на 32 выборки снижает нагрузку на главный процессор.
- Обнаружение событий:
- Обнаружение одиночного/двойного нажатия (импульса)
- Мониторинг активности/бездействия с программируемыми пороговыми значениями и продолжительностью.
- Цифровые интерфейсы:
- I²C (7-битный адрес = 0x53, когда ALT_ADDRESS = LOW)
- SPI (3- или 4-проводной)
- Напряжение питания: от 2,0 В до 3,6 В
- Диапазон входного/выходного напряжения: от 1,7 В до VS
- Рабочая температура: от –40 °C до +85 °C
- Устойчивость к ударам: 10 000 g (в нерабочем состоянии)
- Корпус / Соответствие RoHS: 3 × 5 × 1 мм LGA, соответствует требованиям RoHS.
Схема проекта
Схема подключения акселерометра ADXL375 к плате Arduino представлена на следующем рисунке.
Как можно видеть, акселерометр ADXL375 плдключен к плате Arduino Nano через интерфейс I²C.
Мы можем упростить подключение проводов на макетной плате с помощью перемычек и убедиться, что ADXL375 ориентирован так, как показано на макетной плате.
Исходные коды программ
Программа для получения показаний ускорения
Для разработки прошивки можно использовать хорошо написанную библиотеку Adafruit для ADXL375. Вы можете скачать ее с репозитория GitHub и добавить ее в Arduino IDE через менеджер библиотек.
Далее представлен модифицированный пример кода для режима I²C.
|
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 66 67 68 69 |
#include <Wire.h> #include <Adafruit_Sensor.h> #include <Adafruit_ADXL375.h> // ——— I²C SETUP ——— // Use the “default Wire” constructor (just the sensor ID) Adafruit_ADXL375 accel = Adafruit_ADXL375(12345); // If you ever need to override the address, you can call begin(0x53) below. // ALT_ADDRESS pin tied to GND → 0x53. void displayDataRate(void) { Serial.print("Data Rate: "); switch (accel.getDataRate()) { case ADXL343_DATARATE_3200_HZ: Serial.print("3200 "); break; case ADXL343_DATARATE_1600_HZ: Serial.print("1600 "); break; case ADXL343_DATARATE_800_HZ: Serial.print("800 "); break; case ADXL343_DATARATE_400_HZ: Serial.print("400 "); break; case ADXL343_DATARATE_200_HZ: Serial.print("200 "); break; case ADXL343_DATARATE_100_HZ: Serial.print("100 "); break; case ADXL343_DATARATE_50_HZ: Serial.print("50 "); break; case ADXL343_DATARATE_25_HZ: Serial.print("25 "); break; case ADXL343_DATARATE_12_5_HZ: Serial.print("12.5 "); break; case ADXL343_DATARATE_6_25HZ: Serial.print("6.25 "); break; case ADXL343_DATARATE_3_13_HZ: Serial.print("3.13 "); break; case ADXL343_DATARATE_1_56_HZ: Serial.print("1.56 "); break; case ADXL343_DATARATE_0_78_HZ: Serial.print("0.78 "); break; case ADXL343_DATARATE_0_39_HZ: Serial.print("0.39 "); break; case ADXL343_DATARATE_0_20_HZ: Serial.print("0.20 "); break; case ADXL343_DATARATE_0_10_HZ: Serial.print("0.10 "); break; default: Serial.print("???? "); break; } Serial.println("Hz"); } void setup(void) { Serial.begin(115200); while (!Serial) delay(10); Serial.println("ADXL375 I²C Accelerometer Test"); // Initialize I2C Wire.begin(); // Try to start the sensor on address 0x53 if (!accel.begin(0x53)) { Serial.println("Ooops, no ADXL375 detected ... Check your wiring!"); while (1) delay(10); } // (Optional) change data rate — default is 100 Hz accel.setDataRate(ADXL343_DATARATE_100_HZ); // Note: range is fixed at ±200 g on the ADXL375 Serial.println(); accel.printSensorDetails(); displayDataRate(); Serial.println(); } void loop(void) { sensors_event_t event; accel.getEvent(&event); Serial.print("X: "); Serial.print(event.acceleration.x); Serial.print(" "); Serial.print("Y: "); Serial.print(event.acceleration.y); Serial.print(" "); Serial.print("Z: "); Serial.print(event.acceleration.z); Serial.println(" m/s^2"); delay(500); } |
Загрузите этот код на плату Arduino Nano, а затем откройте последовательный монитор. Вы увидите данные об ускорении по всем осям x, y и z в последовательном мониторе.
Данные по осям x и y должны быть близки к нулю, поскольку датчик расположен на плоской поверхности. Данные по оси z должны составлять около 9,8 м/с² из-за гравитационного притяжения Земли. Но отображаются некоторые смещения. Именно поэтому вы изменили код для автоматической калибровки.
Программа чтения ускорения с автоматической калибровкой
Вот ещё один код для считывания корректных значений ускорения по осям x, y и z.
Сначала мы усредняем 100 показаний, удерживая доску в горизонтальном положении, чтобы вычислить x_offset, y_offset, и z_offset = avg_z – 9.80665 m/s². Затем в каждом цикле мы вычитаем эти смещения из исходных показаний, так что показания X/Y составляют примерно 0, а показания Z — примерно 9,8 м/с², когда датчик находится в горизонтальном положении.
|
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 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
#include <Wire.h> #include <Adafruit_Sensor.h> #include <Adafruit_ADXL375.h> // I²C constructor; we’ll call begin(0x53) below. Adafruit_ADXL375 accel = Adafruit_ADXL375(12345); // Offsets computed at startup: float x_offset = 0, y_offset = 0, z_offset = 0; // Helper to print current data rate void displayDataRate() { Serial.print("Data Rate: "); switch (accel.getDataRate()) { case ADXL343_DATARATE_3200_HZ: Serial.print("3200"); break; case ADXL343_DATARATE_1600_HZ: Serial.print("1600"); break; case ADXL343_DATARATE_800_HZ: Serial.print("800"); break; case ADXL343_DATARATE_400_HZ: Serial.print("400"); break; case ADXL343_DATARATE_200_HZ: Serial.print("200"); break; case ADXL343_DATARATE_100_HZ: Serial.print("100"); break; case ADXL343_DATARATE_50_HZ: Serial.print("50"); break; case ADXL343_DATARATE_25_HZ: Serial.print("25"); break; case ADXL343_DATARATE_12_5_HZ: Serial.print("12.5"); break; default: Serial.print("?"); break; } Serial.println(" Hz"); } void setup() { Serial.begin(115200); while (!Serial) delay(10); Serial.println("ADXL375 I²C Auto-Cal Accelerometer"); // --- I²C on custom ESP32 pins SDA=21, SCL=22 --- Wire.begin(); // Start the sensor at address 0x53 if (!accel.begin(0x53)) { Serial.println("ERROR: ADXL375 not found. Check wiring!"); while (1) delay(10); } // Optional: change from default 100 Hz accel.setDataRate(ADXL343_DATARATE_100_HZ); Serial.println(); accel.printSensorDetails(); displayDataRate(); Serial.println(); // --- AUTO CALIBRATION --- Serial.println("Calibrating... keep sensor FLAT and STILL"); const int SAMPLES = 100; float sum_x = 0, sum_y = 0, sum_z = 0; sensors_event_t evt; for (int i = 0; i < SAMPLES; i++) { accel.getEvent(&evt); sum_x += evt.acceleration.x; sum_y += evt.acceleration.y; sum_z += evt.acceleration.z; delay(20); } float avg_x = sum_x / SAMPLES; float avg_y = sum_y / SAMPLES; float avg_z = sum_z / SAMPLES; // X/Y → zero; Z → 1 g x_offset = avg_x; y_offset = avg_y; z_offset = avg_z - SENSORS_GRAVITY_STANDARD; Serial.print("X offset = "); Serial.println(x_offset, 4); Serial.print("Y offset = "); Serial.println(y_offset, 4); Serial.print("Z offset = "); Serial.println(z_offset, 4); Serial.println("Calibration done!\n"); } void loop() { sensors_event_t evt; accel.getEvent(&evt); // apply offsets float x = evt.acceleration.x - x_offset; float y = evt.acceleration.y - y_offset; float z = evt.acceleration.z - z_offset; Serial.print("X: "); Serial.print(x, 2); Serial.print(" Y: "); Serial.print(y, 2); Serial.print(" Z: "); Serial.print(z, 2); Serial.println(" m/s^2"); delay(500); } |
Загрузите этот код еще раз на плату Arduino Nano. Теперь показания будут правильн
Чтобы увидеть изменение показаний, потрясите датчик, переместите его или резко дерните. Вы увидите резкое изменение показаний.
Отображение показаний акселерометра ADXL375 на OLED-экране
Давайте добавим 0,96-дюймовый I2C OLED-дисплей к модулю Arduino и ADXL375. Вместо отображения показаний акселерометра в последовательном мониторе, давайте теперь будем выводить их на OLED-экран.
Вот простая схема подключения. OLED-дисплей представляет собой модуль I2C. Поэтому нам нужно просто подключить OLED-дисплей к контактам I2C на плате Arduino Nano.
Внешний вид этой схемы, собранной на макетной плате, показан на следующем рисунке.
Для написания кода нам необходимо добавить библиотеки Adafruit GFX и Adafruit SSD1306 OLED в папку библиотек Arduino IDE.
Скопируйте следующий код и загрузите его на плату Arduino Nano.
|
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 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 |
#include <Wire.h> #include <Adafruit_Sensor.h> #include <Adafruit_ADXL375.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> // ── ADXL375 I²C ───────────────────────────────────────────────────────────── Adafruit_ADXL375 accel = Adafruit_ADXL375(12345); // ── OLED DISPLAY ──────────────────────────────────────────────────────────── #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels #define OLED_RESET -1 // No reset pin Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); // ── calibration offsets ───────────────────────────────────────────────────── float x_offset = 0, y_offset = 0, z_offset = 0; void setup() { Serial.begin(115200); while (!Serial) delay(10); Serial.println("ADXL375 + SSD1306 Auto-Cal Example"); // Init I²C on ESP32 default pins (21=SDA,22=SCL) Wire.begin(); // Init ADXL375 @0x53 if (!accel.begin(0x53)) { Serial.println("ERROR: ADXL375 not found!"); while (1) delay(10); } accel.setDataRate(ADXL343_DATARATE_100_HZ); // Init OLED if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { Serial.println("ERROR: SSD1306 not found!"); while (1) delay(10); } display.clearDisplay(); display.setTextSize(1); display.setTextColor(SSD1306_WHITE); display.setCursor(0, 0); display.println("Calibrating..."); display.display(); // ── Auto-calibrate on flat/still surface ─────────────────────────────────── const int SAMPLES = 100; float sx=0, sy=0, sz=0; sensors_event_t evt; for (int i=0; i<SAMPLES; i++) { accel.getEvent(&evt); sx += evt.acceleration.x; sy += evt.acceleration.y; sz += evt.acceleration.z; delay(20); } float avg_x = sx / SAMPLES; float avg_y = sy / SAMPLES; float avg_z = sz / SAMPLES; x_offset = avg_x; y_offset = avg_y; z_offset = avg_z - SENSORS_GRAVITY_STANDARD; Serial.print("Offsets → X:"); Serial.print(x_offset,4); Serial.print(" Y:"); Serial.print(y_offset,4); Serial.print(" Z:"); Serial.println(z_offset,4); // Show offsets on OLED briefly display.clearDisplay(); display.setCursor(0,0); display.print("X offset: "); display.println(x_offset,2); display.print("Y offset: "); display.println(y_offset,2); display.print("Z offset: "); display.println(z_offset,2); display.display(); delay(1500); } void loop() { sensors_event_t evt; accel.getEvent(&evt); // apply calibration float x = evt.acceleration.x - x_offset; float y = evt.acceleration.y - y_offset; float z = evt.acceleration.z - z_offset; // ── OLED DISPLAY ───────────────────────────────────────────────────────── display.clearDisplay(); display.setTextColor(SSD1306_WHITE); // Header (small font) display.setTextSize(1); display.setCursor(0, 0); display.println("Acceleration (m/s^2)"); // X line display.setTextSize(2); // big numbers display.setCursor(0, 10); display.print("X:"); display.print(x, 1); display.setTextSize(1); // small units display.print(" m/s2"); // Y line display.setTextSize(2); display.setCursor(0, 28); display.print("Y:"); display.print(y, 1); display.setTextSize(1); display.print(" m/s2"); // Z line display.setTextSize(2); display.setCursor(0, 46); display.print("Z:"); display.print(z, 1); display.setTextSize(1); display.print(" m/s2"); display.display(); delay(200); } |
После загрузки кода OLED-дисплей начнет отображать показания ускорения по осям x, y и z.
