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

Arduino:Примеры/Genuino101CurieIMUShockDetect

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

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

Контакты:

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


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

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

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

  • Плата Arduino/Genuino 101

Цепь

Genuino101fzz.jpg

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

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

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

Код

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

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

  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. boolean blinkState = false;          // состояние светодиода
  32.  
  33. void setup() {
  34.   Serial.begin(9600);
  35.  
  36.   /* инициализируем IMU-устройство */
  37.   CurieIMU.begin();
  38.   CurieIMU.attachInterrupt(eventCallback);
  39.  
  40.   /* включаем определение удара */
  41.   CurieIMU.setDetectionThreshold(CURIE_IMU_SHOCK, 1500); // 1.5g = 1500 mg
  42.   CurieIMU.setDetectionDuration(CURIE_IMU_SHOCK, 50);   // 50 миллисекунд
  43.   CurieIMU.interrupts(CURIE_IMU_SHOCK);
  44.  
  45.   Serial.println("IMU initialisation complete, waiting for events...");  //  "Инициализация IMU-устройства завершена, ждем наступления заданных условий..."
  46. }
  47.  
  48. void loop() {
  49.   // как только начался блок loop(), мигаем светодиодом:
  50.   digitalWrite(13, blinkState);
  51.   blinkState = !blinkState;
  52.   delay(1000);
  53. }
  54.  
  55.  
  56. static void eventCallback(void)
  57. {
  58.   if (CurieIMU.getInterruptStatus(CURIE_IMU_SHOCK)) {
  59.     if (CurieIMU.shockDetected(X_AXIS, POSITIVE))
  60.       Serial.println("Negative shock detected on X-axis");  //  "Определен удар по оси X в направлении от бесконечности к 0"
  61.     if (CurieIMU.shockDetected(X_AXIS, NEGATIVE))
  62.       Serial.println("Positive shock detected on X-axis");  //  "Определен удар по оси X в направлении от 0 к бесконечности"
  63.     if (CurieIMU.shockDetected(Y_AXIS, POSITIVE))
  64.       Serial.println("Negative shock detected on Y-axis");  //  "Определен удар по оси Y в направлении от бесконечности к 0"
  65.     if (CurieIMU.shockDetected(Y_AXIS, NEGATIVE))
  66.       Serial.println("Positive shock detected on Y-axis");  //  "Определен удар по оси Y в направлении от 0 к бесконечности"
  67.     if (CurieIMU.shockDetected(Z_AXIS, POSITIVE))
  68.       Serial.println("Negative shock detected on Z-axis");  //  "Определен удар по оси Z в направлении от бесконечности к 0"
  69.     if (CurieIMU.shockDetected(Z_AXIS, NEGATIVE))
  70.       Serial.println("Positive shock detected on Z-axis");  //  "Определен удар по оси Z в направлении от 0 к бесконечности"
  71.   }
  72. }

См.также

  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

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

  1. Arduino.cc - Arduino/Genuino 101 CurieIMU Shock Detect