设为首页收藏本站

[教程] DIY海盗船系列 第4话 --- 手机遥控功能

Jane 发表于 2016-6-9 09:58:39 | 显示全部楼层 [复制链接]
4 1227
DIY海盗船系列 第4话 --- 手机遥控功能
在完成基础功能后,我们对机器人来个升级,给它增加手机蓝牙遥控。可通过手机轻松遥控小车,更可给小车增加炫酷的LED灯光效果。结合我们全新打造的手机端APP,相信你一定会对它爱不释手。并且我们对蓝牙的代码做了优化,更方便初学者使用。

准备工作:
  •     iPhone或者iPad × 1
走你.png
      注意:需要 iOS 8.1 或更高版本。此App已针对iPhone 5、iPhone 6 和iPhone 6 Plus 优化。

由于我们目前只开发了iOS的APP,所以安卓用户暂时没有可直接使用的APP。iPhone用户可在Apple Store下载GoBLE的APP。下载完成后,打开APP,如果呈现出如下所示的界面,说明你APP下载正确了!

手机.png

输入测试代码:
插上USB线,你可在软件包中找到GoBLE_Test.ino的代码,这是一段测试代码。还不能遥控小车的,只是可以从电脑端看到手机发出来的信号。下载一下看了就知道了。下载代码前,不要忘记加载一下遥控的GoBLE的库。下载成功后,信息框会显示Done uploading。

测试代码.png

蓝牙调试:
下载完代码,我们需要将手机和蓝牙进行配对。首先 , 记得打开手机蓝牙。然后,打开走你APP,会出现如下界面。

1.png

点击蓝牙搜索键(红色放大镜)。此时,会显示所有蓝牙设备,选择Romeo BLE对应的蓝牙设备名称,进行连接。

2.png
连接成功后,蓝牙搜索键的会由红色转变为绿色。如下图所示:
3.png
     连接成功后,Roemo BLE上的绿色Link会点亮,此时说明你手机和控制器连接上了。

link.png

完成连接后,我们就可以测试控制器接收信号的情况了。回到Arduino IDE的界面,点击右上角Serial Monitor(串口监视器)。

串口.png

会弹出如下的对话框,先将串口的波特率设置为115200,就是下图红色圈出的部分。

波特率.png

此时,拿出你的手机,任意的滑动摇杆,或者点击按钮。不出意外的话,你可以从串口监视器中看到,对应的数值,Joystick Value代表的是摇杆的数值。你会发现摇杆上下滑动时,JoystickValue的值随之发生变化,并且向上,值越大,向下,值越小。左右也是同样的道理。有发现吗?Button ID则对应显示你按下的哪个按键。
4.png
value.png
手柄.png
value1.png

输入遥控代码:
如果前面都很顺利的话,我们就可以进行最后的遥控代码的下载了。这里下载遥控代码时,有个很关键的一点需要注意。因为我们前面在测试阶段,已经将手机和Romeo BLE建立连接了。蓝牙在连接时,是无法下载程序的。所以,需要将蓝牙断开连接后,方可下载重新下载程序。这点需要牢记!
断开蓝牙连接的方法是:可以给RomeoBLE断电再重新上电,或者关掉手机蓝牙。

断掉蓝牙后,我们重新下载下面这段遥控代码,可在代码包中找到GoBLE_APP.ino。

正式.png


下载成功后,按下图箭头方向前后左右滑动摇杆,就可以通过手机来操控你的机器人。还可按下图中标出的按键,用来控制板载的13号引脚的LED的开关。

2323.png
1212.png

代码回顾:
小车我们玩过了,现在就来简单学习下代码如何使用了。GoBLE_Test测试代码我们就不单独说了,直接来看下GoBLE_APP。
基础功能重复的就不多说了,直接说蓝牙遥控的部分。首先,这里用到两个库,Metro和GoBLE库。

  1. #include "Metro.h"
  2. #include "GoBLE.h"
  3. int joystickX, joystickY;
  4. int buttonState[6];
复制代码
joystickX,joystickY,buttonState[6]这三个变量是针对GoBLE库定义的。分别用来存储摇杆X轴,Y轴以及6个按键的状态值的。
下图就是各个按键的分布图。如果在测试代码中,有仔细看过数值变化过程的伙伴,也许能猜出左边摇杆图的中的+X,-X,+Y,-Y是什么意思了。
X,Y是摇杆的两个移动方向。“+,-”表示的数值的变化趋势。“+”代表数值递增的方向,“-”代表数值递减的方向。

111.png

Setup()函数中我们需要做一些初始化设置:
Goble.begin();   
这句语句用来蓝牙初始化设置的。每次使用手机蓝牙的话,都必须用到这句语句。
   Serial.begin(115200);
这个用法其实我们在前面测试阶段已经用到过了,是用来初始化串口的。如果我们想从串口监视器上看到数据,必须要在setup()函数中,begin一下Serial,并且设置一下它的速度(括号内的值), 蓝牙波特率为115200
继续往下看,Goble.available()函数:
  1. if(Goble.available())
复制代码
这个函数的含义是:如果接收到了蓝牙发过来的数值,那么执行些什么动作。   
那么available()内部就是需要执行的动作了。首先,我们需要对接收到的数据做解析,下面两句就是读取X,Y轴上的数据。
  1. joystickX = Goble.readJoystickX();  
  2. joystickY = Goble.readJoystickY();
  3. // Serial.print("joystickX: ");
  4. // Serial.print(joystickX);
  5. // Serial.print("joystickY: ");
  6. // Serial.println(joystickX);
复制代码
下面的四句Serial.print()能猜出是什么意思呢?和串口有关。是用来串口打印出读到的数据,便于我们观察,调试。语句前面的”//”符号,表示这句话注释掉。代码在编译的时候,将不包含这四句话。简单的说 ,注释掉这四句话的话,我们无法从串口读到数据。
想了解更多,可查看Arudino语法手册[J1]
  1. buttonState[SWITCH_UP]     = Goble.readSwitchUp();
  2. buttonState[SWITCH_DOWN]   = Goble.readSwitchDown();
  3. buttonState[SWITCH_LEFT]   = Goble.readSwitchLeft();
  4. buttonState[SWITCH_RIGHT]  = Goble.readSwitchRight();
  5. buttonState[SWITCH_SELECT] = Goble.readSwitchSelect();
  6. buttonState[SWITCH_START]  = Goble.readSwitchStart();
复制代码
上面这一大串是用来读取按键的状态的。依次对应按键的分布图:

SWITCH_UP      (上键)      -- 1
SWITCH_RIGHT  (右键)      -- 2
SWITCH_DOWN  (下键)      -- 3
SWITCH_LEFT   (左键)    -- 4
SWITCH_SELECT (选择键)  -- 5
SWITCH_START  (开始键)   -- 6
   
读完所有的数据以后,我们不能直接拿来用,需要做一些处理。
首先,需要将手柄读到的数据映射到我们小车的轮子转速上,所以就有了下面这两句。将读到的原始数据0~255映射为小车速度-255~255。
  1. int SpeedX=2*joystickX-256;
  2. int SpeedY=2*joystickY-256;

  3. Serial.print("Speed: ");
  4. Serial.print(SpeedX);
  5. Serial.print("  ");
  6. Serial.println(SpeedY);
复制代码
同样是串口打印出速度,便于你调试使用,如果不需要的话,你也可以用”//”注释掉。
数据处理完之后,就需要让小车开始执行动作了。
如果 ( 摇杆向上 或者(||) 摇杆向下 ){  
   小车前进或者后退;
}         
如果 ( 摇杆向右 或者(||) 摇杆向左){   
   小车右转或者左转;
}
如果 (摇杆X轴没变化 并且(&&) 摇杆Y轴没变化){
   小车停止;
}
“翻译”成对应的代码就是下面这段:
  1. if (SpeedX>200 || SpeedX<-200){        
  2.     LeftWheelSpeed=SpeedX;                 
  3.     RightWheelSpeed=SpeedX;
  4.     Robot.Speed (LeftWheelSpeed,RightWheelSpeed);
  5. }         
  6. else if (SpeedY>200 || SpeedY<-200){           
  7.     LeftWheelSpeed=SpeedY-80;            
  8.     RightWheelSpeed=-SpeedY-80;
  9.     Robot.Speed(LeftWheelSpeed,RightWheelSpeed);
  10. }
  11. else if (SpeedX==0 && SpeedY==0){
  12.     Robot.Speed(0,0);
  13. }
复制代码
最后一段是用来控制板载13号引脚的LED。
  1. int ledPin = 13;
复制代码
代码开始还是需要定义下13号引脚。
  1. pinMode(ledPin,OUTPUT);
复制代码
在setup()中将LED设置为输出模式,具体可以查看pinMode()函数的使用说明。
下面这段就是对按键读到的状态进行判断,因为我们只用到了按键1(上键),如果被按下了(PRESSED),点亮LED,也就是将LED引脚设置为HIGH。
  1. if (buttonState[1] == PRESSED)
复制代码
同样如果按键被释放(RELEASED),熄灭LED,也就是将LED引脚设置为LOW。  
  1. if (buttonState[1] == RELEASED)
复制代码
好了,代码解释就到这里了。这样一看,是不是代码也不是很难理解呀?可是尝试按照你的意愿来修改代码,比如换一个按键来控制小灯啦,或者给你小车装个手动转向灯等等。好玩的很多,当看到小车按你的要求在跑的话,一定会觉得非常有乐趣的!







1313.png

Code.zip

10.99 KB, 下载次数: 16, 下载积分: 创造力 -1

发表于 2016-6-9 14:33:17 | 显示全部楼层
顶起
回复 支持 反对

使用道具 举报

发表于 2016-6-10 08:20:19 | 显示全部楼层
学习学习
回复 支持 反对

使用道具 举报

发表于 2017-3-7 18:44:02 | 显示全部楼层
你好我问下我是blelink+arduino原板,蓝牙和app连接上了,把测试程序下进去,按手机按键串口什么值也没有,什么数据都没有,请问是什么原因
回复 支持 反对

使用道具 举报

发表于 2017-3-24 23:20:24 | 显示全部楼层
mxc19881030 发表于 2017-3-7 18:44
你好我问下我是blelink+arduino原板,蓝牙和app连接上了,把测试程序下进去,按手机按键串口什么值也没有, ...

按键的时候,TX,RX的LED灯会闪烁吗?
回复 支持 反对

使用道具 举报

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

本版积分规则 允许回帖同步到新浪微博  

  • 管理员
  • 4334
  • 103
  • 活跃会员

    活跃会员

  • 版主限定

    版主限定

  • 特邀作者

    特邀作者

  • 牛X认证

    牛X认证

  • 小蘑菇勋章

    小蘑菇勋章

  • 蘑菇人勋章

    蘑菇人勋章

  • 教师荣誉徽章

    教师荣誉徽章

  • 蘑菇老人勋章

    蘑菇老人勋章

推荐阅读

精华导读




公司简介| 联系我们| 小黑屋| 加入我们| 微博| 优酷| 英文网站| DF创客社区 ( 沪ICP备09038501号-4  
友情链接| 硬创邦| 花生壳社区| 模友之吧| 电子发烧友社区| 创客星球| 云汉电子社区| 电子工程网| 与非网| Arduino中文社区| 南极熊3D打印网| OneNET|

上海智位机器人有限公司  沪ICP备09038501号-4   

Powered by Discuz! X3.1

Licensed Comsenz Inc.

返回顶部 返回列表