Arduino:Примеры/Genuino101CurieIMURawImuDataSerial

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Считывание данных с гироскопа и акселерометра одной функцией[1]

Этот пример показывает, как за один раз считывать «сырые» данные от акселерометра и гироскопа. Функция, используемая в этом примере, считывает все шесть значений сразу. Впрочем, существуют функции, позволяющие считывать значения от какого-либо одного датчика или от какой-либо одной оси датчика – они тоже указаны в этом скетче.

Необходимое оборудование

  • Плата Arduino/Genuino 101

Цепь

Никакого дополнительного оборудования для этого примера не нужно.

Наиболее важные части скетча

Библиотека CurieIMU.h, дающая доступ ко всем параметрам, функциям и значениям IMU-чипа платы Arduino/Genuino 101. В этот чип встроены 3-осевой акселерометр и 3-осевой гироскоп. Библиотека Curie IMU является частью ядра платы 101 и загружается вместе с ее ключевыми файлами. В этом примере мы будем считывать сразу все «сырые» данные от датчика движения при помощи функции readMotionSensor().

Код

Чтобы получить «сырые» данные, соответствующие реальному положению платы в пространстве, датчикам может потребоваться калибровка. Чтобы запустить ее, поменяйте строчку

int calibrateOffsets = 1;

на

int calibrateOffsets = 0;

, а затем поместите плату горизонтально на ровной плоской поверхности компонентами кверху. На мониторе порта будут показаны значения смещения до и после калибровки. Если вы не двигали плату, «сырые» данные должны быть близки к нулю, за исключением оси Z, где значение будет равно или близко к «16767», что соответствует 1G в диапазоне +/- 2G.

/*
  ===============================================
  Скетч-пример для библиотеки Curie IMU, предназначенной для 
  устройств Intel Curie. Все права защищены и принадлежат
  Intel Corporation (2015). 

  Основан на демонстрационном Arduino-скетче Джеффа Роуберга 
  (Jeff Rowberg) для библиотеки I2Cdev и устройства MPU6050: 
  https://github.com/jrowberg/i2cdevlib

  ===============================================
  Код библиотеки I2Cdev размещен в соответствии с лицензией MIT. 
  Права принадлежат Джеффу Роубергу. 

  Настоящим разрешается любому лицу, владеющему копией этой программы
  и сопутствующих документационных файлов (далее – «ПО»), а также тем,
  кому это ПО поставляется, обращаться с этим ПО без ограничений,
  включая права на использование, копирование, модификацию, слияние, 
  публикацию, распространение, сублицензирование и/или продажу копий 
  ПО, но при соблюдении следующих условий:
  
  Запись об авторском праве, написанная выше, а также запись о
  разрешениях, написанная ниже, должна быть включена во все копии
  или существенные части этого ПО.

  ДАННОЕ ПО ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗО ВСЯКИХ ГАРАНТИЙ, ЯВНЫХ 
  ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ ГАРАНТИИ НА КОММЕРЧЕСКОЕ КАЧЕСТВО,
  ПРИГОДНОСТЬ ПРИМЕНЕНИЯ ДЛЯ КОНКРЕТНЫХ ЦЕЛЕЙ И НЕНАРУШЕНИЕ ЧЬИХ-ЛИБО
  ПРАВ. НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ НЕ
  НЕСУТ ОТВЕТСВЕННОСТИ ЗА ЛЮБЫЕ ЖАЛОБЫ, УЩЕРБ И ПРОЧИЕ ПРЕТЕНЗИИ,
  БУДЬ ТО ИСК ПО КОНТРАКТУ, ПРАВОНАРУШЕНИЮ И Т.Д., ВОЗНИКШИЙ ИЗ ИЛИ 
  В СВЯЗИ С ПО, ИСПОЛЬЗОВАНИЯ ПО ИЛИ ПРОЧИХ ДЕЙСТВИЙ С ПО. 

  ===============================================
*/

#include "CurieIMU.h"
int ax, ay, az;         // значения от акселерометра 
int gx, gy, gz;         // значения от гироскопа

const int ledPin = 13;      // контакт для светодиода-индикатора
boolean blinkState = false; // статус светодиода

int calibrateOffsets = 1; // переменная для включения/отключения калибровки

void setup() {
  Serial.begin(9600); // инициализируем последовательную коммуникацию
  while (!Serial);    // ждем открытия последовательного порта

  // инициализируем IMU-устройство:
  Serial.println("Initializing IMU device...");  //  "Инициализация IMU-устройства..."
  CurieIMU.begin();

  // проверяем подключение: 
  Serial.println("Testing device connections...");  //  "Проверка подключения устройства..."
  if (CurieIMU.begin()) {
    Serial.println("CurieIMU connection successful");  //  "CurieIMU успешно подключено"
  } else {
    Serial.println("CurieIMU connection failed");  //  "Подключение CurieIMU не удалось"
  }

  // используйте код ниже, чтобы откалибровать смещение на акселерометре и гироскопе: 
  if (calibrateOffsets == 1) {
    Serial.println("Internal sensor offsets BEFORE calibration...");  //  "Смещение ПЕРЕД калибровкой..."   
    Serial.print(CurieIMU.getAccelerometerOffset(X_AXIS));
    Serial.print("\t"); // -76
    Serial.print(CurieIMU.getAccelerometerOffset(Y_AXIS));
    Serial.print("\t"); // -235
    Serial.print(CurieIMU.getAccelerometerOffset(Z_AXIS));
    Serial.print("\t"); // 168
    Serial.print(CurieIMU.getGyroOffset(X_AXIS));
    Serial.print("\t"); // 0
    Serial.print(CurieIMU.getGyroOffset(Y_AXIS));
    Serial.print("\t"); // 0
    Serial.println(CurieIMU.getGyroOffset(Z_AXIS));

    // используйте эти функции, если хотите задать компенсационные
    // значения вручную; если хотите, чтобы эти значения выставились
    // автоматически, используйте функцию autoCalibrate...()
    //CurieIMU.setAccelerometerOffset(X_AXIS,495.3);
    //CurieIMU.setAccelerometerOffset(Y_AXIS,-15.6);
    //CurieIMU.setAccelerometerOffset(Z_AXIS,491.4);
    //CurieIMU.setGyroOffset(X_AXIS,7.869);
    //CurieIMU.setGyroOffset(Y_AXIS,-0.061);
    //CurieIMU.setGyroOffset(Z_AXIS,15.494);

    Serial.println("About to calibrate. Make sure your board is stable and upright");  //  "Скоро начнется калибровка. Убедитесь, что плата лежит ровно, горизонтально и компонентами кверху"   
    delay(5000);

    // Чтобы калибровка прошла правильно, IMU-устройство
    // должно неподвижно лежать в горизонтальном положении: 
    Serial.print("Starting Gyroscope calibration and enabling offset compensation...");  //  "Запускаем калибровку гироскопа и активируем компенсацию смещения..."   
    CurieIMU.autoCalibrateGyroOffset();
    Serial.println(" Done");  //  " Готово"   

    Serial.print("Starting Acceleration calibration and enabling offset compensation...");  //  "Запускаем калибровку акселерометра и активируем компенсацию смещения..."   
    CurieIMU.autoCalibrateAccelerometerOffset(X_AXIS, 0);
    CurieIMU.autoCalibrateAccelerometerOffset(Y_AXIS, 0);
    CurieIMU.autoCalibrateAccelerometerOffset(Z_AXIS, 1);
    Serial.println(" Done");  //  " Готово"   

    Serial.println("Internal sensor offsets AFTER calibration...");  //  "Смещение ПОСЛЕ калибровки..."   
    Serial.print(CurieIMU.getAccelerometerOffset(X_AXIS));
    Serial.print("\t"); // -76
    Serial.print(CurieIMU.getAccelerometerOffset(Y_AXIS));
    Serial.print("\t"); // -2359
    Serial.print(CurieIMU.getAccelerometerOffset(Z_AXIS));
    Serial.print("\t"); // 1688
    Serial.print(CurieIMU.getGyroOffset(X_AXIS));
    Serial.print("\t"); // 0
    Serial.print(CurieIMU.getGyroOffset(Y_AXIS));
    Serial.print("\t"); // 0
    Serial.println(CurieIMU.getGyroOffset(Z_AXIS));
  }
  
  // делаем светодиод индикатором активности: 
  pinMode(ledPin, OUTPUT);
}

void loop() {
  // считываем «сырые» данные от акселерометра и гироскопа: 
  CurieIMU.readMotionSensor(ax, ay, az, gx, gy, gz);

  // если вы хотите извлечь данные только от акселерометра или только
  // от гироскопа, используйте эти функции:

  //CurieIMU.readAcceleration(ax, ay, az);
  //CurieIMU.readRotation(gx, gy, gz);

  // если вы хотите извлечь данные от какой-то одной оси,
  // используйте эти функции

  //ax = CurieIMU.readAccelerometer(X_AXIS);
  //ay = CurieIMU.readAccelerometer(Y_AXIS);
  //az = CurieIMU.readAccelerometer(Z_AXIS);
  //gx = CurieIMU.readGyro(X_AXIS);
  //gy = CurieIMU.readGyro(Y_AXIS);
  //gz = CurieIMU.readGyro(Z_AXIS);

  // показываем данные от гироскопа и акселерометра для всех 6 осей, разделяя их запятой:
  Serial.print("a/g:\t");
  Serial.print(ax);
  Serial.print("\t");
  Serial.print(ay);
  Serial.print("\t");
  Serial.print(az);
  Serial.print("\t");
  Serial.print(gx);
  Serial.print("\t");
  Serial.print(gy);
  Serial.print("\t");
  Serial.println(gz);

  // мигаем светодиодом, сообщая об активности:
  blinkState = !blinkState;
  digitalWrite(ledPin, blinkState);
}

См.также

  1. Curie IMU Orientation Visualizer
  2. Curie IMU Accelerometer
  3. Curie IMU Accelerometer Orientation
  4. Curie IMU Gyro
  5. Curie IMU Shock Detect
  6. Curie IMU Step Count
  7. Curie IMU Tap Detect

Внешние ссылки