资源配置
概述
Node-MQ可配置的硬件资源包括:
- 29 x GPIO引脚
- 10 x ADC通道(12-bit)
- 8 x PWM通道(12-bit)
- 3 x UART控制器
- 2 x I2C接口(主机)
- 2 x SPI接口(主机)
ESP32-S3的部分硬件资源保留用于系统功能,不包含在Node-MQ的可配置资源中。例如,全部45个GPIO引脚中,部分用作Strapping(启动配置)引脚,以及连接内部或外部Flash/PSRAM的引脚。详细信息请参考 ESP32-S3引脚说明。
Node-MQ使用统一的config指令管理所有硬件资源,包括资源的配置、释放以及当前配置的查看。
config指令样例:
{
"action": "config",
"input": [1, 2, 3],
"output": [4, 5, 6],
"pwm": [
{
"freq_hz": 100,
"io_num": [7, 8]
}
],
"uart": [
{
"uart_num": 0,
"post_encoding": "base64"
}
]
}发送不带参数的config指令,可以查看当前系统配置信息。不带参数的config指令:
{
"action": "config"
}config指令可以多次执行,逐步配置不同的资源,或释放、修改已配置的资源。Node-MQ采用增量方式配置资源。
Node-MQ收到config指令并完成相应的配置后(如果有),将应答当前系统的完整配置信息(type-config)。
硬件资源序号
config指令的参数通常需要引用对应的硬件资源序号,例如GPIO序号、UART控制器序号等。这些序号定义如下:
GPIO序号 - 使用与ESP32-S3数据手册一致的定义,即通常标注在PCB引脚旁的数字。可配置的29个GPIO为:
json[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 21, 38, 39, 40, 41, 42, 43, 44, 46, 47, 48 ]UART控制器序号 - 使用与ESP32-S3数据手册一致的定义,即UART0、UART1、UART2。对应的参数值为:
json[0, 1, 2]I2C接口序号 - 使用与ESP32-S3数据手册一致的定义,即I2C_NUM_0、I2C_NUM_1。对应的参数值为:
json[0, 1]SPI接口序号 - SPI接口的情况有所不同。ESP32-S3共有SPI0~SPI3 4个SPI接口。其中,SPI0和SPI1由系统保留,用于Flash/PSRAM访问。可供用户使用的是SPI2和SPI3。Node-MQ顺序定义了SPI_NUM_0与SPI_NUM_1分别对应数据手册中的SPI2与SPI3。SPI_NUM_0、SPI_NUM_1对应的参数值为:
json[0, 1]
参数说明
config指令的参数覆盖所有可配置的硬件资源,以下将分类说明。
提示
所有指令参数可以任意组合使用(不受分类限制)。
GPIO
- input
[array] (?)设置为输入模式的GPIO序号数组。 - output
[array] (?)设置为输出模式的GPIO序号数组。 - pullup
[array] (?)启用内部上拉电阻的GPIO序号数组。 - pulldown
[array] (?)启用内部下拉电阻的GPIO序号数组。 - posedge
[array] (?)设置为上升沿触发的GPIO序号数组。 - negedge
[array] (?)设置为下降沿触发的GPIO序号数组。 - anyedge
[array] (?)设置为任意边沿触发的GPIO序号数组。
- GPIO引脚可以同时设置为输入和输出,即同时具备读写功能。例如:
json{ "action": "config", "input": [1, 2], "output": [1, 2] }- GPIO引脚在一次
config指令中的 input、output、pullup、pulldown 值会覆盖该引脚之前的对应设置,而其已有的触发设置会保留。- ESP32-S3各GPIO引脚的驱动电流为:GPIO17、GPIO18约10 mA;其他引脚约20 mA。
- ESP32-S3的内部上拉/下拉电阻约为45 kΩ。
- 当设置为触发(中断)的GPIO满足触发条件时,Node-MQ将发送该GPIO对应的 type-digital 消息到
config指令所使用的通道。
样例
{
"action": "config",
"input": [1],
"output": [2, 3],
"pulldown": [1],
"posedge": [1]
}
input- 设置GPIO1引脚为输入模式。output- 设置GPIO2、GPIO3引脚为输出模式。pulldown- 启用GPIO1引脚的内部下拉电阻。posedge- 设置GPIO1引脚为上升沿触发。
ADC
- analog
[array] (?)启用模拟输入功能(ADC)的GPIO序号数组。
- Node-MQ有10个可配置的ADC通道,对应GPIO1~GPIO10,即 analog 数组元素的取值范围
1~10。- ADC采样分辨率为12-bit,读数值范围
0~4095。
monitor
[array] (?)模拟量监视器对象数组。模拟量监视器可以实时监视 analog 参数中定义的模拟输入引脚,当输入电平满足监视器设置的触发条件时,Node-MQ将发送对应该引脚的 type-analog 消息到
config指令所使用的通道。监视器对象的JSON属性定义:
- io_num
[array] (!)要监视的GPIO序号数组,各引脚必须已经配置为 analog。 - remove
[bool] (?)为true时,释放并移除 io_num 对应的监视器。默认false。 - period_ms
[int] (?)引脚电平的采样周期,单位毫秒,调整步长为100ms。默认值500ms。 - grain
[int] (?)采样变化粒度。在无阈值条件的情况下,当采样值的变化量大于或等于该参数时,满足触发条件。默认值为1。 - high
[int] (?)上限阈值。指定该参数后,当采样值向上越过阈值时,满足触发条件。取值范围0~4095。 - low
[int] (?)下限阈值。指定该参数后,当采样值向下越过阈值时,满足触发条件。取值范围0~4095。
- io_num
样例
{
"action": "config",
"analog": [4, 5, 6],
"monitor": [
{
"io_num": [4],
"period_ms": 1000,
"grain": 5
},
{
"io_num": [5, 6],
"period_ms": 1000,
"high": 1024
}
]
}
analog- 设置GPIO4、GPIO5、GPIO6为模拟输入引脚。monitor- 监视器对象数组:
- 监视器[0] - 模拟输入引脚:GPIO4;采样周期:1000 ms(1秒);采样变化粒度:5。
- 监视器[1] - 模拟输入引脚:GPIO5、GPIO6;采样周期:1000 ms(1秒);上限阈值:1024。
PWM
pwm
[array] (?)PWM配置对象数组。Node-MQ有8个可配置的PWM通道,可以绑定到任意GPIO引脚。8个通道共用4个产生PWM频率的LEDC定时器。因此,8个通道可以任意分为4组不同频率的PWM输出。所有PWM通道均具有12-bit duty分辨率。
PWM配置对象按照PWM频率对输出引脚进行分组设置。PWM配置对象的JSON属性定义:
- freq_hz
[int] (?)该分组的PWM频率,单位赫兹。默认值100Hz,最大允许值100 kHz。 - io_num
[array] (!)该分组绑定的输出GPIO序号数组。
最多允许4组不同频率的PWM配置(4个定时器),所有分组的GPIO数量合计不得超过8个(8个PWM通道)。
- freq_hz
样例
{
"action": "config",
"pwm": [
{
"io_num": [7, 8]
},
{
"freq_hz": 1000,
"io_num": [9]
}
]
}
pwm- 不同频率的PWM输出分组:
- 分组[0] - PWM频率:100 Hz(默认值);输出引脚:GPIO7、GPIO8。
- 分组[1] - PWM频率:1000 Hz;输出引脚:GPIO9。
重置
reset
[array] (?)重置引脚为默认状态的GPIO序号数组。配置为GPIO、ADC或PWM功能的引脚,可以通过 reset 取消已配置的功能,并恢复为默认状态。默认状态为不指定输入/输出模式的GPIO,无内部上拉/下拉电阻,无触发。
样例
{
"action": "config",
"reset": [1, 2, 3, 4, 5, 6, 7, 8, 9]
}
reset- 重置GPIO1~GPIO9引脚为默认状态。
UART
uart
[array] (?)UART配置对象数组。Node-MQ有3个可配置的UART控制器(控制器序号0~2)。默认TX/RX引脚为:
UART控制器 默认TX引脚 默认RX引脚 UART0 43 44 UART1 17 18 UART2 39 40 UART配置对象的JSON属性定义:
- uart_num
[int] (!)该配置对象的UART序号。取值范围0~2。 - remove
[bool] (?)为true时,释放并移除 uart_num 对应的UART控制器。默认false。 - tx
[int] (?)TX引脚的GPIO序号。不指定时使用默认TX引脚。 - rx
[int] (?)RX引脚的GPIO序号。不指定时使用默认RX引脚。 - baud_rate
[int] (?)传输波特率,默认值115200。 - data_bits
[int] (?)数据位数,默认值8。取值范围5~8。 - parity
[string] (?)奇偶校验方式,默认值none。可选值:even- 偶校验odd- 奇校验none- 无校验
- stop_bits
[float](?)停止位数量,默认值1。可选值:1、1.5、2。 - post
[bool] (?)为true时,该UART RX接收的数据将以 type-uart 消息转发到config指令所使用的通道。默认true。 - post_encoding
[string] (?)当 post 为true时,转发数据所使用的编码格式。默认值json。可选值:json- 对RX接收的数据进行JSON转义,适用于文本数据。base64- 对RX接收的数据进行Base64编码,适用于二进制数据。hex- 将RX接收的数据转换为Hex文本,适用于二进制数据。
- action
[bool] (?)为true时,该UART将作为指令通道使用。默认false。
- 当 action 为
true时,该UART的RX接收数据将作为指令解析并执行,同时由TX输出指令执行结果。 - 当 action 为
true时,post 参数无效(接收数据作为指令而非数据)。 - 当 remove 释放UART控制器后,其占用的TX、RX引脚将恢复为默认GPIO状态。
- uart_num
样例
启用UART0、UART1:
json{ "action": "config", "uart": [ { "uart_num": 0, "post_encoding": "base64" }, { "uart_num": 1, "action": true } ] }uart- 要启用的UART配置对象数组:- 配置[0] - UART序号:0;转发数据编码:base64。
- 配置[1] - UART序号:1;设置为指令通道:true。
移除UART1:
json{ "action": "config", "uart": [ { "uart_num": 1, "remove": true } ] }
I2C
i2c
[array] (?)I2C接口配置对象数组。Node-MQ有2个可配置的I2C接口(I2C接口序号0~1)。
I2C接口配置对象的JSON属性定义:
- i2c_num
[int] (!)该配置对象的I2C接口序号。取值范围0~1。 - remove
[bool] (?)为true时,释放并移除 i2c_num 对应的I2C接口。默认false。 - sda
[int] (!)SDA引脚的GPIO序号。 - scl
[int] (!)SCL引脚的GPIO序号。
- Node-MQ的I2C接口采用总线与设备分离的配置方式。I2C总线由 i2c 参数配置,仅定义总线相关的引脚信息。与I2C设备相关的地址、速度等信息则由 i2c_device 参数定义。
- 当 remove 释放I2C接口后,其占用的SDA、SCL引脚将恢复为默认GPIO状态。
- i2c_num
i2c_device
[array] (?)I2C设备配置对象数组。I2C设备配置用于定义具体的I2C设备,例如24C02N EEPROM。I2C设备通过I2C接口序号引用已配置的I2C接口(总线),一个I2C总线上可以定义多个I2C设备。
I2C设备配置对象的JSON属性定义:
- name
[string] (!)用户定义的设备名。I2C设备操作指令使用该名称访问设备。最大长度15个字符。 - remove
[bool] (?)为true时,释放并移除 name 对应的I2C设备。默认false。 - i2c_num
[int] (!)已配置的I2C接口序号。 - address
[int] (!)I2C设备地址(7-bit)。取值范围0~127(十进制)。 - speed_hz
[int] (?)SCL频率,单位赫兹。默认值100000(100 kHz),最大允许值400 kHz。
- name
样例
启用I2C_NUM_0接口,添加I2C设备(24C02N EEPROM):
json{ "action": "config", "i2c": [ { "i2c_num": 0, "sda": 15, "scl": 16 } ], "i2c_device": [ { "name": "eeprom", "i2c_num": 0, "address": 80 } ] }i2c- 要启用的I2C接口配置对象数组:- 配置[0] - I2C接口序号:0;SDA引脚:GPIO15;SCL引脚:GPIO16。
i2c_device- 要添加的I2C设备配置对象数组:- 配置[0] - I2C设备名:eeprom;I2C接口序号:0;设备地址:80。
移除I2C设备(eeprom)并移除I2C_NUM_0接口:
json[ { "action": "config", "i2c_device": [ { "name": "eeprom", "remove": true } ] }, { "action": "config", "i2c": [ { "i2c_num": 0, "remove": true } ] } ]- 移除I2C总线之前,需要先移除该总线上的所有设备。
- 样例使用指令数组形式,以确保先移除I2C设备,再移除I2C总线。
SPI
spi
[array] (?)SPI接口配置对象数组。Node-MQ有2个可配置的SPI接口(SPI接口序号0~1)。
SPI接口配置对象的JSON属性定义:
- spi_num
[int] (!)该配置对象的SPI接口序号。取值范围0~1。 - remove
[bool] (?)为true时,释放并移除 spi_num 对应的SPI接口。默认false。 - mosi
[int] (?)MOSI引脚的GPIO序号。 - miso
[int] (?)MISO引脚的GPIO序号。 - sclk
[int] (!)SCLK引脚的GPIO序号。
- Node-MQ的SPI接口采用总线与设备分离的配置方式。SPI总线由 spi 参数配置,仅定义总线相关的引脚信息。与SPI设备相关的模式、频率、片选、位序等信息则由 spi_device 参数定义。
- SPI接口的 mosi 与 miso 引脚可根据设备要求选择配置。
- 当 remove 释放SPI接口后,其占用的MOSI、MISO、SCLK引脚将恢复为默认GPIO状态。
- spi_num
spi_device
[array] (?)SPI设备配置对象数组。SPI设备配置用于定义具体的SPI设备,例如ADXL345数字加速度计。SPI设备通过SPI接口序号引用已配置的SPI接口(总线),一个SPI总线上可以定义多个SPI设备。
SPI设备配置对象的JSON属性定义:
- name
[string] (!)用户定义的设备名。SPI设备操作指令使用该名称访问设备。最大长度15个字符。 - remove
[bool] (?)为true时,释放并移除 name 对应的SPI设备。默认false。 - spi_num
[int] (!)已配置的SPI接口序号。 - mode
[int] (?)设备SPI模式。可选值:0、1、2、3。 - speed_hz
[int]SCLK频率,单位赫兹。默认值1000000(1 MHz),最大允许值40 MHz。 - cs
[int] (?)设备片选引脚的GPIO序号。 - cs_level
[string] (?)片选信号的有效电平,默认值low。可选值:low、high。 - bit_order
[string] (?)数据位传输顺序,默认值msb。可选值:msb- 高位在前lsb- 低位在前
- 当 remove 释放SPI设备后,其占用的CS片选引脚将恢复为默认GPIO状态。
- name
样例
启用SPI_NUM_0接口,添加SPI设备(ADXL345数字加速度计):
json{ "action": "config", "spi": [ { "spi_num": 0, "mosi": 10, "miso": 11, "sclk": 12 } ], "spi_device": [ { "name": "adxl345", "spi_num": 0, "mode": 3, "cs": 13 } ] }spi- 要启用的SPI接口配置对象数组:- 配置[0] - SPI接口序号:0;MOSI引脚:GPIO10;MISO引脚:GPIO11;SCLK引脚: GPIO12。
spi_device- 要添加的SPI设备配置对象数组:- 配置[0] - SPI设备名:adxl345;SPI接口序号:0;设备SPI模式:3;设备片选引脚:GPIO13。
移除SPI设备(adxl345)并移除SPI_NUM_0接口:
json[ { "action": "config", "spi_device": [ { "name": "adxl345", "remove": true } ] }, { "action": "config", "spi": [ { "spi_num": 0, "remove": true } ] } ]- 移除SPI总线之前,需要先移除该总线上的所有设备。
- 样例使用指令数组形式,以确保先移除SPI设备,再移除SPI总线。
应答
type-config
Node-MQ收到config指令并完成相应的配置后(如果有),将应答当前系统的完整配置信息(有效的配置)。
应答JSON对象的type属性值为config,其余属性的定义与config指令的参数定义一致。
样例
{
"type": "config",
"input": [1],
"output": [2, 3],
"pulldown": [1],
"posedge": [1],
"analog": [4, 5, 6],
"pwm": [
{
"freq_hz": 100,
"io_num": [7, 8]
}
],
"monitor": [
{
"io_num": [4],
"period_ms": 1000,
"grain": 5,
"high": 0,
"low": 0
}
],
"uart": [
{
"uart_num": 0,
"tx": 43,
"rx": 44,
"post": true,
"post_encoding": "base64",
"baud_rate": 115200,
"data_bits": 8,
"parity": "none",
"stop_bits": 1
}
]
}type-digital
当设置为触发(中断)的GPIO满足触发条件时,Node-MQ将发送该GPIO对应的type-digital消息到config指令所使用的通道。
样例
{
"type": "digital",
"data": [
{
"io_num": 1,
"value": 1
}
]
}
type- 数据类型digital(引脚电平数字量)。data- 数据对象数组。
io_num- 引脚的GPIO序号。value- 数值:0(低电平);1(高电平)。
type-analog
当模拟量监视器的引脚输入电平满足触发条件时,Node-MQ将发送对应该引脚的type-analog消息到config指令所使用的通道。
样例
{
"type": "analog",
"data": [
{
"io_num": 4,
"raw": 1172,
"voltage_mv": 982
}
]
}
type- 数据类型analog(引脚电平模拟量)。data- 数据对象数组。
io_num- 引脚的GPIO序号。raw- 12-bit ADC原始采样值(0~4095)。voltage_mv- 经过校准转换的mV单位电压值。
type-uart
- 当配置UART控制器的 post 参数为
true时(默认值),该UART RX接收的数据将以type-uart消息转发到config指令所使用的通道。转发数据按照配置的 post_encoding 作相应的编码。
样例
{
"type": "uart",
"uart_num": 0,
"encoding": "base64",
"data": "VGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZy4="
}
type- 数据类型uart(UART RX数据)。uart_num- UART序号。encoding- 数据编码(即config指令中 post_encoding 参数指定的编码)。data- 编码后的RX接收数据(此处为base64编码)。
json编码样例:
{
"type": "uart",
"uart_num": 0,
"encoding": "json",
"data": "The quick brown fox jumps over the lazy dog."
}