justd0 发表于 2021-6-27 01:40

蜜袋鼯 第④贴 RSL10-SENSE-GEVK 玩耍BHI160,步数、运动识别?不用处理,直接获取!!

本帖最后由 justd0 于 2021-6-27 01:42 编辑

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">&nbsp;&nbsp;&nbsp;&nbsp; 本是周末是要被想出游的家人拉出去当司机,奈何计划有变,</span></span><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">于是终于有了自己的周末空闲时间~~</span></span><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">撒花啊!</span></span></p>

<p>&nbsp;</p>

<p><span style="font-size:14.0pt">&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://bbs.eeworld.com.cn/thread-1169973-1-1.html"><span lang="zh-CN" style="font-family:&quot;Microsoft YaHei&quot;">蜜袋鼯 第③贴</span></a> <span lang="zh-CN" style="font-family:&quot;Microsoft YaHei&quot;">上一贴写了</span> <span lang="zh-CN" style="font-family:&quot;Microsoft YaHei&quot;">由于官方对</span><span lang="zh-CN" style="font-family:&quot;Times New Roman&quot;">RSL10-SENSE-GEVK</span><span lang="zh-CN" style="font-family:&quot;Microsoft YaHei&quot;">开发板进行了硬件升级,替换了光照度传感器而导致的相应例程无法使用,故写了个写了个驱动代码分享给大家。</span></span></p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">&nbsp;</span></span></p>

<p><strong><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">本帖主要内容:</span></span></strong></p>

<p><span style="font-size:14.0pt"><span lang="en-US" style="font-family:&quot;Times New Roman&quot;">1</span><span lang="zh-CN" style="font-family:&quot;Microsoft YaHei&quot;">、介绍姿态传感器、磁力计传感器背景及功能。</span></span></p>

<p><span style="font-size:14.0pt"><span lang="en-US" style="font-family:&quot;Times New Roman&quot;">2</span><span lang="zh-CN" style="font-family:&quot;Microsoft YaHei&quot;">、修改</span><span lang="zh-CN" style="font-family:&quot;Times New Roman&quot;">RSL10-SENSE-GEVK</span><span lang="zh-CN" style="font-family:&quot;Microsoft YaHei&quot;">官方例程,读取</span><span lang="zh-CN" style="font-family:&quot;Microsoft YaHei&quot;"><span style="color:#e84c22">加速度、角速度、磁力计、重力</span></span><span lang="zh-CN" style="font-family:&quot;Microsoft YaHei&quot;">等数据。</span></span></p>

<p><span style="font-size:14.0pt"><span lang="en-US" style="font-family:&quot;Times New Roman&quot;">3</span><span lang="zh-CN" style="font-family:&quot;Microsoft YaHei&quot;">、修改例程中的</span><span lang="en-US" style="font-family:&quot;Microsoft YaHei&quot;">BHI160</span><span lang="zh-CN" style="font-family:&quot;Microsoft YaHei&quot;">应用层配置,将该传感器的特殊数据读取出来,例如:</span><span lang="zh-CN" style="font-family:&quot;Microsoft YaHei&quot;"><span style="color:#e84c22">步数检测、运动状态识别</span></span><span lang="zh-CN" style="font-family:&quot;Microsoft YaHei&quot;">等,此处得圈下<span style="font-size:16px;">@</span></span></span><i><span style="font-size:16px;">w494143467</span>&nbsp;</i><span style="font-size:14.0pt"><span lang="zh-CN" style="font-family:&quot;Microsoft YaHei&quot;">,没记错的话你项目里要用它来做运动识别的话,传感器已经实现了,你就不用自己算了哈</span><span lang="en-US" style="font-family:&quot;Microsoft YaHei&quot;">~~</span></span></p>

<p>&nbsp;</p>

<hr />
<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">正文开始:</span></span></p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">&nbsp;</span></span></p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">按照我的项目计划(哦,忘记写了,下一贴写下项目的计划内容吧),还需要运动信息,比如角速度、旋转圈数等,而这些数据可以由开发板上的BHI160传感器获取到。</span></span></p>

<p>&nbsp;</p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">在玩板之前,本以为这个传感器就是个普通的六轴姿态传感器,</span></span></p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">但查了下资料之后才发现,这可是大名鼎鼎的博世 的 姿态传感器啊!</span></span></p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">&nbsp;</span></span></p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">你可能会问博世是啥?跟普通的姿态传感器有啥区别啊。。</span></span></p>

<p>&nbsp;</p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">哈哈,我也有这个疑问来的,在我看完他的datasheet之后,不得不说这传感器很牛b。</span></span></p>

<p>&nbsp;</p>

<p></p>

<p>&nbsp;</p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">从他<a href="https://www.bosch-sensortec.com/products/smart-sensors/bhi160b/">官网</a>上的简介可以看到,这个小传感器不仅仅是三轴加速度计、三轴角速度计这么简单,</span></span></p>

<p>&nbsp;</p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">他在内部就对原始数据进行了处理,能够输出</span></span></p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;"><span lang="zh-CN" style="color:#fa0000">&ldquo;加速度计、重力、线性加速度、陀螺仪、</span></span></span><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;"><span lang="zh-CN" style="color:#fa0000">陀螺仪未校准、游戏旋转矢量、计步器、步数检测器、</span></span></span></p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;"><span lang="zh-CN" style="color:#fa0000">有效运动识别(</span><span lang="en-US" style="color:#fa0000">significant motion</span><span lang="zh-CN" style="color:#fa0000">)、</span></span></span><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;"><span lang="zh-CN" style="color:#fa0000">倾斜检测器、拾取识别、唤醒识别、手势识别、站立、</span></span></span></p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;"><span lang="zh-CN" style="color:#fa0000">跑步、骑自行车、开车的活动识别&rdquo;</span></span></span></p>

<p>&nbsp;</p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">而且传感器还能串联一个其他类别的传感器,例如地磁计,就又可以输出</span></span></p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;"><span lang="zh-CN" style="color:#fa0000">&ldquo;地磁场、未校准磁场、方向矢量、旋转矢量、地磁旋转矢量&rdquo;</span></span></span></p>

<p>&nbsp;</p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">在官网的下方还可以看到博世已经给提供了这个传感器的使用例程,还有固件?</span></span></p>

<p>&nbsp;</p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">固件什么鬼,点开看下,原来用传感器串联他家自己传感器的时候,都不用自己配置信息了,直接按照固件烧进去就行了,如下图的BMM150,</span></span><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">这不正是RSL10-SENSE-GEVK开发板上的磁力计传感器么~~</span></span></p>

<p>&nbsp;</p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">另外博世还给提供了详细的驱动库和示例代码,感兴趣的可以去<a href="https://github.com/BoschSensortec/BHy1_driver_and_MCU_solution">github</a>看下</span></span></p>

<p>&nbsp;</p>

<p></p>

<p lang="en-US"><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;"><span style="color:#fa0000">&nbsp;</span></span></span></p>

<p lang="en-US"><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;"><span style="color:#fa0000">&nbsp;</span></span></span></p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">那么回来再看RSL10-SENSE-GEVK开发板的电路图上,就是采用的博世的BHI160+BMM150方案</span></span></p>

<p></p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">我们直接打开SDK中的sense_bhi160来先体验下,copy下工程,然后看下例程里面是怎么个逻辑,</span></span></p>

<p>&nbsp;</p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">我画了个流程图,可以看到这个例程还是很好理解的,</span></span></p>

<p>&nbsp;</p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">初始化了必要组件之后,初始化了下BHI160传感器,并对它初始化过程做了个计时。</span></span></p>

<p>&nbsp;</p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">接下来就是注册了三组数据的回调处理函数,以便获取传感器数据更新值。</span></span></p>

<p></p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">然后编译下载到开发板,我们通过Jlink RTT viewer 就可以看到数据了,</span></span></p>

<p>&nbsp;</p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">下图中可以看到,BHI160初始化的时间显示的是805ms</span></span></p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">感兴趣的同学可以进入到初始化函数中看下,</span></span><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">可以看到用这么久时间进行初始化,其实都是前面说的给BHI160烧写了BMM150的配置程序那个过程。</span></span></p>

<p></p>

<p>&nbsp;</p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">用RTT viewer看log数据就是一堆的打印信息,如下图所示,</span></span></p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">但实时刷新的时候,根本看不清数据是啥。。。</span></span></p>

<p></p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">那么我们可以借助jscope来看下数据变化,接下来只要定义个全局变量,</span></span></p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">把传感器数据传出来,jscope就可以监控到变化的数据。</span></span></p>

<p>&nbsp;</p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">代码修改如下:</span></span></p>

<pre>
<code class="language-cpp">main.c

//定义数据结构,实例化数据
typedef struct
{
        float x;
        float y;
        float z;
}Data_t;

Data_t orientation;
Data_t acc;
Data_t gyro;

........

/** Converts measured orientation data into degrees.
*
* GREEN LED will be turned on if board heading is within 10 degrees of
* magnetic north (&lt;=10 or &gt;=350).
*/
void ao_vector_cb(bhy_data_generic_t *data, bhy_virtual_sensor_t sensor)
{
        orientation.x = data-&gt;data_vector.x / 32768.0f * 360.0f;
        orientation.y = data-&gt;data_vector.y / 32768.0f * 360.0f;
        orientation.z = data-&gt;data_vector.z / 32768.0f * 360.0f;

    if (orientation.x &gt; 350.0f || orientation.x &lt; 10.0f)
    {
      LED_On(LED_GREEN);
    }
    else
    {
      LED_Off(LED_GREEN);
    }

    //printf("Orientation: h=%.1f p=%.1f, y=%.1f (%d)\r\n", h, p, y, data-&gt;data_vector.status);
}

/** Converts measured linear acceleration data based on sensors dynamic range
* and prints it to debug terminal.
*
* Also turns on RED LED if total acceleration applied to the board is over 1g.
*/
void la_vector_cb(bhy_data_generic_t *data, bhy_virtual_sensor_t sensor)
{
    /* Linear Acceleration sensor values are scaled using dynamic range. */
    uint16_t dyn_range = BHI160_NDOF_GetAccelDynamicRange();

    acc.x = data-&gt;data_vector.x / 32768.0f * dyn_range;
    acc.y = data-&gt;data_vector.y / 32768.0f * dyn_range;
    acc.z = data-&gt;data_vector.z / 32768.0f * dyn_range;

    if (fabsf(acc.x) + fabsf(acc.y) + fabsf(acc.z) &gt;= 1.0f)
    {
      LED_On(LED_RED);
    }
    else
    {
      LED_Off(LED_RED);
    }

//    printf("Linear Accel: x=%.2f g, y=%.2f g, z=%.2f g\r\n", x, y, z);
}

void gyro_vector_cb(bhy_data_generic_t *data, bhy_virtual_sensor_t sensor)
{
    uint16_t dyn_range = BHI160_NDOF_GetGyroDynamicRange();

    gyro.x = data-&gt;data_vector.x / 32768.0f * dyn_range;
    gyro.y = data-&gt;data_vector.y / 32768.0f * dyn_range;
    gyro.z = data-&gt;data_vector.z / 32768.0f * dyn_range;

    if (fabsf(gyro.z) &gt; 45.0f)
    {
      LED_On(LED_BLUE);
    }
    else
    {
      LED_Off(LED_BLUE);
    }

//    printf("Rate of Rotation: x=%.2f , y=%.2f /s, z=%.2f \r\n", x, y, z);
}</code></pre>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">&nbsp;</span></span></p>

<p><span style="font-size:14.0pt"><span lang="zh-CN" style="font-family:&quot;Microsoft YaHei&quot;">然后,打开</span><span lang="en-US" style="font-family:&quot;Microsoft YaHei&quot;">jscope</span><span lang="zh-CN" style="font-family:&quot;Microsoft YaHei&quot;">,新建个</span><span lang="en-US" style="font-family:&quot;Microsoft YaHei&quot;">project</span><span lang="zh-CN" style="font-family:&quot;Microsoft YaHei&quot;">,</span></span></p>

<p><span style="font-size:14.0pt"><span lang="zh-CN" style="font-family:&quot;Microsoft YaHei&quot;">在配置界面的</span><span lang="en-US" style="font-family:&quot;Microsoft YaHei&quot;">specify target device</span><span lang="zh-CN" style="font-family:&quot;Microsoft YaHei&quot;">中输入</span><span lang="en-US" style="font-family:&quot;Microsoft YaHei&quot;">rsl10</span></span></p>

<p><span style="font-size:14.0pt"><span lang="en-US" style="font-family:&quot;Microsoft YaHei&quot;">elf file</span><span lang="zh-CN" style="font-family:&quot;Microsoft YaHei&quot;">中选择工程编译目录下的</span><span lang="zh-CN" style="font-family:&quot;Times New Roman&quot;">sense_bhi160.elf</span></span></p>

<p><span style="font-size:14.0pt"><span lang="zh-CN" style="font-family:&quot;Microsoft YaHei&quot;">如下图所示,就可以点</span><span lang="en-US" style="font-family:&quot;Microsoft YaHei&quot;">ok</span><span lang="zh-CN" style="font-family:&quot;Microsoft YaHei&quot;">了</span></span></p>

<p></p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">&nbsp;</span></span></p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">然后在下面添加我们定义的全局变量,点击start就可以看到数据变化了,如下图。</span></span></p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">但各位看下下图中的数据,是存在明显的锯齿的,也就是刷新频率很低。</span></span></p>

<p></p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">&nbsp;</span></span></p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">&nbsp;&nbsp;&nbsp;&nbsp; 这个问题我们可以看下&nbsp; 注册回调函数的那个api,其中最后一个参数,便是设置采样率的,</span></span></p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">他的数值代表的是频率,数值越大更新速度越快,</span></span></p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">当然了,功耗也会相对高一点点,这里我们把它设置为1000hz,看看效果,代码修改如下所示:</span></span></p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">&nbsp;</span></span></p>

<pre>
<code>main.c


int main(void)
{
.......

    retval = BHI160_NDOF_EnableSensor(BHI160_NDOF_S_ORIENTATION, &amp;ao_vector_cb, 1000);
    ASSERT_DEBUG(retval == BHY_SUCCESS);

    retval = BHI160_NDOF_EnableSensor(BHI160_NDOF_S_LINEAR_ACCELERATION, &amp;la_vector_cb, 1000);
    ASSERT_DEBUG(retval == BHY_SUCCESS);

    retval = BHI160_NDOF_EnableSensor(BHI160_NDOF_S_RATE_OF_ROTATION, &amp;gyro_vector_cb, 1000);
    ASSERT_DEBUG(retval == BHY_SUCCESS);

.......
}</code></pre>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">&nbsp;</span></span></p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">编译并烧录,在看下jscope的数据图,就变的连贯很多了。</span></span></p>

<p></p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">&nbsp;</span></span></p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">&nbsp;&nbsp;&nbsp;&nbsp; 在传感器数据回调注册的函数中我们还可以看到第一个参数,是选择需要的数据类型的,</span></span></p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">改变这个参数就可以获取传感器的不同类型数据了,</span></span><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">这里可看到库中给的定义,列写了五种数据,包括姿态角度、重力、线性加速度、角速度、磁场强度数据,</span></span><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">可以分别改动下看看数据是怎样的。</span></span></p>

<p></p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">至此,这个例程的功能我们就体验完了。</span></span></p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">&nbsp;</span></span></p>

<p>&nbsp;</p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">但本帖还没完。。。。。</span></span></p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">&nbsp;</span></span><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">&nbsp;</span></span></p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">&nbsp;</span></span></p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">就像开头所说的,BHI160传感器支持的数据可不止上面例程库中给列写的那几个,</span></span></p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">在看了芯片的datasheet之后,发现还支持</span></span></p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">&ldquo;</span></span><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;"><span style="color:#fa0000;">游戏旋转矢量、计步器、步数检测器、有效运动识别(significant motion)、</span></span></span></p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;"><span style="color:#fa0000;">倾斜检测器、拾取识别、唤醒识别、手势识别、站立、跑步、骑自行车、开车的活动识别</span>&rdquo;这些数据。</span></span></p>

<p></p>

<p lang="en-US"><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">&nbsp;</span></span></p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">看下RSL10的工程,其实也是引用了博世提供的SDK的,如下图:</span></span></p>

<p></p>

<p lang="en-US"><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">&nbsp;</span></span></p>

<p lang="en-US">&nbsp;</p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">在回看下上面传感器数据的枚举变量中</span></span></p>

<p></p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">定义的变量其实就是这些支持的功能</span></span></p>

<p></p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">那么也就是说,我们需要哪个数据,只要在BHI160_NDOF_Sensor这个枚举体中再定义下,</span></span></p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">按照例程的方式,就可以直接使用啦。</span></span></p>

<p>&nbsp;</p>

<p><span style="font-size:14.0pt"><span lang="zh-CN" style="font-family:&quot;Microsoft YaHei&quot;">只是这些不同类型的数据,会有对应的数据格式,这个格式可以参考</span><span lang="en-US" style="font-family:&quot;Times New Roman&quot;">BHI160</span><span lang="zh-CN" style="font-family:&quot;Microsoft YaHei&quot;">的数据手册中定义的来,</span></span></p>

<p><span style="font-size:14.0pt"><span lang="zh-CN" style="font-family:&quot;Microsoft YaHei&quot;">如上面</span><span lang="en-US" style="font-family:&quot;Times New Roman&quot;">T</span><span lang="en-US" style="font-family:&quot;Microsoft YaHei&quot;">able14 virtual sensor ID </span><span lang="zh-CN" style="font-family:&quot;Microsoft YaHei&quot;">表中</span><span lang="en-US" style="font-family:&quot;Microsoft YaHei&quot;">VS data type</span><span lang="zh-CN" style="font-family:&quot;Microsoft YaHei&quot;">中定义的数据类型,</span></span></p>

<p><span style="font-size:14.0pt"><span lang="zh-CN" style="font-family:&quot;Microsoft YaHei&quot;">再看下面这张图中的</span><span lang="en-US" style="font-family:&quot;Microsoft YaHei&quot;">data values </span><span lang="zh-CN" style="font-family:&quot;Microsoft YaHei&quot;">使用就行了。</span></span></p>

<p></p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">&nbsp;</span></span></p>

<p>&nbsp;</p>

<p><span style="font-size:14.0pt"><span lang="zh-CN" style="font-family:&quot;Microsoft YaHei&quot;">下面以行走步数和活动识别来举例,</span></span></p>

<p>&nbsp;</p>

<p><span style="font-size:14.0pt"><span lang="zh-CN" style="font-family:&quot;Microsoft YaHei&quot;">因为步数更新和活动识别都是传感器内部实现的,</span></span></p>

<p><span style="font-size:14.0pt"><span lang="zh-CN" style="font-family:&quot;Microsoft YaHei&quot;">我们读取数据的频率就可以降低些,以1hz频率更新</span></span></p>

<p><span style="font-size:14.0pt"><span lang="zh-CN" style="font-family:&quot;Microsoft YaHei&quot;">这里用</span><span lang="en-US" style="font-family:&quot;Times New Roman&quot;">RTT </span><span lang="en-US" style="font-family:&quot;Microsoft YaHei&quot;">viewer</span><span lang="zh-CN" style="font-family:&quot;Microsoft YaHei&quot;">来打印,</span></span></p>

<p><span style="font-size:14.0pt"><span lang="zh-CN" style="font-family:&quot;Microsoft YaHei&quot;">把例程自带的三个原始数据的回调注册的打印给注释掉了,防止顶掉我们想要的数据显示</span></span></p>

<p><span style="font-size:14.0pt"><span lang="zh-CN" style="font-family:&quot;Microsoft YaHei&quot;">并实现行走步数和活动识别的回调和相应处理,实现代码如下:</span></span></p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">&nbsp;</span></span></p>

<pre>
<code class="language-cpp">main.c


void step_counter_cb(bhy_data_generic_t *data, bhy_virtual_sensor_t sensor)
{
        bhy_data_scalar_u16_t step_data;
        step_data.data = data-&gt;data_scalar_u16.data;
        printf("Step counter is %d\r\n", step_data.data);
}

void activity_recognition_cb(bhy_data_generic_t *data, bhy_virtual_sensor_t sensor)
{
        bhy_data_scalar_u16_t act_data;
        static uint16_t last_act;
        act_data.data = data-&gt;data_scalar_u16.data;
        if(act_data.data != last_act)
        {
                switch (act_data.data)
                {
                        case 0x0000:
                                break;
                        case 0x0001:
                                printf("Still activity ended. \r\n");
                                break;
                        case 0x0002:
                                printf("Walking activity ended. \r\n");
                                break;
                        case 0x0004:
                                printf("Running activity ended. \r\n");
                                break;
                        case 0x0008:
                                printf("On Bicycle activity ended \r\n");
                                break;
                        case 0x0010:
                                printf("In Vehicle activity ended. \r\n");
                                break;
                        case 0x0020:
                                printf("Tilting activity ended. \r\n");
                                break;

                        case 0x0040:
                                break;
                        case 0x0080:
                                break;

                        case 0x0100:
                                printf("Still activity start. \r\n");
                                break;
                        case 0x0200:
                                printf("Walking activity start. \r\n");
                                break;
                        case 0x0400:
                                printf("Running activity start. \r\n");
                                break;
                        case 0x0800:
                                printf("On Bicycle activity start \r\n");
                                break;
                        case 0x1000:
                                printf("In Vehicle activity start. \r\n");
                                break;
                        case 0x2000:
                                printf("Tilting activity start. \r\n");
                                break;

                        case 0x4000:
                                break;
                        case 0x8000:
                                break;
                        default:
                                break;
                }
        }
        last_act = act_data.data;
}


int main(void)
{
.......

    /* Enable desired virtual sensor outputs. */

    retval = BHI160_NDOF_EnableSensor(BHI160_NDOF_S_ORIENTATION, &amp;ao_vector_cb, 1000);
    ASSERT_DEBUG(retval == BHY_SUCCESS);

    retval = BHI160_NDOF_EnableSensor(BHI160_NDOF_S_LINEAR_ACCELERATION, &amp;la_vector_cb, 1000);
    ASSERT_DEBUG(retval == BHY_SUCCESS);

    retval = BHI160_NDOF_EnableSensor(BHI160_NDOF_S_RATE_OF_ROTATION, &amp;gyro_vector_cb, 1000);
    ASSERT_DEBUG(retval == BHY_SUCCESS);

    retval = BHI160_NDOF_EnableSensor(BHI160_NDOF_S_STEP_COUNTER, &amp;step_counter_cb, 1);
    ASSERT_DEBUG(retval == BHY_SUCCESS);

    retval = BHI160_NDOF_EnableSensor(BHI160_NDOF_S_ACTIVITY_RECOGNITION, &amp;activity_recognition_cb, 1);
    ASSERT_DEBUG(retval == BHY_SUCCESS);

........
}</code></pre>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">&nbsp;</span></span></p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">活动识别的数据具体定义可以参考芯片数据手册中的描述:</span></span></p>

<p></p>

<p><span style="font-size:14.0pt"><span lang="zh-CN" style="font-family:&quot;Microsoft YaHei&quot;">然后我们烧录,并用</span><span lang="en-US" style="font-family:&quot;Times New Roman&quot;">RTT </span><span lang="en-US" style="font-family:&quot;Microsoft YaHei&quot;">viewer</span><span lang="zh-CN" style="font-family:&quot;Microsoft YaHei&quot;">可以看到我模拟走路的步数被有效的记录了下来,</span></span></p>

<p><span style="font-size:14.0pt"><span lang="zh-CN" style="font-family:&quot;Microsoft YaHei&quot;">这相比自己用原始数据来计算出来,功耗、效果方面都会好很多了。</span></span></p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">&nbsp;</span></span></p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">本文就先到这了,以上用到的数据手册我放到下面连接了,各位随意取用。</span></span></p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">&nbsp;</span></span></p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">&nbsp;</span></span></p>

<p><span style="font-size:14.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">&nbsp;</span></span></p>

w494143467 发表于 2021-6-27 08:05

<p>哈哈,突然被Q到,原来还有这东西,看来世博提供的SDK还是比较丰富的,这些算法源码开源不,还是只提供接口?</p>

justd0 发表于 2021-6-27 09:59

w494143467 发表于 2021-6-27 08:05
哈哈,突然被Q到,原来还有这东西,看来世博提供的SDK还是比较丰富的,这些算法源码开源不,还是只提供接口 ...

<p>应该是找不到源码的,它可能被固话到传感器芯片了。</p>

<p>不过你可以通过数据和识别结果,做个黑箱测试,或者用它的结果跟你的结果做个对比</p>

cruelfox 发表于 2021-6-27 10:05

w494143467 发表于 2021-6-27 08:05
哈哈,突然被Q到,原来还有这东西,看来世博提供的SDK还是比较丰富的,这些算法源码开源不,还是只提供接口 ...

<p>BHI160内部的程序干的,firmware是二进制数据形式。</p>

w494143467 发表于 2021-6-27 11:02

cruelfox 发表于 2021-6-27 10:05
BHI160内部的程序干的,firmware是二进制数据形式。

<p>哦哦哦,原来如此,那我后面又时间可以试一下!</p>

w494143467 发表于 2021-6-27 11:02

justd0 发表于 2021-6-27 09:59
应该是找不到源码的,它可能被固话到传感器芯片了。

不过你可以通过数据和识别结果,做个黑箱测试,或 ...

<p>我后面试试,那这个传感器还是非常不错的!</p>
页: [1]
查看完整版本: 蜜袋鼯 第④贴 RSL10-SENSE-GEVK 玩耍BHI160,步数、运动识别?不用处理,直接获取!!