论文部分内容阅读
摘要:随着嵌入式的应用与发展,越来越多的计算机爱好者参与其中。但是硬件开发板作为下位机,ANDROID手机移动端作为上位机,如何实现二者连接一直是越来越多的软硬件开发者感兴趣的话题。该文针对当前非常流行的ARDUINO UNO R3开发板,提供一种新的思路和方法,设计简单易行的方案,用手机自动搜索开发板上蓝牙设备实现软硬件的连接并进行相互通信。
关键词:嵌入式;移动端;蓝牙
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2016)21-0065-02
当前在信息化快速发展的大潮中,计算机不仅在科学研究、军事和工业领域大量应用,而且也越来越多的应用到我们每个人的日常生活当中。随着嵌入式产品的大力发展和进一步推广,嵌入式设备影响到我们生活的方方面面,小到遥控器、PDA等数字化产品,大到数字机床、车载电子设备,都离不开嵌入式产品的应用。
1 硬件设备介绍
1.1 Arduino UNO R3开发板
本次研究平台基于开源Arduino UNO R3开发板。Arduino UNO R3是2012年最新推出的一款易用型开源控制器,硬件上与之前Arduino UNO相比并没有大的变动,最大不同在于USB转串口电路部分,改用的是一块ATMega16U2单片机。除了之前所有的特点外,这块板可以使用ATmega16U2替代了8U2。这允许更快的转换速度和更大内存,Linux或者Mac不需要驱动程序,并且有能力外接键盘、鼠标、摇杆等。
Arduino是一个基于开源的、有简单的I/O接口的物理计算平台。Arduino可以用于独立做项目开发的控制核心,也可以与PC进行直接的 USB连接完成与电脑间的互动。Arduino开源IDE开发环境可以通过相关文档的链接直接免费下载(支持Window,Linux以及Max系统)。
1.2 HC-05蓝牙模块
本次研究使用HC-05主从一体蓝牙串口模块作为Arduino UNO R3开发板和ANDROID手机进行无线通信的设备。
HC-05是一款主从一体可以设置的蓝牙芯片,具有传统蓝牙技术的功能,模块的接口有串口、spi接口和usb接口。HC-05经过测试在室内可达10m以内的通信距离。在实际使用的过程中,当蓝牙设备与蓝牙设备配对连接成功后,我们可以忽视蓝牙内部的通信协议,直接将蓝牙当做串口用。当建立连接,两设备共同使用一通道也就是同一个串口,一个设备发送数据到通道中,另外一个设备便可以接收通道中的数据。
2 ANDUINO开发板C语言代码原理
本次研究是利用开发板串口连接蓝牙接口,当接上到ANDROID上位机发来指令为1时让LED1变换状态(如果原来是亮状态则切换为灭状态,反之为亮状态),发送的指令为2时让LED2变换状态。
首先是LED灯宏定义,让LED1和LED2分别连接开发板第4和第5引脚。
#define LED1 4
#define LED2 5
其次是开发板串口宏定义,使用开发板的串口10作为发送端口,串口11作为接收端口。
#define TX 10
#define RX 11
通过给定的函数库来定义蓝牙模块,NewSoftSerial bluetooth(TX,RX);
使用setup函数对LED1、 LED2和蓝牙模块进行初始化。
pinMode(LED1, OUTPUT); //将LED1设置为输出模式
pinMode(LED2, OUTPUT); //将LED2设置为输出模式
bluetooth.begin(9600); //设置蓝牙接收数据波特率
最后编写loop函数,接收ANDROID上位机的指令,通过判断接收的指令来让改变LED1状态还是LED2状态。
if (bluetooth.available()) {
int LED = bluetooth.read();
switch (LED) {
case 1: //如果接收的指令为1,则让LED1变换状态
led1 = !led1;
digitalWrite(LED1, led1);
break;
case 2: //如果接收的指令为2,则让LED2变换状态
led2 = !led2;
digitalWrite(LED2, led2);
break;
}
3 ANDROID移动端代码原理
ANDROID移动端代码主要分三个部分,一个部分设计ANDROID界面,其次是是寻找到ARDUINO开发板的蓝牙并连接,最后一个部分是向ARDUINO开发板发送指令。
本研究只是上位机和下位机蓝牙连接,所以界面设计比较简单。通过XML布局文件设置两个按钮,分别命名为LED1和LED2,通过点击LED1和LED2发出事件,通过事件函数由手机自带蓝牙向ARDUINO开发板发送指令。同时增加一个列表,用于列出ANDRODI移动端平台搜索到的附近蓝牙设备。
接下来定义类BluetoothUtils,在构造函数中编写搜索附近蓝牙设备。
public BluetoothUtils() { //构造函数
devices = new ArrayList();
adapter = BluetoothAdapter.getDefaultAdapter(); for (BluetoothDevice d : adapter.getBondedDevices())
devices.add(d);//搜索到的附近蓝牙设备
}
其次是使用套接字socket连接搜索蓝牙设备。
public boolean connect(int index) {
BluetoothDevice device = devices.get(index);
socket = device.createInsecureRfcommSocketToServiceRecord
(UUID.fromString(UUID_CODE));
socket.connect();
return true;}
最后是编写发送指令函数,通过socket套接字发送。
public void send(int dato) {
if (socket == null)
return;
try {
socket.getOutputStream().write(dato);
} catch (IOException e) {}}
在Activity中主要是相应的处理函数。
添加界面相关代码比较简单,这里省略。这里主要讲解向开发板发送指令。
public void dispatch(View v) {
if (bluetooth.isConnected() == false) {
Toast.makeText(this, R.string.primero_conectar, Toast.LENGTH_SHORT).show();
return;}
switch (v.getId()) {
case R.id.led_1:
bluetooth.send(1);//点击LED1按钮向开发板发送指令1。
break;
case R.id.led_2:
bluetooth.send(2); //点击LED1按钮向开发板发送指令2。
break;}}
4 连接测试
在ECLIPSE开发平台中将编写的ANDROID程序打包成APK文件,然后拷贝到手机中进行安装。Arduino UNO R3通过面包板与蓝牙模块相连,Android手机打开自带的蓝牙,搜索到HC-5蓝牙模块后进行连接匹配。连接匹配成功后即可实现二者蓝牙通信。本次连接实现只是进行简单测试通信,通过手机安装的ANDROID软件由蓝牙向Arduino UNO R3开发板发送指令,当点击ANDROID软件界面上的LED1按钮时则向开发板发送1,此时与开发板相连的LED1会变换状态;,当点击ANDROID软件界面上的LED2按钮时则向开发板发送2,此时与开发板相连的LED1会变换状态。硬件连接测试见图2。
5 结语
本论文针对当前流行的Arduino UNO R3硬件开发板,介绍该开发板的相关特点,着重论述如何用代码实现上位机连接下位机,并通过蓝牙向下位机发送指令,同时介绍下位机如何接收上位机的指令来控制LED灯的状态。通过相关阐述,并最终实现预想的设计方案。
但是本次研究只能实现上位机向下位机发送指令,不能实现下位机的相关状态信息反馈给上位机并显示出来,希望以后多做这方面的研究。
参考文献:
[1] Simon Monk. Arduino Android互动智作[M].科学出版社,2013.
[2] 博希莫. 学Arduino玩转Android应用[M].人民邮电出版社,2014.
[3] 陈吕洲. Arduino程序设计基础[M].北京航空航天大学出版社,2015.
关键词:嵌入式;移动端;蓝牙
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2016)21-0065-02
当前在信息化快速发展的大潮中,计算机不仅在科学研究、军事和工业领域大量应用,而且也越来越多的应用到我们每个人的日常生活当中。随着嵌入式产品的大力发展和进一步推广,嵌入式设备影响到我们生活的方方面面,小到遥控器、PDA等数字化产品,大到数字机床、车载电子设备,都离不开嵌入式产品的应用。
1 硬件设备介绍
1.1 Arduino UNO R3开发板
本次研究平台基于开源Arduino UNO R3开发板。Arduino UNO R3是2012年最新推出的一款易用型开源控制器,硬件上与之前Arduino UNO相比并没有大的变动,最大不同在于USB转串口电路部分,改用的是一块ATMega16U2单片机。除了之前所有的特点外,这块板可以使用ATmega16U2替代了8U2。这允许更快的转换速度和更大内存,Linux或者Mac不需要驱动程序,并且有能力外接键盘、鼠标、摇杆等。
Arduino是一个基于开源的、有简单的I/O接口的物理计算平台。Arduino可以用于独立做项目开发的控制核心,也可以与PC进行直接的 USB连接完成与电脑间的互动。Arduino开源IDE开发环境可以通过相关文档的链接直接免费下载(支持Window,Linux以及Max系统)。
1.2 HC-05蓝牙模块
本次研究使用HC-05主从一体蓝牙串口模块作为Arduino UNO R3开发板和ANDROID手机进行无线通信的设备。
HC-05是一款主从一体可以设置的蓝牙芯片,具有传统蓝牙技术的功能,模块的接口有串口、spi接口和usb接口。HC-05经过测试在室内可达10m以内的通信距离。在实际使用的过程中,当蓝牙设备与蓝牙设备配对连接成功后,我们可以忽视蓝牙内部的通信协议,直接将蓝牙当做串口用。当建立连接,两设备共同使用一通道也就是同一个串口,一个设备发送数据到通道中,另外一个设备便可以接收通道中的数据。
2 ANDUINO开发板C语言代码原理
本次研究是利用开发板串口连接蓝牙接口,当接上到ANDROID上位机发来指令为1时让LED1变换状态(如果原来是亮状态则切换为灭状态,反之为亮状态),发送的指令为2时让LED2变换状态。
首先是LED灯宏定义,让LED1和LED2分别连接开发板第4和第5引脚。
#define LED1 4
#define LED2 5
其次是开发板串口宏定义,使用开发板的串口10作为发送端口,串口11作为接收端口。
#define TX 10
#define RX 11
通过给定的函数库来定义蓝牙模块,NewSoftSerial bluetooth(TX,RX);
使用setup函数对LED1、 LED2和蓝牙模块进行初始化。
pinMode(LED1, OUTPUT); //将LED1设置为输出模式
pinMode(LED2, OUTPUT); //将LED2设置为输出模式
bluetooth.begin(9600); //设置蓝牙接收数据波特率
最后编写loop函数,接收ANDROID上位机的指令,通过判断接收的指令来让改变LED1状态还是LED2状态。
if (bluetooth.available()) {
int LED = bluetooth.read();
switch (LED) {
case 1: //如果接收的指令为1,则让LED1变换状态
led1 = !led1;
digitalWrite(LED1, led1);
break;
case 2: //如果接收的指令为2,则让LED2变换状态
led2 = !led2;
digitalWrite(LED2, led2);
break;
}
3 ANDROID移动端代码原理
ANDROID移动端代码主要分三个部分,一个部分设计ANDROID界面,其次是是寻找到ARDUINO开发板的蓝牙并连接,最后一个部分是向ARDUINO开发板发送指令。
本研究只是上位机和下位机蓝牙连接,所以界面设计比较简单。通过XML布局文件设置两个按钮,分别命名为LED1和LED2,通过点击LED1和LED2发出事件,通过事件函数由手机自带蓝牙向ARDUINO开发板发送指令。同时增加一个列表,用于列出ANDRODI移动端平台搜索到的附近蓝牙设备。
接下来定义类BluetoothUtils,在构造函数中编写搜索附近蓝牙设备。
public BluetoothUtils() { //构造函数
devices = new ArrayList
adapter = BluetoothAdapter.getDefaultAdapter(); for (BluetoothDevice d : adapter.getBondedDevices())
devices.add(d);//搜索到的附近蓝牙设备
}
其次是使用套接字socket连接搜索蓝牙设备。
public boolean connect(int index) {
BluetoothDevice device = devices.get(index);
socket = device.createInsecureRfcommSocketToServiceRecord
(UUID.fromString(UUID_CODE));
socket.connect();
return true;}
最后是编写发送指令函数,通过socket套接字发送。
public void send(int dato) {
if (socket == null)
return;
try {
socket.getOutputStream().write(dato);
} catch (IOException e) {}}
在Activity中主要是相应的处理函数。
添加界面相关代码比较简单,这里省略。这里主要讲解向开发板发送指令。
public void dispatch(View v) {
if (bluetooth.isConnected() == false) {
Toast.makeText(this, R.string.primero_conectar, Toast.LENGTH_SHORT).show();
return;}
switch (v.getId()) {
case R.id.led_1:
bluetooth.send(1);//点击LED1按钮向开发板发送指令1。
break;
case R.id.led_2:
bluetooth.send(2); //点击LED1按钮向开发板发送指令2。
break;}}
4 连接测试
在ECLIPSE开发平台中将编写的ANDROID程序打包成APK文件,然后拷贝到手机中进行安装。Arduino UNO R3通过面包板与蓝牙模块相连,Android手机打开自带的蓝牙,搜索到HC-5蓝牙模块后进行连接匹配。连接匹配成功后即可实现二者蓝牙通信。本次连接实现只是进行简单测试通信,通过手机安装的ANDROID软件由蓝牙向Arduino UNO R3开发板发送指令,当点击ANDROID软件界面上的LED1按钮时则向开发板发送1,此时与开发板相连的LED1会变换状态;,当点击ANDROID软件界面上的LED2按钮时则向开发板发送2,此时与开发板相连的LED1会变换状态。硬件连接测试见图2。
5 结语
本论文针对当前流行的Arduino UNO R3硬件开发板,介绍该开发板的相关特点,着重论述如何用代码实现上位机连接下位机,并通过蓝牙向下位机发送指令,同时介绍下位机如何接收上位机的指令来控制LED灯的状态。通过相关阐述,并最终实现预想的设计方案。
但是本次研究只能实现上位机向下位机发送指令,不能实现下位机的相关状态信息反馈给上位机并显示出来,希望以后多做这方面的研究。
参考文献:
[1] Simon Monk. Arduino Android互动智作[M].科学出版社,2013.
[2] 博希莫. 学Arduino玩转Android应用[M].人民邮电出版社,2014.
[3] 陈吕洲. Arduino程序设计基础[M].北京航空航天大学出版社,2015.