Arduino:Примеры/Genuino101CurieIMUShockDetect

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

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


Определение удара[1]

Этот пример показывает, как настроить IMU-устройство на определение удара и управлять прерыванием, запускаемым при наступлении этого события. Условия для определения удара задаются при помощи двух параметров – продолжительности и порогового значения. Будучи настроенным, IMU-устройство начинает считывать данные от акселерометра и гироскопа, ища паттерн данных, соответствующий заданному событию. То есть в данном случае – удару.

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

  • Плата Arduino/Genuino 101

Цепь

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

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

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

Код

Удар – это событие, при котором датчик считывает от акселерометра очень высокие значения в короткий промежуток времени. В функции setDetectionThreshold() указывается то, каким должно быть пороговое значение от акселерометра, а в функции setDetectionDuration() – то, какой должна быть продолжительность удара (это должно быть 50 или 75 миллисекунд). То есть вместе две эти функции задают условия для определения удара.

Настроив пороговое значение и продолжительность, при помощи функции interrupts() включаем прерывание. Таким образом, когда заданные условия будут соблюдены, запустится прерывание, а вместе с ним и пользовательская функция eventCallback(). Внутри нее имеется функция getInterruptStatus(), позволяющая сверяться с разными комбинациями осей и направлений, тем самым позволяя определять и через монитор порта сообщать, по какой оси и в каком направлении был нанесен удар.

/*
   Правообладатель – 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"

boolean blinkState = false;          // состояние светодиода

void setup() {
  Serial.begin(9600);

  /* инициализируем IMU-устройство */
  CurieIMU.begin();
  CurieIMU.attachInterrupt(eventCallback);

  /* включаем определение удара */
  CurieIMU.setDetectionThreshold(CURIE_IMU_SHOCK, 1500); // 1.5g = 1500 mg
  CurieIMU.setDetectionDuration(CURIE_IMU_SHOCK, 50);   // 50 миллисекунд
  CurieIMU.interrupts(CURIE_IMU_SHOCK);

  Serial.println("IMU initialisation complete, waiting for events...");  //  "Инициализация IMU-устройства завершена, ждем наступления заданных условий..."
}

void loop() {
  // как только начался блок loop(), мигаем светодиодом:
  digitalWrite(13, blinkState);
  blinkState = !blinkState;
  delay(1000);
}


static void eventCallback(void)
{
  if (CurieIMU.getInterruptStatus(CURIE_IMU_SHOCK)) {
    if (CurieIMU.shockDetected(X_AXIS, POSITIVE))
      Serial.println("Negative shock detected on X-axis");  //  "Определен удар по оси X в направлении от бесконечности к 0"
    if (CurieIMU.shockDetected(X_AXIS, NEGATIVE))
      Serial.println("Positive shock detected on X-axis");  //  "Определен удар по оси X в направлении от 0 к бесконечности"
    if (CurieIMU.shockDetected(Y_AXIS, POSITIVE))
      Serial.println("Negative shock detected on Y-axis");  //  "Определен удар по оси Y в направлении от бесконечности к 0"
    if (CurieIMU.shockDetected(Y_AXIS, NEGATIVE))
      Serial.println("Positive shock detected on Y-axis");  //  "Определен удар по оси Y в направлении от 0 к бесконечности"
    if (CurieIMU.shockDetected(Z_AXIS, POSITIVE))
      Serial.println("Negative shock detected on Z-axis");  //  "Определен удар по оси Z в направлении от бесконечности к 0"
    if (CurieIMU.shockDetected(Z_AXIS, NEGATIVE))
      Serial.println("Positive shock detected on Z-axis");  //  "Определен удар по оси Z в направлении от 0 к бесконечности"
  }
}

См.также

  1. Curie IMU Orientation Visualizer
  2. Curie IMU Accelerometer
  3. Curie IMU Accelerometer Orientation
  4. Curie IMU Gyro
  5. Curie IMU Raw Imu Data Serial
  6. Curie IMU Step Count
  7. Curie IMU Tap Detect

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