小车


gForce
手环在Arduino主板上的应用

产品官网:

http://oymotion.com

给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(蓝牙装置),具体就是通过采集肌电,通过一系列的解码及对比,来达到识别指令的目的。指令信息包括:四元数、手势。识别指令之后,通过蓝牙装置将相应的命令发送至gForcejointgForcejoint可以通过串口与嵌入式设备进行数据交互。

鉴于以上原理,我们可以将手势信息通过gForcejoint发送给开发板(51、STM32、Arduino),通过解包数据拿到对应手势,就可以根据不同的手势做不同的操作

gForcejoint与控制板之间的连接方式为串口(嵌入式,目前只支持gForcejoint的发送),控制板通过串口接收到相应的手势命令,用户可以自主定义出想要实现的效果。

gForce中定义的八种手势:GF_FISTGF_SPREADGF_WAVEINGF_WAVEOUTGF_PINCHGF_SHOOT

GF_RELEASEGF_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文件夹,里面有gForceArduino连接的范例。

前提:正确安装gForce库文件

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

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


(二)硬件准备:

3.硬件连接

① gForcejoint连接至小车串口(三根杜邦线,VCCGNDTX)VCCGND连接到小车主板相对应引脚即可,TX接小车RX引脚。(注意:目前只支持向主板传递数据,并不支持主板向手环发送数据,所以gForceRX和主板的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

                   点击下载。

三、演示视频

http://v.youku.com/v_show/id_XMjg4NzA0ODc4NA==.html?spm=a2h3j.8428770.3416059.1

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










































































附件列表

     

    posted @ 2017-07-12 21:04  saber韩  阅读(374)  评论(0)    收藏  举报