Arduino:Примеры/Genuino101CurieIMUAccelerometerOrientation

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

Перевод: Максим Кузьмин (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 и загружается вместе с ее ключевыми файлами. В этом примере мы будем считывать «сырые» значения от акселерометра.

Код

Положение платы в пространстве рассчитывается при помощи значений от трех осей акселерометра. Ось Z идет перпендикулярно плате 101 – если сторона с компонентами будет вверху, то это положительное значение, а если внизу, то отрицательное. Ось X идет от USB-коннектора к Bluetooth-антенне, и при таком направлении значение будет положительным, а если от антенны к коннектору, то отрицательным. Ось Y идет от аналоговых контактов к цифровым контактам, и при таком направлении значение будет положительным, а если наоборот, то отрицательным. Совмещая три этих значения, скетч определяет положение платы в пространстве.

/*
   Правообладатель – Intel Corporation (2015).  Все права защищены.

   Эта библиотека является бесплатной; ее можно распространять 
   и/или модифицировать согласно условиям Стандартной общественной
   лицензии ограниченного применения GNU (т.к. она выпущена Фондом
   свободного ПО) – либо версии 2.1 этой лицензии, либо более поздней
   версии (на ваш выбор). 

   Эта библиотека распространяется в надежде на то, что будет 
   полезна кому-либо, но БЕЗО ВСЯКИХ ГАРАНТИЙ – даже без гарантий на 
   коммерческое качество и пригодность применения для конкретных 
   целей. Более подробно читайте в Стандартной общественной лицензии
   ограниченного применения GNU. 

   Вы должны получить копию Стандартной общественной лицензии
   ограниченного применения вместе с этой библиотекой. Если не
   получили, напишите в Фонд бесплатного ПО на адрес: Free Software
   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,    
   MA  02110-1301  USA 
*/

/*
   Этот скетч-пример демонстрирует, как можно использовать BMI160
   на модуле Intel Curie, чтобы считать данные с акселерометра, а
   затем с их помощью определить положение платы в пространстве.
*/

#include "CurieIMU.h"

int lastOrientation = - 1; // прежнее положение (для сравнения)

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

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

  // задаем диапазон акселерометра на 2G:
  CurieIMU.setAccelerometerRange(2);
}

void loop() {
int orientation = - 1;   // положение платы в пространстве
  String orientationString; // строка для сообщений о положении платы в пространстве
  /*
    Положение платы в пространстве:
    0: горизонтально, процессор вверху
    1: горизонтально, процессор внизу
    2: альбомный вид, аналоговые контакты внизу
    3: альбомный вид, аналоговые контакты вверху
    4: портретный вид, USB-коннектор вверху
    5: портретный вид, USB-коннектор внизу
  */
  // считываем значения акселерометра:
  int x = CurieIMU.readAccelerometer(X_AXIS);
  int y = CurieIMU.readAccelerometer(Y_AXIS);
  int z = CurieIMU.readAccelerometer(Z_AXIS);

  // высчитываем абсолютные значения, чтобы определить самые большие:
  int absX = abs(x);
  int absY = abs(y);
  int absZ = abs(z);

  if ( (absZ > absX) && (absZ > absY)) {
    // положение по оси Z:
    if (z > 0) {
      orientationString = "up";  //  "Процессор вверху"
      orientation = 0;  
    } else {
      orientationString = "down";  //  "Процессор внизу"
      orientation = 1;
    }
  } else if ( (absY > absX) && (absY > absZ)) {
    // положение по оси Y:
    if (y > 0) {
      orientationString = "digital pins up";  //  "Цифровые контакты вверху"
      orientation = 2;
    } else {
      orientationString = "analog pins up";  //  "Аналоговые контакты вверху"
      orientation = 3;
    }
  } else {
    // положение по оси X:
    if (x < 0) {
      orientationString = "connector up";  //  "Коннектор вверху"
      orientation = 4;
    } else {
      orientationString = "connector down";  //  "Коннектор внизу"
      orientation = 5;
    }
  }

  // если положение платы поменялось, сообщаем об этом:
  if (orientation != lastOrientation) {
    Serial.println(orientationString);
    lastOrientation = orientation;
  }
}

См.также

  • Curie IMU Orientation Visualizer
  • Curie IMU Accelerometer
  • Curie IMU Gyro
  • Curie IMU Raw Imu Data Serial
  • Curie IMU Shock Detect
  • Curie IMU Step Count
  • Curie IMU Tap Detect

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