ble-nano是emakefun公司基于官方标准Arduino Nano V3.0主板上集成低功耗蓝牙芯片而开发一款具备无线蓝牙功能的开发板,它的功能和引脚,使用方法,完全兼容标准的Arduino Nano V3.0主板,工作频段为2.4GHZ 范围,调制方式为 GFSK, 接收灵敏度-96dBm,最大发射功率为+5db,最大发射距离超过200米,采用RISC-V架构CH573芯片设计,支持用户通过AT命令查看修改设备名、服务UUID、发射功率、配对密码等指令,方便快捷使用。产品身材非常小,适合于很多对于体积有苛刻限制的应用。
提供Android和IOS手机demo,你可以借助Arduino应用生态,快速开发出一款与手机通信的硬件设备。正如现在非常火爆的可穿戴式手机周边设备,都可以用ble-nano这款硬件开发,你可以使用ble-nano与BLE蓝牙设备连接,也可以两个ble-nano主从通信。同时我们为开发者提供了极大的自由度和支持准备,用户不仅可以通过AT指令调试ble-nano,你还可以在ble-nano控制器上添加Arduino兼容的扩展板、传感器、电机和舵机驱动等,当然最大的亮点是你可以通过手机蓝牙直接给ble-nano下载程序。
- BLE芯片: RISC-V架构ch57xF芯片(高度兼容TI CC2540蓝牙SOC)
- 工作频道: 2.4G
- 0dBm 发送功率时电流 6mA
- 接收灵敏度 -96dBm,可编程+5dBm 发送功率 。
- 传输距离:空旷情况下,在0dB发送功率通讯距离约170m,在 3dBm 发送功率时约 240m
- 支持usb串口,arduino串口,蓝牙三种方式,AT指令配置,支持主从模式切换
- 支持USB虚拟串口,硬件串口,BLE三向透传
- 主机模式下支持蓝牙自动连接从机
- 蓝牙MTU为67,单次数据发送量最大为64Byte
- 处理器: ATmega328P-MU QFN32
- 数字IO引脚:22个(其中6个用作PWM输出)
- 模拟输入引脚:8 (A0~A7)
- IO引脚直流电流:40mA
- 5V 引脚电流:VIN输入时500mA
- 3.3V引脚电流 : 500mA
- Flash内存:32KB(其中0.5KB用于引导加载程序)
- SRAM: 2KB
- EEPROM: 1KB
- USB转串口芯片: CH57xF芯片,兼容arduino官方uno驱动
- 工作时钟:16 MHZ
arduino nano , ble-nano3.0, ble-nano4.2 ble-nano5.3 四款产品对比表格
- B: 蓝牙连接状态指示灯-当蓝牙未连接时,1s间隔闪烁,当蓝牙连接上后常亮;蓝牙接收或者发送数据时,会快闪
- RX TX: 串口收据收发指示灯
- L 为 arduino的13引脚blink灯
ble-nano的usb驱动是兼容Arduino Uno的官方串口驱动,所以安装驱动的方法和官方Arduino Uno驱动是一样的.
ble-nano烧写的为最新Arduino Nano官方Bootloader所以需要使用IDE 1.8.8版本以上来烧写程序 请前往 Arduino官网 载最新IDE
选择开发板类型为Arduino Nano 处理器为 ATmega328P,如下图
1、打开ble控制程序ble_control_led.ino主板上Link(引脚13)上的LED灯程序
String ble_data;
int led_pin = 13;
void setup() {
Serial.begin(115200);
ble_data = "";
pinMode(led_pin, OUTPUT);
}
void loop() {
while (Serial.available() > 0)
{
ble_data += char(Serial.read());
delay(2);
}
if (ble_data.compareTo("on") == 0) {
Serial.println("turn on led");
digitalWrite(led_pin, HIGH);
}
if (ble_data.compareTo("off") == 0) {
Serial.println("turn off led");
digitalWrite(led_pin, LOW);
}
ble_data = "";
}
2、安卓或苹果手机系统设置中是无法连接使用的,因为手机设置都是只能连接经典蓝牙兼容蓝牙耳机,蓝牙麦克风等外设,不能连接低功耗蓝牙。安卓手机(安卓4.2系统版本以上)安装BleToolsTest 可以参考开源Android源代码 (注意需要打开蓝牙,和定位权限)如下图操作)
打开手机定位 | 允许BLE测试工具定位权限 |
---|---|
3、打开测试APP,界面。找到对应的蓝牙名(ble-nano4.2/ble-nano5.3)并点击进行连接,此时会出现4个选项,分别用于测试不同的功能,因为这里我们只测试蓝牙是否可以正常收发数据,所以我们选择SK Service入,再选择SK_KEYPRESSED
连接蓝牙名字 | 选择service | 选择char service |
---|---|---|
4、我们选择“SK-KEYPRESSED”,点击后如图3.1.9我们可以看到有一个“写入”按键,点击即可进入,我们点击“红色框”即可输入想发送的数据,输入完成后点击“发送”即可将数据发出去
5、点击发送字符串"on"后,打开ArduinoIDE的串口监视器上打印 turn on led,同时观察ble-nano上的L灯点亮,代表app蓝牙控制主板上的L灯成功,同样的方法发送字符串“off”后,ble-nano上的L灯会熄灭。到此我们安卓手机蓝牙测试完成。
1、在APP store 中搜索LightBlue,下载软件LightBlue RExplorer,并打开。
2、安装APP后,打开APP扫描到ble-nano,并连接
3、选择字符类型,并点击Write new value,输入字符即可给ble-nano发送数据。
4、点击done后会发送字符串"on"后,打开ArduinoIDE的串口监视器上打印 turn on led,同时观察ble-nano上的L灯点亮,代表app蓝牙控制主板上的L灯成功,同样的方法发送字符串“off”后,ble-nano上的L灯会熄灭。到此我们IOS蓝牙测试完成。
笔记本电脑win10的设置里面蓝牙也无法在设置里面直接和ble-nano连接的,它只能连接经典蓝牙,去微软官方应用商城下载Bluetooth LE Explorer
如果我们想通过win10自带蓝牙和ble-nano那么你需要基于Microsoft官方BLE SDK二次开发,请查看开发者说明 https://docs.microsoft.com/zh-cn/windows/uwp/devices-sensors/gatt-server 以及视频 https://channel9.msdn.com/Events/Build/2017/P4177 很幸运win10提供了专业的源代码请参考 https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/BluetoothLE https://github.com/Microsoft/BluetoothLEExplorer 当然这是一个非常麻烦的事情,假如不是必要的话,强烈建议使用2块ble-nano设备来完成你的想法,详细参考后面章节。
ble-nano的AT指令可通过Arduino自带的硬件串口0(RX)、1 (TX)控制,波特率支持9600、19200、38400、57600、115200。ble-nano串口默认波特率为115200bps。
AT指令还可以通过直连TypeC数据线直连控制或者APP里面为0xFFE2的characteristics来控制。
(注:发AT指令时必须回车换行, AT指令只能在模块未连接状态下才能生效,一旦蓝牙模块与设备连接上,蓝牙模块即进入数据透传模式。AT指令区分大小写,均以回车换行字符结尾:\r\n))
序列 | 指令 | 描述 | 主(Master)/从(Slave) | 默认 |
---|---|---|---|---|
1 | AT | 测试 | M/S | |
2 | AT+ALL | 打印ble-nano所有的配置信息 | M/S | |
3 | AT+RESET | 软件复位BLE蓝牙芯片 | M/S | |
4 | AT+TARGE_RESET | 复位Arduino(Atmega328P芯片) | M/S | |
5 | AT+VER | 查看ble-nano固件版本号 | M/S | |
6 | AT+BAUD | 配置串口波特率 | M/S | 115200 |
7 | AT+NAME | 查看配置蓝牙广播名字 | ble-nano | |
8 | AT+MAC | 查看设置蓝牙12位mac地址 | M/S | |
9 | AT+AUTH | 设置蓝牙连接是否需要鉴权 | S | 0 |
10 | AT+PASS | 设置蓝牙连接密码 | S | 123456 |
11 | AT+ROLE | 配置主从模式 | M/S | 1 |
12 | AT+SCAN | 扫描周边的蓝牙设备 | M | |
13 | AT+CONN | 连接扫描结果对应下标的蓝牙设备 | M | |
14 | AT+CON | 连接对应mac地址的蓝牙设备 | M | |
15 | AT+AUTOCON | 自动绑定连接上次成功连接的从机设备,重启生效 | M | 0 |
16 | AT+DISCON | 断开当前的连接 | M | |
17 | AT+BLEUSB | 设置蓝牙的USB和蓝牙数据传输模式 | M/S | 0 |
18 | AT+TXPOWER | 设置蓝牙发射功率 | M/S | 0 |
19 | AT+MINI_INTERVAL | 设置ble-nano最小通信间隔 | M/S | 6 |
20 | AT+MAX_INTERVAL | 设置ble-nano最大通信间隔 | M/S | 6 |
21 | AT+SERVUUID | 获取蓝牙特征码SERVUUID | M/S | 0xFFE0 |
22 | AT+CHARUUID | 获取字符特征码CHARUUID | M/S | 0xFFE1 |
23 | AT+SETTING | 恢复出厂系统设置,带参数 | M/S | |
24 | AT+SLEEP(暂未实现) | 设置睡眠模式 | M/S |
1、测试指令
指令 | 响应 | 参数 |
---|---|---|
AT | OK | 无 |
2、打印ble-nano的所有配置信息
指令 | 响应 | 参数 |
---|---|---|
AT+ALL | 详细配置信息 OK |
无 |
3、软件复位蓝牙芯片指令
指令 | 响应 | 参数 |
---|---|---|
AT+RESET | 无 | 无 |
4、复位Arduino主控指令
指令 | 响应 | 参数 |
---|---|---|
AT+TARGE_RESET | OK | 无 |
5、查询ble-nano固件版本
指令 | 响应 | 参数 |
---|---|---|
AT+VER | +VERSION=v1.0 +DATE=Apr 16 2023 +TIME= OK |
无 |
6、配置串口波特率
指令 | 响应 | 参数 |
---|---|---|
AT+BAUD=< Param> | +BAUD=< baud > OK |
0:9600 1:19200 2:38400 3:57600 4:115200 |
7、配置蓝牙名字指令
指令 | 响应 | 参数 |
---|---|---|
AT+NAME=< Param > | +NAME=< param > OK |
蓝牙名字 |
8、查询或者设置蓝牙的Mac地址
指令 | 响应 | 参数 |
---|---|---|
AT+MAC=< Param> | +MAC=< Result > OK |
无 |
9、设置蓝牙连接是否需要密码
指令 | 响应 | 参数 |
---|---|---|
AT+AUTH=< Param> | +AUTH=< Result > OK |
0:不要 1:需要 |
10、查询或者设置蓝牙的连接密码
指令 | 响应 | 参数 |
---|---|---|
AT+PASS=< Param> | +PASS=< Result > OK |
6位阿拉伯数字 |
11、查询设置蓝牙主从模式
指令 | 响应 | 参数 |
---|---|---|
AT+ROLE=< Param > | +ROLE=< Param > OK |
0:主机 1:从机 |
12、蓝牙主机模式下扫描附近从机
指令 | 响应 | 参数 |
---|---|---|
AT+SCAN | +SCAN OK mac[1]:xxxx mac[2]:xxxx …… |
无 |
13、通过扫描返回下标连接从机蓝牙
指令 | 响应 | 参数 |
---|---|---|
AT+CONN=< Param > | OK+CONN=< Param > | 扫描从机蓝牙下标数字 |
14、通过Mac地址连接从机蓝牙
指令 | 响应 | 参数 |
---|---|---|
AT+CON=< Param > | OK+CON=< Param > | 从机蓝牙地址 |
+SCAN OK mac[1] 3e:bb:9e:e4:e9:9a mac[2] 8c:5a:f8:ef:5c:f8 mac[3] 6b:9c:b3:c4:4b:0c mac[4] 17:cc:ef:66:40:b1 mac[5] fd:e2:4e:af:ea:da mac[6] 67:3a:b1:45:c2:e8 mac[7] d0:44:7a:9e:e4:e4 OK AT+CONN=1代表连接扫描得到的第二个蓝牙设备 AT+CON=d0:44:7a:9e:e4:e4直接连接Mac地址为d0:44:7a:9e:e4:e4的设备
15、开启蓝牙自动连接模式 开启后,蓝牙模块将自动连接上次成功连接过的设备
指令 | 响应 | 参数 |
---|---|---|
AT+AUTOCON=< Param > | +AUTOCON=< Param > OK |
0:关闭自动连接 1:开机自动连接 |
16、断开当前连接蓝牙设备
指令 | 响应 | 参数 |
---|---|---|
AT+DISCON | +DISCON OK |
无 |
17、设置蓝牙的连接是否需要密码
指令 | 响应 | 参数 |
---|---|---|
AT+AUTH=< Param > | +AUTH=< Param > OK |
0:连接无密码 1:需要密码连接 |
16、设置蓝牙的连接是密码
指令 | 响应 | 参数 |
---|---|---|
AT+PASS=< Param > | +PASS=< Param > OK |
18、设置蓝牙的USB和蓝牙数据传输模式
指令 | 响应 | 参数 |
---|---|---|
AT+BLEUSB=< Param > | +BLEUSB=< Param > OK |
0:关闭 1:USB串口数据传给BLE 2:BLE数据传给USB串口 3:USB串口数据和BLE透传 |
19、设置蓝牙的发射功率
指令 | 响应 | 参数 |
---|---|---|
AT+MINI_INTERVAL=< Param > | + MINI_INTERVAL=< Param > OK |
PC和Android,建议设为为10 iOS设备,建议设置为20 |
20、设置BLE芯片最大通信间隔,以毫秒为单位
指令 | 响应 | 参数 |
---|---|---|
AT+MAX_INTERVAL=< Param > | + MAX_INTERVAL=< Param > OK |
PC和Android,建议设为为10 iOS设备,建议设置为40 |
21、获取BLE服务特征码UUID
指令 | 响应 | 参数 |
---|---|---|
AT+SERVUUID | +SERVUUID=0xffe0 OK |
22、获取BLE字符特征码UUID
指令 | 响应 | 参数 |
---|---|---|
AT+CHARUUID | +CHARUUID=0xffe0 OK |
23、系统设置
指令 | 响应 | 参数 |
---|---|---|
AT+SETTING=< Param > | +SETTING=< Param > OK |
DEFAULT恢复出厂设置 PARI_DEFAULT清除配对信息,密码信息 |
ble-nano最核心的功能就是蓝牙转串口透传功能,所以所谓Arduino蓝牙编程,其实就是对arduino的串口(Serial)进行读写操作我们编程时需要注意两点 1、ble-nano的MTU为67即单包蓝牙数据最带为64Byte,所以超过64个字节的时候,arudino发送时需要分包发送。
2、单次发送数据为64Byte时,发送间隔需要超过50ms,否则会丢包。
auto data = "123456789abcdefghjk\n";
Serial.write(data.c_str(), 20);
delay(10); //必须要延时 10ms以上
ble-nano支持三种AT指令配置方式:
1、通过usb串口直接发送AT指令,打开Arduino IDE的串口工具
串口波特率为115200,选择回车换行(NL和NR)作为结束符。
2、代码中如何使用AT指令
Arduino的硬件串口(RX0, TX1)直连了蓝牙的串口模块,所以我们可以通过Arduino的硬件串口直接发送AT指令
直接操作Arduino的Serial函数就可以和蓝牙芯片通信。
String ble_data;
int led_pin = 13;
void setup() {
Serial.begin(115200);
pinMode(led_pin, OUTPUT);
Serial.println("AT+ROLE=0"); // 设置蓝牙为主机
delay(50); // AT指令设置后需要延时50ms
Serial.println("AT+CON=83:46:8c:e4:c2:84"); //连接mac地址的蓝牙从机
delay(100); // 等待连接成功
}
void loop() {
while (Serial.available() > 0)
{
ble_data += char(Serial.read());
delay(2);
}
if (ble_data.endsWith("OK\r\n") > 0) { //判断AT返回结果为OK
Serial.println("connect success");
digitalWrite(led_pin, HIGH);
}
if (ble_data.endsWith("ERROR\r\n") > 0) { //判断AT返回结果为ERROR
Serial.println("connect fail");
digitalWrite(led_pin, LOW);
}
ble_data = "";
}
3、手机App配置AT指令步骤
选择AT命令的characterisitics | 点击开始通知 | 勾选增加新行 |
---|---|---|
在很多应用我们需要两个ble-nano和来完成自己构想。如下有两种经典的方式来完成两个ble-nano之间的通信。
一、主机ble-nano通过电脑usb转串口发送控制指令,控制另外一个ble-nano从机的led灯。
设置两个ble-nano的USB和蓝牙数据传输模式设置为USB串口数据和BLE透传即AT+BLEUSB=3
主机usb串口发送on后可以看到从机的L灯亮起,usb串口发送off后我们可以看到从机的L灯熄灭。
二、我们可以分别对主机和从机ble-nano分别编程来控制从机ble-nano的L灯亮和灭。
主机程序如下master
String ble_data;
int led_pin = 13;
int ble_status = 0;
void setup() {
Serial.begin(115200);
pinMode(led_pin, OUTPUT);
Serial.println("AT+ROLE=0"); // 设置蓝牙为主机
delay(50);
Serial.println("AT+BLEUSB=0"); // 设置数据通信模式为0
delay(50);
Serial.println("AT+CON=83:46:8c:e4:c2:84"); //连接mac地址的蓝牙从机
//delay(50);
ble_data = "";
while (Serial.available() > 0)
{
ble_data += char(Serial.read());
delay(2);
}
if (ble_data.endsWith("OK\r\n") > 0) {
Serial.println("connect success");
digitalWrite(led_pin, HIGH);
ble_status = 1;
}
if (ble_data.endsWith("ERROR\r\n") > 0) {
Serial.println("connect fail");
digitalWrite(led_pin, LOW);
ble_status = 0;
}
}
void loop() {
if (ble_status)
{
Serial.print("on");
delay(1000);
Serial.print("off");
delay(1000);
}
}
从机程序如下slave
String ble_data;
int led_pin = 13;
void setup() {
Serial.begin(115200);
pinMode(led_pin, OUTPUT);
Serial.println("AT+ROLE=1"); // 设置蓝牙为从机
delay(50);
Serial.println("AT+BLEUSB=0"); //设置数据通信模式为0
//delay(10);
}
void loop() {
while (Serial.available() > 0)
{
ble_data += char(Serial.read());
delay(2);
}
if (ble_data.compareTo("on") == 0) {
Serial.println("turn on led");
digitalWrite(led_pin, HIGH);
}
if (ble_data.compareTo("off") == 0) {
Serial.println("turn off led");
digitalWrite(led_pin, LOW);
}
ble_data = "";
}
成功后,我们可以看到从机的L灯每一秒闪烁一次
1) 问:ble-nano和其他普通nano板有何区别,我要如何开始使用这个开发板
答: ble-nano是在原来官方arduino nano v3.0的基础上将ch340G串口芯片更换成带usb接口的蓝牙芯片。它的驱动兼容arduino官方驱动,接口由Mini-Usb升级成Type-C接口,引脚和功能完全兼容普通NanoV3.0。如果没有用到蓝牙功能,那么使用方法完全和arduino nano V3.0一样,要使用蓝牙请看前面详细介绍。
2) 问:蓝牙如何手机电脑连接 答: ble-nano为低功耗蓝牙设备,不能直接在手机设置里面蓝牙连接,需要通过Android手机的话BLETestTools.apk (IOS LightBlue)连接,如要开发参考源代码二次开发,windows的设置里面也是经典蓝牙连接方式,需要微软官网参考BLE SDK开发。
3) 问:为什么我的手机连不上ble-nano,即使可以连上,但也不能通信?
答:请检查您的手机是否支持蓝牙4.2。请使用BLE测试APP内的Scan按钮扫描连接ble-nano,连接不需要密码。不支持手机蓝牙设置界面里去连接,手机设置里面是连接经典传统蓝牙设备的。
4)问:如何使用Ibeacon和mesh功能?
答:现在不支持,后续考虑增加
5)问:ble-nano支持多联吗?我想用一个主机连接很多从机,请问最多能连几个?
答:ble-nano暂时不支持多联,但是可以通过不断地切换绑定从机,实现多联的思想。
6) 问:为什么ble-nano系列的蓝牙4.2产品无法连接蓝牙2.0的设备?
答:由于我们的ble-nano系列为了实现极低的功耗,采用了单模蓝牙低功耗(Bluetooth Smart),硬件和软件上都做了优化,只能支持BLE,不支持连接蓝牙2.0设备。
7) 问:为什么ble-nano是否支持手机编程?
答:支持手机端编程,但需要手机这边参考https://github.com/nulllab-org/arduino_ble_flash_demo二次开发。
技术+合作 wechat号: jundi0808([email protected])