ESP-NOW 控制
ESP-NOW SETTINGS - ESP-NOW 配置
本教程旨在指导用户为机器人配置 ESP-NOW 通信,实现基于 JSON 指令格式的一对一及一对多无线控制功能。
ESP-NOW 通信协议
ESP-NOW 是由 Espressif Systems 开发的一种快速高效的无线通信协议,旨在提供低功耗、高性能的局域网(LAN)通信解决方案。它最初设计用于 ESP8266 和 ESP32 等 Espressif 的 Wi-Fi 芯片。 ESP-NOW 的特点如下:
-
低延时:ESP-NOW 协议不需要进行 TCP/IP 协议栈处理,因此具有很低的延迟,适合实时性要求较高的应用场景。
-
高吞吐量:ESP-NOW 协议使用帧广播方式发送数据,传输效率高,可以同时向多个节点发送相同的信息。
-
低功耗:ESP-NOW 协议在数据传输过程中使用的功耗非常低,适合电池供电场景。
-
简单易用:ESP-NOW 协议配置简单,只需定义通道、加密密钥和数据结构等基本参数即可实现无线通信。
-
支持多播:ESP-NOW 协议支持一对多或一对所有节点的通信方式,提高了网络的灵活性。
-
可扩展性:ESP-NOW 协议支持多种数据类型的传输,可以通过自定义数据结构来实现更复杂的通信功能。
ESP-NOW 功能
HexArth 自带 ESP-NOW 功能,产品出厂开机后默认为 Follower 模式。该模式下机器人允许被其它设备控制,也可以发送 ESP-NOW 信息到其它设备来控制其它设备。
ESP-NOW 通信数据结构体
在介绍各功能指令的含义之前,我们先介绍 HexArth 的 ESP-NOW 通信数据结构体,如下:
struct Vec3 {
double x;
double y;
double z;
};
typedef struct struct_message {
byte devCode;
Vec3 ESPInBase[6];
byte cmd;
char message[50];
} struct_message;
该部分中变量的具体赋值设置将会在部分 JSON 指令中进行设置,我们这里介绍下变量的含义:
devCode:本设备的设备编号。在我们的使用例程中并没有用到该变量,因此可以选择不设置这一编号(始终设置为 0 即可)。在需要被控制的设备较多而不能使用组播控制、必须使用广播控制的情况下,可以使用这个变量来对 JSON 指令控制设备加以区分。这个是为自定义功能所保留的接口,针对您的需求来更改下位机程序中esp_now_ctrl.h内的OnDataRecv()函数。ESPInBase: 是Vec3结构体数组里面包含了各个腿的坐标值,单位为 mm。cmd:ESP-NOW 控制信息类型。具体赋值请参照下方 JSON 指令的具体含义说明。message:一段字符串。当 ESP-NOW 控制信息类型(cmd)为1时,会将这个字符串当作 JSON 格式的指令来使用,但是指令内容不可以为会产生长时间阻塞的指令。 接下来,我们来看 ESP-NOW 配置相关 JSON 指令的具体含义。
设置广播从动模式
{"T":300,"mode":1}
{"T":300,"mode":0,"mac":"00:00:00:00:00:00"}
300:这条指令为CMD_BROADCAST_FOLLOWER,用来设置该设备的广播从动模式。mode:1- [出厂默认] 该设备可以被其它设备发出的广播信号来控制。0- 该设备不可以被其它设备发出的广播信号来控制。
mac:在mode值为0的情况下,唯一 Leader 控制设备的 MAC 地址。- 给定一个 MAC 地址,则该设备只可以被给定 MAC 地址的设备所发出的 ESP-NOW 信息而控制;
- 如果该设备不需要被任何设备控制,可以输入任意一个编造的 MAC 地址,例如:
00:00:00:00:00:00。
设置 ESP-NOW 的工作方式
{ "T": 301, "mode": 3 }
301:这条指令为CMD_ESP_NOW_CONFIG,用来设置该设备 ESP-NOW 的工作方式。mode(byte):ESP-NOW 的工作方式的代号。0- 关闭;1- 流组播 Leader,持续向peerList中的设备发送自己的坐标位置信息;2- 流单播/流广播 Leader,持续向某一 MAC 地址的设备发送自己的坐标位置信息,当 MAC 地址设置为FF:FF:FF:FF:FF:FF则为流广播控制;3- [出厂默认] Follower,当机器人处于这一模式下时,可以接收来自其它 Leader 设备的 ESP-NOW 信息,也可以作为 Leader 设备向其它设备发送 ESP-NOW 信息。
注意只有在流组播、流单播/流广播模式下,主控制设备会持续向被控制设备发送自己的坐标位置信息,手动转动主控制设备,被控制设备才会跟着做出相同的运动动作。
获得本设备的 MAC 地址
{ "T": 302 }
302:这条指令为CMD_GET_MAC_ADDRESS,用来获得本设备的 MAC 地址。 输入该指令后,返回值如下:每个设备的 MAC 地址都是独一无二的。当你使用 ESP-NOW 的相关功能时,除广播控制外,都需要获得被控制设备的 MAC 地址。默认情况下,每一台机器人的 OLED 屏幕上会显示自己的 MAC 地址。44:17:93:EE:FD:70
将被控制设备的 MAC 地址添加到 peerList
{ "T": 303, "mac": "44:17:93:EE:FD:70" }
303:这条指令为CMD_ESP_NOW_ADD_FOLLOWER,该指令用来将被控制设备的 MAC 地址添加到peerList中。peerList是用来存储 MAC 地址的。mac:需要添加的被控制设备的 MAC 地址。peerList中可以添加十几个 MAC 地址用于组播控制,但是当使用组播控制时,peerList中不可以存有用于广播控制的 MAC 地址:FF:FF:FF:FF:FF:FF。
将被控制设备的 MAC 地址从 peerList 中删除
{ "T": 304, "mac": "44:17:93:EE:FD:70" }
304:这条指令为CMD_ESP_NOW_REMOVE_FOLLOWER,用来将被控制设备的 MAC 地址从peerList中删除。mac:需要删除的被控制设备的 MAC 地址。
组播控制
//组播控制 peerList 中的设备将腿部末端点的坐标摆动到指定的位置
{"T":305,"dev":0,"x1":156.24,"y1":-109.69,"z1":-80.83,"x2":0.18,"y2":-197.19,"z2":-80.83,"x3":-156.06,"y3":-110,"z3":-80.83,"x4":156.06,"y4":110,"z4":-80.83,"x5":-0.18,"y5":197.19,"z5":-80.83,"x6":-156.24,"y6":109.69,"z6":-80.83,"cmd":0,"megs":"hello!"}
//组播控制,将控制 LED 灯打开的 JSON 指令发送给 peerList 中的设备
{"T":305,"dev":0,"x1":156.24,"y1":-109.69,"z1":-80.83,"x2":0.18,"y2":-197.19,"z2":-80.83,"x3":-156.06,"y3":-110,"z3":-80.83,"x4":156.06,"y4":110,"z4":-80.83,"x5":-0.18,"y5":197.19,"z5":-80.83,"x6":-156.24,"y6":109.69,"z6":-80.83,"cmd":1,"megs":"{\"T\":114,\"led\":255}"}
305:这条指令为CMD_ESP_NOW_GROUP_CTRL,使用该指令将信息通过 ESP-NOW 组播发送给peerList中的全部设备。 参考 ESP-NOW 通信数据结构体 部分的内容,该 JSON 指令中各个键对照结构体变量如下,且含补充部分:dev:对应变量devCode。x、y、z:分别对应数组ESPINBase中的x、y、z。cmd:ESP-NOW 控制信息类型。- 当
cmd为0时,被控制的机器人的各条腿会转动到给定的坐标位置; - 当
cmd为1时,x、y、z 无效,在 megs 输入不会引起阻塞的 JSON 指令,机器人会执行 JSON 指令对应的功能。
- 当
- megs:对应变量 message。
单播/广播控制
//单播控制,将控制坐标的命令发送给特定设备
{"T":306,"mac":"44:17:93:EE:FD:70","dev":0,"x1":156.24,"y1":-109.69,"z1":-80.83,"x2":0.18,"y2":-197.19,"z2":-80.83,"x3":-156.06,"y3":-110,"z3":-80.83,"x4":156.06,"y4":110,"z4":-80.83,"x5":-0.18,"y5":197.19,"z5":-80.83,"x6":-156.24,"y6":109.69,"z6":-80.83,"cmd":0,"megs":"hello!"}
//广播控制,将控制坐标的命令发送给全部设备
{"T":306,"mac":"FF:FF:FF:FF:FF:FF","dev":0,"x1":156.24,"y1":-109.69,"z1":-80.83,"x2":0.18,"y2":-197.19,"z2":-80.83,"x3":-156.06,"y3":-110,"z3":-80.83,"x4":156.06,"y4":110,"z4":-80.83,"x5":-0.18,"y5":197.19,"z5":-80.83,"x6":-156.24,"y6":109.69,"z6":-80.83,"cmd":0,"megs":"hello!"}
306:这条指令为CMD_ESP_NOW_SINGLE,使用该指令可以单播或广播控制peerList中的设备。mac:被控制设备的 MAC 地址,当 MAC 地址为FF:FF:FF:FF:FF:FF时,该指令为广播信号,会发送给全部设备。 参考 ESP-NOW 通信数据结构体 部分的内容,该 JSON 指令中各个键对照结构体变量如下,且含补充部分:dev:对应变量devCode。x、y、z:分别对应数组ESPINBase中的x、y、z。cmd:ESP-NOW 控制信息类型。- 当
cmd为0时,被控制的机器人的各条腿会转动到给定的坐标位置; - 当
cmd为1时,x、y、z 无效,在 megs 输入不会引起阻塞的 JSON 指令,机器人会执行 JSON 指令对应的功能。
- 当
- megs:对应变量 message。
注意
无论是组播控制,还是单播/广播控制,都需要提前将被控制设备的 MAC 地址添加到
peerList中。