【ESP32-S31 Function coreboard-1开发板】物联网步进电机和 LabVIEW 远程控制
本文介绍了 ESP32-S31 Function coreboard-1 开发板结合 A4988 模块、WiFi 功能,实现 42 步进电机的 MQTT 协议控制;设计 LabVIEW 上位机实现自动化运行和数据采集的项目设计,包括硬件连接、MQTT 远程控制、LabVIEW上位机、数据采集等。
项目介绍
ESP32-S31 Function coreboard-1 开发板结合 A4988 驱动板、WiFi 功能、MQTT 服务器、LabVIEW 上位机,实现 42 步进电机的远程控制。
准备工作:步进电机参数、环境搭建、硬件连接等;
工程测试:工程配置、流程图、关键代码, MQTTX 测试;
LabVIEW 设计:前面板、程序面板设计,自动发送 JSON 消息,实现步进电机的远程自动化控制、数据采集与存储。

硬件连接
使用 Type-C 数据线连接开发板和电脑;
A4988 驱动板、ESP32-S31 开发板的接线方式如下
| A4988 | ESP32-S31 | Note |
| Dir | Pin 36 | Direction |
| STEP | Pin 37 | Steps |
| EN | Pin 38 | Enable |
| VM | 5V | Power for stepper |
| VCC | 3V3 | Power for MCU |
| GND | GND | Ground |
注意,若步进电机额定电压较高或带负载运行,需使用外部电源连接 A4988 驱动板 VM 引脚供电。
A4988 与 42 步进电机的接线方式如下
| 42步进电机 | A4988 | Note |
| A+ | 1A | A phase |
| A- | 1B | A phase |
| B+ | 2A | B phase |
| B- | 2B | B phase |
实物图


详见:【ESP32-S31_Function_coreboard-1开发板】步进电机的串口控制和LabVIEW数据采集 .
环境搭建
烧录 MicroPython 固件至开发板;


下载并安装 Thonny IDE 软件;
详见:【ESP32-S31_Function_coreboard-1开发板】介绍、环境搭建、工程测试 .
流程图


工程代码
from machine import Pin, I2C
from ssd1306 import SSD1306_I2C
import time
import ujson
import network
from umqtt.simple import MQTTClient
import _thread
import ntptime
# =============== 用户配置 =================
WIFI_SSID = "xxx"
WIFI_PASSWORD = "xxx"
MQTT_BROKER = "iot.kittenbot.cn"
MQTT_PORT = 1883
MQTT_TOPIC = "ljl/stepmotor"
CLIENT_ID = "esp32_stepmotor_01"
# =============== 引脚定义 ===================
dir_pin = Pin(36, Pin.OUT)
step_pin = Pin(37, Pin.OUT)
en_pin = Pin(38, Pin.OUT)
i2c = I2C(0, scl=Pin(47), sda=Pin(48))
oled = SSD1306_I2C(128, 64, i2c)
oled.rotate(1) # 屏幕方向
# ================= 全局变量 ===================
current_angle = 0
speed_us = 1200
direct_text = "STOP"
running_flag = True
mqtt_client = None
# ====================== 电机参数 ======================
step_angle = 1.8 # 步距角
step_cycle = 360 / 1.8 # 200 步/圈
microMode = 8 # 1/8 细分
steps = step_cycle * microMode # 1600 脉冲/圈
STEPS_PER_DEGREE = steps / 360 # 4.444 脉冲/度
# ================ WiFi 连接 ====================
def connect_wifi():
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
if not wlan.isconnected():
print("连接WiFi中...")
wlan.connect(WIFI_SSID, WIFI_PASSWORD)
while not wlan.isconnected():
time.sleep_ms(500)
print("WiFi已连接:", wlan.ifconfig())
# =============== NTP 时间同步 =================
def sync_time():
try:
ntptime.host = "ntp.aliyun.com"
ntptime.settime()
print("NTP时间已同步(UTC)")
except Exception as e:
print("NTP同步失败:", e)
# ================ OLED 后台刷新线程 ===================
def screen_task():
while running_flag:
try:
# UTC+8 时区转换
now = time.localtime(time.time() + 8 * 3600)
date_str = "{:04d}-{:02d}-{:02d}".format(now[0], now[1], now[2])
time_str = "{:02d}:{:02d}:{:02d}".format(now[3], now[4], now[5])
oled.fill(0)
oled.text(date_str, 2, 0)
oled.text(time_str, 2, 12)
oled.text("Dir: " + direct_text, 2, 26)
oled.text("V: " + str(speed_us) + "us", 2, 38)
oled.text("Angle: " + str(current_angle) + "deg", 2, 50)
oled.show()
except Exception as e:
print("OLED刷新错误:", e)
time.sleep_ms(70)
# ================ 电机控制 ======================
def run_angle(degree, speed_us):
global direct_text, current_angle
pulses = int(abs(degree) * STEPS_PER_DEGREE)
current_angle = degree
en_pin.value(0) # 使能驱动器
if degree > 0:
dir_pin.value(1)
direct_text = "CW"
else:
dir_pin.value(0)
direct_text = "CCW"
delay_us = int(speed_us)
if delay_us < 10:
delay_us = 10 # 下限保护,防止过快丢步
for _ in range(pulses):
step_pin.value(1)
time.sleep_us(delay_us)
step_pin.value(0)
time.sleep_us(delay_us)
direct_text = "STOP"
en_pin.value(1) # 释放扭矩
print("Rotate %.1f degree, %d steps" % (degree, pulses))
# ====================== MQTT 回调 ======================
def on_message(topic, msg):
global speed_us
try:
data = ujson.loads(msg.decode())
# 关键:没有 angle 字段,直接忽略
# 由于订阅和接收主题相同,防止接收到 {"result":"OK"} 后循环发送指令
if "angle" not in data:
return
angle = data.get("angle", 0)
speed_us = data.get("speed", 1200)
print("收到指令: angle=%s, speed=%sus" % (angle, speed_us))
run_angle(angle, speed_us)
# 旋转完成回复 OK
mqtt_client.publish(MQTT_TOPIC, '{"result":"OK"}')
except Exception as e:
print("解析错误:", e)
# =============== 主程序 ===================
def main():
global mqtt_client, running_flag
connect_wifi()
sync_time()
# 启动 OLED 后台刷新线程
_thread.start_new_thread(screen_task, ())
# MQTT 客户端连接
mqtt_client = MQTTClient(CLIENT_ID, MQTT_BROKER, MQTT_PORT, keepalive=60)
mqtt_client.set_callback(on_message)
mqtt_client.connect()
mqtt_client.subscribe(MQTT_TOPIC)
print("MQTT已连接,订阅主题:", MQTT_TOPIC)
try:
while True:
mqtt_client.wait_msg()
except KeyboardInterrupt:
running_flag = False
time.sleep(0.2)
oled.fill(0)
oled.show()
en_pin.value(1)
mqtt_client.disconnect()
print("已退出")
if __name__ == "__main__":
main()保存代码。
MQTTX 测试
下载、安装并运行 MQTTX 软件;
新建连接,输入参数配置,目标 MQTT 服务器地址 iot.kittenbot.cn 、端口 1883、ID 等;
连接完成后,新建订阅 ljl/stepmotor 以接收消息;
添加发布主题 ljl/stepmotor 以发送消息;
发送测试 JSON 格式的消息 {"angle": 5, "speed": 1200} 表示以 1200μs 的速度旋转 5 角度。


点击发送后,步进电机转动,终端打印指令执行回执;


LabVIEW 上位机
包括前面板和程序面板设计。
前面板
前面板设计包括 MQTT 配置、单步测试、连续运行测试、实时演化曲线、数据保存、程序控制等模块。


程序面板
程序面板采用模块化设计,将 MQTT 消息函数封装,确保单次发送、连续发送任务均准确执行。


数据采集
配置 MQTT 服务器,运行程序,连接 MQTT 服务器;
设置步长、目标角度、延时、存储路径等;
点击 START 按钮,开始运行步进电机并采集数据;
动态演示
LabVIEW 程序运行后,步进电机按照设定的步长和延时连续旋转;
前面板显示采集数据的实时演化曲线;


步进电机根据串口指令,连续精确转动;

数据存储
数据采集完成后,停止发布消息,数据自动存储至目标路径;
数据保存格式为第一列旋转角度,第二列模拟采集数值;


总结
本文介绍了 ESP32-S31 Function coreboard-1 开发板结合 A4988 模块、WiFi 功能,实现 42 步进电机的 MQTT 协议控制;设计 LabVIEW 上位机实现自动化运行和数据采集的项目设计,包括硬件连接、MQTT 远程控制、LabVIEW上位机、数据采集等,为相关产品在工业自动化领域的快速开发和应用设计提供了参考。
我要赚赏金
