RoArm-M2-S ESP-NOW控制
ESP-NOW SETTINGS - ESP-NOW 配置
本教程主要是介绍如何给机械臂进行 ESP-NOW 配置,配置后,可以让机械臂实现一对一、一对多的 ESP-NOW 通信控制。其中,还是围绕 JSON 指令来实现这一功能。
ESP-NOW 通信协议
ESP-NOW 是由 Espressif Systems 开发的一种快速高效的无线通信协议,旨在提供低功耗、高性能的局域网(LAN)通信解决方案。它最初设计用于 ESP8266 和 ESP32 等 Espressif 的 Wi-Fi 芯片。
ESP-NOW 的特点如下:
1.低延时:ESP-NOW 协议不需要进行 TCP/IP 协议栈处理,因此具有很低的延迟,适合实时性要求较高的应用场景。
2.高吞吐量:ESP-NOW 协议使用帧广播方式发送数据,传输效率高,可以同时向多个节点发送相同的信息。
3.低功耗:ESP-NOW 协议在数据传输过程中使用的功耗非常低,适合电池供电场景。
4.简单易用:ESP-NOW 协议配置简单,只需定义通道、加密密钥和数据结构等基本参数即可实现无线通信。
5.支持多播:ESP-NOW 协议支持一对多或一对所有节点的通信方式,提高了网络的灵活性。
6.可扩展性:ESP-NOW 协议支持多种数据类型的传输,可以通过自定义数据结构来实现更复杂的通信功能。
ESP-NOW 功能
RoArm-M2-S 自带 ESP-NOW 功能,产品出厂开机后默认为 Follower 模式。该模式下机械臂允许被其它设备控制,也可以发送 ESP-NOW 信息到其它设备来控制其它设备。
ESP-NOW 通信数据结构体
在介绍各功能指令的含义之前,我们先介绍 RoArm-M2-S 的 ESP-NOW 通信数据结构体,如下:
typedef struct struct_message { byte devCode; float base; float shoulder; float elbow; float hand; byte cmd; char message[210]; } struct_message;
该部分中变量的具体赋值设置将会在部分 JSON 指令中进行设置,我们这里介绍下变量的含义:
- devCode:本设备的设备编号。在我们的使用例程中并没有用到该变量,因此可以选择不设置这一编号(始终设置为 0 即可)。在需要被控制的设备较多而不能使用组播控制、必须使用广播控制的情况下,可以使用这个变量来对 JSON 指令控制设备加以区分。这个是为自定义功能所保留的接口,针对您的需求来更改下位机程序中 esp_now_ctrl.h 内的 OnDataRecv() 函数。
- base: BASE 关节的角度(弧度制)。
- shoulder:SHOULDER 关节的角度(弧度制)。
- elbow:ELBOW 关节的角度(弧度制)。
- hand:GRIPPER/WRIST 关节的角度(弧度制)。
- cmd:ESP-NOW 控制信息类型。具体赋值请参照下方 JSON 指令的具体含义说明。
- message:一段字符串。当 ESP-NOW 控制信息类型为 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 地址。
输入该指令后,返回值如下:
44:17:93:EE:FD:70
每个设备的 MAC 地址都是独一无二的。当你使用 ESP-NOW 的相关功能时,除广播控制外,都需要获得被控制设备的 MAC 地址。默认情况下,每一台机械臂的 OLED 屏幕上会显示自己的 MAC 地址。
将被控制设备的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,"b":0,"s":0,"e":1.57,"h":1.57,"cmd":0,"megs":"hello!"} # 组播控制,将控制LED灯打开的JSON指令发送给peerList中的设备 {"T":305,"dev":0,"b":0,"s":0,"e":0,"h":0,"cmd":1,"megs":"{\"T\":114,\"led\":255}"}
- 305:这条指令为 CMD_ESP_NOW_GROUP_CTRL,使用该指令将信息通过 ESP-NOW 组播发送给 peerList 中的全部设备。
参考ESP-NOW 通信数据结构体部分的内容,该 JSON 指令中各个键对照结构体变量如下,且含补充部分:
- dev:对应变量 devCode。
- b、s、e、h:分别对应变量 base、shoulder、elbow 和 hand。
- cmd:ESP-NOW 控制信息类型。
- 当cmd为 0 时,被控制的机械臂会转动到给定的各个关节的角度;
- 当cmd为 1 时,b、s、e、h 无效,在 megs 输入不会引起阻塞的 JSON 指令,机械臂会执行 JSON 指令对应的功能。
- megs:对应变量 message。
单播/广播控制
# 单播控制,将控制关节角度的命令发送给特定设备 {"T":306,"mac":"44:17:93:EE:FD:70","dev":0,"b":0,"s":0,"e":1.57,"h":1.57,"cmd":0,"megs":"hello!"} # 广播控制,将控制关节角度的命令发送给全部设备 {"T":306,"mac":"FF:FF:FF:FF:FF:FF","dev":0,"b":0,"s":0,"e":1.57,"h":1.57,"cmd":0,"megs":"hello!"}
- 306:这条指令为 CMD_ESP_NOW_SINGLE,使用该指令可以单播或广播控制 peerList 中的设备。
- mac:被控制设备的 MAC 地址,当 MAC 地址为 FF:FF:FF:FF:FF:FF 时,该指令为广播信号,会发送给全部设备。
参考ESP-NOW 通信数据结构体部分的内容,该 JSON 指令中各个键对照结构体变量如下,且含补充部分:
- dev:对应变量 devCode。
- b、s、e、h:分别对应变量 base、shoulder、elbow 和 hand。
- cmd:ESP-NOW 控制信息类型。
- 当cmd为 0 时,被控制的机械臂会转动到给定的各个关节的角度;
- 当cmd为 1 时,b、s、e、h 无效,在 megs 输入不会引起阻塞的 JSON 指令,机械臂会执行 JSON 指令对应的功能。
- megs:对应变量 message。
注意,无论是组播控制,还是单播/广播控制,都需要提前将被控制设备的 MAC 地址添加到 peerList 中。
ESP-NOW 使用
了解完上方各个 JSON 指令的具体含义和使用,下面将介绍广播控制、单播控制和组播控制具体情况的使用。我们假设现在手上有四个新机械臂是没有格外配置过 ESP-NOW 相关的功能的,给这四个机械臂的编号分别标注为 A、B、C、D。
给四个机械臂分别接通电源,打开开关,待开机完成后,分别按照以下三种控制模式的步骤来操作。
广播控制
本部分用机械臂 A 广播控制机械臂 B、C、D 一起摆动。广播控制是不需要获取机械臂 B、C、D 的 MAC 地址,用广播 MAC 地址即可,示例操作如下:
将机械臂 A 用 USB 线通过 Type-C 接口与电脑连接,在电脑上与机械臂 A 进行串口通信。我们可以通过串口调试助手或 Arduino IDE 的串口监视来与机械臂 A 通信,也可以通过 Python 串口通信教程来与机械臂 A 通信。
首先先添加广播 MAC 地址,使用以下命令将广播 MAC 地址添加到机械臂 A 的 peerList 中:
{"T":303,"mac":"FF:FF:FF:FF:FF:FF"}
添加成功后,就可以使用广播控制的命令来给机械臂 B、C 和 D 发送 JSON 指令信息。
例如,使用以下命令将控制 LED 灯打开的命令通过机械臂 A 发送给机械臂 B、C、D。
{"T":306,"mac":"FF:FF:FF:FF:FF:FF","dev":0,"b":0,"s":0,"e":0,"h":0,"cmd":1,"megs":"{\"T\":114,\"led\":255}"}
发送指令成功后,此时机械臂 B、C、D 的 LED 灯会亮起来。
上述,只是广播控制发送信号的一个例子,也可以发送其它的 JSON 指令给机械臂 B、C、D,具体修改请参考 ESP-NOW 功能的广播控制指令的含义。
接着,使用以下命令关闭机械臂 A 的扭矩锁,这样可以用手自由摆动机械臂 A。
{"T":210,"cmd":0}
通过设置机械臂 A 的"ESP-NOW的工作方式" 来开启 [流广播 Leader] 模式。(当 peerList 中只有广播MAC地址时,原本的流单播模式就是流广播模式)
{"T":301,"mode":2}
此时机械臂 B、C、D 会摆动到与机械臂 A 相同的位置上,当你转动机械臂 A 的关节时,机械臂 B、C、D 也同时会跟着转动。
最后,通过将机械臂 A 的 "ESP-NOW的工作方式" 更改为 Follower 模式,即关闭 [流广播 Leader] 模式。输入以下命令:
{"T":301,"mode":3}
注意:上述所有的 JSON 指令皆是与机械臂 A 进行的通信。
单播控制
本部分用机械臂 A 单独控制机械臂 B 摆动,在单播控制的情况下,需要被控制设备的 MAC 地址,也就是需要机械臂 B 的 MAC 地址,MAC 地址可以从机械臂 B 的 OLED 屏幕上获取,例如 BB:BB:BB:BB:BB:BB。
将机械臂 A 用 USB 线通过 Type-C 接口与电脑连接,在电脑上与机械臂 A 进行串口通信。我们可以通过串口调试助手或 Arduino IDE 的串口监视来与机械臂 A 通信,也可以通过 Python 串口通信教程来与机械臂 A 通信。
首先先添加机械臂 B 的 MAC 地址,使用以下命令将 B 的 MAC 地址添加到机械臂 A 的 peerList 中:
{"T":303,"mac":"BB:BB:BB:BB:BB:BB"} #mac地址具体改为您要被控制设备的MAC地址
添加成功后,使用单播控制的命令给机械臂发送 JSON 指令信息。
注意:如果机械臂 B 的 MAC 地址之前已经添加过了,那么再次添加机械臂 B 的 MAC 地址因为添加了重复的 MAC 地址而会显示添加失败,但只要机械臂 B 的 MAC 地址正确,它依然会被判定为单播控制时的指定被控制设备。在开启 [流单播Leader] 模式后,只有机械臂 B 会跟着机械臂 A 发出的关节位置信息而运动。
例如,使用以下命令将控制 LED 灯打开的命令发送给机械臂 B。
{"T":306,"mac":"BB:BB:BB:BB:BB:BB","dev":0,"b":0,"s":0,"e":0,"h":0,"cmd":1,"megs":"{\"T\":114,\"led\":255}"}
如果您经过了广播控制操作的学习,那么此时机械臂B的LED灯应该是打开的状态,可以使用以下命令关闭机械臂B的LED灯:
{"T":306,"mac":"BB:BB:BB:BB:BB:BB","dev":0,"b":0,"s":0,"e":0,"h":0,"cmd":1,"megs":"{\"T\":114,\"led\":0}"}
接着,使用以下命令关闭机械臂 A 的扭矩锁,这样可以用手自由摆动机械臂 A 。
{"T":210,"cmd":0}
通过设置机械臂 A 的 "ESP-NOW的工作方式" 来开启 [流单播 Leader] 模式。就算您此时经过了广播控制操作的学习,但由于此时最新添加的 MAC 地址是 B 的地址,所以 [流单播 Leader] 模式仅仅会将关节角度信息发送给机械臂 B。
{"T":301,"mode":2}
此时 B 会摆动到与 A 相同的位置上,当你转动机械臂 A 的关节时,机械臂 B 也同时会跟着转动,而机械臂 C、D 不会有动作。
注意:上述所有的 JSON 指令皆是与机械臂 A 进行的通信。
组播控制
本部分用机械臂 A 组播控制机械臂 B、C 摆动,在组播控制的情况下,需要被控制设备的 MAC 地址,也就是需要机械臂 B 和 C 的 MAC 地址,MAC 地址可以从机械臂 B 和机械臂 C 的 OLED 屏幕上获取,例如 BB:BB:BB:BB:BB:BB 和 CC:CC:CC:CC:CC:CC。
将机械臂 A 用 USB 线通过 Type-C 接口与电脑连接,在电脑上与机械臂 A 进行串口通信。我们可以通过串口调试助手或 Arduino IDE 的串口监视来与机械臂 A 通信,也可以通过 Python 串口通信教程来与机械臂 A 通信。
首先先添加机械臂 B 和机械臂 C 的 MAC 地址,使用以下命令将机械臂 B 和机械臂 C 的 MAC 地址添加到机械臂 A 的 peerList 中:
{"T":303,"mac":"BB:BB:BB:BB:BB:BB"} {"T":303,"mac":"CC:CC:CC:CC:CC:CC"} #mac地址具体改为您要被控制的两台设备的MAC地址
如果经过单播控制的操作,你已经将 B 的 MAC 地址添加到了 peerList 中了,执行添加机械臂 B 的 MAC 地址的 JSON 指令可能会报错,忽略即可。
如果经过广播控制的操作,你已经添加了广播地址,则需要删除广播地址,使用以下命令来删除机械臂 A 的 peerList 中的广播地址:
{"T":304,"mac":"FF:FF:FF:FF:FF:FF"}
可以使用以下命令将控制 LED 灯打开的命令发送给机械臂 B 和机械臂 C。
{"T":305,"dev":0,"b":0,"s":0,"e":0,"h":0,"cmd":1,"megs":"{\"T\":114,\"led\":255}"}
如果 LED 灯已经是打开的状态,可以使用以下命令关闭机械臂 B 和机械臂 C 的 LED 灯。
{"T":305,"dev":0,"b":0,"s":0,"e":0,"h":0,"cmd":1,"megs":"{\"T\":114,\"led\":0}"}
接着,使用以下命令关闭机械臂 A 的扭矩锁,这样可以用手自由摆动机械臂 A。
{"T":210,"cmd":0}
通过设置机械臂 A 的 "ESP-NOW的工作方式" 来开启 [流组播 Leader] 模式,这会将机械臂 A 的关节角度信息持续发送给机械臂 B 和 C。
{"T":301,"mode":1}
此时机械臂 B 和 C 会摆动到与机械臂 A 相同的位置上,当你转动机械臂 A 的关节时,机械臂 B 和 C 也同时会跟着改变。
注意:上述所有的 JSON 指令皆是与机械臂 A 进行的通信。
RoArm-M2-S 教程目录
RoArm-M2-S 使用教程
- RoArm-M2-S_Web端使用
- RoArm-M2-S_开发工具使用
- RoArm-M2-S_JSON指令含义
- RoArm-M2-S_WIFI配置
- RoArm-M2-S_机械臂控制
- RoArm-M2-S_末端关节设置
- RoArm-M2-S_FLASH文件系统操作
- RoArm-M2-S_步骤录制和重现
- RoArm-M2-S_ESP-NOW控制
- RoArm-M2-S_Python串口通信控制
- RoArm-M2-S_Python HTTP请求通信