Android互动设计-蓝牙遥控自走车iTank

本文介绍如何通过Android手机蓝牙连接iTank智能移动平台,并实现对其控制板LED灯的点亮及发送移动指令。首先需要配置Android应用的蓝牙权限并导入FlagAPI库,接着创建蓝牙对象和iTank对象以管理蓝牙连接与事件。最后,通过编写特定格式的指令控制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对应的控制位
LED0bit4 + bit0
LED1bit5 + 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参数:

123
左前前进右前
456
左转停止右转
789
左后后退右后
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();
    }
}

 

转载于:https://www.cnblogs.com/sirius-swu/p/6687980.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值