Android互动设计-蓝牙遥控自走车iTank
一、让Android与外部的设备互动
iTank智能型移动平台基本款简介
iTank智能型移动平台是一台履带车,车体上方的控制板有一颗微处理器,我们可以通过它的UART或是I2C接口下达指令来控制iTank:

在控制板上具备有UART插座,可搭配使用F1611A蓝牙无线传输模块从手机端以蓝牙连接来远程控制iTank:


UART插座会将蓝牙模块的UART接口连接到控制板上微处理器的UART接口,在手机端通过蓝牙与蓝牙模块连接后,就相当于建立一条无线传输通道,连接手机与控制板的UART接口,即可从手机送出指令给控制板上的微处理器来控制iTank。
1、复制链接库文件:将FlagAPI.jar导入项目;
2、加入蓝牙权限:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="tw.com.flag.ch16_itankled" > <uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application> </manifest>
3、导入FlagAPI的类:
4、创建蓝牙对象:
5、管理蓝牙连接:
6、处理蓝牙事件:
package tw.com.flag.ch16_itankled; import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView; import tw.com.flag.api.FlagBt;
import tw.com.flag.api.OnFlagMsgListener; public class MainActivity extends AppCompatActivity
implements OnFlagMsgListener { FlagBt bt; //声明蓝牙对象
TextView txv;
byte[] ledCmd ={ //点亮 LED0 的指令
(byte)0xFF,(byte)0xFF,
(byte)0x03,(byte)0x00,(byte)0x02,
(byte)0xFF,(byte)0xFF,(byte)0x00
}; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); this.setRequestedOrientation( // 让手机屏幕保持直立模式
ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); txv = (TextView)findViewById(R.id.txv);
bt = new FlagBt(this); // 创建蓝牙对象
} public void onDestroy() {
bt.stop(); // 确保程序结束前会停止蓝牙连接
super.onDestroy();
} public void connect(View v) {
if(!bt.connect()) // 选取已配对设备进行连接
txv.setText("找不到任何已配对设备");
} public void quit(View v) {
bt.stop();
finish();
} @Override
public void onFlagMsg(Message msg) {
switch(msg.what) {
case FlagBt.CONNECTING: // 尝试与已配对设备连接
txv.setText("正在连接到:" + bt.getDeviceName());
break;
case FlagBt.CONNECTED: // 与已配对设备连接成功
txv.setText("已连接到:" + bt.getDeviceName());
bt.write(ledCmd); // 送出点亮 LED0 的指令
break;
case FlagBt.CONNECT_FAIL: // 连接失败
txv.setText("连接失败!请重连");
break;
case FlagBt.CONNECT_LOST: // 当前连接意外中断
txv.setText("连接中断!请重连");
break;
}
}
}
二、点亮iTank控制板上的LED灯
iTank控制板上有两颗LED,分别标示为LED0与LED1:

点亮LED的指令:
要点亮控制板上的LED,手机端程序可以通过蓝牙传递一下8个字节长度的指令(均为十六进制数值):
FF FF 03 00 data FF FF 00
其中,data是1个字节的数据,由其中的4个比特控制两个LED:
| LED | 对应的控制位 |
| LED0 | bit4 + bit0 |
| LED1 | bit5 + bit1 |
两个比特的组合值会决定对应的LED状态:
| bits组合值 | LED状态 |
| 00 | 变暗 |
| 01 | 变亮 |
| 10 | 保持当前状态 |
| 11 | 不合法的指令,舍弃不处理 |
因此,要点亮LED1,就必须传送一下指令:
FF FF 03 00 02 FF FF 00
三、手机蓝牙遥控iTank
传送特定格式的指令,FlagAPI中已经为iTank定制了一个好用的类,即FlagTank,提供了一些便利的方法可以控制iTank:
FlagTank类提供的方法:
| moveF() | 前进 |
| moveB() | 后退 |
| moveL() | 左转 |
| moveR() | 右转 |
| stop() | 停止 |
| move(int direction) | 根据参数指定的方向移动 |
其中,move方法的direction参数:
| 1 | 2 | 3 |
| 左前 | 前进 | 右前 |
| 4 | 5 | 6 |
| 左转 | 停止 | 右转 |
| 7 | 8 | 9 |
| 左后 | 后退 | 右后 |
package tw.com.flag.ch16_itankled; import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView; import tw.com.flag.api.FlagBt;
import tw.com.flag.api.FlagTank;
import tw.com.flag.api.OnFlagMsgListener; public class MainActivity extends AppCompatActivity
implements OnFlagMsgListener { FlagBt bt; //声明蓝牙对象
FlagTank tank; //声明 iTank 对象
TextView txv; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); this.setRequestedOrientation( // 让手机屏幕保持直立模式
ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); txv = (TextView)findViewById(R.id.txv);
bt = new FlagBt(this); // 创建蓝牙对象
tank = new FlagTank(bt); // 创建 iTank 对象
} public void onDestroy() {
bt.stop(); // 确保程序结束前会停止蓝牙连接
super.onDestroy();
} public void connect(View v) {
if(!bt.connect()) // 选取已配对设备进行连接
txv.setText("找不到任何已配对设备");
} public void quit(View v) {
bt.stop();
finish();
} @Override
public void onFlagMsg(Message msg) {
switch(msg.what) {
case FlagBt.CONNECTING: // 尝试与已配对设备连接
txv.setText("正在连接到:" + bt.getDeviceName());
break;
case FlagBt.CONNECTED: // 与已配对设备连接成功
txv.setText("已连接到:" + bt.getDeviceName());
break;
case FlagBt.CONNECT_FAIL: // 连接失败
txv.setText("连接失败!请重连");
break;
case FlagBt.CONNECT_LOST: // 当前连接意外中断
txv.setText("连接中断!请重连");
break;
}
}
public void forward(View v) {
tank.moveF();
} public void backward(View v) {
tank.moveB();
} public void left(View v) {
tank.moveL();
} public void right(View v) {
tank.moveR();
} public void stop(View v) {
tank.stop();
}
}
Android互动设计-蓝牙遥控自走车iTank的更多相关文章
- Android BLE 蓝牙编程(一)
最近在研究这个,等我有时间来写吧! 终于在端午节给自己放个假,现在就来说说关于android蓝牙ble的 最近的学习成果吧!! 需要材料(写个简单教程吧--关于小米手环的哦!嘿嘿) Android 手 ...
- ubuntu16.04连接android手机蓝牙共享网络热点
最近的想要用android手机蓝牙共享wifi网络给ubuntu16.04系统用,查了好多资料,发现网上很少有有用的.自己实践后分享如下. 第一步:手机与电脑配对: 该步骤比较简单,网 ...
- 【转】Android bluetooth介绍(二): android blueZ蓝牙代码架构及其uart 到rfcomm流程
原文网址:http://blog.sina.com.cn/s/blog_602c72c50102uzoj.html 关键词:蓝牙blueZ UART HCI_UART H4 HCI L2CAP ...
- 【转】Android低功耗蓝牙应用开发获取的服务UUID
原文网址:http://blog.csdn.net/zhangjs0322/article/details/39048939 Android低功耗蓝牙应用程序开始时获取到的蓝牙血压计所有服务的UUID ...
- Android ble 蓝牙4.0 总结
本文介绍Android ble 蓝牙4.0,也就是说API level >= 18,且支持蓝牙4.0的手机才可以使用,如果手机系统版本API level < 18,也是用不了蓝牙4.0的哦 ...
- 【源代码】基于Android和蓝牙的单片机温度採集系统
如需转载请标明出处:http://blog.csdn.net/itas109 QQ技术交流群:129518033 STC89C52单片机通过HC-06蓝牙模块与Android手机通信实例- 基于And ...
- 锅巴视频工作室 ----------------android端蓝牙测试demo--app
android端蓝牙测试demo--app 这个是为一个客户做蓝牙项目时的一个测试demo,用来测试蓝牙单片机的收发情况,代码中没有做一些兼容性测试,请理解 锅巴视频工作室,专注于android视频相 ...
- Android ble 蓝牙4.0 总结一
本文介绍Android ble 蓝牙4.0,也就是说API level >= 18,且支持蓝牙4.0的手机才可以使用,如果手机系统版本API level < 18,也是用不了蓝牙4.0的哦 ...
- Android 开发 蓝牙开发
前言 蓝牙开发其实分2个部分,一个是正常蓝牙功能的开发(比如Android蓝牙的互相连接.读取蓝牙列表.文件传输.蓝牙耳机等等).另外一个是BLE蓝牙开发(属于低功耗蓝牙设备,设备大多是血糖仪.蓝牙手 ...
随机推荐
- 最长上升子序列的回溯 ZOJ 2432
题目大意: 找一组最长上升公共子序列,并把任意一组满足的情况输出出来 最长公共上升子序列不清楚可以先看这篇文章 http://www.cnblogs.com/CSU3901130321/p/41826 ...
- [luoguP2031] 脑力达人之分割字串(DP)
传送门 想了个4次方算法,没想到也A了,数据真是水. 其实两个字符串匹配那部分可以用kmp优化 ——代码 #include <cstdio> #include <cstring> ...
- noip模拟赛 蒜头君的坐骑
分析:标准的棋盘dp问题. 如果没有技能,那么就很好做了,相当于传纸条的做法.有了技能的限制,我们就要加上一维表示用了多少次技能,这个时候转移就要用到dfs了,而且不能用填表法,要用刷表法,从当前位置 ...
- Swift 对象创建(PUT Object)过程详解——基于副本策略(一)
swift中创建对象,即PUT object,根据选定的存储策略将对象内容写入至相应的服务器(object server).我们重点关注object controller和object servers ...
- 质因数分解 2012年NOIP全国联赛普及组
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 青铜 Bronze 题目描述 Description 已知正整数 n是两个不同的质数的乘积,试求出较大的那个质数 . 输入描述 Inp ...
- A multiprocessing system including an apparatus for optimizing spin-lock operations
A multiprocessing system having a plurality of processing nodes interconnected by an interconnect ne ...
- 浪潮服务器装机RAID
下面是在装浪潮服务器NF8480M5收集的资料,但是NF8480M5服务器没有网上说的webBIOS界面需要按住DEL进BIOS,将启动都禁止了再重启,进入页面配置. http://blog.51ct ...
- Java设计模式补充:回调模式、事件监听器模式、观察者模式(转)
一.回调函数 为什么首先会讲回调函数呢?因为这个是理解监听器.观察者模式的关键. 什么是回调函数 所谓的回调,用于回调的函数. 回调函数只是一个功能片段,由用户按照回调函数调用约定来实现的一个函数. ...
- 使用 IAsyncResult 调用异步方法
.NET Framework 和第三方类库中的类型可以提供允许应用程序在主应用程序线程之外的线程中执行异步操作的同时继续执行的方法.下面几部分介绍了在调用使用 IAsyncResult 设计模式的异步 ...
- 利用Clojure统计代码文件数量和代码行数
;; 引入clojure的io包 (use '[clojure.java.io]) ;; 遍历目录将所有符合要求的文件做为列表返回 (defn walk [dirpath pattern] (doal ...