Введение
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) и работы с регистрами. Гибкость настроек делает его идеальным для многих приложений, связанных с отслеживанием движений.

Добавить комментарий