Работа с датчиком 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_LOUT_Y_LOUT_Z_L).
  • Старший байт (OUT_X_HOUT_Y_HOUT_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) и работы с регистрами. Гибкость настроек делает его идеальным для многих приложений, связанных с отслеживанием движений.

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии