Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

Arduino:Примеры/Genuino101CurieIMUAccelerometerOrientation

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

Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

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


Короткие уведомления о положении платы в пространстве[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

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

  1. Arduino.cc - Genuino101CurieIMUAccelerometerOrientation