2-17、18 HC06蓝牙模块(meArm机械臂)
- [2-17 HC06蓝牙模块-1](#2-17 HC06蓝牙模块-1)
- [2-18 HCO6蓝牙模块-2](#2-18 HCO6蓝牙模块-2)
2-17 HC06蓝牙模块-1
之前的视频,如何通过电脑和一个数据线与arduino进行串口通信
比较受限
使用无线通信的一种方法,蓝牙通信(手机和平板等移动平台与arduino通信)
HC06蓝牙模块(初学,简单,易用,应用广泛,价格低廉;缺点,功耗不是最优化,以后会有更先进的蓝牙模块)
HC-06无线蓝牙串口透传模块
串口两条数据线(TX,RX),注意接地线要连在一起
看左侧蓝牙模块的引脚,对应有数字TX,RX
注意3.3V,即HC06的高电平是3.3V,而arduino的高电平是5V
注意两个设备的串口通信高电压有区别,后续会深入讲解
GND接地,VCC用来接电源
Arduino开发板上的TX和RX分别对应着0,1两个数字输入输出引脚
HC06蓝牙模块只是数据搬运工,通过蓝牙传输的数据是一样的
HCO6蓝牙模块引脚说明
HCO6的高电压3.3v , arduino的高电压是5V
HCO6发送数据给arduino时,对应低电压(3.3v)到高电压(5V)的过程,没有任何问题
但是当从arduino的TX引脚发送数据给蓝牙的RX引脚时(5V到3.3v),短时间使用没事,但当长时间使用时,会把HC06模块烧坏了
所以要在HC06的RX引脚上面接一个分压电路,分压电路作用将arduino发送的比较高的5v电压降低到HC06的高电压3.3v
RX引脚分压电路
如下
HC06连接与arduino的电路
HC06的TX引脚直接使用导线与arduino的RX引脚相连
HC06的RX引脚使用导线通过分压电路与arduino的TX引脚相连
Arduino和蓝牙模块的接地线是连接在一起的
HC06供电的引脚3.3v~6v的,可以将其连到arduino开发板的+5V引脚上
注意:使用arduino开发板的引脚0和引脚1两个引脚一旦和外部设备如蓝牙模块连接,
那么再想使用电脑的arduinoIDE通过数据线上传程序给开发板,上传过程必定失败。要想上传程序需将arduino的RX和TX 上的导线移除掉,然后才能给开发板再上传程序
原因是电脑上传程序给arduino使用的就是引脚0和引脚1(TX,RX),一旦未接设备,就无法上传程序段奥arduino,这过程只影响程序上传不会影响到arduino开发板的运行的
HC06蓝牙模块应用
当上传程序成功后,可以打开电脑或者手机蓝牙模块的常用的蓝牙模块应用程序
这里使用Android的蓝牙应用模块App演示
可以在网站免费下载此应用程序(可以使用其他的蓝牙应用程序)
本节课重点不是手机程序应用,而是学习和使用arduino开发板
手机应用控制HC06蓝牙模块的方法都是大同小异的,若会用这个arduino Bluetooth controller
那么使用别的应用也可以使用了
程序
程序,作用通过蓝牙模块,使用手机等移动终端的蓝牙功能用来打开或者关闭连接在arduino上11引脚的led灯的
可通过网站获取
测试程序1:使用Arduino通过无线蓝牙控制Arduino引脚11的LED点亮/熄灭
测试程序1
Arduino
/*
HC-06-Serial-LED-demo
by 太极创客(2017-07-08)
www.taici-maker.com
此程序旨在演示如何利用HC-06蓝牙模块通过手机或平板电脑的
蓝牙功能来打开和关闭arduino开发板引脚11上连接的LED。
如需获得更多关于本程序的使用说明,请参见太极创客制作的《零基础入门学用Arduino》教程。
---- 电路连接 ----
HC-06 Arduino Uno R3 引脚
TX 0 (RX)
RX 1 (TX)
VCC +5v
GND GND
注意:
1. 须使用分压电路,确保HC-06 RX信号电压为3.3伏特。
2. 须先将此程序上传至ARDUINO后,再将HC-06连接在ARDUINO开发板的串口引脚上。
否则程序将无法正常上传。
*/
char serialData; //变量声明
void setup() {
Serial.begin(9600); //开启串口通信
pinMode(11, OUTPUT); //11引脚连接演示用LED
}
void loop(){
if( Serial.available()>0 ){ //判断串口是否有数据传输
serialData = Serial.read(); //读取数据字符
if (serialData == '1' ) { //接收到点亮LED指令
Serial.print("Got command: "); Serial.println(serialData);
Serial.println("LED-ON");
digitalWrite(11, HIGH); //点亮LED指令
} else { //接收到熄灭LED指令
Serial.print("Got command: ");
Serial.println(serialData);
Serial.println("LED-OFF");
digitalWrite(11, LOW); //熄灭LED指令
}
}
}
此时可以编译程序上传给arduino了
注意上传程序时arduino的引脚0和1一定不能连接任何的外部设备,等到程序上传结束后再将HC06模块连到arduino开发板上
测试程序2:使用Arduino通过无线蓝牙控制调节Arduino引脚11的LED明暗
测试程序2
Arduino
/*
HC-06-Serial-LED-Fade
by 太极创客(2017-07-08)
www.taici-maker.com
此程序旨在演示如何利用HC-06蓝牙模块通过手机或平板电脑的
蓝牙功能来设置arduino开发板上11引脚上连接LED的亮度。
如需获得更多关于本程序的使用说明,请参见太极创客制作的《零基础入门学用Arduino》教程。
---- 电路连接 ----
HC-06 Arduino Uno R3 引脚
TX 0 (RX)
RX 1 (TX)
VCC +5v
GND GND
LED Arduino Uno R3 引脚
+ 11 (RX)
- GND (通过220欧姆限流电阻)
注意:
1. 须使用分压电路,确保HC-06 RX信号电压为3.3伏特。
2. 须先将此程序上传至ARDUINO后,再将HC-06连接在ARDUINO开发板的串口引脚上。
否则程序将无法正常上传。
*/
int brightness; //LED亮度变量
int serialData; //串口数据变量
void setup() {
Serial.begin(9600);
pinMode(LED_BUILTIN, OUTPUT);
pinMode(11, OUTPUT);
}
void loop(){
if( Serial.available()>0 ){ //如果串口缓存有数据
serialData = Serial.parseInt(); //将串口缓存数值存储到serialData变量
Serial.print("serialData = "); Serial.println(serialData);
if (serialData >=0 && serialData <= 255) {
if (serialData >= brightness){ //逐渐调节LED亮度
for (brightness; brightness <= serialData; brightness++){
analogWrite(11, brightness);
Serial.print("brightness = "); Serial.println(brightness);
delay(5);
}
} else {
for (brightness; brightness >= serialData; brightness--){
analogWrite(11, brightness);
Serial.print("brightness = "); Serial.println(brightness);
delay(5);
}
}
}
}
}
演示
当电路连接蓝牙模块后,实际使用或者程序编写时自己无需加入任何其他与蓝牙相关的程序,程序还是按照之前可以与电脑进行串口通信的程序就行
第一步上传程序到开发板(数字引脚0和1处电路先不进行搭建)
当电路连接好后,HC06蓝牙模块一直闪烁,说明未和任何设备连接
下面进行手机与蓝牙的首次连接设置
手机可以看到HC06的名称,点击会进行配对
配对时可能会出现pin,密码为1234默认
确定后连接
打开手机蓝牙应用arduino controler
进入显示HC06,点击连接,选择switch mode模式
手机发送数据给蓝牙模块
点击设置,设置开关的符号"1""0"的数据发送
点击按钮,灯就亮了
选择终端模式led点亮
输入1,返回LED-ON这样的文字,都是arduino通过HC06蓝牙模块传到手机上来的
发送0如下
手机先与蓝牙配对连接,连接好以后,再使用手机中的应用程序通过点击开关符号
来发送相应的字符指令给HC06蓝牙模块,蓝牙模块将此指令原封不动的传给arduino,
Arduino根据指令进行内部程序的操作
演示2
使用程序2进行led灯的亮度控制,操作还是之前的操作,这里简略,可以看教程
选择的模式dimmer mode
终端模式
输入255 ,亮度会逐渐从0达到255
若使用串行通信的方式,使用手机与HC06以及arduino通信
问题
1,每次都要上传程序前,将arduino的tx及rx引脚(0,1)外接设备去除,麻烦
2,加入有多个设备,若同时和arduino控制器进行串行通信,只有一个串口只能与一台设备通信,其他设备怎么办,有解决方案,下节课介绍
注意:此处使用iphone与连接在引脚0,1的HC06蓝牙模块配对失败(可能需要Android手机配对,也可能需要学习下一节的软件模拟输入的方式)
已验证:使用iPhone与HC06配对失败,使用Android配对成功,并且下载上述软件可以进行通信
2-18 HCO6蓝牙模块-2
问题
上节课如何使用串口通信的方式让arduino与HC06蓝牙模块进行数据通信
这样的方法存在一些问题
1,arduino与HC06蓝牙模块通信,每次上传程序时都要将接在0和1的导线拔掉
2,多个设备同时和arduino控制器进行串口通信,只有一个串口,只能和一台设备进行串口通信,其它设备怎么办呢,此时可以使用开发板上其它的数字输入输出引脚,使用软件模拟的方式让这些引脚实现串行通讯功能
电路
在HC06模块上的tx、rx连接的不再是arduino的0、1引脚,而是普通的数字输入输出引脚2、3~(tx与2连接,rx与3~连接)
示例代码
接下来看程序代码如何让arduino使用软件模拟的方式用2、3引脚与HC06进行串行通讯的
下方程序有两部分要分清
一是硬件串口Serial,直接与IDE串口监视器相互通信
二是软件模拟串口BTserial,与蓝牙模块相连并相互通信
/*
HC-06蓝牙模块设置以及功能测试
by 太极创客(2017-07-08)
www.taici-maker.com
此程序旨在演示如何通过HC-06模块使用蓝牙通讯向Arduino数字IO引脚
收发串口数据,以及如何设置HC-06蓝牙模块。
如需获得更多关于本程序的使用说明,请参见太极创客制作的《零基础入门学用Arduino》教程。
---- 电路连接 ----
HC-06 Arduino Uno R3 引脚
TX 2
RX 3
VCC +5v
GND GND
注意:须使用分压电路,确保HC-06 RX信号电压为3.3伏特。
//
---- AT指令 ----
// 对蓝牙模块设置命令时要小心,一旦更改名称、密码时,若忘记再找回就只能蒙了
指令 答复 说明
AT OK 通讯测试
AT+VERSION OKlinvorV1.8 固件版本
AT+NAMEmyBTmodule OKsetname 设置设备名 "myBTmodule"
AT+PIN6789 OKsetPIN 设置设备 PIN 6789
AT+BAUD1 OK1200 设置波特率 1200
AT+BAUD2 OK2400 设置波特率 2400
AT+BAUD3 OK4800 设置波特率 4800
AT+BAUD4 OK9600 设置波特率 9600
AT+BAUD5 OK19200 设置波特率 19200
AT+BAUD6 OK38400 设置波特率 38400
AT+BAUD7 OK57600 设置波特率 57600
AT+BAUD8 OK115200 设置波特率 115200
AT+BAUD9 OK230400 设置波特率 230400
AT+BAUDA OK460800 设置波特率 460800
AT+BAUDB OK921600 设置波特率 921600
AT+BAUDC OK1382400 设置波特率 1382400
*/
#include <SoftwareSerial.h> // 引入库SoftwareSerial(功能可以使用普通的数字输入输出引脚接收发送串行数据)
SoftwareSerial BTserial(2, 3); // 建立SoftwareSerial对象,RX引脚2, TX引脚3(将普通引脚2、3分别功能设置为rx、tx用于接收发送串口数据)
void setup() {
Serial.begin(9600);// 启动arduino硬件的串口
BTserial.begin(9600); // HC-06 默认波特率 9600,启动软件模拟串口
Serial.print("HC-06 DEMO/TEST ");//通过arduino硬件串口输出英文(可以通过arduino ide串口监视器检测到)
BTserial.print("AT"); //可在此处输入设置HC-06蓝牙模块的AT指令。(当蓝牙模块没有和其它设备相连接时,收到此指令就会处理,AT指令在上方有讲解)
//此AT指令须在HC-06未连接蓝牙状态输入。
//软件模拟串口输出英文,若蓝牙模块与其它设备已连接,此字符会直接透传给手机。若蓝牙设备接收到此字符时没有和其他设备连接,自己会处理此字符看此字符和其是否存在关系,若存在则进行相关操作,没有关系就忽略
pinMode(11, OUTPUT);//11引脚输出模式,有测试用的led
}
void loop(){
// 通过串口监视器显示HC-06发送的数据
if( BTserial.available()>0 ){ //如果软件串口有HC-06发来的数据
char BTserialData = BTserial.read(); //将软件串口中的数据赋值给变量BTserialData
Serial.print( BTserialData ); //通过硬件串口监视器显示HC-06发来的数据
if (BTserialData == '1') { //判断HC-06发来的数据是否是字符1
digitalWrite(11, HIGH); //如果是字符1,则点亮LED
} else if (BTserialData == '0') { //如果不是字符0
digitalWrite(11, LOW); //则熄灭LED
}
}
// 将用户通过串口监视器输入的数据发送给HC-06
if (Serial.available()>0) { //如果硬件串口缓存中有等待传输的数据
char serialData = Serial.read(); //将硬件串口中的数据赋值给变量serialData
BTserial.print( serialData ); //将硬件串口中的数据发送给HC-06
}
}
效果演示
将代码编译上传到arduino后
直接打开串口监视器
OK字符来自 蓝牙模块发送回来的(说明蓝牙模块工作正常)
输入AT+VERSION发送
返回蓝牙固件版本号如下
注意此时蓝牙模块没有和任何其它设备连接,所以其能回复相关如版本号等信息
当蓝牙与其它设备如手机连接后,发送的信息如AT+VERSION会直接透传给手机,而不会被蓝牙模块处理返回相应的版本号
打开手机应用arduino blutooth contraller
连接HC06,选择终端模式temnal
手机输入1发送,led被点亮,串口监视器也显示1
手机输入0,led熄灭
手机输入hello,串口监视器也输出了
在串口监视器输入hello from arduino发送,在手机也显示收到了
使用arduino的普通的输入输出数字引脚就能实现串行通信的功能了,那么此功能不会影响到上传程序,还能让更多的设备同时的和arduino串行通信,软件模拟串口
软件模拟串口在稳定性准确性上等是不如硬件串口的(当数据出现丢失等情况时可以将蓝牙软件模拟串口更换为硬件串口)