CNK Arduino 教程(七)

智能拳击手套

材料准备

材料实物图如下:

硬件连接:

实物连接图如下:

9V 电池和 Genuino101 开发板通过电池线相连,USB BLE-link 插到 pc 机的 USB 接口上;

魔术扎带穿过底座和扩展板时间的缝隙,捆绑在手背上,手握电池,如下图:

软件准备

系统推荐:Windows 7 以上  / Mac OS 10.7 Lion 或更新的版本
开发环境推荐:Arduino IDE 1.6.12 以上
开发版支持库推荐:Intel Curie Boards by Intel  1.0.7 以上
数据采集程序(烧写在 Genuino101 上使用):
下载地址:
data-collection_ino.zip

数据处理软件(放在 pc 机上使用):QriNeuronPipeline.exe,
下载地址:
链接: https://pan.baidu.com/s/1mhU4hG8 密码: qnsx        

数据学习和识别(烧写在 Genuino101 上使用):
下载地址:
curie-classfiy-ble.zip

操作流程:

让 Curie 学会一个动作需要三个大步骤,数据采集,数据处理,数据的学习和识别,Curie 有 128 个神经元,处理数据的能力有限,所以面对复杂动作的大数据的时候,需要裁剪优化采集到的 3 轴的原始数据,然后进行降采样处理使数据量变小,最后 Curie 对这特征数据进行学习。具体步骤如下:

第一步:数据采集:

首先烧写 data-collection.ino 到 arduono101 上。
代码如下:


#include “SPI.h”
#include “SD.h”
#include “CurieIMU.h”

#define SAMPLING_INTERVAL 10//ms

File myFile;
float ax, ay, az;
uint64_t timer;

void setup() {
  timer = 0;
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  CurieIMU.begin();
  CurieIMU.autoCalibrateXAccelOffset(0);
  CurieIMU.autoCalibrateYAccelOffset(0);
  CurieIMU.autoCalibrateZAccelOffset(1);
  CurieIMU.setAccelOffsetEnabled(true);
  CurieIMU.setAccelerometerRange(4);
  
  if(!SD.begin(4)) {
      Serial.println(“initialization failed!”);
      return;
  }
}

void loop() {
    timer = millis();  
     CurieIMU.readAccelerometerScaled(ax, ay, az);
    myFile = SD.open(“data.csv”, FILE_WRITE);
    if(myFile) {
        myFile.print(ax);
        myFile.print(“,”);
        myFile.print(ay);
        myFile.print(“,”);
        myFile.print(az);
        myFile.print(“\n”);
    }
    myFile.close();   
    while((millis() – timer) < SAMPLING_INTERVAL);   
}


1. 烧写完程序以后,拔下 usb 烧写线,

2. 将设备捆绑到手背上,如下图所示,

3. 将电池和 Genuino101 相连上电,开始做直拳动作,连续重复做直拳出拳动作,大约 10 次到 20 次左右,注意在每次出拳后中间要停顿一秒,这样以后方便看动作波形。

4. 拔下电池线,将 SD 卡取出通过适配器插到 pc 电脑上,打开 SD 卡中的 DATA.CSV 文件,如下:

5. 显示折线图:    选中 ABC 3 列数据-> 点击插入-> 插入折线图 ,如下图:

上面我们看到的每一个波形都是一次出拳,下面我们的工作就是把每个波形截取出来,把杂波剪切掉。

第二步:数据处理:

1. 我们要把每次直拳之间的杂波去掉,去掉的方法就是对应着删除数据即可;比如我们要裁剪掉下图的第一段箭头指的杂波,这段杂波从图表上看是从 0 到 253 行,那我们就删除 0 到 253 的单元格.

裁剪掉第一段杂波的波形如下:

用同样的方法裁剪掉其他杂波,如下图,是裁剪掉杂波的波形。

怎么样看起来规整多了吧,这只是直拳的截取过的数据,我们把这个文件重命名为 straight.csv。
同样的步骤我们采集和处理勾拳和摆拳的文件。
分别改名为 uppercut.csv、swing.csv。

2. 降采样,进行下来我们要把这三个文件的数据用我们事先写好的程序提取特征以便减小数据。解压 pipeline-curie.zip,打开 train_data 文件,将第一步生成的 3 个文件拷贝到此处,然后修改配置文件 config.csv 如下:

找到数据处理程序 QriNeuronPiPeline.exe,

双击执行,会自动处理 3 个动作的数据,执行结果如下:

结果显示三个动作识别率分别为 68.5714%、80.7692%、76.4706%; 这个石碑率是使用训练的数据作为识别的数据来进行识别统计的概率,可以从侧面反应出识别的准确度。
执行结束后会生成 1 个新的文件:neuron.csv。

第三步:数据学习和识别:

1. 复制 neuron.csv 到 SD 卡,将 sd 卡插回到 Genuino101 上。

2. 解压 curie-classfiy-ble.zip 文件。
进入 curie-classfiy-ble 文件夹,如下:

用 ArduinoIDE 双击打开 curie-classfiy-ble.ino, 进行编译和下载程序到 Genuino101.

3. 将 BLE-link 插到电脑的 usb 口上,打开 ArduinoIDE,(注意 BLE-link 本身就是一个 Arduino UNO 芯片),打开工具-> 端口-> 选择 BLE-link 的端口 COM4,然后打开虚拟串口,

打开虚拟串口如下:

4.Arduino 101 的蓝牙天线 靠近 BLE-link(尽量靠近等待几秒钟),Arduino101 和 BLE-link 会自动配对,自动配对成功后 BLE-link 会有蓝灯亮起,

配对成功后如下:

配对成功后 Arduino101 会自动学习 neurons.csv 的数据:如下图在读取学习数据:

大约几十秒,等待读取完以后,
就可以随便做动作进行识别啦。

效果测试

比如做个直拳:

如下图示识别的结果:

注意事项:
1.Genuino101 读取 sd 卡里的文件的时候,文件名不能太长,文件名太长会读取失败,建议文件名保持在 8 个字符之内。
2.Genuino101 和 BLE-link 配对的时候会配对失败,碰到这种情况的话, 请插拔 Genuino101 和 BLE-link 再试几次。

 

发布者:Cara,转载请注明出处:http://www.makercollider.com/curie/1108

发表评论

登录后才能评论
QR code