|
在本篇文章中,我们将学习如何配置和配对两个HC-05蓝牙模块作为主设备和从设备。在之前的两个教程中,我们已经学会了如何将HC-05蓝牙模块连接到Arduino开发板,并且在Android智能手机和Arduino之间进行通信。在这些教程中,我们采用默认配置使用HC-05蓝牙模块,也就是作为从设备。
配置HC-05蓝牙模块 - AT命令 在本篇文章中,我们需要配置这两个模块。为了实现这一点,我们需要切换到AT命令模式,以下让我们展示如何做到这一点。首先,我们需要将蓝牙模块连接到Arduino开发板,如前面文章中介绍的电路原理图。我们还需要做的是将蓝牙模块的“EN”引脚连接到5V,并且连接到Arduino开发板上的TX和RX引脚。
因此,Arduino的RX引脚通过分压器需要连接到蓝牙模块的RX引脚,以及Arduino的TX引脚连接到蓝牙模块的TX引脚。现在,当按住“EN”引脚上的小按钮时,我们需要为模块供电,这就是我们进入命令模式的方式。如果蓝牙模块指示灯每2秒闪烁一次,表示我们已成功进入AT命令模式。
在此之后,我们需要将空的sketch草图上传到Arduino,但不要忘记在上传时断开RX和TX线。然后我们需要运行串行监视器,然后选择“Both NL和CR”,以及“38400波特率”,这是蓝牙模块的默认波特率。现在我们准备发送命令,其格式如下。
所有命令以“AT”开头,后跟“+”符号,然后是<参数名称>,它们以“?”符号结束,返回参数的当前值或“=”符号,当我们想要时输入该参数的新值。
从设备配置 例如,如果我们只键入“AT”这是一个测试命令,我们应该返回消息“OK”。然后,如果我们键入“AT + UART?”,我们应该返回显示默认的波特率38400。然后,如果我们键入“AT + ROLE?”,我们将返回信息“+ ROLE = 0”,这意味着蓝牙设备处于从属模式。如果我们键入“AT + ADDR?”,我们将返回蓝牙模块的地址,它应该如下所示:98d3:34:905d3f。
现在我们需要记下这个地址,因为在配置主设备时我们需要它。实际上,这是配置从设备时所需要的,以获取其地址,虽然我们可以更改许多不同的参数,如名称、波特率、配对密码等,但我们不会为此示例执行此操作。
主设备配置 好了,现在让我们继续并将其他蓝牙模块配置为主设备。首先,我们将检查波特率,以确保它与从设备的38400相同。然后输入“AT + ROLE = 1”,我们将蓝牙模块设置为主设备。在此之后使用“AT + CMODE = 0”,我们将连接模式设置为“固定地址”,并使用“AT + BIND =”命令,我们将设置我们先前记下的从设备的地址。
请注意,在编写地址时,我们需要使用逗号而不是冒号。另请注意,如果我们在“AT + CMODE”命令中输入“1”而不是“0”,我们可以跳过上一步,这使主设备连接到其传输范围内的任何设备,但配置不太安全。在这里您可以找到完整的命令和参数列表:HC-05 AT命令列表
尽管如此,我们需要将蓝牙模块的基本配置作为主设备和从设备使用,现在如果我们在正常数据模式下重新连接它们并重新为模块供电,主机将在几秒钟内连接到从设备。两个模块将每2秒开始闪烁一次,表示连接成功。
两个HC-05蓝牙模块示例之间的通信 好的,现在我们已经准备好为本篇文章制作实际示例了。以下是电路原理图。我们将在主机上使用电位器来控制从设备的伺服电机。反之亦然,我们将在从设备上使用按钮来控制主机上的LED。
本示例所需的组件如下
● HC-05蓝牙模块 ● Arduino开发板 ● 伺服电机 ● 电位器 ● 3个220欧姆电阻 ● 面包板和跳线
Arduino源代码 代码描述:首先我们需要定义程序所需的引脚和一些变量。在主设备的setup函数部分中,我们将LED引脚设置为输出并立即将其设置为低电平,然后以38400波特率启动串行通信。类似地,在从机的setup函数中,我们将按钮引脚设置为输入,定义伺服电机连接的引脚,并以相同的波特率启动串行通信。
在两者的loop函数中,使用Serial.available()函数,我们将检查串口中是否有可读数据,并使用Serial.read()函数,我们将读取的数据存储到“state”变量。因此,如果主机接收到按钮状态为高电平时从从机发送的字符“1”,或者按下按钮,则LED将亮起。否则,如果字符为'0',则LED将熄灭。
对于伺服电机控制,首先在主机上读取电位器值并将其映射到适合的0到255的伺服范围。该值发送到从设备,用于相应地旋转伺服电机。下面是示例的演示代码。
主设备代码: - /*
- * 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);
- }
复制代码
从设备代码: - #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');
- }
- }
复制代码
以上就是本篇文章的全部内容。如果您有任何问题,请随时在本帖下面提问,我会尽快进行回复。 |