Arduino:Примеры/Genuino101CurieIMUTapDetect

Материал из Онлайн справочника
Версия от 00:52, 14 декабря 2016; Myagkij (обсуждение | вклад) (Замена текста — «<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">» на «<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">»)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигацииПерейти к поиску
Версия для печати больше не поддерживается и может содержать ошибки обработки. Обновите закладки браузера и используйте вместо этого функцию печати браузера по умолчанию.

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


Определение двойного нажатия[1]

Этот пример показывает, как настроить IMU-устройство на определение двойного нажатия, сделанного по оси X, Y или Z. В данном случае диапазон значений от акселерометра выставлен на более сильные нажатия, а интервал между ними должен быть не менее четверти секунды.

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

  • Плата Arduino/Genuino 101

Цепь

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

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

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

Код

Этот скетч включает в себя только блок setup(), который содержит весь код, необходимый, чтобы задать событие для определения двойного нажатия. Если двойное нажатие будет определено, запустится прерывание, с помощью которого будет вызвана функция eventCallback(), определяющая и через монитор порта сообщающая, по какой оси и в каком направлении было совершено двойное нажатие. Блок loop() оставляем пустым.

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

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

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

  // увеличиваем диапазон значений акселерометра, чтобы можно было
  // определять более сильные нажатия (< 4g):
  CurieIMU.setAccelerometerRange(4);

  // снижаем порог, чтобы можно было определять более 
  // слабые нажатия (>= 750mg):
  CurieIMU.setDetectionThreshold(CURIE_IMU_TAP, 750); // (750mg)

  // включаем определение двойного нажатия:
  CurieIMU.interrupts(CURIE_IMU_TAP);

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

void loop() {
  // в блоке loop() ничего не пишем, потому что все нужные действия
  // происходят в функции внешнего вызова, т.е. в eventCallback()
}

static void eventCallback()
{
  if (CurieIMU.getInterruptStatus(CURIE_IMU_TAP)) {
    if (CurieIMU.tapDetected(X_AXIS, NEGATIVE))
      Serial.println("Tap detected on negative X-axis");  //  "Определено двойное нажатие по оси X в направлении от бесконечности к 0"
    if (CurieIMU.tapDetected(X_AXIS, POSITIVE))
      Serial.println("Tap detected on positive X-axis");  //  "Определено двойное нажатие по оси X в направлении от 0 к бесконечности"
    if (CurieIMU.tapDetected(Y_AXIS, NEGATIVE))
      Serial.println("Tap detected on negative Y-axis");  //  "Определено двойное нажатие по оси Y в направлении от бесконечности к 0"
    if (CurieIMU.tapDetected(Y_AXIS, POSITIVE))
      Serial.println("Tap detected on positive Y-axis");  //  "Определено двойное нажатие по оси Y в направлении от 0 к бесконечности"
    if (CurieIMU.tapDetected(Z_AXIS, NEGATIVE))
      Serial.println("Tap detected on negative Z-axis");  //  "Определено двойное нажатие по оси Z в направлении от бесконечности к 0"
    if (CurieIMU.tapDetected(Z_AXIS, POSITIVE))
      Serial.println("Tap detected on positive 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 Shock Detect
  7. Curie IMU Step Count

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