如何配置和配对两个HC-05蓝牙模块作为主设备和从设备

原文地址: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配置步骤

  1. [AT模式]上电后进入AT指令模式,都用USB转TTL模块连接到电脑的USB接口。

  2. [打开串口调试助手]开启2个串口调试窗口,一个打开蓝牙A的COM15口,一个打开蓝牙B的COM14口。(默认波特率一般为38400,数据位为8,停止位为1)

  3. [恢复A默认设置]串口调试助手A,端口为com15,将蓝牙A恢复默认设置:AT+ORGL\r\n(\r\n即回车、换行,或者在串口调试助手上输入AT+ORGL再按下回车即可)

  4. [设置A配对码]串口调试助手A,配置蓝牙A的配对码:AT+PSWD=1234\r\n,(蓝牙A与蓝牙B的配对码相同,这样才能成功配对)

  5. [设置A主模式]串口调试助手A,将蓝牙A配置为主机模式:AT+ROLE=1\r\n

  6. [恢复B默认设置]串口调试助手B,将蓝牙B恢复默认设置:AT+ORGL\r\n

  7. [设置B配对码]串口调试助手B,配置蓝牙B的配对码与蓝牙A一致:AT+PSWD=1234\r\n

  8. [设置B从模式]串口调试助手B,将蓝牙B配置为从机模式:AT+ROLE=0\r\n

  9. [查询B地址]串口调试助手B,查询蓝牙B的地址:AT+ADDR?\r\n (如:+ADDR:98d3:37:90efca)

  10. [蓝牙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();
}

注意:

  1. 修改程序中的参数即可设置你所需的蓝牙模块名称、密码等
  2. 在下载程序到Arduino时,请务必将蓝牙模块断开,否则蓝牙模块将占用Arduino的串口,导致程序下载不进。
  3. 程序下载后将蓝牙模块连接至Arduino,并且将蓝牙模块设置成AT模式。该步骤完成后,打开串口监视器,将波特率设置为38400,即可看到下面的情况。(串口不断输出参数修改成功的信号)
  4. 接下来你可以用手机蓝牙来发现你已经修改过参数的蓝牙模块了!

测试程序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();
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值