海盗船套件进阶教程 手机遥控功能
<center>在完成基础功能后,我们对机器人来个升级,给它增加手机蓝牙遥控。可通过手机轻松遥控小车,更可给小车增加炫酷的LED灯光效果。结合我们全新打造的手机端APP,相信你一定会对它爱不释手。并且我们对蓝牙的代码做了优化,更方便初学者使用。</center>
目录
1 准备工作
2 软件按键定义
3 通讯协议
4 输入测试代码
5 蓝牙调试
6 输入遥控代码
7 代码回顾
8 相关下载
9 应用成果展示
准备工作
iPhone 或者 iPad × 1
走你APP × 1
注意:需要 iOS 8.1 或更高版本。此App已针对iPhone 5、iPhone 6 和 iPhone 6 Plus 优化。
由于我们目前只开发了iOS的APP,所以安卓用户暂时没有可直接使用的APP。
软件按键定义
通讯协议
输入测试代码
注意:因某些库官方进行了升级,故在新版本的IDE下编译使用会出现Y轴数据不正常的情况。请使用1.0.6版本的ArduinoIDE。
蓝牙调试
下载完代码,我们需要将手机和蓝牙进行配对。首先 , 记得打开手机蓝牙。然后,打开走你APP,会出现如下界面。
点击蓝牙键(红色放大镜)。此时,会显示所有蓝牙设备,选择Romeo BLE对应的蓝牙设备名称,进行连接。
连接成功后,蓝牙键的会由红色转变为绿色。如下图所示:
连接成功后,Roemo BLE上的绿色Link会点亮,此时说明你手机和控制器连接上了。
完成连接后,我们就可以测试控制器接收信号的情况了。
回到Arduino IDE的界面,点击右上角Serial Monitor(串口监视器)。
会弹出如下的对话框,先将串口的波特率设置为115200,就是下图红色圈出的部分。
此时,拿出你的手机,任意的滑动摇杆,或者点击按钮。不出意外的话,你可以从串口监视器中看到,对应的数值,Joystick Value代表的是摇杆的数值。Button ID则对应显示你按下的哪个按键,
输入遥控代码
如果前面都很顺利的话,我们就可以进行最后的遥控代码的下载了。这里下载遥控代码时,有个很关键的一点需要注意。因为我们前面在测试阶段,已经将手机和Romeo BLE建立连接了。蓝牙在连接时,是无法下载程序的。所以,需要将蓝牙断开连接后,方可下载重新下载程序。这点需要牢记!
断开蓝牙连接的方法是:可以给Romeo BLE断电再重新上电,或者关掉手机蓝牙。
断掉蓝牙后,我们重新下载下面这段遥控代码,可在代码包中找到GoBLE_APP.ino。
下载成功后,按下图箭头方向前后左右滑动摇杆,就可以通过手机来操控你的机器人。还可按下图中标出的按键,用来控制板载的13号引脚的LED的开关。
代码回顾
小车我们玩过了,现在就来简单学习下代码如何使用了。GoBLE_Test测试代码我们就不单独说了,直接来看下GoBLE_APP。
基础功能重复的就不多说了,直接说蓝牙遥控的部分。
首先,这里用到两个库,Metro和GoBLE库。
#include "Metro.h"
#include "GoBLE.h"
int joystickX, joystickY;
int buttonState[6];
下图就是各个按键的分布图。如果在测试代码中,有仔细看过数值变化过程的伙伴,也许能猜出左边摇杆图的中的+X,-X,+Y,-Y是什么意思了。
X,Y是摇杆的两个移动方向。“+,-”表示的数值的变化趋势。“+”代表数值递增的方向,“-”代表数值递减的方向。
Setup()函数中我们需要做一些初始化设置:
Goble.begin();
这句语句用来蓝牙初始化设置的。每次使用手机蓝牙的话,都必须用到这句语句。Serial.begin(115200);
这个用法其实我们在前面测试阶段已经用到过了,是用来初始化串口的。如果我们想从串口监视器上看到数据,必须要在setup()函数中,begin一下Serial,并且设置一下它的速度(括号内的值), 蓝牙波特率为115200。 继续往下看,Goble.available()函数:if(Goble.available()){
do something;
}
joystickX = Goble.readJoystickX();
joystickY = Goble.readJoystickY();
// Serial.print("joystickX: ");
// Serial.print(joystickX);
// Serial.print("joystickY: ");
// Serial.println(joystickY);
下面的四句Serial.print()能猜出是什么意思呢?和串口有关。是用来串口打印出读到的数据,便于我们观察,调试。语句前面的”//”符号,表示这句话注释掉。代码在编译的时候,将不包含这四句话。简单的说 ,注释掉这四句话的话,我们无法从串口读到数据。
想了解更多,可查看Arudino语法手册。
buttonState[SWITCH_UP] = Goble.readSwitchUp();
buttonState[SWITCH_DOWN] = Goble.readSwitchDown();
buttonState[SWITCH_LEFT] = Goble.readSwitchLeft();
buttonState[SWITCH_RIGHT] = Goble.readSwitchRight();
buttonState[SWITCH_SELECT] = Goble.readSwitchSelect();
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。
int SpeedX=2joystickX-256;
int SpeedY=2joystickY-256;
Serial.print("Speed: ");
Serial.print(SpeedX);
Serial.print(" ");
Serial.println(SpeedY);
数据处理完之后,就需要让小车开始执行动作了。
如果 ( 摇杆向上 或者(||) 摇杆向下 ){
小车前进或者后退;
}
如果 ( 摇杆向右 或者(||) 摇杆向左){
小车右转或者左转;
}
如果 (摇杆X轴没变化 并且(&&) 摇杆Y轴没变化){
小车停止;
}
“翻译”成对应的代码就是下面这段:
if (SpeedX>200 || SpeedX<-200){
LeftWheelSpeed=SpeedX;
RightWheelSpeed=SpeedX;
Robot.Speed (LeftWheelSpeed,RightWheelSpeed);
}
else if (SpeedY>200 || SpeedY<-200){
LeftWheelSpeed=SpeedY-80;
RightWheelSpeed=-SpeedY-80;
Robot.Speed(LeftWheelSpeed,RightWheelSpeed);
}
else if (SpeedX==0 && SpeedY==0){
Robot.Speed(0,0);
}
int ledPin = 13;
代码开始还是需要定义下13号引脚。pinMode(ledPin,OUTPUT);
在setup()中将LED设置为输出模式,具体可以查看pinMode()函数的使用说明。 下面这段就是对按键读到的状态进行判断,因为我们只用到了按键1(上键),如果被按下了(PRESSED),点亮LED,也就是将LED引脚设置为HIGH。if (buttonState[1] == PRESSED){
digitalWrite(ledPin,HIGH);
}
if (buttonState[1] == RELEASED){
digitalWrite(ledPin,LOW);
}
相关下载
走你APP
GoBle库
应用成果展示
带两自由度云台的履带机器人