Сейчас ваша корзина пуста!
Работа с датчиком L3G4200D
Введение
L3G4200D — это трехосевой гироскоп производства STMicroelectronics, предназначенный для измерения угловой скорости вращения. Этот датчик широко используется в робототехнике, мобильных устройствах, игровых контроллерах и других приложениях, где требуется измерение вращательного движения.
Датчик поддерживает цифровой интерфейс и позволяет настроить параметры чувствительности, диапазона измерений и частоты обновления. Он работает через интерфейс I²C или SPI, что делает его универсальным для использования в различных системах.
Основные характеристики L3G4200D
- Диапазон измерений угловой скорости: ±250, ±500 или ±2000 °/с.
- Цифровой интерфейс: поддерживает I²C и SPI.
- Напряжение питания: 2.4–3.6 В.
- Частота обновления: от 95 до 800 Гц.
- Встроенный температурный датчик.
- Функции низкого энергопотребления: различные режимы сна и ожидания.
Подключение L3G4200D
1. Подключение по I2C
Для работы с L3G4200D через I²C потребуется подключить следующие пины:
- VDD: питание (обычно 3.3 В).
- GND: земля.
- SDA: линия данных.
- SCL: линия синхронизации.
- CS: для работы по I2C необходимо подтянуть к питанию
Для примера я добавлю в схему небольшой OLED дисплей
Ваш датчик и дисплей визуально могут отличаться, Особенно дисплей может иметь всего 4 контакта. Это не существенно т.к. принцип подключения и работы с ними останется идентичен
2. Подключение по SPI
Для работы по SPI требуется задействовать пины:
- VDD: питание.
- GND: земля.
- SDO: выход данных.
- SDI: вход данных.
- SCL: линия синхронизации.
- CS: чип-селект, подтянут к земле для активации SPI.
Конфигурация и работа
После подключения датчика необходимо произвести начальную настройку через запись в его регистры. Рассмотрим основные этапы работы.
1. Настройка регистров
Для управления L3G4200D используются следующие ключевые регистры:
- CTRL_REG1 (0x20): Включите x, y, z и выключите питание.
- CTRL_REG4 (0x23): задает чувствительность гироскопа (FS).
- OUT_X_L, OUT_X_H, OUT_Y_L, OUT_Y_H, OUT_Z_L, OUT_Z_H: регистры данных для трех осей.
Пример настройки CTRL_REG1 для включения всех осей и частоты 100 Гц:
- Адрес регистра:
0x20
- Значение:
0x0F
(включение X, Y, Z и активация датчика).
2. Чтение данных
Данные угловой скорости передаются в 16-битных регистрах:
- Младший байт (
OUT_X_L
,OUT_Y_L
,OUT_Z_L
). - Старший байт (
OUT_X_H
,OUT_Y_H
,OUT_Z_H
).
Данные объединяются в одно 16-битное значение:Gyro_Data=(OUT_H≪8)|OUT_L
3. Конвертация данных
Для получения угловой скорости в градусах/секунду значение умножается на чувствительность, заданную в CTRL_REG4:
- ±250 °/с: чувствительность $= 8.75$ mdps/LSB.
- ±500 °/с: чувствительность $= 17.5$ mdps/LSB.
- ±2000 °/с: чувствительность $= 70$ mdps/LSB.
Формула: ω=Gyro_Data×Sensitivity
Пример кода на Arduino
Подключение по I2C
#include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define CTRL_REG1 0x20 #define CTRL_REG2 0x21 #define CTRL_REG3 0x22 #define CTRL_REG4 0x23 #define CTRL_REG5 0x24 #define OLED_WIDTH 128 // OLED дисплей. Ширина в пикселях #define OLED_HEIGHT 64 // OLED дисплей. Высота в пикселях int L3G4200D_Address = 105; //I2C адрес для L3G4200D int x; int y; int z; Adafruit_SSD1306 oled(OLED_WIDTH, OLED_HEIGHT, &Wire, -1); // Разрешение изображения: 64 x 64; const uint16_t image_widht PROGMEM = 64; // Размер в пикселях, а не в байтах const uint16_t image_height PROGMEM = 64; // const uint16_t image_size PROGMEM = 512; const uint8_t image[512] PROGMEM = { 0b11111111, 0b11111111, 0b11111111, 0b00000000, 0b00000000, 0b11111111, 0b11111111, 0b11111111, 0b11111111, 0b11111111, 0b11111000, 0b00000000, 0b00000000, 0b00011111, 0b11111111, 0b11111111, 0b11111111, 0b11111111, 0b11100000, 0b00001111, 0b11110000, 0b00000111, 0b11111111, 0b11111111, 0b11111111, 0b11111111, 0b10000001, 0b11111111, 0b11111111, 0b10000001, 0b11111111, 0b11111111, 0b11111111, 0b11111110, 0b00000111, 0b11111111, 0b11111111, 0b11100000, 0b01111111, 0b11111111, 0b11111111, 0b11111000, 0b00111111, 0b11111111, 0b11111111, 0b11111100, 0b00011111, 0b11111111, 0b11111111, 0b11110000, 0b01111111, 0b11111111, 0b11111111, 0b11111110, 0b00001111, 0b11111111, 0b11111111, 0b11100001, 0b11111111, 0b11111111, 0b11111111, 0b11111111, 0b10000111, 0b11111111, 0b11111111, 0b11000011, 0b11111111, 0b11111111, 0b11111111, 0b11111111, 0b11000011, 0b11111111, 0b11111111, 0b10000111, 0b11111111, 0b11111111, 0b11111111, 0b11111111, 0b11100001, 0b11111111, 0b11111111, 0b00011111, 0b11111111, 0b00011111, 0b11111000, 0b11111111, 0b11111000, 0b11111111, 0b11111110, 0b00111111, 0b11111110, 0b00001111, 0b11110000, 0b01111111, 0b11111100, 0b01111111, 0b11111100, 0b00111111, 0b11111110, 0b01100111, 0b11100010, 0b01111111, 0b11111100, 0b00111111, 0b11111000, 0b01111111, 0b11111110, 0b01110011, 0b11000110, 0b01111111, 0b11111110, 0b00011111, 0b11111000, 0b11111111, 0b11111111, 0b00111001, 0b10001100, 0b01111111, 0b11111111, 0b00011111, 0b11110001, 0b11111111, 0b11111111, 0b10011001, 0b10011000, 0b11111111, 0b11111111, 0b10001111, 0b11110001, 0b11111111, 0b11111000, 0b11001001, 0b10010001, 0b00011111, 0b11111111, 0b10001111, 0b11100011, 0b11111111, 0b11110000, 0b01001001, 0b10010010, 0b00001111, 0b11111111, 0b11000111, 0b11100111, 0b11111111, 0b11110010, 0b00001001, 0b10010000, 0b01001111, 0b11111111, 0b11100111, 0b11000111, 0b11111111, 0b11110011, 0b00001001, 0b10010000, 0b11001111, 0b11111111, 0b11100011, 0b11000111, 0b11111111, 0b11110001, 0b10001001, 0b10010001, 0b10001111, 0b11111111, 0b11100011, 0b10001111, 0b11111111, 0b11111000, 0b11111001, 0b10011111, 0b00011111, 0b11111111, 0b11110001, 0b10001111, 0b11111111, 0b11101100, 0b01111001, 0b10011110, 0b00110011, 0b11111111, 0b11110001, 0b10011111, 0b11111111, 0b10000010, 0b00001001, 0b10010000, 0b01000001, 0b11111111, 0b11111001, 0b00011111, 0b11111111, 0b10010001, 0b10001001, 0b10010001, 0b10001001, 0b11111111, 0b11111000, 0b00011111, 0b11111111, 0b10011000, 0b00001001, 0b10010000, 0b00011001, 0b11111111, 0b11111000, 0b00011111, 0b11111111, 0b10001100, 0b00001001, 0b10010000, 0b00110001, 0b11111111, 0b11111000, 0b00011111, 0b11111111, 0b11000111, 0b11111001, 0b10011111, 0b11100011, 0b11111111, 0b11111000, 0b00111111, 0b11111111, 0b11000111, 0b11111001, 0b10011111, 0b11100011, 0b11111111, 0b11111100, 0b00111111, 0b11100001, 0b10001100, 0b00001001, 0b10010000, 0b00110001, 0b10000111, 0b11111100, 0b00111111, 0b11100000, 0b10011000, 0b00001001, 0b10010000, 0b00011001, 0b00000111, 0b11111100, 0b00111111, 0b11100100, 0b00010001, 0b11001001, 0b10010011, 0b10001001, 0b00110111, 0b11111100, 0b00111111, 0b11100100, 0b10000011, 0b11001001, 0b10010011, 0b11000001, 0b00110111, 0b11111100, 0b00111111, 0b11100100, 0b11000111, 0b11001001, 0b10010011, 0b11100011, 0b00110111, 0b11111100, 0b00111111, 0b11100110, 0b01111111, 0b11001001, 0b10010011, 0b11111110, 0b01100111, 0b11111100, 0b00111111, 0b11100111, 0b00111111, 0b11001001, 0b10010011, 0b11111100, 0b11100111, 0b11111100, 0b00011111, 0b11110011, 0b10011111, 0b11001001, 0b10010011, 0b11111001, 0b11001111, 0b11111000, 0b00011111, 0b11110001, 0b11001111, 0b11001001, 0b10010011, 0b11110011, 0b10001111, 0b11111000, 0b00011111, 0b11100011, 0b11100000, 0b00001001, 0b10010000, 0b00000111, 0b11000111, 0b11111000, 0b00011111, 0b11100110, 0b01110000, 0b00001001, 0b10010000, 0b00001110, 0b01100111, 0b11111000, 0b10011111, 0b11100100, 0b00111111, 0b11111001, 0b10011111, 0b11111100, 0b00100111, 0b11110001, 0b10001111, 0b11100000, 0b00000000, 0b00001001, 0b10010000, 0b00000001, 0b00000111, 0b11110001, 0b10001111, 0b11110001, 0b11000000, 0b00001001, 0b10010000, 0b00000011, 0b10001111, 0b11110001, 0b11000111, 0b11111111, 0b11111111, 0b11001001, 0b10010011, 0b11111111, 0b11111111, 0b11100011, 0b11000111, 0b11111111, 0b11111111, 0b11001001, 0b10010011, 0b11111111, 0b11111111, 0b11100011, 0b11100111, 0b11111111, 0b11111111, 0b11001001, 0b10010011, 0b11111111, 0b11111111, 0b11100011, 0b11100011, 0b11111111, 0b11111111, 0b11001001, 0b10010011, 0b11111111, 0b11111111, 0b11000111, 0b11110001, 0b11111111, 0b11111111, 0b11001001, 0b10010011, 0b11111111, 0b11111111, 0b10001111, 0b11110001, 0b11111111, 0b11111111, 0b11001001, 0b10010011, 0b11111111, 0b11111111, 0b10001111, 0b11111000, 0b11111111, 0b11111111, 0b11001001, 0b10010011, 0b11111111, 0b11111111, 0b00011111, 0b11111000, 0b01111111, 0b11111111, 0b11001001, 0b10010011, 0b11111111, 0b11111110, 0b00011111, 0b11111100, 0b00111111, 0b11111111, 0b11001001, 0b10010011, 0b11111111, 0b11111100, 0b00111111, 0b11111110, 0b00111111, 0b11111111, 0b11001001, 0b10010011, 0b11111111, 0b11111100, 0b01111111, 0b11111111, 0b00011111, 0b11111111, 0b11000001, 0b10000011, 0b11111111, 0b11111000, 0b11111111, 0b11111111, 0b10000111, 0b11111111, 0b11100001, 0b10000111, 0b11111111, 0b11100001, 0b11111111, 0b11111111, 0b11000011, 0b11111111, 0b11111111, 0b11111111, 0b11111111, 0b11000011, 0b11111111, 0b11111111, 0b11100001, 0b11111111, 0b11111111, 0b11111111, 0b11111111, 0b10000111, 0b11111111, 0b11111111, 0b11110000, 0b01111111, 0b11111111, 0b11111111, 0b11111110, 0b00001111, 0b11111111, 0b11111111, 0b11111000, 0b00111111, 0b11111111, 0b11111111, 0b11111100, 0b00011111, 0b11111111, 0b11111111, 0b11111110, 0b00000111, 0b11111111, 0b11111111, 0b11100000, 0b01111111, 0b11111111, 0b11111111, 0b11111111, 0b10000001, 0b11111111, 0b11111111, 0b00000001, 0b11111111, 0b11111111, 0b11111111, 0b11111111, 0b11100000, 0b00001111, 0b11110000, 0b00000111, 0b11111111, 0b11111111, 0b11111111, 0b11111111, 0b11111000, 0b00000000, 0b00000000, 0b00011111, 0b11111111, 0b11111111, 0b11111111, 0b11111111, 0b11111111, 0b00000000, 0b00000000, 0b11111111, 0b11111111, 0b11111111, }; void setup(){ Wire.begin(); Serial.begin(115200); Serial.println("starting up L3G4200D"); setupL3G4200D(2000); // Настраиваем наш L3G4200 - Доступные значения 250, 500 or 2000 deg/sec //Инициализируем OLED дисплей с адресом 0x3C if (!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { Serial.println(F("SSD1306 allocation failed")); while (true); } oled.clearDisplay(); // clear display oled.drawBitmap(32, 0, image, 64, 64, 1); oled.display(); delay(5000); } void loop(){ getGyroValues(); // Получаем значения гмроскопа Serial.print("X:"); Serial.print(x); Serial.print(" Y:"); Serial.print(y); Serial.print(" Z:"); Serial.println(z); oled.clearDisplay(); oled.drawBitmap(64, 0, image, 64, 64, 1); oled.setTextSize(1); // Размер текста oled.setTextColor(WHITE); // Цвет текста... ну мало ли, вдруг у вас цветной oled.setCursor(0, 10); // Положение на дисплее oled.print("X:"); oled.println(x); oled.print("Y:"); oled.println(y); oled.print("Z:"); oled.println(z); oled.display(); delay(200); // Подождем немного для полной готовности } void getGyroValues(){ byte xMSB = readRegister(L3G4200D_Address, 0x29); byte xLSB = readRegister(L3G4200D_Address, 0x28); x = ((xMSB << 8) | xLSB); byte yMSB = readRegister(L3G4200D_Address, 0x2B); byte yLSB = readRegister(L3G4200D_Address, 0x2A); y = ((yMSB << 8) | yLSB); byte zMSB = readRegister(L3G4200D_Address, 0x2D); byte zLSB = readRegister(L3G4200D_Address, 0x2C); z = ((zMSB << 8) | zLSB); } void setupL3G4200D(int scale){ // Включите x, y, z и выключите питание: writeRegister(L3G4200D_Address, CTRL_REG1, 0b00001111); // Если вы хотите настроить/использовать HPF, вы можете отредактировать строку ниже, чтобы настроить CTRL_REG2: writeRegister(L3G4200D_Address, CTRL_REG2, 0b00000000); // Настраиваем CTRL_REG3 для генерации прерывания готовности данных на INT2 // Прерывания для INT1 не используются, если вы хотите настроить INT1 // или INT2 в противном случае, обратитесь к таблице данных: writeRegister(L3G4200D_Address, CTRL_REG3, 0b00001000); // CTRL_REG4, среди прочего, управляет полномасштабным диапазоном:: if(scale == 250){ writeRegister(L3G4200D_Address, CTRL_REG4, 0b00000000); }else if(scale == 500){ writeRegister(L3G4200D_Address, CTRL_REG4, 0b00010000); }else{ writeRegister(L3G4200D_Address, CTRL_REG4, 0b00110000); } // CTRL_REG5 управляет фильтрацией верхних частот выходных данных, используйте его writeRegister(L3G4200D_Address, CTRL_REG5, 0b00000000); } void writeRegister(int deviceAddress, byte address, byte val) { Wire.beginTransmission(deviceAddress); Wire.write(address); Wire.write(val); Wire.endTransmission(); int readRegister(int deviceAddress, byte address){ int v; Wire.beginTransmission(deviceAddress); Wire.write(address); // register to read Wire.endTransmission(); Wire.requestFrom(deviceAddress, 1); // read a byte while(!Wire.available()) { // waiting } v = Wire.read(); return v; }
Заключение
Датчик L3G4200D — мощный инструмент для измерения угловых скоростей. Его интеграция с микроконтроллером требует базового понимания цифровых интерфейсов (I²C или SPI) и работы с регистрами. Гибкость настроек делает его идеальным для многих приложений, связанных с отслеживанием движений.