风筝
发表于: 2018-11-20 22:16:51 | 显示全部楼层

在本篇文章中,我们将学习如何配置和配对两个HC-05蓝牙模块作为主设备和从设备。在之前的两个教程中,我们已经学会了如何将HC-05蓝牙模块连接到Arduino开发板,并且在Android智能手机和Arduino之间进行通信。在这些教程中,我们采用默认配置使用HC-05蓝牙模块,也就是作为从设备。


配置HC-05蓝牙模块 - AT命令

在本篇文章中,我们需要配置这两个模块。为了实现这一点,我们需要切换到AT命令模式,以下让我们展示如何做到这一点。首先,我们需要将蓝牙模块连接到Arduino开发板,如前面文章中介绍的电路原理图。我们还需要做的是将蓝牙模块的“EN”引脚连接到5V,并且连接到Arduino开发板上的TX和RX引脚。

How-To-Configure-and-Pair-Two-HC-05-Bluetooth-Module-as-Master-and-Slave-AT-Commands.png


因此,Arduino的RX引脚通过分压器需要连接到蓝牙模块的RX引脚,以及Arduino的TX引脚连接到蓝牙模块的TX引脚。现在,当按住“EN”引脚上的小按钮时,我们需要为模块供电,这就是我们进入命令模式的方式。如果蓝牙模块指示灯每2秒闪烁一次,表示我们已成功进入AT命令模式。


在此之后,我们需要将空的sketch草图上传到Arduino,但不要忘记在上传时断开RX和TX线。然后我们需要运行串行监视器,然后选择“Both NL和CR”,以及“38400波特率”,这是蓝牙模块的默认波特率。现在我们准备发送命令,其格式如下。

AT-Commands-Format.png


所有命令以“AT”开头,后跟“+”符号,然后是<参数名称>,它们以“?”符号结束,返回参数的当前值或“=”符号,当我们想要时输入该参数的新值。


从设备配置

例如,如果我们只键入“AT”这是一个测试命令,我们应该返回消息“OK”。然后,如果我们键入“AT + UART?”,我们应该返回显示默认的波特率38400。然后,如果我们键入“AT + ROLE?”,我们将返回信息“+ ROLE = 0”,这意味着蓝牙设备处于从属模式。如果我们键入“AT + ADDR?”,我们将返回蓝牙模块的地址,它应该如下所示:98d3:34:905d3f。

Slave-Configuration-HC-05-Bluetooth-Module-Arduino.png


现在我们需要记下这个地址,因为在配置主设备时我们需要它。实际上,这是配置从设备时所需要的,以获取其地址,虽然我们可以更改许多不同的参数,如名称、波特率、配对密码等,但我们不会为此示例执行此操作。


主设备配置

好了,现在让我们继续并将其他蓝牙模块配置为主设备。首先,我们将检查波特率,以确保它与从设备的38400相同。然后输入“AT + ROLE = 1”,我们将蓝牙模块设置为主设备。在此之后使用“AT + CMODE = 0”,我们将连接模式设置为“固定地址”,并使用“AT + BIND =”命令,我们将设置我们先前记下的从设备的地址。

Master-Configuration-HC-05-Bluetooth-Module-Arduino.png


请注意,在编写地址时,我们需要使用逗号而不是冒号。另请注意,如果我们在“AT + CMODE”命令中输入“1”而不是“0”,我们可以跳过上一步,这使主设备连接到其传输范围内的任何设备,但配置不太安全。在这里您可以找到完整的命令和参数列表:HC-05 AT命令列表


尽管如此,我们需要将蓝牙模块的基本配置作为主设备和从设备使用,现在如果我们在正常数据模式下重新连接它们并重新为模块供电,主机将在几秒钟内连接到从设备。两个模块将每2秒开始闪烁一次,表示连接成功。


两个HC-05蓝牙模块示例之间的通信

好的,现在我们已经准备好为本篇文章制作实际示例了。以下是电路原理图。我们将在主机上使用电位器来控制从设备的伺服电机。反之亦然,我们将在从设备上使用按钮来控制主机上的LED。

Communcation-Between-Two-HC-05-Bluetooth-Module-Circuit-Schematics.png


本示例所需的组件如下

●     HC-05蓝牙模块

●     Arduino开发板

●     伺服电机

●     电位器

●     3个220欧姆电阻

●     面包板和跳线


Arduino源代码

代码描述:首先我们需要定义程序所需的引脚和一些变量。在主设备的setup函数部分中,我们将LED引脚设置为输出并立即将其设置为低电平,然后以38400波特率启动串行通信。类似地,在从机的setup函数中,我们将按钮引脚设置为输入,定义伺服电机连接的引脚,并以相同的波特率启动串行通信。


在两者的loop函数中,使用Serial.available()函数,我们将检查串口中是否有可读数据,并使用Serial.read()函数,我们将读取的数据存储到“state”变量。因此,如果主机接收到按钮状态为高电平时从从机发送的字符“1”,或者按下按钮,则LED将亮起。否则,如果字符为'0',则LED将熄灭。


对于伺服电机控制,首先在主机上读取电位器值并将其映射到适合的0到255的伺服范围。该值发送到从设备,用于相应地旋转伺服电机。下面是示例的演示代码。


主设备代码:

  1. /*
  2. * How to configure and pair two HC-05 Bluetooth Modules
  3. * by Dejan Nedelkovski, www.HowToMechatronics.com
  4. *
  5. *                 == MASTER CODE ==
  6. */
  7. #define ledPin 9
  8. int state = 0;
  9. int potValue = 0;
  10. void setup() {
  11.   pinMode(ledPin, OUTPUT);
  12.   digitalWrite(ledPin, LOW);
  13.   Serial.begin(38400); // Default communication rate of the Bluetooth module
  14. }
  15. void loop() {
  16. if(Serial.available() > 0){ // Checks whether data is comming from the serial port
  17.     state = Serial.read(); // Reads the data from the serial port
  18. }
  19. // Controlling the LED
  20. if (state == '1') {
  21.   digitalWrite(ledPin, HIGH); // LED ON
  22.   state = 0;
  23. }
  24. else if (state == '0') {
  25.   digitalWrite(ledPin, LOW); // LED ON
  26.   state = 0;
  27. }
  28. // Reading the potentiometer
  29. potValue = analogRead(A0);
  30. int potValueMapped = map(potValue, 0, 1023, 0, 255);
  31. Serial.write(potValueMapped); // Sends potValue to servo motor
  32. delay(10);
  33. }
复制代码

从设备代码:

  1. #include <Servo.h>
  2. #define button 8
  3. Servo myServo;
  4. int state = 20;
  5. int buttonState = 0;
  6. void setup() {
  7.   pinMode(button, INPUT);
  8.   myServo.attach(9);
  9.   Serial.begin(38400); // Default communication rate of the Bluetooth module
  10. }
  11. void loop() {
  12. if(Serial.available() > 0){ // Checks whether data is comming from the serial port
  13.     state = Serial.read(); // Reads the data from the serial port
  14. }
  15. // Controlling the servo motor
  16. myServo.write(state);
  17. delay(10);

  18. // Reading the button
  19. buttonState = digitalRead(button);
  20. if (buttonState == HIGH) {
  21.    Serial.write('1'); // Sends '1' to the master to turn on LED
  22. }
  23. else {
  24.    Serial.write('0');
  25. }  
  26. }
复制代码

以上就是本篇文章的全部内容。如果您有任何问题,请随时在本帖下面提问,我会尽快进行回复。

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 705 | 回复: 1492



手机版|

GMT+8, 2024-11-8 01:28 , Processed in 0.072424 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表