蓝牙与arduino

2018-04-22 12:17:11 wanzew 阅读数 15780

Table of Contents

1. 介绍

2. 连接蓝牙与Arduino

3. 安装手机软件

4. 编写程序


本篇主要内容:通过手机蓝牙发送数据给Arduino,其实本篇并不设计到ROS的内容,Arduino读取传感器的值然后以ROS消息方式广播出去的教程将在下一节中进行介绍,可参考:ROS学习之Arduino篇——读取并发布各种传感器数据

1. 介绍

蓝牙HC-05: 蓝牙设备分为主从两种模式,作为主设备时,它查找和连接其它设备;作为从设备时只能被只它设备连接;通讯模式分透明传输和AT命令模式。HC05主要有两种方法进行AT设置,一种是用USB转TTL,另一种就是借助Arduino主板进行设置,本篇使用第二种方式。

2. 连接蓝牙与Arduino

蓝牙与Arduino的连接方式,注意,别  接  错  了...

 

 

3. 安装手机软件

手机上使用的软件我用的是这一款:感谢分享,在手机上安装以后打开蓝牙,连上HC-05,再打开手机软件,找到HC-05连上。

选择第一个控制模式:

界面如下,点击右上角的设置按钮,把前后左右四个按钮的值分别设置为:f,b,l,r

 

4. 编写程序

注意烧写时要把两个串口线拔掉,否则烧写不进去,为什么呢?因为烧写程序用的就是这两个串口,Arduino UNO板子只有这一组串口(TX,RX),连上蓝牙就没办法下载程序了。

char serialData;  
void setup() {  
  Serial.begin(9600);  
}  

void loop(){  
  if( Serial.available() > 0 ){   
      
    serialData =  Serial.read();
      
    if ('f' == serialData) {    
      Serial.print(serialData);   
      Serial.println(": forWard Command.");
    }   
    else if('b' == serialData) {  
      Serial.print(serialData);   
      Serial.println(": backWard Command.");
    }   
    else if( 'l' == serialData){  
      Serial.print(serialData);  
      Serial.println(": leftTurn Command.");
    }  
    else if('r' == serialData){  
      Serial.print(serialData);  
      Serial.println(": rightTurn Command.");
    }  
    else{  
      //do nothing.  
    }  
  }  
}  
2017-09-18 14:27:40 weixin_37272286 阅读数 8083

通过这篇文章,你可以了解到以下内容:

  • 什么是蓝牙BLE 4.0
  • 如何设置蓝牙BLE 的 AT 指令
  • Arduino 连接蓝牙 BLE 与 iOS 设备互联实践

了解 BLE 4.0

BLE 全称是 Bluetooth Low Energy 低功耗蓝牙的缩写,是蓝牙 4.0 的一个分支。

BLE 支持 iPhone4s 以上的 iOS 设备,并且无需做 MFI 认证,因此对于个人开发者及一些中小型开发团队快速开发硬件原型以及智能家居等产品设备有着极大的便利。

作为 Arduino 开发者,我们常见的蓝牙 BLE 模块主要是采用美国TI公司CC2541芯片的模块,这种模块比较容易购买,现在能买到的蓝牙BLE模块主要有两种,一种是已经焊接好,带有针脚的模块,另外一种是没有焊接针脚的,用户可以根据自己项目及需求的实际情况进行选择。

设置 AT指令

我们可以通过USB-TTL 模块蓝牙BLE与电脑连接,使用蓝牙串口助手软件对蓝牙BLE模块进行调试。

USB-TTLBLE4.0 的连接方法如下:

BLE4.0 USB-TTL
VCC 3.3V
GND GND
TXD RXD
RXD TXD

注意,在通电之前,请确保连接正确,以防因连接错误而损坏模块设备!
接线完成后,把 USB-TTL 连接电脑,打开串口调试软件(可以根据自己的使用习惯选择串口调试软件),选择好正确的端口号,打开串口即可通讯。

ble_com.jpg

BLE4.0的AT指令大致与HC05蓝牙模块类似,详细AT指令请参考购买时商家提供的手册。

这里有一点需要注意,BLE4.0模块进入AT指令设置模式,不需要向HC05一样需要按着模块电路板上的按钮,但是需要确保该模块没有被连接。

Arduino 连接蓝牙 BLE 与 iOS 设备互联实践

接下来,我们将尝试使用Arduino和BLE4.0模块与 iOS 设备进行互联通信。进行这个实验,我们需要预先准备好以下内容:

名称 数量
iOS 设备 1
Arduino 1
BLE 4.0模块 1
FM连接线 若干
LightBlue App 1

准备好后,下面开始连接 Arduino 和 BLE4.0 模块:

Arduino BLE4.0
5V VCC
GND GND
TX RXD
RX TXD

连接完成后,我们接着为 Arduino 编写程序。程序非常简单,程序的主要功能为接收蓝牙数据,如果截获数据为A,那么久返回 BLE get char A.。程序代码如下:

void setup()
{
    Serial.begin(9600);
}

void loop()
{
    while(Serial.available()){
        char c = Serial.read();
        if (c == 'A') {
            Serial.println("BLE get char A.");
        }
    }
}

编译上传程序到 Arduino 上之后,我们打开 LightBlue,测试是否能正常使用。

lightblue_1step.PNG

打开 LightBlue App,打开蓝牙,我们可以看到周围的蓝牙设备,我们这里的 BLE4.0 设备名称是 BT05,接下来,我们点击 BT05 ,可以看到左上方显示 Connected 字样,代表连接成功。接下来,我们下拉到最下面,点击 TX&RX 进入 TX&RX 子页,可以看到以下的内容:

light_blue_2step.PNG

注意页面的最右上方,这里现在是显示 Hex,我们需要的是使用 UTF-8 编码方式进行通讯,因此,我们点击 Hex,进入设置页面,选择 UTF-8 String 设置编码方式为 UTF-8 编码。

lightblue_step3.PNG

设置完成后,我们就可以通过 WRITTEN VALUES 来输入发送数据,然后可以在 READ/NOTIFIED VALUES 里面看到 Arduino 返回的数据。

lightblue_final.PNG

我们可以看到,LightBlue 已经收到 Arduino 返回的 BLE get char A. 字符串,到这里为止,实验成功。

小结

这篇文章简单介绍了BLE的特点,以及如何视同 USB-TTL 设置蓝牙模块的AT指令,最后通过一个Arduino蓝牙与iOS设备连接的小实验来了解手机和Arduino蓝牙是如何通信的。如果你需要了解蓝牙HC05模块的使用方法,可以参考另外一篇文章Arduino使用HC05蓝牙模块与手机连接

参考资料

蓝牙4.0BLE模块兼容Arduino

2016-11-28 20:01:42 Janet_1994 阅读数 7977

1:对于Arduino,print()和println()函数都是用ASCII字符的方式传送数据。
无论是int、float还是string,都自动转换成ASCII码传送。
其中println()函数在传送的数据后面加了回车和换行符(”\r”和”\n”)。换行符正好可以作为结束符来让手机端识别。
2:蓝牙串口是异步传输方式,每次Serial.read()只读一个字节,在一个loop()循环中可能收不全一条数据信息,必须要有一个全局变量来收集接收到的字符。如果要通讯可靠,使用结束符来确定收到了一条完整的信息,是非常必要的。手机端也是一样。
3:用的Serial.parseInt()函数,作用是在收到的字符流中,找到数字字符,并累积在一起,直到收到一个非数字字符时,将前面收到的数字字符转换成一个整数。如果要传送多个数值,中间用逗号等分隔符隔开即可。比如三个数值,”12,325,993“,后面加一个自定义的结束符,作为字符串发给Arduino。
(例程中用字符”X”作为结束符。)这样接收数据完整而可靠。接收float可以用Serial.parseFloat()函数,用法一样。
4:/* 本例程演示从手机蓝牙串口接收指令,点亮或熄灭11脚的LED,或者调整亮度。
* 接收指令格式:“101X”点亮,“102X”熄灭,”000X”调整亮度。(000为0-100的整数,表示亮度值,X是结束符。)
* 串口是异步接收的,用parseInt()查找第一个有效整数,检测到结束符后开始处理。
* 接收数据显示在1602LCD屏上。
* 点亮或熄灭LED后,将收到数据回传给手机。用pringln()函数,数据后面加了”\r”和”\n”两个字符,可以用作结束符。
* 串口传送的是ASCII字符,数据格式可以自动转换。
*/

/* 本例程演示从手机蓝牙串口接收指令,点亮或熄灭11脚的LED,或者调整亮度。
 * 接收指令格式:“101X”点亮,“102X"熄灭,”000X"调整亮度。(000为0-100的整数,表示亮度值,X是结束符。)
 * 串口是异步接收的,用parseInt()查找第一个有效整数,检测到结束符后开始处理。
 * 接收数据显示在1602LCD屏上。
 * 点亮或熄灭LED后,将收到数据回传给手机。用pringln()函数,数据后面加了"\r"和"\n"两个字符,可以用作结束符。
 * 串口传送的是ASCII字符,数据格式可以自动转换。
 */

#include <Wire.h>                  // 包含LCD库。
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);  // 初始化LCD对象,地址为0x27,每行16个字符,共两行。
int p;                             // 定义整数型全局变量,保存接收的数据。

void setup() {
  lcd.init();                      // 初始化LCD。 
  lcd.backlight();                 // 打开LCD背光。
  Serial.begin(9600);              // 打开串口(蓝牙)
  pinMode(11,OUTPUT);              // 定义11脚为输出。(数字或PWM)
}

void loop() {
  while (Serial.available() > 0) {   // 串口收到字符数大于零。
    p = Serial.parseInt();           // 在串口数据流中查找一个有效整数。
    if (Serial.read() == 'X') {      // 收到结束符后开始处理数据。
      lcd.clear();                   // LCD清屏。
      lcd.print(p);                  // LCD显示收到的数据(整数)。
      switch (p) {                   // 判断数据内容。
      case 101:
        digitalWrite(11,HIGH);       // 点亮LED。
        Serial.println(p);           // 回传数据。
        break;
      case 102:
        digitalWrite(11,LOW);        // 熄灭LED。
        Serial.println(p);           // 回传数据。
        break;
      default:
        p = map(p,0,100,0,255);      // 转换数据范围到PWM输出值。
        analogWrite(11,p);           // 调整LED亮度。(PWM)
      }
    }
  }
}
2017-11-12 20:02:01 gc_2299 阅读数 16525
在淘宝店中买的HC-05主从机一体蓝牙模块,该模块的正面和反面截图如下:
Arduino使用蓝牙通信模块 - gc_2299 - gc_2299的博客
 
Arduino使用蓝牙通信模块 - gc_2299 - gc_2299的博客
测试的时候只使用了RX、TX、GND、5V这四个引脚,测试的连接示意图如下,需要注意的是蓝牙模块的RX要接Arduino的TX,蓝牙模块的TX要接Arduino的RX:
Arduino使用蓝牙通信模块 - gc_2299 - gc_2299的博客
  测试代码使用的是参考文献1中的代码,代码如下:

char data = 0;
void setup()
{
Serial.begin(9600);
pinMode(13, OUTPUT);
}
void loop()
{
if(Serial.available() > 0)
{
data = Serial.read();
Serial.print(data);
Serial.print("\n");
if(data == '1')
digitalWrite(13, HIGH);
else if(data == '0')
digitalWrite(13, LOW);
}
}

实物连线图如下:
Arduino使用蓝牙通信模块 - gc_2299 - gc_2299的博客
 
演示视频:

注意:一开始测试的时候使用的是iPhone5,结果在蓝牙界面中死活收不到hc-05的设备(原因可以参考文献2-3),后来换了一个三星的手机,很快就搜索出来了,但是开始的时候下了几个蓝牙串口调试助手,要么检测不到蓝牙连接,要么检测到了连接不上,最后下了一个名称为蓝牙串口的软件,版本为5.4.3,图标为蓝底带大写字母SPP,使用这个软件可以正常地进行蓝牙串口通信。

参考文献:
[1]https://create.arduino.cc/projecthub/user206876468/arduino-bluetooth-basic-tutorial-d8b737
[2]http://www.eevblog.com/forum/beginners/hc05-bluetooth-and-iphone/
[3]http://apple.stackexchange.com/questions/141112/connecting-iphone-to-hc-05-bluetooth-module
 
2019-01-18 18:04:17 xiang_123_ 阅读数 2454

一、蓝牙模块与Arduino
主要分两步,第一步设置蓝牙模块(AT模式),如,设置成从动任何设备可连接,设置名称及密码等;第二步,编写相应的控制程序;
HC05(ZS-040)蓝牙模块与手机连接参考链接参考1

蓝牙模块AT设置相关参考3

蓝牙模块与手机进行通信参考2

以上几个参考链接,即可完成用手机蓝牙与arduino的通信,并控制对应舵机与led灯; (未在ubuntu上运行,待后续。。)