安卓手机蓝牙控制智能小车 android程序设计

news/2024/6/19 4:51:58

安卓手机蓝牙控制智能小车 android程序设计

2016年06月10日 19:21:11 cyang812 阅读数:14773

版权声明:本文为博主原创文章,未经博主允许不得转载。欢迎访问个人主页 https://cyang.tech https://blog.csdn.net/u011303443/article/details/51628099

项目名称: 安卓手机控制智能小车

本文主要介绍手机端程序设计

源码托管在地址:github.com/cyang812/Bluetooth_Car

开发平台 :win10; 
开发软件:Android Studio 2.1

在开发的过程中,软件版本有过几次更新,本文重点讲述更新逻辑及实现过程。

一、Bluetooth_Demo(通过按钮控制)

1、这是最早开发的版本,通过连接蓝牙后,可实现通过按钮(Button)控制小车运动。 
2、主要代码: 
Version 1.0 
监听按钮的点击事件

……
public void onClick(View v){
       switch (v.getId()){
            case R.id.imagebutton1:
                message[0]= (byte) 0x41;//设置要发送的数值
                vibrator();//振动器
                Toast.makeText(this,"前进",Toast.LENGTH_SHORT).show();
                bluesend(message);//发送数值
                Log.d("cy08",""+message[0]);
                break;

            case R.id.imagebutton2:
                message[0]= (byte) 0x44;
                vibrator();
                Toast.makeText(this,"左转",Toast.LENGTH_SHORT).show();
                bluesend(message);
                Log.d("cy08",""+message[0]);
                break;
……
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

Version 1.0 Bug 
点击前进后,便会不停向前,直到接受到下一个控制信号。其他按钮也是如此,这样小车运行就没办法停止。 
这个问题的原因是,从手机程序的角度说,点击一个按钮后,程序判断这个按钮的意图,例如前进,则发送一个预设的数值,比如 ‘A’,当然这需要转换成ASCII码值,并采用十六进制发送,具体会在蓝牙通信原理部分讲述。也就是说,点击一次按钮,仅发送一次数据。从单片机程序讲,蓝牙模块接受完一个数据,通过串行口请求中断,单片机根据接收到的数据控制输出,以实现对小车的控制。所以按一个按钮仅发送一个数据的方式实际上就造成了小车运动不灵活,无法停止。

Version 1.1 
添加停止按钮

            case R.id.imagebutton5:
                message[0]= (byte) 0x40;
                vibrator();
                Toast.makeText(this,"停止",Toast.LENGTH_SHORT).show();
                bluesend(message);
                Log.d("cy08",""+message[0]);
                break;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

这个版本添加停止按钮,通过发送一个不同的数值,蓝牙将该数值传输给单片机后,单片机对电机的输出端变为低电平,之后小车停止运动。 
这个按钮实际上解决了问题,只不过在每次想要停止时还要按下按钮不是一种符合交互逻辑的方式。更好的方式应该是按下按钮小车运动,放开按钮小车停止。这也就是 Version 1.2

Version 1.2 部分代码 
监听按下和放开的事件

class ButtonListener implements View.OnTouchListener {

        public boolean onTouch(View v, MotionEvent event) {
            switch (v.getId()){
                case R.id.imagebutton1:
                    if(event.getAction() == MotionEvent.ACTION_UP){//放开事件
                        message[0]= (byte) 0x40;//设置要发送的数值
                        bluesend(message);//发送数值
                        Log.d("cy08",""+message[0]);
                    }
                    if(event.getAction() == MotionEvent.ACTION_DOWN){//按下事件
                        message[0]= (byte) 0x41;//设置要发送的数值
                        bluesend(message);//发送数值
                        Log.d("cy08",""+message[0]);
                    }
                    break;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

这段代码实现了监听按钮的按下和放开事件。按下和放开发送不同的数值,用以实现不同的控制。按下前进,发送数值,单片机进入中断程序,放开发送新的数值,单片机又一次中断。 
这个版本删除了 V1.1中的停止按钮,因为已经不需要了,放开任意按钮就会发送停止运行的数据。

二、Gsensor(通过手机传感器控制)

1、手机调用传感器判断手机方位,通过连接蓝牙后发送数据,控制小车运动。 
2、主要代码: 
Version 1.0

            if (y < 0 && z < 10) {
                textUp.setText("up");
                message[0]= (byte) 0x41;
                //vibrator();
                Toast.makeText(this,"前进",Toast.LENGTH_SHORT).show();
                bluesend(message);
                Log.d("cy08",""+message[0]);
            } else {
                textUp.setText("wait");
            }

            if (y > 0 && z < 10) {
                textDown.setText("down");
                message[0]= (byte) 0x42;
                //vibrator();
                Toast.makeText(this,"后退",Toast.LENGTH_SHORT).show();
                bluesend(message);
                Log.d("cy08",""+message[0]);
            } else {
                textDown.setText("wait");
            }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

首先调用手机内置的加速度传感器,系统会放回三个整形数字,范围为(-10,10),这三个数字分别表示手机XYZ轴三个方向上的加速度分量。 
这里写图片描述 
我们可以通过判断这三个数值的大小,确定手机的方向,例如,手机平放时这三个数十(0,0,10),而手机前倾时,X分量不变,Y分量小于0,Z分量小于10. 
可通过限制这三个分量的大小,判断操作者的意图,并通过蓝牙传输数据,单片机处理数据控制输出。

三、Bluetooth_Car(通过按钮切换以上两种模式)

1、上面两种方式开始是两个单独的程序,这个程序只是将两种方式融合。 
这里写图片描述


http://www.niftyadmin.cn/n/1039890.html

相关文章

第十七课时: 网络编程

一. 网络编程的基础知识 1、网络基础知识 计算机网络通常是按照规模大小和延伸范围来分类的, 常见的划分为: 局域网(LAN), 城域网(MAN), 广域网(WAN). INTERNET 可以视为世界上最大的广域网. 如果按照网络的拓扑结构来划分, 可以分为星型网络, 总线网络, 环形网络, 树形网络, 星…

【Android - 自定义View】之自定义View浅析

【Android - 自定义View】之自定义View浅析 1、概述 Android自定义View / ViewGroup的步骤大致如下&#xff1a; 1) 自定义属性&#xff1b; 2) 选择和设置构造方法&#xff1b; 3) 重写onMeasure()方法&#xff1b; 4) 重写onDraw()方法&#xff1b; 5) 重写onLayout()方…

智能玩具小风扇制作教程

[智能硬件] 2、三分钟看懂智能硬件原理——智能玩具小风扇制作教程&#xff08;包括手机应用开发&#xff09; 恭喜大家顺利通过测试一&#xff01;在测试一中我们学会了如何利用现有模块HC-05/06进行简单的连线来制作一个蓝牙防丢器&#xff0c;同时学习了安卓蓝牙相关的几个A…

UML1 —— UML 简介,类图

UML 1 — 简介 UML (统一建模语言) 介绍 面向对象软件开发需要经过 OOA (面向对象分析), OOD (面向对象设计) 和 OOP (面向对象编程) 三个阶段, OOA 对目标系统进行分析并建立分析模型, 并将之文档化, OOD 用面向对象的思想将 OOA 的结果进行细化, 得出设计模型. OOA 和 OOD 的…

第十四课时: 输入/输出1

Java 的 IO 支持通过 java.io 包下的类和接口来支持&#xff0c;在 java.io 包下主要包括输入、输出两种 IO 流&#xff0c;每种输入、输出流又可分为字节流和字符流两大类。其中字节流以字节为单位来处理输入、输出操作&#xff0c;而字符流以字符来处理输入、输出操作。除此之…

设计一款好玩的智能硬件(一)

如何为编程爱好者设计一款好玩的智能硬件&#xff08;一&#xff09;——即插即用、积木化、功能重组的智能硬件模块构想 一、我的构想&#xff1a; 世界上本来没有轮子&#xff0c;只是码代码的人多了&#xff0c;也就出现了轮子&#xff01;由于至今为止咱们还没有研制出一种…

设计一款好玩的智能硬件(二)

如何为编程爱好者设计一款好玩的智能硬件&#xff08;二&#xff09;——别人是如何设计硬件积木的&#xff01; 一、我的构想&#xff1a;如何为编程爱好者设计一款好玩的智能硬件&#xff08;一&#xff09;——即插即用、积木化、功能重组的智能硬件模块构想 二、别人家的孩…

设计一款好玩的智能硬件(三)

如何为编程爱好者设计一款好玩的智能硬件&#xff08;三&#xff09;——该选什么样的MCU呢&#xff1f; 一、我的构想&#xff1a;如何为编程爱好者设计一款好玩的智能硬件&#xff08;一&#xff09;——即插即用、积木化、功能重组的智能硬件模块构想 二、别人家的孩子&…