index
原文地址:https://www.yiboard.com/thread-1003-1-1.html
英文地址:www.HowToMechatronics.com
0. HC-05引脚说明
- STATE:蓝牙连接状态指示,连接成功此引脚为高电平,没有连接则为低电平
- RX:接收端
- TX:发送端
- GND:接地端
- +5V:5V电源输入端
- EN:使能端,需要进入AT模式时接3.3V。其实不接也没有关系
在本篇文章中,我们将学习如何配置和配对两个HC-05蓝牙模块作为主设备和从设备。在之前的两个教程中,我们已经学会了如何将HC-05蓝牙模块连接到Arduino开发板,并且在Android智能手机和Arduino之间进行通信。在这些教程中,我们采用默认配置使用HC-05蓝牙模块,也就是作为从设备。
两个蓝牙模块通信
两个蓝牙模块通信,首先是要让两个蓝牙模块进入命令响应工作模式即五下面说说的AT模式
AT配置步骤
-
[AT模式]上电后进入AT指令模式,都用USB转TTL模块连接到电脑的USB接口。
-
[打开串口调试助手]开启2个串口调试窗口,一个打开蓝牙A的COM15口,一个打开蓝牙B的COM14口。(默认波特率一般为38400,数据位为8,停止位为1)
-
[恢复A默认设置]串口调试助手A,端口为com15,将蓝牙A恢复默认设置:
AT+ORGL\r\n
(\r\n即回车、换行,或者在串口调试助手上输入AT+ORGL再按下回车即可) -
[设置A配对码]串口调试助手A,配置蓝牙A的配对码:
AT+PSWD=1234
\r\n,(蓝牙A与蓝牙B的配对码相同,这样才能成功配对) -
[设置A主模式]串口调试助手A,将蓝牙A配置为主机模式:
AT+ROLE=1
\r\n -
[恢复B默认设置]串口调试助手B,将蓝牙B恢复默认设置:
AT+ORGL
\r\n -
[设置B配对码]串口调试助手B,配置蓝牙B的配对码与蓝牙A一致:
AT+PSWD=1234
\r\n -
[设置B从模式]串口调试助手B,将蓝牙B配置为从机模式:
AT+ROLE=0
\r\n -
[查询B地址]串口调试助手B,查询蓝牙B的地址:
AT+ADDR?
\r\n (如:+ADDR:98d3:37:90efca) -
[蓝牙A绑定蓝牙B]串口调试助手A,蓝牙A绑定蓝牙B地址:
AT+BIND=98d3,37,90efca
\r\n(注意把地址的冒号换成逗号)
11、[常规工作模式]2个模块的PIO11引脚都接地,重新上电后进入常规工作模式,自动完成配对。之后,串口调试助手A和串口调试助手B就能互传数据了。(笔者这里是直接将EN脚置空)
注意: 确保2个蓝牙模块的配对码(PSWD)相同,都上电后两个模块会自动相连。
(蓝牙的连接模式默认是:0——指定蓝牙地址连接模式,这样蓝牙A才能自动连接绑定的地址,如果不是模式0,设置为模式0:AT+CMODE=0 [查询指令:AT+CMODE?])
如果连接失败,重新配置一次。连接成功是每秒闪一次,一次闪两下
注意:
- 两个模块波特率及格式相同
- 密码相同
- 一个为主机模式,一个为从机模式
- 连接方式都设置为地址连接
- 绑定对方地址
1. 配置HC-05蓝牙模块 - AT命令
在本篇文章中,我们需要配置这两个模块。为了实现这一点,我们需要切换到AT命令模式,以下让我们展示如何做到这一点。首先,我们需要将蓝牙模块连接到Arduino开发板,如前面文章中介绍的电路原理图。我们还需要做的是将蓝牙模块的“EN”引脚连接到5V,并且连接到Arduino开发板上的TX和RX引脚。
因此,Arduino的RX引脚通过分压器需要连接到蓝牙模块的TX引脚,以及Arduino的TX引脚连接到蓝牙模块的RX引脚。现在,当按住“EN”引脚上的小按钮时,我们需要为模块供电,这就是我们进入命令模式的方式。如果蓝牙模块指示灯每2秒闪烁一次,表示我们已成功进入AT命令模式。
在此之后,我们需要将空的sketch草图上传到Arduino,但不要忘记在上传时断开RX和TX线。然后我们需要运行串行监视器,然后选择“Both NL和CR”,以及“38400波特率”,这是蓝牙模块的默认波特率。现在我们准备发送命令,其格式如下。
所有命令以“AT”开头,后跟“+”符号,然后是<参数名称>,它们以“?”符号结束,返回参数的当前值或“=”符号,当我们想要时输入该参数的新值。
1.1 从设备配置
例如,如果我们只键入AT
这是一个测试命令,我们应该返回消息“OK”。然后,如果我们键入AT + UART
,我们应该返回显示默认的波特率38400。然后,如果我们键入AT + ROLE
,我们将返回信息“+ ROLE = 0”,这意味着蓝牙设备处于从属模式。如果我们键入AT + ADDR
,我们将返回蓝牙模块的地址,它应该如下所示:98d3:34:905d3f
。
现在我们需要记下这个地址,因为在配置主设备时我们需要它。实际上,这是配置从设备时所需要的,以获取其地址,虽然我们可以更改许多不同的参数,如名称、波特率、配对密码等,但我们不会为此示例执行此操作。
1.2 主设备配置
好了,现在让我们继续并将其他蓝牙模块配置为主设备。首先,我们将检查波特率,以确保它与从设备的38400相同。然后输入AT + ROLE = 1
,我们将蓝牙模块设置为主设备。在此之后使用AT + CMODE = 0
,我们将连接模式设置为“固定地址”,并使用AT + BIND =
命令,我们将设置我们先前记下的从设备的地址。
请注意,在编写地址时,我们需要使用逗号而不是冒号。另请注意,如果我们在AT + CMODE
命令中输入“1”而不是“0”,我们可以跳过上一步,这使主设备连接到其传输范围内的任何设备,但配置不太安全。在这里您可以找到完整的命令和参数列表:HC-05 AT命令列表
尽管如此,我们需要将蓝牙模块的基本配置作为主设备和从设备使用,现在如果我们在正常数据模式下重新连接它们并重新为模块供电,主机将在几秒钟内连接到从设备。两个模块将每2秒开始闪烁一次,表示连接成功。
2. 两个HC-05蓝牙模块示例之间的通信
好的,现在我们已经准备好为本篇文章制作实际示例了。以下是电路原理图。我们将在主机上使用电位器来控制从设备的伺服电机。反之亦然,我们将在从设备上使用按钮来控制主机上的LED。
2.1 所需的组件
● HC-05蓝牙模块
● Arduino开发板
● 伺服电机
● 电位器
● 3个220欧姆电阻
● 面包板和跳线
2.2 Arduino源代码
代码描述:首先我们需要定义程序所需的引脚和一些变量。在主设备的setup函数部分中,我们将LED引脚设置为输出并立即将其设置为低电平,然后以38400波特率启动串行通信。类似地,在从机的setup函数中,我们将按钮引脚设置为输入,定义伺服电机连接的引脚,并以相同的波特率启动串行通信。
在两者的loop函数中,使用Serial.available()函数,我们将检查串口中是否有可读数据,并使用Serial.read()函数,我们将读取的数据存储到“state”变量。因此,如果主机接收到按钮状态为高电平时从从机发送的字符“1”,或者按下按钮,则LED将亮起。否则,如果字符为’0’,则LED将熄灭。
对于伺服电机控制,首先在主机上读取电位器值并将其映射到适合的0到255的伺服范围。该值发送到从设备,用于相应地旋转伺服电机。下面是示例的演示代码。
2.2.1 主设备代码:
/*
How to configure and pair two HC-05 Bluetooth Modules
by Dejan Nedelkovski, www.HowToMechatronics.com
== MASTER CODE ==
*/
#define ledPin 9
int state = 0;
int potValue = 0;
void setup() {
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
Serial.begin(38400); // Default communication rate of the Bluetooth module
}
void loop() {
if (Serial.available() > 0) { // Checks whether data is comming from the serial port
state = Serial.read(); // Reads the data from the serial port
}
// Controlling the LED
if (state == '1') {
digitalWrite(ledPin, HIGH); // LED ON
state = 0;
}
else if (state == '0') {
digitalWrite(ledPin, LOW); // LED ON
state = 0;
}
// Reading the potentiometer
potValue = analogRead(A0);
int potValueMapped = map(potValue, 0, 1023, 0, 255);
Serial.write(potValueMapped); // Sends potValue to servo motor
delay(10);
}
2.2.2 从设备代码:
#include <Servo.h>
#define button 8
Servo myServo;
int state = 20;
int buttonState = 0;
void setup() {
pinMode(button, INPUT);
myServo.attach(9);
Serial.begin(38400); // Default communication rate of the Bluetooth module
}
void loop() {
if (Serial.available() > 0) { // Checks whether data is comming from the serial port
state = Serial.read(); // Reads the data from the serial port
}
// Controlling the servo motor
myServo.write(state);
delay(10);
// Reading the button
buttonState = digitalRead(button);
if (buttonState == HIGH) {
Serial.write('1'); // Sends '1' to the master to turn on LED
}
else {
Serial.write('0');
}
}
arduino 修改蓝牙模块参数
void setup() {
// put your setup code here, to run once:
Serial.begin(38400);
}
void sendcmd()
{
Serial.println("AT");
while (Serial.available())
{
char ch;
ch = Serial.read();
Serial.print(ch);
} // Get response: OK
delay(1000); // wait for printing
Serial.println("AT+NAME=14jxcheng");
while (Serial.available())
{
char ch;
ch = Serial.read();
Serial.print(ch);
}
delay(1000);
Serial.println("AT+ADDR?");
while (Serial.available())
{
char ch;
ch = Serial.read();
Serial.print(ch);
}
delay(1000);
Serial.println("AT+PSWD=1125");
while (Serial.available())
{
char ch;
ch = Serial.read();
Serial.print(ch);
}
delay(1000);
}
void loop() {
sendcmd();
}
注意:
- 修改程序中的参数即可设置你所需的蓝牙模块名称、密码等
- 在下载程序到Arduino时,请务必将蓝牙模块断开,否则蓝牙模块将占用Arduino的串口,导致程序下载不进。
- 程序下载后将蓝牙模块连接至Arduino,并且将蓝牙模块设置成AT模式。该步骤完成后,打开串口监视器,将波特率设置为38400,即可看到下面的情况。(串口不断输出参数修改成功的信号)
- 接下来你可以用手机蓝牙来发现你已经修改过参数的蓝牙模块了!
测试程序2
1. master
#include "SoftwareSerial.h"
#define bt_pin 7
// software serial : RX = digital pin 10, TX = digital pin 11
// on the Mega, use other pins instead, since 8 and 9 don't work on the Mega
SoftwareSerial BT(10, 11);
void setup() {
Serial.begin(9600);
while (!Serial);
BT.begin(9600);
pinMode(bt_pin, INPUT);
Serial.println("master system start……");
}
void loop() {
BT.listen();
while (BT.available()) {
char inByte = BT.read();
Serial.write(inByte);
delay(2);
}
if (digitalRead(bt_pin) == LOW) {
Serial.println();
Serial.println("The master Button is pressed");
BT.print("master");
Serial.println();
}
}
2. slave
#define bt_pin 7
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
while(!Serial);
Serial1.begin(9600);
while(!Serial1);
pinMode(bt_pin,INPUT);
Serial.println("slave system start……");
}
void loop() {
while (Serial1.available()){
char inByte=Serial1.read();
Serial.write(inByte);
delay(2);
}
if (digitalRead(bt_pin)==LOW){
Serial.println();
Serial.println("The slave Button is pressed");
Serial1.print("slave");
Serial.println();
}
}