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 идет от аналоговых контактов к цифровым контактам, и при таком направлении значение будет положительным, а если наоборот, то отрицательным. Совмещая три этих значения, скетч определяет положение платы в пространстве.

  1 /*
  2    Правообладатель – Intel Corporation (2015).  Все права защищены.
  3 
  4    Эта библиотека является бесплатной; ее можно распространять 
  5    и/или модифицировать согласно условиям Стандартной общественной
  6    лицензии ограниченного применения GNU (т.к. она выпущена Фондом
  7    свободного ПО) – либо версии 2.1 этой лицензии, либо более поздней
  8    версии (на ваш выбор). 
  9 
 10    Эта библиотека распространяется в надежде на то, что будет 
 11    полезна кому-либо, но БЕЗО ВСЯКИХ ГАРАНТИЙ – даже без гарантий на 
 12    коммерческое качество и пригодность применения для конкретных 
 13    целей. Более подробно читайте в Стандартной общественной лицензии
 14    ограниченного применения GNU. 
 15 
 16    Вы должны получить копию Стандартной общественной лицензии
 17    ограниченного применения вместе с этой библиотекой. Если не
 18    получили, напишите в Фонд бесплатного ПО на адрес: Free Software
 19    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,    
 20    MA  02110-1301  USA 
 21 */
 22 
 23 /*
 24    Этот скетч-пример демонстрирует, как можно использовать BMI160
 25    на модуле Intel Curie, чтобы считать данные с акселерометра, а
 26    затем с их помощью определить положение платы в пространстве.
 27 */
 28 
 29 #include "CurieIMU.h"
 30 
 31 int lastOrientation = - 1; // прежнее положение (для сравнения)
 32 
 33 void setup() {
 34   Serial.begin(9600); // инициализируем последовательную коммуникацию
 35   while (!Serial);    // ждем открытия последовательного порта
 36 
 37   // инициализируем IMU-устройство:
 38   Serial.println("Initializing IMU device...");  //  "Инициализация IMU-устройства..."
 39   CurieIMU.begin();
 40 
 41   // задаем диапазон акселерометра на 2G:
 42   CurieIMU.setAccelerometerRange(2);
 43 }
 44 
 45 void loop() {
 46 int orientation = - 1;   // положение платы в пространстве
 47   String orientationString; // строка для сообщений о положении платы в пространстве
 48   /*
 49     Положение платы в пространстве:
 50     0: горизонтально, процессор вверху
 51     1: горизонтально, процессор внизу
 52     2: альбомный вид, аналоговые контакты внизу
 53     3: альбомный вид, аналоговые контакты вверху
 54     4: портретный вид, USB-коннектор вверху
 55     5: портретный вид, USB-коннектор внизу
 56   */
 57   // считываем значения акселерометра:
 58   int x = CurieIMU.readAccelerometer(X_AXIS);
 59   int y = CurieIMU.readAccelerometer(Y_AXIS);
 60   int z = CurieIMU.readAccelerometer(Z_AXIS);
 61 
 62   // высчитываем абсолютные значения, чтобы определить самые большие:
 63   int absX = abs(x);
 64   int absY = abs(y);
 65   int absZ = abs(z);
 66 
 67   if ( (absZ > absX) && (absZ > absY)) {
 68     // положение по оси Z:
 69     if (z > 0) {
 70       orientationString = "up";  //  "Процессор вверху"
 71       orientation = 0;  
 72     } else {
 73       orientationString = "down";  //  "Процессор внизу"
 74       orientation = 1;
 75     }
 76   } else if ( (absY > absX) && (absY > absZ)) {
 77     // положение по оси Y:
 78     if (y > 0) {
 79       orientationString = "digital pins up";  //  "Цифровые контакты вверху"
 80       orientation = 2;
 81     } else {
 82       orientationString = "analog pins up";  //  "Аналоговые контакты вверху"
 83       orientation = 3;
 84     }
 85   } else {
 86     // положение по оси X:
 87     if (x < 0) {
 88       orientationString = "connector up";  //  "Коннектор вверху"
 89       orientation = 4;
 90     } else {
 91       orientationString = "connector down";  //  "Коннектор внизу"
 92       orientation = 5;
 93     }
 94   }
 95 
 96   // если положение платы поменялось, сообщаем об этом:
 97   if (orientation != lastOrientation) {
 98     Serial.println(orientationString);
 99     lastOrientation = orientation;
100   }
101 }

См.также

  • 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

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