在线时间4746 小时
UID3441752
注册时间2017-11-21
NXP金币82794
TA的每日心情 | 开心 7 天前 |
---|
签到天数: 301 天 连续签到: 2 天 [LV.8]以坛为家I
管理员
  
- 积分
- 39226
- 最后登录
- 2025-7-18
|
i.MX RT1064智能车应用入门之无线模块应用
各位车友好,基于i.MX RT1064智能车应用入门教程专辑连载推送又来啦,今天更新的专题是“无线模块通信应用”。先给模块做个介绍,我们收到很多老司机反馈逐飞无线串口模块非常好用,但新手总有些固定疑问,以为这是蓝牙,或以为这是NRF模块,但都不是,逐飞无线串口模块是我们基于SI24R1无线芯片精心设计制作的无线透传模块,你只需要像使用串口一样使用它就行了,关于无线发送和接收的部分由模块自己完成,具体参数可至逐飞淘宝店搜索无线模块了解。
一、原理讲解
无线通信的基本原理是利用电磁波信号可以在空间中传播的特性进行数据交换的一种通信方式,常用的无线模块主要有433M、2.4G,433M与2.4G指的是模块的通讯频率,相对来说2.4G的无线模块比433M的无线模块通信速度更快一些,虽然 433M的无线模块穿透能力更好一些。但智能车竞赛往往是在空旷的体育场馆或者室外举行的,所以通常智能车竞赛大多选择2.4G的无线通讯模块来使用,但是直接编写程序与无线芯片通信比较麻烦,而且还需要设置通信频率、信道、功率等等比较专业的参数。
因此强烈推荐逐飞科技设计的无线模块,使用起来与普通串口的操作方式基本一样。无线传输部分的工作交给无线模块自己处理就行了,就像使用有线串口通信一样使用无线模块进行通信,非常简单。接下来我们就从基于逐飞RT1064开源库的使用上来讲解如何使用无线模块进行无线通信。
二、例程解析
- #include "headfile.h"
-
- uint8 test1[] = "seekfree wireless to uart test\n";
- uint8 test2[] = "seekfree.taobao.com\n";
-
- int main(void)
- {
-
- DisableGlobalIRQ();
- board_init(); //务必保留,本函数用于初始化MPU 时钟 调试串口
-
- systick_delay_ms(300); //延时300ms,等待主板其他外设上电成功
-
- //无线转串口模块相关引脚定义在 wireless.h文件中
- seekfree_wireless_init();
-
- //对于如何接受无线转串口的数据,其实底层已经写好了,具体可以多看看wireless.c文件,主要采用中断接收的方式
- EnableGlobalIRQ(0);
-
- while(1)
- {
- seekfree_wireless_send_buff(test1,sizeof(test1)-1);//由于sizeof计算字符串的长度包含了最后一个0,因此需要减一
- seekfree_wireless_send_buff(test2,sizeof(test2)-1);
- systick_delay_ms(1000);
-
- }
- }
复制代码 例程要点解析1:上述例程使用的是逐飞科技所制作的无线转串口模块,采用SI24R1芯片,最大7db的功率,模块最大波特率为460800。
例程要点解析2:对于模块的使用基本与串口一样,有一个需要注意的地方,模块有RTS引脚,引脚的作用是告诉单片机当前是否可以发送数据,当RTS引脚为低电平时表示可以发送数据,如果为高电平表示模块内部的缓冲区已满,此时单片机不应该向模块发送数据,否则会造成数据的丢失。
无线通讯的作用:在调试智能车时经常我们需要在车模运行时查看内部变量或者修改某些变量,此时我们就可以采用无线模块来进行通讯,可以远程实现实时修改或者读取数据。
三、应用场景举例
3.1、单片机与单片机通信(双车通信)
可以两个无线转串口配合使用(适用于双车通信或其他两个单片机通信)
使用单片机A通过无线模块A进行数据发送,通过按键控制发送数据,每次按下按键send_buff就加1并且发送出去,例程代码如下:
- #include "headfile.h"
-
- //定义发送buff
- uint8 send_buff = 0;
- int main(void)
- {
- DisableGlobalIRQ();
- board_init(); //务必保留,本函数用于初始化MPU 时钟 调试串口
- systick_delay_ms(300); //延时300ms,等待主板其他外设上电成功
-
- //初始化无线转串口模块
- seekfree_wireless_init();
-
- //初始化2寸IPS屏幕
- ips200_init();
- //2寸IPS屏幕显示字符串
- ips200_showstr(0, 0, "I am transmitter");
-
- //初始化C4引脚作为输入按键使用
- fast_gpio_init(C4, GPI, 1, FAST_GPIO_PIN_CONFIG);
-
- //总中断最后开启
- EnableGlobalIRQ(0);
- while (1)
- {
- if(fast_gpio_get(C4) == 0)
- {
- //按键去抖
- systick_delay_ms(10);
- if(fast_gpio_get(C4) == 0)
- {
- send_buff++;
- //通过无线转串口发送一个字节
- seekfree_wireless_send_buff(&send_buff, 1);
- //按键去抖
- while(fast_gpio_get(C4) == 0);
- }
- }
- }
- }
复制代码 使用单片机B通过无线模块B进行数据接收,每接收一次数据,就命令显示屏往下一行显示接收到的数据,例程代码如下:
- #include "headfile.h"
-
- int main(void)
- {
- DisableGlobalIRQ();
- board_init(); //务必保留,本函数用于初始化MPU 时钟 调试串口
- systick_delay_ms(300); //延时300ms,等待主板其他外设上电成功
-
- //初始化无线转串口模块
- seekfree_wireless_init();
-
- //初始化2寸IPS屏幕
- ips200_init();
- //2寸IPS屏幕显示字符串
- ips200_showstr(0, 0, "I am receiver");
-
- //总中断最后开启
- EnableGlobalIRQ(0);
- while (1)
- {
- }
- }
-
- //-------------------------------------------------------------------------------------------------------------------
- // @brief 无线转串口模块 串口中断回调函数
- // @param NULL
- // @return void
- // @since v1.0
- // Sample usage:
- // @note 该函数会在无线转串口接收到数据的时候自动进入。
- //-------------------------------------------------------------------------------------------------------------------
- void wireless_uart_callback(LPUART_Type *base, lpuart_handle_t *handle, status_t status, void *userData)
- {
- if(kStatus_LPUART_RxIdle == status)
- {
- //通过2寸IPS显示字符串
- ips200_showstr(0, wireless_rx_buffer, "receiver data = ");
- //通过2寸IPS显示无线转串口接收到的数据
- ips200_showuint8(8*16, wireless_rx_buffer, wireless_rx_buffer);
- }
- handle->rxDataSize = wireless_receivexfer.dataSize; //还原缓冲区长度
- handle->rxData = wireless_receivexfer.data; //还原缓冲区地址
- }
复制代码 演示视频:
3.2、单片机与PC通信
可以1无线转串口+1个无线转USB配合使用(适用于PC端上位机与单片机通信)
单片机端连接一个无线转串口作为发送,每一秒钟发送一次数据。PC端接一个无线转USB作为接收,通过上位机显示数据,例程代码和上位机接收效果如下:
- #include "headfile.h"
- uint8 send_buff;
- int main(void)
- {
- DisableGlobalIRQ();
- board_init(); //务必保留,本函数用于初始化MPU 时钟 调试串口
- systick_delay_ms(300); //延时300ms,等待主板其他外设上电成功
-
- //初始化无线转串口模块
- seekfree_wireless_init();
-
- //总中断最后开启
- EnableGlobalIRQ(0);
- while (1)
- {
- send_buff++;
- //通过无线转串口发送一个字节
- seekfree_wireless_send_buff(&send_buff, 1);
- //延时1秒
- systick_delay_ms(1000);
- }
- }
复制代码 PC端接一个无线转USB作为发送,使用串口上位机发送数据。单片机端接一个无线转串口作为接收,将接收到的数据显示到2寸IPS屏幕上。例程代码和演示效果如下:
- #include "headfile.h"
-
- int main(void)
- {
- DisableGlobalIRQ();
- board_init(); //务必保留,本函数用于初始化MPU 时钟 调试串口
- systick_delay_ms(300); //延时300ms,等待主板其他外设上电成功
-
- //初始化无线转串口模块
- seekfree_wireless_init();
-
- //初始化2寸IPS屏幕
- ips200_init();
- //2寸IPS屏幕显示字符串
- ips200_showstr(0, 0, "I am receiver");
-
- //总中断最后开启
- EnableGlobalIRQ(0);
- while (1)
- {
- }
- }
-
- //-------------------------------------------------------------------------------------------------------------------
- // @brief 无线转串口模块 串口中断函数
- // @param NULL
- // @return void
- // @since v1.0
- // Sample usage:
- // @note 该函数会在无线转串口接收到数据的时候自动进入。
- //-------------------------------------------------------------------------------------------------------------------
- void wireless_uart_callback(LPUART_Type *base, lpuart_handle_t *handle, status_t status, void *userData)
- {
- if(kStatus_LPUART_RxIdle == status)
- {
- //通过2寸IPS显示字符串
- ips200_showstr(0, 1, "receiver data = ");
- //通过2寸IPS显示无线转串口接收到的数据
- ips200_showuint8(8*16, 1, wireless_rx_buffer);
- }
- handle->rxDataSize = wireless_receivexfer.dataSize; //还原缓冲区长度
- handle->rxData = wireless_receivexfer.data; //还原缓冲区地址
- }
复制代码
3.3、PC与PC通信
可以两个无线转USB配合使用(适用于PC端上位机与另一PC端上位机通信)
示例为PC端接两个无线转USB模块,使用一个串口助手作为数据接收,另一个串口助手作为数据发送,演示效果如下:
文章出处:逐飞科技
|
|