请选择 进入手机版 | 继续访问电脑版

gForce手环遥控Arduino小车

[复制链接]

2

主题

3

帖子

22

积分

新手上路

Rank: 1

积分
22
hyw 发表于 2017-7-13 17:26:33
429 2
本帖最后由 hyw 于 2017-7-13 23:37 编辑

产品官网:
给Arduino提供的用于连接Gforce手环的SDK,github代码地址:https://github.com/oymotion/gForceSDKArduino

器材:
1.Arduino小车、gForce手势识别控制器(手环)、gForceJoint、及三根杜邦线

注:小车的官网http://learn.makeblock.com/cn/,内涵全部学习资料和github上的实例源代码 https://github.com/Makeblock-official/mBot

一、gForce简单介绍
gForce包括手环和gForcejoint(蓝牙装置),具体就是通过采集肌电,通过一系列的解码及对比,来达到识别指令的目的。指令信息包括:四元数、手势。识别指令之后,通过蓝牙装置将相应的命令发送至gForcejoint,gForcejoint可以通过串口与嵌入式设备进行数据交互。
鉴于以上原理,我们可以将手势信息通过gForcejoint发送给开发板(51、STM32、Arduino),通过解包数据拿到对应手势,就可以根据不同的手势做不同的操作。
gForcejoint与控制板之间的连接方式为串口(嵌入式,目前只支持gForcejoint的发送),控制板通过串口接收到相应的手势命令,用户可以自主定义出想要实现的效果。
gForce中定义的八种手势:GF_FIST、GF_SPREAD、GF_WAVEIN、GF_WAVEOUT、GF_PINCH、GF_SHOOT、
GF_RELEASE、GF_UNKNOWN。(官方手势视频讲解:http://video.tudou.com/v/XMjQ2NjgxNzE1Mg==.html

二、通过gForce手环控制Arduino小车,步骤及流程(实例)
理论上只要是支持串口的设备,gForce都可以实现联调,下面是gForce手势识别应用在Arduino车上的实例。
(一)软件准备:

1.gFroce库函数的导入

在Arduino平台下,gForce开发出了自己对应的库函数,并且留出了相对应的函数接口,让我们可以简单的就可以使用库函数进行我们想要的开发工作。

前提:你已经安装过Arduino IDE应用程序(Arduino编程软件)

步骤:项目-->加载库-->添加一个.zip库-->gForceSDKArduino-master.zip(对应的库文件会提供)

2.范例程序的演示

在提供的库文件压缩包下,有一个example文件夹,里面有gForce与Arduino连接的范例。

前提:正确安装gForce库文件

步骤:文件-->打开-->/gForceSDKArduino-master/examples/SimpleControlByGesture/SimpleControlByGesture.ino

延伸:在该文件中,对八种手势的应用框架已经写在loop()函数中,自己可以根据需求做相应的修改。如果有兴趣了解gForce的库函数,可以自行研究(C++编写)。


(二)硬件准备:

3.硬件连接

① 将gForcejoint连接至小车串口(三根杜邦线,VCC、GND、TX),VCC与GND连接到小车主板相对应引脚即可,TX接小车RX引脚。(注意:目前只支持向主板传递数据,并不支持主板向手环发送数据,所以gForce的RX和主板的TX引脚可以不接!)

② 将gForcejoint固定在小车主板上,防止因接线不牢导致信息的传递失败。

③ 正确佩戴手环(具体注意事项可以参考手环使用教程)。
例子:掌心面和手环充电口保持一致,暂只支持这种佩戴方法。


④ 连接手环与gForcejoint,进行手势的识别。打开手环电源后靠近gForcejoint(5cm内为最佳),手环绿色指示灯快速闪烁表示连接已建立。


(三)程序

4.用户定义程序

前提:正确安装库函数,了解库函数的基本用法

步骤:>编写小车相对应的行为函数(例如前进,后退,左转,右转,停止,加速等)。

           >在loop()中姿势判断中调用相应的子函数,确定每个手势代表的内容,
例如:GF_FIST-->前进         
          GF_SPREAD-->后退
          GF_WAVEIN-->左转
               GF_WAVEOUT-->右转
          GF_PINCH-->停止
          GF_SHOOT-->加速
          GF_RELEASE-->停止
          GF_UNKNOWN-->停止。、】
延伸:有需求的话,可以研究下串口的使用,利用串口进行调试。将每个手势被识别时对应的信息打印至PC端。工具-->串口监视器

5.程序的下载

前提:程序编译正确,串口对应的驱动正确安装(未安装会识别不到该设备),开发板型号选择正确

步骤:工具-->开发板型号为Arduino/Genuino Uno。

                   点击下载。

三、演示视频
1.手势的练习
2.硬件连接指导
3.控制示范
四、控制前景
上面的实例只是gForce应用于嵌入式系统的一个亮点,也是一种十分炫酷的控制方式,具体其他好玩的东西还需要我们自己去探讨,接下来就打开你的脑洞吧!

五、附录代码
  1. #include "mCore.h"
  2. #include <Arduino.h>
  3. #include <Wire.h>
  4. #include <SoftwareSerial.h>
  5. #include <gForceAdapter.h>     // import gForceSDK        
  6. #define DEBUG         1       //  print log information when it is true
  7. GForceAdapter gforce = GForceAdapter(&Serial);
  8. MeDCMotor MotorL(M1);
  9. MeDCMotor MotorR(M2);
  10. uint8_t moveSpeed = 200;  // speed
  11. uint8_t m_accelerate = 0; // accelerated factor
  12. static inline void logI(String str) {
  13. #if DEBUG
  14.   Serial.println(str);
  15. #endif
  16. }
  17. void setup()
  18. {
  19. #if DEBUG
  20.   Serial.begin(115200);
  21. #endif
  22.   Stop();
  23.   logI("Init:Setup");
  24. }
  25. void loop()
  26. {
  27.   getgForceData();
  28. }
  29. // Gesture decoding function
  30. void getgForceData()
  31. {
  32.   GF_Data gForceData;
  33.   if (OK == gforce.GetGForceData(&gForceData)) {
  34.     GF_Gesture gesture;
  35.     switch (gForceData.type) {
  36.       case GF_Data::QUATERNION:
  37.         break;
  38.       case GF_Data::GESTURE:
  39.         gesture = gForceData.value.gesture;
  40.         if (gesture == GF_FIST) {
  41.           logI("get fist signal");
  42.           moveSpeed = 200;
  43.           Forward();
  44.         }
  45.         else if (gesture == GF_SPREAD) {
  46.           logI("get spread signal");
  47.           moveSpeed = 100;
  48.           Backward();
  49.         }
  50.         else if (gesture == GF_WAVEIN) {
  51.           logI("get wave in signal");
  52.           moveSpeed = 150;
  53.           TurnLeft();
  54.         }
  55.         else if (gesture == GF_WAVEOUT) {
  56.           logI("get wave out signal");
  57.           moveSpeed = 150;
  58.           TurnRight();
  59.         }
  60.         else if (gesture == GF_PINCH) {
  61.           logI("get pinch signal");
  62.           Stop();
  63.         }
  64.         else if (gesture == GF_SHOOT) {
  65.           if (0 == m_accelerate) {
  66.             moveSpeed = 220;
  67.             Forward();
  68.             m_accelerate++;
  69.             logI("get shoot signal, m_accelerate = 0");
  70.           }
  71.           else if (1 == m_accelerate) {
  72.             moveSpeed = 240;
  73.             Forward();
  74.             m_accelerate++;
  75.             logI("get shoot signal, m_accelerate = 1");
  76.           }
  77.           else if (2 == m_accelerate) {
  78.             moveSpeed = 255;
  79.             Forward();
  80.             m_accelerate++;
  81.             logI("get shoot signal, m_accelerate = 2");
  82.           }
  83.           else {
  84.             moveSpeed = 200;
  85.             Forward();
  86.             m_accelerate = 0;
  87.             logI("get shoot signal, m_accelerate is else");
  88.           }
  89.         }
  90.         else if (gesture == GF_RELEASE) {
  91.           logI("get release signal");
  92.           Stop();
  93.         }
  94.         else if (gesture == GF_UNKNOWN) {
  95.           logI("get unknown signal");
  96.         }
  97.         break;
  98.       default:
  99.         break;
  100.     }
  101.   }
  102. }
  103. void Forward()
  104. {
  105.   MotorL.run(-moveSpeed);
  106.   MotorR.run(moveSpeed);
  107. }
  108. void Backward()
  109. {
  110.   MotorL.run(moveSpeed);
  111.   MotorR.run(-moveSpeed);
  112. }
  113. void TurnLeft()
  114. {
  115.   MotorL.run(-moveSpeed / 10);
  116.   MotorR.run(moveSpeed);
  117. }
  118. void TurnRight()
  119. {
  120.   MotorL.run(-moveSpeed);
  121.   MotorR.run(moveSpeed / 10);
  122. }
  123. void Stop()
  124. {
  125.   MotorL.run(0);
  126.   MotorR.run(0);
  127. }
复制代码
备注:调用的是https://github.com/Makeblock-official/mBot 上的库代码(MeDCMotor


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

suxiang198 发表于 2017-7-14 10:03:47
哇,这个很赞呀
回复 支持 反对

使用道具 举报

yuyu_morning 发表于 2017-7-14 13:55:43
技术帖,666,楼主加油!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

热帖滚动