手机端遥控程序
动力老男孩发布于 2016-01-23 23:48
各位朋友新年好!祝大家2016新年快乐!好久没有更新了,新的一年希望尽快把攻略补全 :)
这个代码是我从一个控制乐高NXT的代码里面改过来的,所以名字还是NXTRemoteControl,请无视。主要的代码文件有这几个:1. NXTTalker.java 这个类主要用于蓝牙通讯,包括连接、断开、发送和接收。其中发送命令的部分代码为:
实际上write函数可以一次发送多个字节,在这个程序里,控制转速需要的命令太简单了,所以我把sendCmd改成只发送一个字节。
很多朋友都比较关注手机端的遥控代码,这部分代码我确实很久没有碰了。因为自从做了鸡腿遥控器,发现这玩意儿比手机好用太多了。但是话说回来,毕竟做一个遥控器还是要花不少时间和精力的,如果手头正好有Android手机,确实会方便不少。
先把链接贴出来吧:
只想下载安装包使用的朋友点这里下载: http://7xic5x.com2.z0.glb.qiniucdn.com/NXTRemoteControl.apk
先把链接贴出来吧:
只想下载安装包使用的朋友点这里下载: http://7xic5x.com2.z0.glb.qiniucdn.com/NXTRemoteControl.apk
有兴趣查看源代码自己改进的朋友,请下载全部代码:http://7xic5x.com2.z0.glb.qiniucdn.com/skywalker.zip
说到这里,还必须多说两句。曾经有人加我的QQ,要了安卓代码以后,问了一些这样的问题:安卓开发环境怎么搭?这个怎么打开?Java代码怎么写?
这样的同学以后就别来问我了,入门的东西需要自己去学。毕竟大家都很忙,谁也没精力当义务教师啊,而且还是一对一的……
这个代码是我从一个控制乐高NXT的代码里面改过来的,所以名字还是NXTRemoteControl,请无视。主要的代码文件有这几个:1. NXTTalker.java 这个类主要用于蓝牙通讯,包括连接、断开、发送和接收。其中发送命令的部分代码为:
public void sendCmd(byte cmd) {
byte[] data = {cmd};
write(data);
}
private void write(byte[] out) {
ConnectedThread r;
synchronized (this) {
if (mState != STATE_CONNECTED) {
return;
}
r = mConnectedThread;
}
r.write(out);
}实际上write函数可以一次发送多个字节,在这个程序里,控制转速需要的命令太简单了,所以我把sendCmd改成只发送一个字节。
2. NXTRemoteControl.java
这个类主要是处理各种逻辑,例如:获取手指在屏幕上的坐标,换算成速度或者刹车力度;显示各种配置界面等;如果是调试的话还可以记录一些log。其中大家比较关注的触屏事件代码如下:
3. ChooseDeviceActivity.java \ LightActivity.java \ SettingActivity.java
这三个文件分别对应连接蓝牙设备,设置灯光,设置最高转速 三个界面。
指令规则:
这里说的指令规则,就是遥控端和接收端的通讯协议。一个比较好的协议,应该有较好的容错和扩展的能力。但是对于遥控电滑板来说,目前需要控制的参数还很少,所以用了非常简易的规则:a. 每次发送一个字节,也就是说数据永远是0~255之间的一个数;
b. 没有任何操作的时候,发送50,对应的遥控器放在中点位置,既没有动力,也没有刹车;
c. 51~99 表示加油门,数字越大代表动力越大,对应手在屏幕上向上推;
d. 0~49表示带刹车,数字越小表示刹车越重,对应手在屏幕上向下拉;
e. 100~200 设置最大油门比例,例如滑板收到一个指令150,会把 150-100=50 作为油门推到顶的动力值;
f. 201 ~ 203 灯光设置,分别对应:永远亮、永远灭、根据环境光线调节;
g. 204 开喇叭,205 关喇叭
规则很简单,但是扩展性不是很好,也没有校验,有兴趣的同学请自己修改吧 :)
public boolean onTouchEvent (MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: // 手指按下
case MotionEvent.ACTION_MOVE: // 手指移动
int x = (int)event.getRawX();
int y = (int)event.getRawY();
int viewWidth = getWindowManager().getDefaultDisplay().getWidth();
int viewHeight = getWindowManager().getDefaultDisplay().getHeight();
if ( 1.0 * x / viewWidth > 0.9) {
if (!hornOpen) {
mNXTTalker.setCtrlValue(204, 1);
hornOpen = true;
}
} else {
if (hornOpen) {
mNXTTalker.setCtrlValue(205, 1);
hornOpen = false;
}
}
int offset = viewHeight / 6; // Use 20% as empty zone
int power = 100 - (y - offset) * 100 / (viewHeight - 2 * offset);
power = Math.min(100, Math.max(0, power));
mNXTTalker.setCtrlValue(power, 1);
if ((inLowPowerArea && power > 53) || (!inLowPowerArea && power < 47)) {
Vibrator mVibrator = (Vibrator)getApplication().getSystemService(Service.VIBRATOR_SERVICE);
mVibrator.vibrate(200);
inLowPowerArea = (power < 50);
}
break;
case MotionEvent.ACTION_UP:// 手指抬起
mNXTTalker.setCtrlValue(255, 1);
//手指抬起后轻带刹车
//mNXTTalker.setCtrlValue(50, 1);
break;
default:
break;
}
return false;
}
3. ChooseDeviceActivity.java \ LightActivity.java \ SettingActivity.java
这三个文件分别对应连接蓝牙设备,设置灯光,设置最高转速 三个界面。
指令规则:
这里说的指令规则,就是遥控端和接收端的通讯协议。一个比较好的协议,应该有较好的容错和扩展的能力。但是对于遥控电滑板来说,目前需要控制的参数还很少,所以用了非常简易的规则:a. 每次发送一个字节,也就是说数据永远是0~255之间的一个数;
b. 没有任何操作的时候,发送50,对应的遥控器放在中点位置,既没有动力,也没有刹车;
c. 51~99 表示加油门,数字越大代表动力越大,对应手在屏幕上向上推;
d. 0~49表示带刹车,数字越小表示刹车越重,对应手在屏幕上向下拉;
e. 100~200 设置最大油门比例,例如滑板收到一个指令150,会把 150-100=50 作为油门推到顶的动力值;
f. 201 ~ 203 灯光设置,分别对应:永远亮、永远灭、根据环境光线调节;
g. 204 开喇叭,205 关喇叭
规则很简单,但是扩展性不是很好,也没有校验,有兴趣的同学请自己修改吧 :)
登录以发表评论
动力哥,好多网友喊您更新攻略呢~~~ 2017年咱能争取更完吗?小编这里代大伙儿先给您拜早年啦~~~~
苹果系统可以吗
动力老男孩,在装Android SDK TOOLS的时候那个android sdk tools和android sdk platform tools安装不上,在网络搜索到方法也安装不上,您有好方法没?
加油
沙发我的啦O(∩_∩)O哈哈~ 加油一口气更新到底
作者的最新随笔
-
愚蠢的地球人:为什么太阳和月亮看上去一样大?
2016-12-12 17:11发布
-
手机端遥控程序
2016-01-23 23:48发布
-
电滑板攻略-手持遥控器
2015-06-08 23:45发布
-
电滑板攻略 - 主控板程序
2015-05-21 22:22发布
-
电动滑板攻略 - 蓝牙控制原理
2015-05-18 19:10发布
阅读数: 12926