更新
EBYTE 收发器
本库旨在与UART型EBYTE收发器(如E44-TTL-100)一起使用,这些是适用于Teensy和Arduino等微控制器的小型无线单元。本库允许用户编程操作参数,并可以发送和接收数据。 该公司生产多种具有不同功能的模块,但此处的大多数#defines应该与它们兼容。 所有常量都是从多个数据表中提取的,并以二进制形式列出,因为数据表就是这样表示每个设置的。 希望对常量的任何更改或添加都可以直接从数据表复制到#defines中。 使用本库大约消耗970字节。
您实际上只需要这个库来编程这些EBYTE单元。
要读取数据结构,您可以直接在EBYTE的Serial对象上调用readBytes方法:
ESerial.readBytes((uint8_t*)& MyData, (uint8_t) sizeof(MyData));
要写入数据结构,您可以直接在EBYTE的Serial对象上调用write方法:
ESerial.write((uint8_t*) &MyData, (uint8_t) sizeof(MyData) );
EBYTE型号(仅显示部分列表)
旧型号命名方案
E30-TTL-100,E30-490T20D, E31-TTL-100, E32-TTL-100, E32-TTL-500, E32-TTL-1W, E41-TTL-100, E41-TTL-100, E44-TTL-100, E44-TTL-500, E44-TTL-1W, E50-TTL-100, E50-TTL-500, E51-TTL-100, E51-TTL-500, E51-TTL-1W
新型号命名方案 E22-900T22S, E22-230T22S, E22-400T22S, E22-230T30S, E22-400T30S, E22-900T30S, E30-433T20S3, E30-170T20D, E30-170T27D, E30-780T20S, E30-868T20S, E30-868T20D, E30-915T20D, E30-490T20D, E30-433T20S, E30-433T20D, E30-915T20S, E30-490T20S, E31-433T30S, E31-433T17S3, E31-230T33D, E31-230T17D, E31-230T27D, E31-433T17S, E31-433T17D, E31-433T27D, E31-433T30D, E31-433T33D, E32-433T20DC, E32-433T20S, E32-433T20S2T, E32-433T27D, E32-433T30D, E32-433T30S, E32-868T20D, E32-868T20S, E32-868T30D, E32-868T30S, E32-915T20D, E32-915T20S, E32-915T30D, E32-915T30S, E32-170T30D, E32-400T20S
注意:请查看EBYTE网站,确保所选模块支持UART通信,某些模块仅支持SPI。
这里有一个关于库使用的YouTube视频:https://youtu.be/hMjArKGucFA
模块连接
模块 MCU 描述- MO 任意数字引脚* 控制工作/编程模式的引脚
- M1 任意数字引脚* 控制工作/编程模式的引脚
- Rx 任意数字引脚* 连接到MCU的TX引脚(模块向MCU发送数据,因此MCU必须从模块接收数据)
- Tx 任意数字引脚* 连接到MCU的RX引脚(模块向MCU发送数据,因此MCU必须从模块接收数据)
- AUX 任意数字引脚 指示操作完成的引脚(低电平表示忙碌,高电平表示完成)(可以用-1省略,但会使用固定恢复时间,可能不足以完成操作)
- Vcc +3.3V或5.0V,注意使用5.0V时单元可能会更热并消耗更多电力
- Vcc 接地 模块和MCU必须共地
注意
- 连接到Arduino的0和1引脚时要小心,因为这些引脚用于与PC的USB连接,所以在编程时不能连接EBYTE。我建议不要使用Arduino的0和1引脚。
- 这些单元的信号线为3.3V,但可以承受5V,然而5V可能导致通信失败。如果使用5V的MCU(如Arduino),您可能需要执行以下操作: a) 如果使用Arduino,可能需要在Rx和AUX引脚(可能还有Tx)上加4.7K-10K的上拉电阻。 b) 如果使用Arduino,可能需要在MCU的Tx和收发器的Rx之间加一个4.7K的串联电阻。
- 在我的一些应用中,没有足够的数字引脚来连接Aux引脚。不用担心(只需在创建对象的参数列表中传入-1)。库中内置了适当的延迟,以确保传输完成——您可能需要实验来确定合适的延迟时间。
- 连接的串行引脚取决于MCU,例如Teensy 3.2:Serial1的Rx=0,Tx=1,Serial2的Rx=9,Tx=10,Serial3的Rx=7,Tx=8。Arduino可以使用SoftwareSerial(MCU_Rx_pin, MCU_Tx_pin)在大多数串行引脚上使用,除了0和1号引脚,因为这些是用于USB的。
- 一些MCU,如Teensy和ESP32,不允许使用SoftwareSerial创建通信端口。不用担心,只需将EBYTE直接连接到专用的UART端口(例如Teensy 3.2上的0号和1号引脚用于Serial1)。
制造商网站
http://www.ebyte.com/en/ 本库适用的示例模块 http://www.ebyte.com/en/product-view-news.aspx?id=174一般代码用法
- 创建一个串行对象
- 创建使用该串行对象的EBYTE对象
- 初始化串行对象
- 初始化EBYTE对象
- 设置参数(可选,但如果发送方和接收方不同则必需)
- 发送或接收数据(单字节)或创建并发送数据结构
使用技巧
为获得最佳范围:
- 数据表表明,天线离地2米时效果最佳
- 理想情况下应视线可见,但根据我的个人测试,即使有一些障碍物,传输仍然可以成功
- 较慢的空中数据率可以改善范围,但由于传输时间较长,数据发送频率会受到影响
- 考虑使用高增益天线(可从制造商处购买),详情请参见他们的网站
- 数据表称,为获得最大范围,应使用5.0伏电压供电(信号线保持3.3V)。我个人发现更高的供电电压对范围影响不大
- 数据表称,为获得最大范围,应将空中数据率设置为2.4 bps。我个人发现较低的数据率对范围影响不大,而且较低的数据率可能会限制数据发送的频率。
数据传输数据包
- 该库有一个发送单字节的方法,但如果需要发送更多数据,请创建一个数据结构,并使用库的SendStruct(&struct, sizeof(struct))方法发送数据结构。注意传递引用,所以在结构名前加上&
- 同样,较慢的数据速率需要更长时间,你需要根据数据大小实验理想的空中数据速率范围
- 如果你需要在不同的MCU之间使用结构体发送数据,每个处理器的打包方式可能会有所不同。如果在接收端得到损坏的数据,有一些方法可以强制编译器不优化结构体打包——我还没能让它们正常工作。对我有效的方法是使用一个创建结构体并处理发送的库。查看EasyTransfer.h(搜索并选择你喜欢的作者)。在这些库中,你将使用它们的方法来发送和获取结构体(有硬件和软件库,请根据情况使用。这意味着你可以使用这个库来编程和管理设置,但使用EasyTransfer来处理通过EBYTE使用的串行线发送数据。听起来很奇怪,但这与使用Serial1.sendBytes(...)没有什么不同,因为这实际上就是这个库在调用的内容。也许有一天我会将EasyTransfer技术集成到这个sendstruct库中)。
调试
- 如果你的无线模块在PrintParameters()方法中返回全0或只返回型号,并且你正在使用硬件串口,并且你正在使用ESP32,请确保在begin()语句中使用完整的串口定义,如下所示:
-
#include <HardwareSerial.h>
-
#define Serial_0 Serial2
-
Serial_0.begin(9600, SERIAL_8N1, 16, 17);
- 如果你的无线模块在PrintParameters()方法中返回全0,请确保你的接线正确且工作正常,MCU的Rx需要连接到EBYTE的Tx,反之亦然。同时确保M0、M1和AUX连接到有效的数字端口。大多数问题都是由于数据线连接不正确造成的
- 如果你的无线模块在PrintParameters()方法中返回全0,并且你确定接线正确,你的模块在模式更改期间可能反应较慢,无法及时响应pinMode的变化。数据手册说需要2毫秒的延迟,但我发现10毫秒更可靠。对于某些单元,甚至需要更多时间。库的默认值是50毫秒,但如果参数读取不正确,请在.h文件中增加这个值。
- 如果你的无线模块在PrintParameters()方法中返回全0,并且你确定接线正确,且你的MCU是5V的,你可能需要在MCU的Tx和AUX线上添加电压分压器。如果向这些模块发送5V信号,它们可能会变得不稳定。当使用单独的3.3V电源为模块供电时,我得到了非常可靠的结果。我通常使用降压转换器或线性稳压器。
- 如果使用5V MCU,你可能需要在MCU的Tx线到EBYTE的Rx线以及可能的M0和M1线上加串联电阻。这些EBYTE单元应该能承受5V,但小心为上。制造商还声称MCU的Tx线和AUX可能需要4.7K上拉电阻。我在UNO、MEGA和NANO上使用这些收发器时没有使用任何电阻,一切正常。但我确实遇到过一次NANO无法与这些收发器一起工作,需要一些奇怪的供电方式。
- 如果你使用的是他们的1W单元(30dB功率输出),请将单元与MCU的板载电源分开供电。电流消耗可能超过板载额定值,导致MCU损坏。我在尝试为1W单元供电时曾经烧毁了NANO的板载电压调节器。
- 如果发射器和接收器使用不同的MCU(Arduino <-> Teensy),发送数据结构的打包方式会有所不同,无论结构数据类型如何。这是由于8位处理器和32位处理器处理打包过程的方式不同。选项1)使用EasyTransfer库。我使用这个库,效果很好。选项2)尝试使用__attribute__((packed))变量属性。选项3)别笑,但如果发送浮点数,考虑将浮点数乘以100(并重新转换为整数),然后在接收端将该值除以100(重新转换为浮点数)
- 如果你从.PrintParameters得到的数据似乎损坏了,试着在你的.INO程序中添加#include "avr/io.h"
- 如果你从单独的电源为EBYTE模块供电,请确保所有接地都已连接