这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 【ESP32-S31_Function_coreboard-1开发板】物联网步进

共1条 1/1 1 跳转至

【ESP32-S31_Function_coreboard-1开发板】物联网步进电机和LabVIEW远程控制

工程师
2026-08-29 18:46:27     打赏

【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 消息,实现步进电机的远程自动化控制、数据采集与存储。

cover_stepper_mqtt.jpg

硬件连接

  • 使用 Type-C 数据线连接开发板和电脑;

  • A4988 驱动板、ESP32-S31 开发板的接线方式如下

 

A4988ESP32-S31Note
DirPin 36Direction
STEPPin 37Steps
ENPin 38Enable
VM5VPower for stepper
VCC3V3Power for MCU
GNDGNDGround

注意,若步进电机额定电压较高或带负载运行,需使用外部电源连接 A4988 驱动板 VM 引脚供电。

  • A4988 与 42 步进电机的接线方式如下


42步进电机A4988Note
A+1AA phase
A-1BA phase
B+2AB phase
B-2BB phase

实物图

connect_stepper_oled_a4988_mqtt.jpg

详见:【ESP32-S31_Function_coreboard-1开发板】步进电机的串口控制和LabVIEW数据采集 .

环境搭建

  • 烧录 MicroPython 固件至开发板;

  • micropython_logo.jpg

  • 下载并安装 Thonny IDE 软件;

详见:【ESP32-S31_Function_coreboard-1开发板】介绍、环境搭建、工程测试 .

流程图

flowchart_stepper_mqtt.jpg

工程代码

 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 角度。

stepper_mqttx_test.jpg

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

stepper_mqtt_oled_print.jpg

LabVIEW 上位机

包括前面板和程序面板设计。

前面板

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

labview_stepper_mqtt_front.jpg

程序面板

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

labview_stepper_mqtt_block.jpg


数据采集

  • 配置 MQTT 服务器,运行程序,连接 MQTT 服务器;

  • 设置步长、目标角度、延时、存储路径等;

  • 点击 START 按钮,开始运行步进电机并采集数据;

动态演示

  • LabVIEW 程序运行后,步进电机按照设定的步长和延时连续旋转;

  • 前面板显示采集数据的实时演化曲线;

stepper_labview_mqtt.gif

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

stepper_run_mqtt.gif

数据存储

  • 数据采集完成后,停止发布消息,数据自动存储至目标路径;

  • 数据保存格式为第一列旋转角度,第二列模拟采集数值;

stepper_mqtt_labview_data.jpg

总结

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





关键词: ESP32-S31     LabVIEW     MQTT     物联    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]