Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
BLE主机
WIFI模块_RW007
基于RW007高速WiFi模块实现MPU6050数据BLE透传综合示例
发布于 2021-04-16 17:44:35 浏览:628
订阅该版
[tocm] ## 硬件准备 - 1.`STM32F411-NUCLEO` 开发板,`RW007 EVB`模块 - 2.`PC` 电脑 - 3.`USB` 数据线 - 4.`BLE` 数据透传模块(如`HC-08`模块、`KT6368A`蓝牙模块等) - 5.`STM32F401-NUCLEO`开发板,`MPU6050`模块 - 6.`USB-TTL` 模块(如`CH340`等) - 7.杜邦线若干条 ## 软件准备 - 1.`RT-Thread Studio IDE `软件 - 2.串口调试软件(`xshell`、`SSCOM` 等) 要实现`MPU6050`传感器数据BLE透传的功能,需要分为发送端设备和接收端设备。 ### 发送端设备: 由 `STM32F401-NUCLEO`读取 `mpu6050`传感器数据配合`KT6368A蓝牙模块`数据透传。 可以分为以下的 7 个步骤: - 步骤1:创建 RT-Thread Studio IDE 工程 - 步骤2:项目工程配置 `I2C`设备框架和硬件IO 引脚配置及硬件连接 - 步骤3:添加`mpu6050`软件包,测试 `mpu6050` 数据获取 - 步骤4:项目工程配置开启 `uart6`串口配置和硬件连接 - 步骤5:测试 `uart6`串口功能 - 步骤6:把获取的`mpu6050`数据通过 `uart6`串口输出 - 步骤7:把`KT6368A蓝牙模块`的`RXD`引脚接在`uart6`串口配置的`TXD` 其中各个步骤的具体操作如下: #### 步骤1:创建 RT-Thread Studio IDE 工程 由于使用`RT-Thread Studio IDE `如何创建`STM32F401-NUCLEO`的工程,这个在官方的文档中心中有相关的文档说明,这里只作简单说明。 (1)通过点击新建`RT-Thread`项目,选择基于开发板,型号选择`STM332F401-NUCLEO`,输入工程名称,点击完成按钮开始创建工程。 ![创建mpu6050工程.png](https://oss-club.rt-thread.org/uploads/20210416/2a0d651dad365fe8585247ddf56175b2.png) #### 步骤2:项目工程配置 `I2C`设备框架和硬件IO 引脚配置及硬件连接 在配置`I2C`设备框架前,先确定使用那组硬件 IO 引脚,在这里使用 `PA4` 连接到`mpu6050`模块的`SCL`,`PA1`连接到`mpu6050`模块的`SCK`. 由于使用的是软件模拟的 `I2C`功能,只需确保对应的`IO`引脚没有被复用即可。 | STM32引脚名 | Pin序号 | MPU6050引脚 | 功能 | | ----------- | ------- | ----------- | ---- | | PA0 | 4 | SCL | SCL | | PA1 | 1 | SCK | SCK | | | | | | ![I2C引脚配置.png](https://oss-club.rt-thread.org/uploads/20210416/d3780c31edad3eb1ebbb5252d01ca231.png) 配置完成后,编译工程烧录到板子上,通过串口验证是否`I2C`设备框架正常工作。 ***注意:如果程序下载过程中提示 Warning: The core is locked up,需要在属性中配置为 system Reset 的复位模式*** ![验证I2C设备框架.png](https://oss-club.rt-thread.org/uploads/20210416/70811be67297ffcc70d159b2de197449.png) 如图,通过`list_device`可以查看到有`i2c1`这个 `device`,表明配置已经生效。 #### 步骤3:添加`mpu6050`软件包,测试 `mpu6050` 数据获取 关于 `mpu6050`软件包的使用,可以参考官方文档关于`mpu6050`传感器的使用,在这里仅是说明如何使用从官网相关文档中下载的`mpu6050`驱动包,获取数据。 `mpu6050`软件驱动包的下载连接:https://www.rt-thread.org/document/site/application-note/driver/i2c/i2c-mpu6050.rar 下载后的软件包中包含的文件如下图 ![mpu6050软件包.png](https://oss-club.rt-thread.org/uploads/20210416/59afe499b459648c4ed02d8dec3e9ef1.png) 在工程目录中刷新后可以显示添加的文件。 ![添加mpu6050软件包.png](https://oss-club.rt-thread.org/uploads/20210416/95893863b94ac1473f7e9694f3631b4f.png) 添加`mpu6050软件包`后需要适当修改`SConscript` 脚本 ![修改SConscript脚本.png](https://oss-club.rt-thread.org/uploads/20210416/ef4fe1fbe5ab8aa2f819415de522feb3.png) 添加`mpu6050软件包`后需要适当修改`drv_mpu6050.c` 文件中的 `MPU6050_I2CBUS_NAME`为 `i2c1`。 ![修改设备名为i2c1.png](https://oss-club.rt-thread.org/uploads/20210416/b2f3c61442228dcb2aafe3b266fed9f6.png) 然后编译工程,烧录测试`mpu6050`的功能。 ![测试mpu6050数据.png](https://oss-club.rt-thread.org/uploads/20210416/03ccac54248d2aab13d30b47549357d8.png) #### 步骤4:项目工程配置开启 `uart6`串口配置和硬件连接 由于默认创建的工程中没有开启`uart6`串口的配置,需要使用`CubeMX`开启 `uart6`的串口功能配置。 ![CubeMX配置USART6串口.png](https://oss-club.rt-thread.org/uploads/20210416/77b03ef93c1eeb3a85ed3b4ebb862ea8.png) 由于默认的图形化配置中没有`UART6`的配置,需要手动修改添加。 ![修改Kconfig添加UART6配置.png](https://oss-club.rt-thread.org/uploads/20210416/183b3f59963068bedcd086a75a4a66c7.png) 修改 `Kconfig`添加 `UART6`的配置后,需要图形化配置。 ![图形化配置uart6.png](https://oss-club.rt-thread.org/uploads/20210416/80dffdf4a4b643ed4e57fc4b01385822.png) 如图,默认`USART6`串口功能的`RXD`引脚是`PC7`,`TXD`引脚是`PC6`. 此时,可以使用一个 `USB-TTL`串口模块的与`STM32F401-NUCLEO`进行连接测试`uart6`的功能。 | STM32引脚名 | UART功能 | 连接 USB-TTL 模块引脚 | | ----------- | -------- | --------------------- | | PC6 | TXD | RXD | | PC7 | RXD | TXD | | GND | | GND | #### 步骤5:测试 `uart6`串口功能 关于 `uart`通信的示例,在官网的文档中心中有相关详细的说明,这里就不进行详细的描述。 直接从相关文档中参考一小段代码进行测试。 ``` #define SAMPLE_UART_NAME "uart6" /* 串口设备名称 */ static rt_device_t serial; /* 串口设备句柄 */ char str[] = "hello RT-Thread!\r\n"; struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; /* 配置参数 */ /* 查找串口设备 */ serial = rt_device_find(SAMPLE_UART_NAME); /* 以中断接收及轮询发送模式打开串口设备 */ rt_device_open(serial, RT_DEVICE_FLAG_INT_RX); /* 发送字符串 */ rt_device_write(serial, 0, str, (sizeof(str) - 1)); ``` 把上面的代码添加到工程里面的`main.c`文件中,通过`MSH`命令启动测试。 ![测试uart6串口发送数据.png](https://oss-club.rt-thread.org/uploads/20210416/70f03b70a93da222d35b03648287eb33.png) 此时通过 `SSCOM` 串口调试工具观察 `USB-TTL`串口模块接收来自`STM32F401-NUCLEO`串口 `UART6`发送的数据。 ![USB-TTL串口模块接收数据.png](https://oss-club.rt-thread.org/uploads/20210416/b832005a274acfe15100a40a919312f9.png) 到此,验证`uart6`串口功能正常。 #### 步骤6:把获取的`mpu6050`数据通过 `uart6`串口输出 这里需要把获取的`mpu6050`数据通过`uart6`串口输出,需要适当修改代码,主要是添加 `uart6`串口的初始化还有把`mpu6050`数据通过`uart6`输出。 在`main.c`文件中,添加`BLE_UART_NAME`和`serial`的声明。 ```c #define BLE_UART_NAME "uart6" /* 串口设备名称 */ static rt_device_t serial; /* 串口设备句柄 */ ``` 在`main`函数中,添加 `uart6`串口的初始化代码。 ```c /* 查找系统中的串口设备 */ serial = rt_device_find(BLE_UART_NAME); if (!serial) { rt_kprintf("find %s failed!\n", BLE_UART_NAME); return RT_ERROR; } rt_kprintf("open uart6 ok...\n"); rt_device_open(serial, RT_DEVICE_FLAG_INT_RX) ``` 在`mpu6050_thread_entry`函数中,添加把`mpu6050`数据通过`uart6`输出的功能代码。 ```c void mpu6050_thread_entry(void *parameter) { rt_int16_t temp; //温度 rt_int16_t gx,gy,gz; //三轴加速度 rt_int16_t ax,ay,az; //三轴角速度 char TempStr[15] = {0}; //char Gx[10] = {0}; rt_err_t ret; while(1) { ret = mpu6050_temperature_get(&temp); if (ret != RT_EOK) { rt_kprintf("mpu6050 : get temperature error\r\n"); } ret = mpu6050_accelerometer_get(&ax, &ay, &az); if (ret != RT_EOK) { rt_kprintf("mpu6050 : get acc error\r\n"); } ret = mpu6050_gyroscope_get(&gx, &gy, &gz); if (ret != RT_EOK) { rt_kprintf("mpu6050 : get gyro error\r\n"); } if (ret == RT_EOK) { //rt_kprintf("mpu6050: temperature=%-6d gx=%-6d gy=%-6d gz=%-6d ax=%-6d ay=%-6d az=%-6d\r\n",temp/100,gx,gy,gz,ax,ay,az); sprintf(TempStr,"55temp=%dAA",temp/100); rt_device_write(serial, 0, TempStr, (sizeof(TempStr) - 1)); memset(TempStr,0,sizeof(TempStr)/sizeof(char)); rt_thread_delay(rt_tick_from_millisecond(500)); sprintf(TempStr,"55gx=%dAA",gx); rt_device_write(serial, 0, TempStr, (sizeof(TempStr) - 1)); memset(TempStr,0,sizeof(TempStr)/sizeof(char)); rt_thread_delay(rt_tick_from_millisecond(500)); sprintf(TempStr,"55gy=%dAA",gy); rt_device_write(serial, 0, TempStr, (sizeof(TempStr) - 1)); memset(TempStr,0,sizeof(TempStr)/sizeof(char)); rt_thread_delay(rt_tick_from_millisecond(500)); sprintf(TempStr,"55gz=%dAA",gz); rt_device_write(serial, 0, TempStr, (sizeof(TempStr) - 1)); memset(TempStr,0,sizeof(TempStr)/sizeof(char)); rt_thread_delay(rt_tick_from_millisecond(500)); sprintf(TempStr,"55ax=%dAA",ax); rt_device_write(serial, 0, TempStr, (sizeof(TempStr) - 1)); memset(TempStr,0,sizeof(TempStr)/sizeof(char)); rt_thread_delay(rt_tick_from_millisecond(500)); sprintf(TempStr,"55ay=%dAA",ay); rt_device_write(serial, 0, TempStr, (sizeof(TempStr) - 1)); memset(TempStr,0,sizeof(TempStr)/sizeof(char)); rt_thread_delay(rt_tick_from_millisecond(500)); sprintf(TempStr,"55az=%dAA",az); rt_device_write(serial, 0, TempStr, (sizeof(TempStr) - 1)); memset(TempStr,0,sizeof(TempStr)/sizeof(char)); } rt_thread_delay(rt_tick_from_millisecond(1000)); } } ``` 说明:由于 `BLE`设备单次发送的数据长度有限制,需要拆分`mpu6050`的数据,并在发送的一帧数据前加上`55`作为数据头,在一帧数据后添加`AA`作为数据尾,这样方便接收方解析数据。 ![USB-TTL串口模块接收uart6的数据.png](https://oss-club.rt-thread.org/uploads/20210416/ca201cc46d392b2476b6f2d2d29db340.png) #### 步骤7:把`KT6368A蓝牙模块`的`RXD`引脚接在`uart6`串口配置的`TXD` 基于前面的步骤,这里距离蓝牙数据透传功能的实现仅需要进行最后一步,把`KT6368A蓝牙模块`的`RXD`引脚接在`uart6`串口配置的`TXD`,由于`KT6368A蓝牙模块`一旦被连接后,就自动进入了透传模式,这时候可以参考上面的使用手机调试的方法,尝试读取数据。 ![手机接收来自BLE_TEST的数据.png](https://oss-club.rt-thread.org/uploads/20210416/bb5a551007d9ea3661d4c019396cbfab.png) 到此,`STM32F401-NUCLEO`读取 `mpu6050`传感器数据配合`KT6368A蓝牙模块`数据透传的功能完成。 ### 接收端设备: `STM32F411-NUCLEO`通过 `RW007` BLE 功能读取`mpu6050`传感器数据。 可以分为以下的 2 个步骤: - 步骤1:创建 RT-Thread Studio IDE 工程 - 步骤2:添加`BLE `功能读取`mpu6050`传感器数据并解析的功能实现代码 #### 步骤1:创建 RT-Thread Studio IDE 工程 这里可以参考前面 `使用`STM32F411-NUCLEO`通过 `RW007` BLE 功能测试`BLE`蓝牙模块数据传输功能` 这部分的内容,进行创建工程,在这个工程的基础上,只需要添加一小部分代码就可以实现读取`mpu6050`传感器数据的功能。这里在 `application`目录下添加`ble_example.c`文件,并修改`applications`目录下的`SConscript`脚本,把`ble_example.c`添加到工程编译。 ![修改SConscript脚本添加ble_example.c文件.png](https://oss-club.rt-thread.org/uploads/20210416/b0fde740feb8326e2d23f3f83e33d3e2.png) #### 步骤2:添加`BLE `功能读取`mpu6050`传感器数据并解析的功能实现代码 在`ble_example.c`文件中添加`BLE `功能读取`mpu6050`传感器数据并解析的功能实现代码,主要参考`rw007`软件包中的`ble_cmd_rw007.c`里面关于`ble`命令的使用。 (1)添加`RW007` BLE 功能初始化 ```c static int ble_example_init(void) { rt_kprintf("ble_example_init\n"); rt_uint8_t roles = 0; roles = RW007_BLE_INIT_ROLE_CENTRAL; rw007_ble_init(roles); rw007_ble_resp_handle_cb_reg(rw007_ble_resp_handle); rw007_ble_ntf_handle_cb_reg(rw007_ble_ntf_handle); return 0; } ``` 说明: 上面代码实现`RW007` BLE 功能作为主机初始化并设置相关回调的功能,`rw007_ble_resp_handle ` 和 `rw007_ble_ntf_handle`函数可以直接参考`ble_cmd_rw007.c`文件里面的,具体的可以查询相关的代码。 (2)添加`RW007` BLE 功能通过`addr`连接指定的`BLE`设备 由于前面的步骤中,明确了需要连接的`BLE`设备的`addr`(即`mac`地址),这里就使用了。 ``` static int ble_example_connect(void) { rt_kprintf("ble_example_connect\n"); ble_addr_t addr; addr.type = RW007_BLE_ADDR_PUBLIC; rt_kprintf("str_addr: %s\n", "ee:dd:ff:ee:cc:aa"); _hexstrtoaddr("ee:dd:ff:ee:cc:aa", addr.val); rt_kprintf("mac addr: %2x:%2x:%2x:%2x:%2x:%2x\n", addr.val[0], addr.val[1], addr.val[2], addr.val[3], addr.val[4], addr.val[5]); rw007_ble_connect(&addr); return 0; } ``` 说明:上面代码实现通过`BLE`设备的`addr`(即`mac`地址)进行连接。 (3)添加`RW007` BLE 功能通过`UUID`接收数据 在前面的步骤中,知道可以通过 `UUID=0XFFF1`来接收`BLE`设备的数据。 ``` static int ble_example_gatt_notify_change_by_uuid(void) { rt_kprintf("ble_example_gatt_notify_change_by_uuid\n"); rt_uint16_t conn_handle = 0; rt_uint16_t char_value = 0; int uuidint; ble_uuid_any_t uuid; conn_handle = 1; char_value = 1; uuid.u16.u.type = BLE_UUID_TYPE_16; sscanf("0xfff1", "%x", &uuidint); uuid.u16.value = uuidint & 0xFFFFu; rw007_ble_gatt_notify_change_by_uuid(conn_handle, &uuid, char_value); return 0; } ``` 说明:上面的代码中实现,通过设置`UUID=0XFFF1`来接收`BLE`设备的数据` (4)添加数据解析部分的功能 通过前面的测试中,可以知道`BLE_TEST`设备会把数据通过`NOTIFY`发送,此时只需要在`RW007_BLE_NTF_TYPE_NOTIFY_RX`中进行处理,把接收的数据解析(去掉数据头55、数据尾AA) ``` case RW007_BLE_NTF_TYPE_NOTIFY_RX: { rt_kprintf("RW007_BLE_NTF_TYPE_NOTIFY_RX\n"); int offset = 0, notify_data_len = 0; char *pcBegin = NULL; char *pcEnd = NULL; char cRes[15]={0}; struct ble_gap_event *event = RT_NULL; void *notify_data = RT_NULL; event = (struct ble_gap_event *)data; offset = sizeof(struct ble_gap_event); notify_data = data + offset; notify_data_len = size - offset; //hex_dump(notify_data, notify_data_len); pcBegin = strstr(notify_data,"55"); pcEnd = strstr(notify_data,"AA"); if(pcBegin == NULL || pcEnd == NULL || pcBegin > pcEnd) { rt_kprintf("data not found!!!\n"); } else { pcBegin += strlen("55"); rt_memcpy(cRes, pcBegin, pcEnd-pcBegin); rt_kprintf("data:%s\n",cRes); } break; } ``` (5)添加启动测试命令 在调试过程中,可以把启动的函数导出到`msh`命令中执行。 ``` static int ble_example_start(void) { ble_example_init(); rt_thread_delay(1000); ble_example_connect(); rt_thread_delay(5000); ble_example_gatt_notify_change_by_uuid(); return 0; } MSH_CMD_EXPORT(ble_example_start,ble_example_start) ``` 说明:把`ble_example_start`函数导出到`msh`命令行中执行,代码中添加一些适当的延时是考虑到`BLE`设备执行连接需要等待一些时间。 (6)工程编译与下载 按照上面的步骤操作后,重新编译工程下载到板子上,在`STM32F411-NUCLEO`的调试串口上输入`ble_example_start`的命令进行通过 `RW007` BLE 功能读取`mpu6050`传感器数据。 ![执行ble_example_start.png](https://oss-club.rt-thread.org/uploads/20210416/32ff8d6312551e955950136735173b33.png) 到此,`STM32F411-NUCLEO`通过 `RW007` BLE 功能读取`mpu6050`传感器数据功能完成。 ## 常见问题 1.下载程序过程中提示` Warning: The core is locked up`,导致程序烧录失败。 ![下载异常.png](https://oss-club.rt-thread.org/uploads/20210416/8f7000b4818b737c7a2dffe7cb69a73f.png) 一般在属性设置中重新配置工程的复位模式即可解决。 ![设置复位模式.png](https://oss-club.rt-thread.org/uploads/20210416/6b501da76543147baba8c8a4835272cc.png)
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
shadowliang
Hello,world!!!
文章
10
回答
100
被采纳
6
关注TA
发私信
相关文章
1
wlan设备测试,除了rw007模块,还有哪些可以测试?
2
rw007 开机进不了spi模式
3
RW007wifi模块扫描热点超时的问题
4
stm32f429+RW007 初始化一直失败???
5
RW007 TCP发送数据出现瞬间卡顿问题,请问是怎么回事?
6
关于K210使用RW007的注意
7
RW007 没有作为从机连接手机的例子吗?
8
RW007 运行异常
9
RW007 wifi 模块中断回环电阻的作用?
10
RW007模块有Arduino开发板上的例程吗?
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
机器人操作系统 (ROS2) 和 RT-Thread 通信
4
国产MCU移植系列教程汇总,欢迎查看!
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
LWIP
Env
SPI
Bootloader
AT
ART-Pi
Hardfault
CAN总线
FinSH
USB
文件系统
RT-Thread
DMA
SCons
线程
RT-Thread Nano
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
ota在线升级
WIZnet_W5500
I2C_IIC
UART
flash
cubemx
packages_软件包
freemodbus
潘多拉开发板_Pandora
PWM
定时器
ADC
BSP
中断
keil_MDK
编译报错
socket
MicroPython
GD32
msh
Debug
ulog
SDIO总线
SFUD
rt_mq_消息队列_msg_queue
C++_cpp
本月问答贡献
xiaorui
7
个答案
3
次被采纳
sakumisu
4
个答案
3
次被采纳
三世执戟
31
个答案
1
次被采纳
梦笑真美
18
个答案
1
次被采纳
踩姑娘的小蘑菇
14
个答案
1
次被采纳
本月文章贡献
Z_Y
2
篇文章
5
次点赞
Alipay
2
篇文章
3
次点赞
2345vor
2
篇文章
1
次点赞
比特饼干
1
篇文章
6
次点赞
Lu_盼盼
1
篇文章
3
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部