Arduino:Примеры/Genuino101CurieIMURawImuDataSerial

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

Перевод: Максим Кузьмин (Cubewriter) Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


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

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

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

  • Плата Arduino/Genuino 101

Цепь

Genuino101fzz.jpg

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

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

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

Код

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

int calibrateOffsets = 1;

на

int calibrateOffsets = 0;

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

  1 /*
  2   ===============================================
  3   Скетч-пример для библиотеки Curie IMU, предназначенной для 
  4   устройств Intel Curie. Все права защищены и принадлежат
  5   Intel Corporation (2015). 
  6 
  7   Основан на демонстрационном Arduino-скетче Джеффа Роуберга 
  8   (Jeff Rowberg) для библиотеки I2Cdev и устройства MPU6050: 
  9   https://github.com/jrowberg/i2cdevlib
 10 
 11   ===============================================
 12   Код библиотеки I2Cdev размещен в соответствии с лицензией MIT. 
 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 #include "CurieIMU.h"
 38 int ax, ay, az;         // значения от акселерометра 
 39 int gx, gy, gz;         // значения от гироскопа
 40 
 41 const int ledPin = 13;      // контакт для светодиода-индикатора
 42 boolean blinkState = false; // статус светодиода
 43 
 44 int calibrateOffsets = 1; // переменная для включения/отключения калибровки
 45 
 46 void setup() {
 47   Serial.begin(9600); // инициализируем последовательную коммуникацию
 48   while (!Serial);    // ждем открытия последовательного порта
 49 
 50   // инициализируем IMU-устройство:
 51   Serial.println("Initializing IMU device...");  //  "Инициализация IMU-устройства..."
 52   CurieIMU.begin();
 53 
 54   // проверяем подключение: 
 55   Serial.println("Testing device connections...");  //  "Проверка подключения устройства..."
 56   if (CurieIMU.begin()) {
 57     Serial.println("CurieIMU connection successful");  //  "CurieIMU успешно подключено"
 58   } else {
 59     Serial.println("CurieIMU connection failed");  //  "Подключение CurieIMU не удалось"
 60   }
 61 
 62   // используйте код ниже, чтобы откалибровать смещение на акселерометре и гироскопе: 
 63   if (calibrateOffsets == 1) {
 64     Serial.println("Internal sensor offsets BEFORE calibration...");  //  "Смещение ПЕРЕД калибровкой..."   
 65     Serial.print(CurieIMU.getAccelerometerOffset(X_AXIS));
 66     Serial.print("\t"); // -76
 67     Serial.print(CurieIMU.getAccelerometerOffset(Y_AXIS));
 68     Serial.print("\t"); // -235
 69     Serial.print(CurieIMU.getAccelerometerOffset(Z_AXIS));
 70     Serial.print("\t"); // 168
 71     Serial.print(CurieIMU.getGyroOffset(X_AXIS));
 72     Serial.print("\t"); // 0
 73     Serial.print(CurieIMU.getGyroOffset(Y_AXIS));
 74     Serial.print("\t"); // 0
 75     Serial.println(CurieIMU.getGyroOffset(Z_AXIS));
 76 
 77     // используйте эти функции, если хотите задать компенсационные
 78     // значения вручную; если хотите, чтобы эти значения выставились
 79     // автоматически, используйте функцию autoCalibrate...()
 80     //CurieIMU.setAccelerometerOffset(X_AXIS,495.3);
 81     //CurieIMU.setAccelerometerOffset(Y_AXIS,-15.6);
 82     //CurieIMU.setAccelerometerOffset(Z_AXIS,491.4);
 83     //CurieIMU.setGyroOffset(X_AXIS,7.869);
 84     //CurieIMU.setGyroOffset(Y_AXIS,-0.061);
 85     //CurieIMU.setGyroOffset(Z_AXIS,15.494);
 86 
 87     Serial.println("About to calibrate. Make sure your board is stable and upright");  //  "Скоро начнется калибровка. Убедитесь, что плата лежит ровно, горизонтально и компонентами кверху"   
 88     delay(5000);
 89 
 90     // Чтобы калибровка прошла правильно, IMU-устройство
 91     // должно неподвижно лежать в горизонтальном положении: 
 92     Serial.print("Starting Gyroscope calibration and enabling offset compensation...");  //  "Запускаем калибровку гироскопа и активируем компенсацию смещения..."   
 93     CurieIMU.autoCalibrateGyroOffset();
 94     Serial.println(" Done");  //  " Готово"   
 95 
 96     Serial.print("Starting Acceleration calibration and enabling offset compensation...");  //  "Запускаем калибровку акселерометра и активируем компенсацию смещения..."   
 97     CurieIMU.autoCalibrateAccelerometerOffset(X_AXIS, 0);
 98     CurieIMU.autoCalibrateAccelerometerOffset(Y_AXIS, 0);
 99     CurieIMU.autoCalibrateAccelerometerOffset(Z_AXIS, 1);
100     Serial.println(" Done");  //  " Готово"   
101 
102     Serial.println("Internal sensor offsets AFTER calibration...");  //  "Смещение ПОСЛЕ калибровки..."   
103     Serial.print(CurieIMU.getAccelerometerOffset(X_AXIS));
104     Serial.print("\t"); // -76
105     Serial.print(CurieIMU.getAccelerometerOffset(Y_AXIS));
106     Serial.print("\t"); // -2359
107     Serial.print(CurieIMU.getAccelerometerOffset(Z_AXIS));
108     Serial.print("\t"); // 1688
109     Serial.print(CurieIMU.getGyroOffset(X_AXIS));
110     Serial.print("\t"); // 0
111     Serial.print(CurieIMU.getGyroOffset(Y_AXIS));
112     Serial.print("\t"); // 0
113     Serial.println(CurieIMU.getGyroOffset(Z_AXIS));
114   }
115   
116   // делаем светодиод индикатором активности: 
117   pinMode(ledPin, OUTPUT);
118 }
119 
120 void loop() {
121   // считываем «сырые» данные от акселерометра и гироскопа: 
122   CurieIMU.readMotionSensor(ax, ay, az, gx, gy, gz);
123 
124   // если вы хотите извлечь данные только от акселерометра или только
125   // от гироскопа, используйте эти функции:
126 
127   //CurieIMU.readAcceleration(ax, ay, az);
128   //CurieIMU.readRotation(gx, gy, gz);
129 
130   // если вы хотите извлечь данные от какой-то одной оси,
131   // используйте эти функции
132 
133   //ax = CurieIMU.readAccelerometer(X_AXIS);
134   //ay = CurieIMU.readAccelerometer(Y_AXIS);
135   //az = CurieIMU.readAccelerometer(Z_AXIS);
136   //gx = CurieIMU.readGyro(X_AXIS);
137   //gy = CurieIMU.readGyro(Y_AXIS);
138   //gz = CurieIMU.readGyro(Z_AXIS);
139 
140   // показываем данные от гироскопа и акселерометра для всех 6 осей, разделяя их запятой:
141   Serial.print("a/g:\t");
142   Serial.print(ax);
143   Serial.print("\t");
144   Serial.print(ay);
145   Serial.print("\t");
146   Serial.print(az);
147   Serial.print("\t");
148   Serial.print(gx);
149   Serial.print("\t");
150   Serial.print(gy);
151   Serial.print("\t");
152   Serial.println(gz);
153 
154   // мигаем светодиодом, сообщая об активности:
155   blinkState = !blinkState;
156   digitalWrite(ledPin, blinkState);
157 }

См.также

  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

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