SIK Experiment Guide for the Arduino 101/Genuino 101 Board (Chinese)

This Tutorial is Retired!

This tutorial covers concepts or technologies that are no longer current. It's still here for you to read and enjoy, but may not be as useful as our newest tutorials.

Pages
Contributors: D___Run___
Favorited Favorite 1

实验 19:点击检测

简介

101 开发板的一个优势在于,它在姿势和移动识别方面具有十分先进的技术。这一切都通过 101 开发板上的惯性测量单元 (IMU) 来实现。IMU 可测量重力感应器(重力)和陀螺仪(旋转)数据。我们在实验 18 中已尝试了重力感应器。让我们更深入一些并利用 Curie 模块(该模块可以理解数据的含义,以确定您是否在迈步并进行计数),从而检测您是否在开发板上点击甚至其空间方向。

作为将 IMU 与 Curie 模块结合使用的示例,我们将创建一个简单 RGB 电路,当您在 101 开发板顶部双击时,它会呈绿色闪烁两次,当您在 101 开发板底部双击时,它会呈红色闪烁两次。

所需部件

您需要以下部件:

  • 1x 实验电路板
  • 1x Arduino 101 或 Genuino 101 开发板
  • 1x 共阴极 RGB LED
  • 3x 100Ω 电阻
  • 6x 跳线

没有 SIK?

如果您要执行本实验,但又没有 SIK,那么我们建议您使用这些部件:

Breadboard - Self-Adhesive (White)

Breadboard - Self-Adhesive (White)

PRT-12002
$5.50
48
Jumper Wires - Connected 6" (M/M, 20 pack)

Jumper Wires - Connected 6" (M/M, 20 pack)

PRT-12795
$2.10
2
Mini Speaker - PC Mount 12mm 2.048kHz

Mini Speaker - PC Mount 12mm 2.048kHz

COM-07950
$2.10
5
Momentary Pushbutton Switch - 12mm Square

Momentary Pushbutton Switch - 12mm Square

COM-09190
$0.55
4

Resistor 100 Ohm 1/4th Watt PTH - 20 pack

COM-13761
Retired

您还需要一个 Arduino 101 Genuino 101 开发板。

Arduino 101

DEV-13787
9 Retired

Genuino 101

DEV-13984
Retired

推荐阅读

继续进行本实验之前,我们建议您熟悉以下教程中的概念:

惯性测量单元简介

惯性测量单元 (IMU) 是一种传感器组合,用于确定传感器在三维空间中的方向。101 开发板使用重力感应器陀螺仪检测物理方向(通过测量对传感器施加的重力),并使用陀螺仪检测旋转运动。

101 开发板可以将 IMU 数据转换为某些预编程的姿势,如:迈步、点击或双击它或是使开发板落下。本实验重点检测点击/双击,但是请尝试位于文件 > 示例 > CurieIMU下的其他示例代码。

注:101 开发板具有一个组装在开发板上的 IMU,可通过 Arduino 库进行访问。使用该 IMU 无需接线!

硬件接线

是否准备好开始对每个部件进行接线?请查看下面的接线图以了解如何连接每个部件。

请特别注意组件用于指示如何在实验电路板上放置它的标记。极化组件只能按一个方向连接到电路。

实验的接线图

替换文本

难以看清电路?单击接线图可放大查看。

打开草图

在计算机上打开 Arduino IDE 软件。采用 Arduino 语言进行编码可控制电路。通过访问您先前下载并置于“示例”文件夹中的“101 SIK 指南代码”,来打开用于电路 19 的代码。

要打开该代码,请转到:文件 > 示例 > SIK 指南代码 > Circuit_19

还可以将以下代码复制并粘贴到 Arduino IDE 中。点击“上传”,然后查看发生的情况!

language:cpp
/*
SparkFun Inventor's Kit
Example sketch 19

TAP DETECTION

Use the 101 board's on-board IMU to detect a tap and double tap and react accordingly.

This sketch was written by SparkFun Electronics,
with lots of help from the Arduino community.
This code is completely free for any use.
Visit http://learn.sparkfun.com/products/2 for SIK information.
Visit http://www.arduino.cc to learn more about Arduino.
*/

#include "CurieIMU.h"

void setup()
{

 pinMode(5, OUTPUT);
 pinMode(6, OUTPUT);

 // Initialise the IMU
 CurieIMU.begin();
 CurieIMU.attachInterrupt(eventCallback);

 // Increase Accelerometer range to allow detection of stronger taps (< 4g)
 CurieIMU.setAccelerometerRange(3);

 // Reduce threshold to allow detection of weaker taps (>= 750mg)
 CurieIMU.setDetectionThreshold(CURIE_IMU_TAP, 750); // (750mg)

 // Set the time window for 2 taps as a double tap (<= 250 milliseconds)
 CurieIMU.setDetectionDuration(CURIE_IMU_DOUBLE_TAP, 250);

 // Enable Double-Tap detection
 CurieIMU.interrupts(CURIE_IMU_DOUBLE_TAP);
 }

void loop()
{
 // nothing happens in the loop because all the action happens
 // in the callback function.  
 }

static void eventCallback()
{
 if (CurieIMU.getInterruptStatus(CURIE_IMU_DOUBLE_TAP)) {
    if (CurieIMU.tapDetected(Z_AXIS, NEGATIVE))
    {
    digitalWrite(5, HIGH);
    digitalWrite(6, LOW);
    delay(250);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    delay(250);
    digitalWrite(5, HIGH);
    digitalWrite(6, LOW);
    delay(250);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    delay(250);
    }
   else if (CurieIMU.tapDetected(Z_AXIS, POSITIVE))
   {
    digitalWrite(5, LOW);
    digitalWrite(6, HIGH);
    delay(250);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    delay(250);
    digitalWrite(5, LOW);
    digitalWrite(6, HIGH);
    delay(250);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    delay(250);
   }
  else
  {
  digitalWrite(5, LOW);
  digitalWrite(6, LOW);
  }
 }
}

要注意的代码

CurieIMU.begin();

初始化或开始使用板载 IMU。如果没有此 IMU,则 101 开发板从不会寄存任何 IMU 数据。

CurieIMU.attachInterrupt(eventCallback);

中断是中断循环并指示 101 开发板立即执行某种操作的事件。101 开发板随后会跳出循环,执行该操作,然后返回到循环中。中断会指定在触发中断时要执行的函数。在此示例中是 eventCallback

 // Reduce threshold to allow detection of weaker taps (>= 750mg)
 CurieIMU.setDetectionThreshold(CURIE_IMU_TAP, 750); // (750mg)

 // Set the time window for 2 taps as a double tap (<= 250 milliseconds)
 CurieIMU.setDetectionDuration(CURIE_IMU_DOUBLE_TAP, 250);

要使用 IMU 检测双击,需要进行一些设置。需要为硬点击以及软点击设置力阈值。还需要为双击指定持续时间,以便 Curie 可以判断单击与双击之间的差异。

CurieIMU.interrupts(CURIE_IMU_DOUBLE_TAP); 最后,我们将中断附加到双击事件。因此只要双击事件发生,101 开发板便会执行 eventCallback 函数。

应看到的情况

代码上传之后,RGB 应熄灭。拿起开发板并使用手指以类似于鼠标双击的节奏和时间在开发板顶部双击。RGB 应呈绿色闪烁两次,然后再次熄灭。如果您在开发板底部执行相同操作,则它会呈红色闪烁。

替换文本

故障诊断

库未进行编译

仔细检查是否使用了 #include "CurieIMU.h" 语句。如果使用了,请确保头文件名处于引号中,而不是书名号中。

未捕获双击

101 开发板在特定时间范围内查找双击。请尝试加快双击速度,或是在 CurieIMU.setDetectionDuration(CURIE_IMU_DOUBLE_TAP, 250); 方法中调整双击时间。

仍未运行

可以设置重力感应器的灵敏度。例如设置为 2G,或是我们在地球上通常体验的重力量的两倍。如果减小该值,则会提高灵敏度。