Arduino:Примеры/Genuino101CurieIMUStepCount

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

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


Счетчик шагов[1]

Этот пример показывает, как настроить на IMU-устройстве счетчик шагов и управлять соответствующим прерыванием. Как вариант, вместо прерывания можно использовать циклическое считывание (опрос) – чтобы данные, показываемые через монитор порта, обновлялись не так быстро.

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

  • Плата Arduino/Genuino 101

Цепь

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

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

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

Функция updateStepCount(), считывающая количество шагов, посчитанных с момента инициализации IMU-устройства. Если их количество будет таким же, что и при последнем считывании, ничего не произойдет. Если количество изменится, новое значение будет сохранено и показано на мониторе порта.

Код

Этот скетч поддерживает подсчет шагов и с помощью прерываний, и с помощью опроса. Счетчик через прерывания включен по умолчанию, поэтому если вы хотите считать шаги через опрос (он будет проводиться раз в секунду), поменяйте строчку

boolean stepEventsEnabeled = true;

на

boolean stepEventsEnabeled = false;

Функция, вызываемая при прерывании, просто вызывает функцию updateStepCount(), отвечающую за подсчет шагов. Таким образом, при использовании прерываний данные в мониторе порта будут обновляться с каждым новым прерыванием, а при использовании опроса – раз в секунду.

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

/* Чтобы включить уведомления, присылаемые с каждым прерыванием,
   выставьте stepEventsEnabeled на «true». Чтобы включить  
   уведомления, присылаемые каждую секунду, выставьте его на «false».

   Согласно замыслу, уведомления о считанных шагах будут немного
   запаздывать. Более подробно о счетчике шагов читайте в секции 2.7 
   «даташита» IMU-устройства BMI160.
*/
const int ledPin = 13;

boolean stepEventsEnabeled = true;   // здесь задается, какой способ будет использоваться – через прерывания или опрос
long lastStepCount = 0;              // счетчик шагов при предыдущем опросе 
boolean blinkState = false;          // состояние светодиода

void setup() {
  Serial.begin(9600);
  // pinMode(13, OUTPUT);
  // инициализируем датчик:
  CurieIMU.begin();
  // включаем режим определения шагов:
  CurieIMU.setStepDetectionMode(CURIE_IMU_STEP_MODE_NORMAL);
  // включаем счетчик шагов:
  CurieIMU.setStepCountEnabled(true);

  if (stepEventsEnabeled) {
    // задаем функцию внешнего вызова, которая будет обработчиком события: 
    CurieIMU.attachInterrupt(eventCallback);
    CurieIMU.interrupts(CURIE_IMU_STEP);  // включаем определение шагов

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

void loop() {
  /* вместо использования уведомлений о распознанных шагах мы можем
     проверять счетчик шагов периодически */
  if (!stepEventsEnabeled) {
    updateStepCount();
  }
  digitalWrite(13, blinkState);
  blinkState = !blinkState;
  delay(1000);
}

static void updateStepCount() {
  // получаем информацию о посчитанных шагах:
  int stepCount = CurieIMU.getStepCount();

  // если она изменилась, сообщаем об этом через монитор порта:
  if (stepCount != lastStepCount) {
    Serial.print("Step count: ");
    Serial.println(stepCount);
    // сохраняем текущее значение для сравнения в следующий раз:
    lastStepCount = stepCount;
  }
}

static void eventCallback(void) {
  if (CurieIMU.stepsDetected())
    updateStepCount();
}

См.также

  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 Tap Detect

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