Motion & Gesture Recognition Solution
将实时运动追踪与手势识别相结合,打造用于交互式控制、机器人和智能用户界面的创新解决方案
你将学到和构建的内容
简介
Motion & Gesture Recognition 解决方案集成了 Smart DOF 4 Click 和 IR Gesture 3 Click,实现了实时运动追踪与直观手势识别于一体的紧凑型响应式嵌入式系统。该方案专为游戏、机器人、智能界面及免接触控制等应用而设计,能够精确采集加速度、陀螺仪及磁力计数据,同时识别诸如滑动、点击等手势动作。借助持续的 UART 日志输出与双传感器协同工作,该方案为构建具备交互感知能力的运动识别系统提供了强大支持,适用于多种智能控制与人机交互场景。
mikroBUS 1
Smart DOF 4 Click
Smart DOF 4 Click 是一款用于高精度运动追踪与上下文感知的紧凑型扩展板。该板搭载了来自 CEVA 的 BNO085,这是一款 9 轴惯性测量单元(IMU)系统级封装器件,集成了加速度计、陀螺仪和地磁传感器,并配备运行 CEVA SH-2 固件的 32 位微控制器。该板能够实时提供经过校准的三维方向、线性加速度和角速度,并具备动态温度补偿和传感器老化补偿功能。Smart DOF 4 Click 支持 I2C 和 SPI 接口,内置先进的 MotionEngine™ 技术,可实现手势识别与活动监测,并具备始终在线(Always-On)功能,如计步与稳定性检测。其模块化设计还支持 MIKROE 的 Click Snap 特性,可将主要传感器部分独立安装使用,提升集成灵活性。该产品非常适用于增强/虚拟现实头戴设备、机器人、物联网设备以及其他基于运动控制的应用场景。
mikroBUS 2
IR Gesture 3 Click
IR Gesture 3 Click 是一款紧凑型扩展板,提供非接触式手势识别功能。该板搭载了 Analog Devices 出品的 ADPD1080 光度前端芯片。IR Gesture 3 Click 支持二维手势识别,内置光学滤波器,具备明显的可见光截止特性。该设计无需外部透镜,即可在日光或室内照明环境下保持传感器的动态范围,确保稳定性能。此模块不需要精确对准,因为其传感器在 ±35° 视场角内可保持线性响应,简化了集成和使用流程。该 Click 板是各种手势感应应用开发的理想选择,包括手势滑动(向左、向右、向上、向下)、挥手识别、空中点击、快速滑动(flick),以及多区域接近检测等。
功能概述
开发板
Clicker 4 for STM32F4 是一款紧凑型开发板,专为快速构建自定义设备而设计。它配备 STM32F407VGT6 MCU、四个 mikroBUS™ 插座(用于 Click board™ 连接)、电源管理等功能,使其成为快速应用开发的理想选择。核心采用 STM32F407VGT6 MCU,该芯片基于 Arm® Cortex®-M4 32 位处理器,运行频率高达 168 MHz,提供充足的计算能力以满足高负载任务需求。除了两个 1x20 排针接口外,四个 mikroBUS™ 插座可支持庞大且不断增长的 Click boards™ 生态系统。开发板上清晰标记的功能区域提供直观、易用的界面,加快开发进程。Clicker 4 不仅能加速原型设计,还可直接集成到项目中,无需额外的硬件修改。四个 4.2mm(0.165”)的安装孔位于角落,便于使用螺丝固定,实现简便安装。
微控制器概述
MCU卡片 / MCU

建筑
ARM Cortex-M4
MCU 内存 (KB)
10
硅供应商
STMicroelectronics
引脚数
100
RAM (字节)
100
一步一步来
项目组装
实时跟踪您的结果
应用程序输出
1. 应用程序输出 - 在调试模式下,“应用程序输出”窗口支持实时数据监控,直接提供执行结果的可视化。请按照提供的教程正确配置环境,以确保数据正确显示。

2. UART 终端 - 使用UART Terminal通过USB to UART converter监视数据传输,实现Click board™与开发系统之间的直接通信。请根据项目需求配置波特率和其他串行设置,以确保正常运行。有关分步设置说明,请参考提供的教程。

3. Plot 输出 - Plot功能提供了一种强大的方式来可视化实时传感器数据,使趋势分析、调试和多个数据点的对比变得更加直观。要正确设置,请按照提供的教程,其中包含使用Plot功能显示Click board™读数的分步示例。在代码中使用Plot功能时,请使用以下函数:plot(insert_graph_name, variable_name);。这是一个通用格式,用户需要将“insert_graph_name”替换为实际图表名称,并将“variable_name”替换为要显示的参数。

软件支持
库描述
Motion & Gesture Recognition Solution 使用 NECTO Studio 开发,确保兼容 mikroSDK 的开源库和工具。该解决方案采用即插即用的设计,支持快速实施和测试,并与所有配备 mikroBUS™ 插座的开发板、入门套件和 mikromedia 板完全兼容。
示例描述
Motion & Gesture Recognition 解决方案集成了 Smart DOF 4 Click 和 IR Gesture 3 Click,实现同时的运动追踪和手势识别功能。Smart DOF 4 Click 提供 X、Y、Z 三轴的实时加速度计、陀螺仪和磁力计数据;同时,IR Gesture 3 Click 能检测手势动作,如滑动与点击,实现直观交互。
关键功能:
smartdof4_init
- 初始化 Smart DOF 4 Click,实现运动追踪功能。smartdof4_default_cfg
- 配置 Smart DOF 4 Click,用于加速度计、陀螺仪和磁力计的数据测量。smartdof4_read_data
- 读取 X、Y、Z 三轴的加速度、陀螺仪和磁力计数据。irgesture3_init
- 初始化 IR Gesture 3 Click,实现手势识别功能。irgesture3_default_cfg
- 配置 IR Gesture 3 Click,使其处于手势识别工作状态。irgesture3_get_gesture
- 检测手势动作,如上滑、下滑、左滑、右滑和点击。read_motion_data
- 读取运动数据(加速度、陀螺仪和磁力计),并通过 UART 打印日志。read_gesture_data
- 读取手势识别结果,并通过 UART 记录检测到的手势类型。log_printf
- 通过 UART 输出运动传感器数据和手势识别结果,用于调试和实时可视化。
应用初始化
初始化过程配置系统以实现运动追踪和手势识别功能:
1. 初始化 UART 日志系统,用于调试输出。
2. 配置 Smart DOF 4 Click,实现加速度、陀螺仪和磁力计数据测量。
3. 初始化 IR Gesture 3 Click,实现手势检测。
4. 若任一初始化步骤失败,则记录错误信息并中止系统运行。
应用任务
主循环持续执行以下操作:
1. 从 Smart DOF 4 Click 读取运动数据(加速度、陀螺仪和磁力计)。
2. 通过 UART 打印读取到的运动数据,用于实时监控。
3. 从 IR Gesture 3 Click 检测手势动作。
4. 通过 UART 记录识别到的手势类型(如 SWIPE LEFT、SWIPE RIGHT、SWIPE UP、SWIPE DOWN、CLICK 或 NO GESTURE)。
5. 循环重复该过程,确保系统实现连续的实时运动与手势识别功能。
开源
代码示例
完整的应用程序代码和一个现成的项目可以通过NECTO Studio包管理器直接安装到NECTO Studio。 应用程序代码也可以在MIKROE的GitHub账户中找到。
/*
* Solution Name: Motion & Gesture Recognition Solution
*
* Description:
* This embedded application continuously monitors motion data using the Smart
* DOF 4 Click and detects hand gestures using the IR Gesture 3 Click, logging
* real-time sensor readings via UART.
*
* The system utilizes the following Click boards:
* - Smart DOF 4 Click: Measures acceleration, gyroscope, and magnetometer
* data on the X, Y, and Z axes.
* - IR Gesture 3 Click: Detects hand gestures such as swipe and click
* motions, providing intuitive user interaction.
*
* The `application_init` function initializes both Click boards, configures
* them for proper operation, and sets up the UART logger for debugging.
*
* The `application_task` function reads accelerometer, gyroscope, and
* magnetometer data from the Smart DOF 4 Click and logs it via UART. It also
* continuously monitors gesture detection using the IR Gesture 3 Click, logging
* recognized gestures.
*
* Hardware Setup:
* - MIKROBUS_1: Smart DOF 4 Click (Motion sensing)
* - MIKROBUS_2: IR Gesture 3 Click (Gesture recognition)
*
* Key Features:
* - Real-time motion sensing with acceleration, gyroscope, and magnetometer
* data logging.
* - Gesture detection including swipe and click motions.
* - UART-based logging for debugging and sensor data visualization.
* - Dynamic I2C slave switching between Click boards.
*
* Development Environment:
* - [NECTO Studio](https://www.mikroe.com/necto)
* - [mikroSDK v2.0](https://www.mikroe.com/mikrosdk) framework
* - MIKROE [Click boards](https://www.mikroe.com/click-boards) Add-ons
*
* Author: Branko Jaksic
* Date: April, 2025
*/
// ------------------------------------------------------------------- INCLUDES
#include "log.h"
#include "board.h"
#include "smartdof4.h"
#include "irgesture3.h"
// ------------------------------------------------------------------ VARIABLES
static log_t logger;
static smartdof4_t smartdof4;
static irgesture3_t irgesture3;
// ------------------------------------------------------ APPLICATION FUNCTIONS
void application_init ( void )
{
log_cfg_t log_cfg; /**< Logger config object. */
smartdof4_cfg_t smartdof4_cfg; /**< Click config object. */
irgesture3_cfg_t irgesture3_cfg; /**< Click config object. */
/**
* Logger initialization.
* Default baud rate: 115200
* Default log level: LOG_LEVEL_DEBUG
* @note If USB_UART_RX and USB_UART_TX
* are defined as HAL_PIN_NC, you will
* need to define them manually for log to work.
* See @b LOG_MAP_USB_UART macro definition for detailed explanation.
*/
LOG_MAP_USB_UART( log_cfg );
log_init( &logger, &log_cfg );
log_info( &logger, " Application Init " );
// Smart DOF 4 Click initialization.
smartdof4_cfg_setup( &smartdof4_cfg );
SMARTDOF4_MAP_MIKROBUS( smartdof4_cfg, MIKROBUS_1 );
err_t init_flag = smartdof4_init( &smartdof4, &smartdof4_cfg );
if ( ( I2C_MASTER_ERROR == init_flag ) || ( SPI_MASTER_ERROR == init_flag ) )
{
log_error( &logger, " Communication init." );
for ( ; ; );
}
if ( SMARTDOF4_ERROR == smartdof4_default_cfg ( &smartdof4 ) )
{
log_error( &logger, " Default configuration." );
for ( ; ; );
}
smartdof4_pid_t pid;
if ( SMARTDOF4_OK == smartdof4_read_pid ( &smartdof4, &pid ) )
{
log_printf ( &logger, " SW Version: %u.%u.%u\r\n", ( uint16_t ) pid.sw_ver_major,
( uint16_t ) pid.sw_ver_minor,
( uint16_t ) pid.sw_ver_patch );
log_printf ( &logger, " SW Part Number: %lu\r\n", pid.sw_part_num );
log_printf ( &logger, " SW Build Number: %lu\r\n\n", pid.sw_build_num );
}
// IR Gesture 3 Click initialization.
irgesture3_cfg_setup( &irgesture3_cfg );
IRGESTURE3_MAP_MIKROBUS( irgesture3_cfg, MIKROBUS_2 );
if ( I2C_MASTER_ERROR == irgesture3_init( &irgesture3, &irgesture3_cfg ) )
{
log_error( &logger, " Communication init." );
for ( ; ; );
}
if ( IRGESTURE3_ERROR == irgesture3_default_cfg ( &irgesture3 ) )
{
log_error( &logger, " Default configuration." );
for ( ; ; );
}
log_info( &logger, " Application Task " );
}
void read_motion_data( void )
{
// Switch I2C communication to Smart DOF 4 Click.
i2c_master_set_slave_address(&smartdof4.i2c, smartdof4.slave_address);
static smartdof4_axis_t accel, gyro, mag;
if ( SMARTDOF4_OK == smartdof4_read_data( &smartdof4, &accel, &gyro, &mag ) )
{
log_printf( &logger,
" Accel (g): X=%.3f Y=%.3f Z=%.3f\r\n"
" Gyro (dps): X=%.1f Y=%.1f Z=%.1f\r\n"
" Mag (uT): X=%.1f Y=%.1f Z=%.1f\r\n",
accel.x, accel.y, accel.z,
gyro.x, gyro.y, gyro.z,
mag.x, mag.y, mag.z );
}
}
void read_gesture_data( void )
{
// Switch I2C communication to IR Gesture 3 Click.
i2c_master_set_slave_address(&irgesture3.i2c, irgesture3.slave_address);
static uint8_t gesture;
if ( IRGESTURE3_OK == irgesture3_get_gesture( &irgesture3, &gesture ) )
{
const char *gesture_str;
switch ( gesture )
{
case IRGESTURE3_GESTURE_CLICK: gesture_str = "CLICK"; break;
case IRGESTURE3_GESTURE_SWIPE_UP: gesture_str = "SWIPE UP"; break;
case IRGESTURE3_GESTURE_SWIPE_DOWN: gesture_str = "SWIPE DOWN"; break;
case IRGESTURE3_GESTURE_SWIPE_LEFT: gesture_str = "SWIPE LEFT"; break;
case IRGESTURE3_GESTURE_SWIPE_RIGHT: gesture_str = "SWIPE RIGHT"; break;
default: gesture_str = "UNKNOWN"; break;
}
log_printf( &logger, " Gesture: %s\r\n", gesture_str );
}
else
{
log_printf( &logger, " No gesture detected!\r\n" );
}
}
void application_task ( void )
{
read_motion_data();
Delay_ms( 100 ); // Ensuring data stability before switching
read_gesture_data();
}
int main ( void )
{
/* Do not remove this line or clock might not be set correctly. */
#ifdef PREINIT_SUPPORTED
preinit();
#endif
application_init( );
for ( ; ; )
{
application_task( );
}
return 0;
}
// ------------------------------------------------------------------------ END
额外支持
资源
类别:Human-Machine Interface (HMI)