搜档网
当前位置:搜档网 › 成功实现手机蓝牙控制智能小车机器人视频程序源代码Android

成功实现手机蓝牙控制智能小车机器人视频程序源代码Android

成功实现手机蓝牙控制智能小车机器人视频程序源代码Android
成功实现手机蓝牙控制智能小车机器人视频程序源代码Android

上次成功实现了通过笔记本电脑蓝牙来控制智能小车机器人的运动,但是通过电脑控制毕竟不方便,于是乎~本人打算将控制程序移植到手机上。

目前主流的手机操作系统有塞班、安卓(Android)、Windows Mobile,对比了一下,首先,塞班是用C++写的,这么多门语言我唯独看到C++就头大···,放弃了···,Windows Moblie其实和之前发的电脑端程序基本是一样的,也就没什么意思了,最后决定选择目前正火的Android手机作为控制平台。

Android是个开源的应用,使用Java语言对其编程。于是这次的开发我选用Eclipse作为开发工具,用Java语言开发手机端的控制程序,由于之前对Android的蓝牙通信这块涉及不多,一开始感觉有点小茫然,而网上也少有这方面的例程,有少数人做出了类似的东西,但是只传了个视频装X!雪特····

经过几天的研究,最终确定了手机蓝牙通信其实就是Socket编程,再经过一番编写和调试,昨晚终于大功告成!

这是视频:

下面开始介绍Android手机端控制程序的编写:

首先打开Eclipse,当然之前的Java开发环境和安卓开发工具自己得先配置好,这里就不多说了,网上教程一大摞。

然后新建一个Android项目,修改布局文件main.xml,代码如下:

android:id="@+id/widget0"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

xmlns:android="https://www.sodocs.net/doc/8312580217.html,/apk/res/android"

>

android:id="@+id/btnF"

android:layout_width="100px" android:layout_height="60px" android:text="前进" android:layout_x="130px" android:layout_y="62px"

>

android:id="@+id/btnL" android:layout_width="100px" android:layout_height="60px" android:text="左转" android:layout_x="20px" android:layout_y="152px"

>

android:id="@+id/btnR" android:layout_width="100px" android:layout_height="60px" android:text="右转" android:layout_x="240px" android:layout_y="152px"

>

android:id="@+id/btnB" android:layout_width="100px" android:layout_height="60px"

android:text="后退"

android:layout_x="130px"

android:layout_y="242px"

>

android:id="@+id/btnS"

android:layout_width="100px"

android:layout_height="60px"

android:text="停止"

android:layout_x="130px"

android:layout_y="152px"

>

这个布局文件的效果就是如视频中所示的手机操作界面。

然后是权限声明,这一步不能少,否则将无法使用安卓手机的蓝牙功能。

权限声明如下:

打开AndroidManifest.xml文件,修改代码如下:

package="com.ThinBTClient.www"

android:versionCode="1"

android:versionName="1.0">

android:label="@string/app_name">

其中红色、加粗部分就是要添加的权限声明。

然后编写Activity中的执行代码,这些代码的作用就是发送指令,控制小车的运动。代码如下:

package com.ThinBTClient.www;

import android.app.Activity;

import android.os.Bundle;

import java.io.IOException;

import java.io.OutputStream;

import java.util.UUID;

import android.app.Activity;

import android.bluetooth.BluetoothAdapter;

import android.bluetooth.BluetoothDevice;

import android.bluetooth.BluetoothSocket;

import android.content.DialogInterface;

import android.content.DialogInterface.OnClickListener;

import android.os.Bundle;

import https://www.sodocs.net/doc/8312580217.html,monDataKinds.Event;

import android.util.Log;

import android.view.MotionEvent;

import android.view.View;

import android.widget.Button;

import android.widget.Toast;

public class ThinBTClient extends Activity {

private static final String TAG = "THINBTCLIENT";

private static final boolean D = true;

private BluetoothAdapter mBluetoothAdapter = null;

private BluetoothSocket btSocket = null;

private OutputStream outStream = null;

Button mButtonF;

Button mButtonB;

Button mButtonL;

Button mButtonR;

Button mButtonS;

private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");

private static String address = "00:11:03:21:00:43"; // <==要连接的蓝牙设备MAC 地址

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(https://www.sodocs.net/doc/8312580217.html,yout.main);

//前进

mButtonF=(Button)findViewById(R.id.btnF);

mButtonF.setOnTouchListener(new Button.OnTouchListener(){

@Override

public boolean onTouch(View v, MotionEvent event) {

// TODO Auto-generated method stub

String message;

byte[] msgBuffer;

int action = event.getAction();

switch(action)

{

case MotionEvent.ACTION_DOWN:

try {

outStream = btSocket.getOutputStream();

} catch (IOException e) {

Log.e(TAG, "ON RESUME: Output stream creation failed.", e);

}

message = "1";

msgBuffer = message.getBytes();

try {

outStream.write(msgBuffer);

} catch (IOException e) {

Log.e(TAG, "ON RESUME: Exception during write.", e);

}

break;

case MotionEvent.ACTION_UP:

try {

outStream = btSocket.getOutputStream();

} catch (IOException e) {

Log.e(TAG, "ON RESUME: Output stream creation failed.", e);

}

message = "0";

msgBuffer = message.getBytes();

try {

outStream.write(msgBuffer);

} catch (IOException e) {

Log.e(TAG, "ON RESUME: Exception during write.", e);

}

break;

}

return false;

}

});

//后退

mButtonB=(Button)findViewById(R.id.btnB);

mButtonB.setOnTouchListener(new Button.OnTouchListener(){

@Override

public boolean onTouch(View v, MotionEvent event) {

// TODO Auto-generated method stub

String message;

byte[] msgBuffer;

int action = event.getAction();

switch(action)

{

case MotionEvent.ACTION_DOWN:

try {

outStream = btSocket.getOutputStream();

} catch (IOException e) {

Log.e(TAG, "ON RESUME: Output stream creation failed.", e);

}

message = "3";

msgBuffer = message.getBytes();

try {

outStream.write(msgBuffer);

} catch (IOException e) {

Log.e(TAG, "ON RESUME: Exception during write.", e);

}

break;

case MotionEvent.ACTION_UP:

try {

outStream = btSocket.getOutputStream();

} catch (IOException e) {

Log.e(TAG, "ON RESUME: Output stream creation failed.", e);

}

message = "0";

msgBuffer = message.getBytes();

try {

outStream.write(msgBuffer);

} catch (IOException e) {

Log.e(TAG, "ON RESUME: Exception during write.", e);

}

break;

}

return false;

}

});

//左转

mButtonL=(Button)findViewById(R.id.btnL);

mButtonL.setOnTouchListener(new Button.OnTouchListener(){

@Override

public boolean onTouch(View v, MotionEvent event) {

// TODO Auto-generated method stub

String message;

byte[] msgBuffer;

int action = event.getAction();

switch(action)

{

case MotionEvent.ACTION_DOWN:

try {

outStream = btSocket.getOutputStream();

} catch (IOException e) {

Log.e(TAG, "ON RESUME: Output stream creation failed.", e);

}

message = "2";

msgBuffer = message.getBytes();

try {

outStream.write(msgBuffer);

} catch (IOException e) {

Log.e(TAG, "ON RESUME: Exception during write.", e);

}

break;

case MotionEvent.ACTION_UP:

try {

outStream = btSocket.getOutputStream();

} catch (IOException e) {

Log.e(TAG, "ON RESUME: Output stream creation failed.", e);

}

message = "0";

msgBuffer = message.getBytes();

try {

outStream.write(msgBuffer);

} catch (IOException e) {

Log.e(TAG, "ON RESUME: Exception during write.", e);

}

break;

}

return false;

}

});

//右转

mButtonR=(Button)findViewById(R.id.btnR);

mButtonR.setOnTouchListener(new Button.OnTouchListener(){

@Override

public boolean onTouch(View v, MotionEvent event) {

// TODO Auto-generated method stub

String message;

byte[] msgBuffer;

int action = event.getAction();

switch(action)

{

case MotionEvent.ACTION_DOWN:

try {

outStream = btSocket.getOutputStream();

} catch (IOException e) {

Log.e(TAG, "ON RESUME: Output stream creation failed.",

}

message = "4";

msgBuffer = message.getBytes();

try {

outStream.write(msgBuffer);

} catch (IOException e) {

Log.e(TAG, "ON RESUME: Exception during write.", e);

}

break;

case MotionEvent.ACTION_UP:

try {

outStream = btSocket.getOutputStream();

} catch (IOException e) {

Log.e(TAG, "ON RESUME: Output stream creation failed.", e);

}

message = "0";

msgBuffer = message.getBytes();

try {

outStream.write(msgBuffer);

} catch (IOException e) {

Log.e(TAG, "ON RESUME: Exception during write.", e);

}

break;

}

return false;

}

});

//停止

mButtonS=(Button)findViewById(R.id.btnS);

mButtonS.setOnTouchListener(new Button.OnTouchListener(){

@Override

public boolean onTouch(View v, MotionEvent event) {

// TODO Auto-generated method stub

if(event.getAction()==MotionEvent.ACTION_DOWN)

try {

outStream = btSocket.getOutputStream();

} catch (IOException e) {

Log.e(TAG, "ON RESUME: Output stream creation failed.", e);

}

String message = "0";

byte[] msgBuffer = message.getBytes();

try {

outStream.write(msgBuffer);

} catch (IOException e) {

Log.e(TAG, "ON RESUME: Exception during write.", e);

}

return false;

}

});

if (D)

Log.e(TAG, "+++ ON CREATE +++");

mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

if (mBluetoothAdapter == null) {

Toast.makeText(this, "Bluetooth is not available.", Toast.LENGTH_LONG).show();

finish();

return;

}

if (!mBluetoothAdapter.isEnabled()) {

Toast.makeText(this, "Please enable your Bluetooth and re-run this program.", Toast.LENGTH_LONG).show();

finish();

return;

}

if (D)

Log.e(TAG, "+++ DONE IN ON CREATE, GOT LOCAL BT ADAPTER +++");

}

@Override

public void onStart() {

super.onStart();

if (D) Log.e(TAG, "++ ON START ++");

}

@Override

public void onResume() {

super.onResume();

if (D) {

Log.e(TAG, "+ ON RESUME +");

Log.e(TAG, "+ ABOUT TO ATTEMPT CLIENT CONNECT +");

}

BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);

try {

btSocket = device.createRfcommSocketToServiceRecord(MY_UUID);

} catch (IOException e) {

Log.e(TAG, "ON RESUME: Socket creation failed.", e);

}

mBluetoothAdapter.cancelDiscovery();

try {

btSocket.connect();

Log.e(TAG, "ON RESUME: BT connection established, data transfer link open.");

} catch (IOException e) {

try {

btSocket.close();

} catch (IOException e2) {

Log .e(TAG,"ON RESUME: Unable to close socket during connection failure", e2);

}

}

// Create a data stream so we can talk to server.

if (D)

Log.e(TAG, "+ ABOUT TO SAY SOMETHING TO SERVER +");

/* try {

outStream = btSocket.getOutputStream();

} catch (IOException e) {

Log.e(TAG, "ON RESUME: Output stream creation failed.", e);

}

String message = "1";

byte[] msgBuffer = message.getBytes();

try {

outStream.write(msgBuffer);

} catch (IOException e) {

Log.e(TAG, "ON RESUME: Exception during write.", e);

}

*/

}

@Override

public void onPause() {

super.onPause();

if (D)

Log.e(TAG, "- ON PAUSE -");

if (outStream != null) {

try {

outStream.flush();

} catch (IOException e) {

Log.e(TAG, "ON PAUSE: Couldn't flush output stream.", e);

}

}

try {

btSocket.close();

} catch (IOException e2) {

Log.e(TAG, "ON PAUSE: Unable to close socket.", e2);

}

}

@Override

public void onStop() {

super.onStop();

if (D)Log.e(TAG, "-- ON STOP --");

}

@Override

public void onDestroy() {

super.onDestroy();

if (D) Log.e(TAG, "--- ON DESTROY ---");

}

}

可以看到,在这个程序中我直接把小车蓝牙模块的MAC地址给写进去了,其实更合理一点应该让程序运行后搜索周围蓝牙设备,然后选择需要连接的设备,获取它的MAC地址再连接,但是我为了图省事,就直接把我的小车的蓝牙MAC给定死了(反正也没那么多小车让我遥控~~~),这样一打开程序,手机将自动连接智能小车。

好了,手机端的开发到此介绍完毕~希望能为需要者提供一点帮助。

下一步是打算增加红外避障功能、超声波测距功能,机械手臂,如果有机会,以后再安装上火控系统发射钻天猴~,不过估计时间不太允许了······

最后在此感谢侯金龙童鞋提供了他心爱的Android手机~

基于stm32f4的蓝牙控制小车

ARM-STM32校园创新大赛 项目报告 题目:基于stm32f4的蓝牙控制小车 学校:中南民族大学 指导教师: 视频观看地址:https://www.sodocs.net/doc/8312580217.html,/v_show/id_XNjA3NTE4MzU2.html

题目:基于stm32f4的蓝牙控制小车 关键词:STM32F4 LM2940-5.0 L298N FBT06_LPDB 蓝牙串口通信android 摘要 “基于stm32f4的蓝牙控制小车”是一个基于意法半导体与ARM公司生产的STM32F4 DISCOVERY开发板的集电机驱动模块、电源管理模块、stm32f4主控模块、蓝牙串口通信模块、android控制端模块。电机驱动模块使用了两个L298N 芯片来驱动4路电机,使能端连接4路来自主控板的PWM波信号,8个输入端接主控板的8个输出端口;电源管理模块使用了LM2940-5.0芯片进行12V到5V 的转换,12V用于电机模块的供电,5V用于蓝牙模块、传感器等的供电;主控模块采用了MDK编辑程序,然后下载到主控板,实现硬件与软件的交互;蓝牙串口通信模块则是采用了FBT06_LPDB针插蓝牙模块,与主控板进行串口通信,同时与android手机进行通信;android控制端模块是一个集开启蓝牙、搜索蓝牙、控制小车等功能。用户可以通过android控制端进行控制小车的运动,实现一些用户需要的功能和服务。 1.引言 蓝牙的创始人是瑞典爱立信公司,蓝牙技术是一种无限数据与语音通信的开放性全球规范,它以低成本的近距离无线连接为基础,为固定与移动设备通信环境建立一个特别连接。手机之间通过蓝牙实现数据共享成为常理,将手机变为遥控器为人们的生活带来无限方便。遥控小车在工业、国防、科研等领域应用越来越广泛,例如说:消防遥控小车、探测小车等。本文详细阐述了使用蓝牙通信的手机遥控小车前行、倒退、左转、右转和停止等功能的软硬件设计过程。 2.系统方案 该系统分为电机驱动模块、电源管理模块、主控板、蓝牙通信模块、android 控制端等5个模块,如图2.1所示:

蓝牙串口通信遥控小车

蓝牙串口通信遥控小车

————————————————————————————————作者:————————————————————————————————日期:

蓝牙串口通信遥控小车 目录 1系统方案论证及方案选择 2本系统软硬件设计 2.1单元硬件电路设计 2.2软件部分设计 参考文献 附录1原器件清单 附录2电路原理图及印制板图 附录3程序 1. 系统方案论证及方案选择 1.总体设计方案 题目要求设计一个蓝牙串口遥控小车,通过对电机转速的控制,调节速度的大小,改变小车角度,并能实现转弯和旋转。设计主要由主控单片机STC 12C5A60S2驱动直流电机,使车轮工作,带动小车的转动。

2.基本工作原理

3.STC89C52RC有定时器T0 T1 T2,在自动控制领域经常把T1作为串口通信了T0作PWM调速用因此有必要把T2定时器拿出来作定时器作为声音频谱程序。下面介绍T2的用法 STC89C52RC有定时器T2 ?void main(void) ?{ ?/* T2定时器赋预装载值,溢出16次就是1秒。*/ ?RCAP2H=(65536-5000)/256; ?RCAP2L=(65536-5000)%256; ?ET2=1; //允许T2定时器中断 ?EA=1; //打开总中断 ?TR2=1; //启动T2定时器

?while(1); // 死循环,等待T2定时器的溢出中断 ?} ?void Timer2_Server(void) interrupt5 ?{ ?staticuint Timer2_Server_Count; ?// 定义静态变量,用来计数T2定时器的溢出次数(进入本函数的次数) ?TF2=0; ?// T2定时器发生溢出中断时,需要用户自己清除溢出标记,而51的其他定时器是自动清除的 ?Timer2_Server_Count++; ?if(Timer2_Server_Count==16)// T2定时器的预装载值为0x0BDC,溢出16次就是1秒钟。 ?{ ?Timer2_Server_Count=0; ?P1_7=~P1_7; // LED11反转显示。 ?} ?} ?voidTimer2_Server(void)interrupt5

成功实现手机蓝牙控制智能小车机器人!视频+程序源代码(Android)

上次成功实现了通过笔记本电脑蓝牙来控制智能小车机器人的运动,但是通过电脑控制毕竟不方便,于是乎~本人打算将控制程序移植到手机上。 目前主流的手机操作系统有塞班、安卓(Android)、Windows Mobile,对比了一下,首先,塞班是用C++写的,这么多门语言我唯独看到C++就头大···,放弃了···,Windows Moblie 其实和之前发的电脑端程序基本是一样的,也就没什么意思了,最后决定选择目前正火的Android手机作为控制平台。 Android是个开源的应用,使用Java语言对其编程。于是这次的开发我选用Eclipse作为开发工具,用Java语言开发手机端的控制程序,由于之前对Android的蓝牙通信这块涉及不多,一开始感觉有点小茫然,而网上也少有这方面的例程,有少数人做出了类似的东西,但是只传了个视频装X!雪特···· 经过几天的研究,最终确定了手机蓝牙通信其实就是Socket编程,再经过一番编写和调试,昨晚终于大功告成! 这是视频: 下面开始介绍Android手机端控制程序的编写: 首先打开Eclipse,当然之前的Java开发环境和安卓开发工具自己得先配置好,这里就不多说了,网上教程一大摞。 然后新建一个Android项目,修改布局文件main.xml,代码如下: