2-17、18 HC06蓝牙模块(meArm机械臂)

2-17、18 HC06蓝牙模块(meArm机械臂)

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串行通信,软件模拟串口

软件模拟串口在稳定性准确性上等是不如硬件串口的(当数据出现丢失等情况时可以将蓝牙软件模拟串口更换为硬件串口)

相关推荐
lantiandianzi7 小时前
基于单片机的多功能跑步机控制系统
单片机·嵌入式硬件
哔哥哔特商务网7 小时前
高集成的MCU方案已成电机应用趋势?
单片机·嵌入式硬件
跟着杰哥学嵌入式7 小时前
单片机进阶硬件部分_day2_项目实践
单片机·嵌入式硬件
电子科技圈7 小时前
IAR与鸿轩科技共同推进汽车未来
科技·嵌入式硬件·mcu·汽车
东芝、铠侠总代136100683938 小时前
浅谈TLP184小型平面光耦
单片机·嵌入式硬件·物联网·平面
lantiandianzi8 小时前
基于单片机中医药柜管理系统的设计
单片机·嵌入式硬件
嵌入式知识大讲堂9 小时前
HDMI数据传输三种使用场景
单片机
黑客呀9 小时前
[系统安全]Rootkit基础
stm32·单片机·系统安全
小A1599 小时前
STM32完全学习——使用SysTick精确延时(阻塞式)
stm32·嵌入式硬件·学习
楚灵魈10 小时前
[STM32]从零开始的STM32 HAL库环境搭建
stm32·单片机·嵌入式硬件