小车
gForce手环在Arduino主板上的应用
产品官网:
给Arduino提供的用于连接Gforce手环的SDK,github代码地址:https://github.com/oymotion/gForceSDKArduino
器材:
1.Arduino小车、gForce手势识别控制器(手环)、gForceJoint、及三根杜邦线

一、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。
点击下载。
三、演示视频
http://v.youku.com/v_show/id_XMjg4NzA0ODc4NA==.html?spm=a2h3j.8428770.3416059.1
1.手势的练习
2.硬件连接指导
3.控制示范
四、控制前景
上面的实例只是gForce应用于嵌入式系统的一个亮点,也是一种十分炫酷的控制方式,具体其他好玩的东西还需要我们自己去探讨,接下来就打开你的脑洞吧!
五、代码附件
#include "mCore.h"#include <Arduino.h>#include <Wire.h>#include <SoftwareSerial.h>#include <gForceAdapter.h> // import gForceSDK#define DEBUG 1 // print log information when it is trueGForceAdapter gforce = GForceAdapter(&Serial);MeDCMotor MotorL(M1);MeDCMotor MotorR(M2);uint8_t moveSpeed = 200; // speeduint8_t m_accelerate = 0; // accelerated factorstatic inline void logI(String str) {#if DEBUGSerial.println(str);#endif}void setup(){#if DEBUGSerial.begin(115200);#endifStop();logI("Init:Setup");}void loop(){getgForceData();}// Gesture decoding functionvoid getgForceData(){GF_Data gForceData;if (OK == gforce.GetGForceData(&gForceData)) {GF_Gesture gesture;switch (gForceData.type) {case GF_Data::QUATERNION:break;case GF_Data::GESTURE:gesture = gForceData.value.gesture;if (gesture == GF_FIST) {logI("get fist signal");moveSpeed = 200;Forward();}else if (gesture == GF_SPREAD) {logI("get spread signal");moveSpeed = 100;Backward();}else if (gesture == GF_WAVEIN) {logI("get wave in signal");moveSpeed = 150;TurnLeft();}else if (gesture == GF_WAVEOUT) {logI("get wave out signal");moveSpeed = 150;TurnRight();}else if (gesture == GF_PINCH) {logI("get pinch signal");Stop();}else if (gesture == GF_SHOOT) {if (0 == m_accelerate) {moveSpeed = 220;Forward();m_accelerate++;logI("get shoot signal, m_accelerate = 0");}else if (1 == m_accelerate) {moveSpeed = 240;Forward();m_accelerate++;logI("get shoot signal, m_accelerate = 1");}else if (2 == m_accelerate) {moveSpeed = 255;Forward();m_accelerate++;logI("get shoot signal, m_accelerate = 2");}else {moveSpeed = 200;Forward();m_accelerate = 0;logI("get shoot signal, m_accelerate is else");}}else if (gesture == GF_RELEASE) {logI("get release signal");Stop();}else if (gesture == GF_UNKNOWN) {logI("get unknown signal");}break;default:break;}}}void Forward(){MotorL.run(-moveSpeed);MotorR.run(moveSpeed);}void Backward(){MotorL.run(moveSpeed);MotorR.run(-moveSpeed);}void TurnLeft(){MotorL.run(-moveSpeed / 10);MotorR.run(moveSpeed);}void TurnRight(){MotorL.run(-moveSpeed);MotorR.run(moveSpeed / 10);}void Stop(){MotorL.run(0);MotorR.run(0);}
备注:调用的是https://github.com/Makeblock-official/mBot 上的库代码(MeDCMotor)
附件列表



浙公网安备 33010602011771号