回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页
best-icon

【FireBeetle 2 ESP32 P4 开发套件】Home Assistant 物联网步进电机控制 简单

头像 无垠的广袤 2025.08.05 31 1

 

本文介绍了 DFRobot FireBeetle 2 ESP32 P4 开发套件通过无线 WiFi 模块和 MQTT 协议实现 Home Assistant 远程控制步进电机旋转的项目设计。

包括项目介绍、流程图、硬件连接、流程图、工程代码、HA 面板设计、运行效果展示等。

 

项目介绍

环境搭建:Docker、EMQX、HA 部署;

工程测试:流程图、MicroPython 代码、MQTTX 通信测试;

HA 测试:配置文件、面板卡片设计、调试;

 

环境搭建

下载并安装 Docker Desktop 软件;

部署 EMQX 平台和 HA 平台;

 

硬件连接

步进电机

Step MotorBoard
IN14
IN25
IN320
IN421
VCC5V
GNDGND

Type-C 数据线接入 USB-CDC 接口,实现程序调试和系统供电;

connect_step_mqtt.jpg

工程测试

包括流程图、代码、MQTTX 软件测试等。

流程图

flowchart_stepper_mqtt.jpg

工程代码

运行 Thonny IDE 软件,配置解释器和设备端口,新建文件并添加如下代码

import json
import time
import random
import network
from machine import Pin
import uasyncio as asyncio
from umqtt.simple import MQTTClient

# ------------- 用户配置 -------------
WIFI_SSID = "Xiaomi_8ABD"
WIFI_PWD = "15836035036"
MQTT_SERVER = "192.168.31.160"
MQTT_PORT   = 32768
MQTT_CLIENT_ID = 'micropython-client-{id}'.format(id=random.getrandbits(8))
MQTT_USER   = "LJL"
MQTT_PWD   = "4421989g"
SUB_TOPIC = "esp/stepper/cmd"
PUB_TOPIC = "esp/stepper/status"
# 电机引脚(A B C D)
MOTOR_PINS = [4, 5, 20, 21]
# ------------------------------------
def wifi_connect(ssid, pwd):
    sta = network.WLAN(network.STA_IF)
    sta.active(True)
    if not sta.isconnected():
        print("Connecting Wi-Fi...")
        sta.connect(ssid, pwd)
        for _ in range(20):
            if sta.isconnected():
                break
            time.sleep(1)
    print("Wi-Fi connected:", sta.ifconfig())
# --------------Stepper-------------------------------------
class Stepper28BYJ48:
    STEP_SEQ = [
        [1,0,0,1], [1,0,0,0], [1,1,0,0], [0,1,0,0],
        [0,1,1,0], [0,0,1,0], [0,0,1,1], [0,0,0,1]
    ]
    def __init__(self, pins):
        self.coils = [Pin(p, Pin.OUT) for p in pins]
        self.release()

    def _write(self, pattern):
        for coil, v in zip(self.coils, pattern):
            coil.value(v)

    def step(self, steps, delay_ms=2):
        direction = 1 if steps > 0 else -1
        for _ in range(abs(steps)):
            for phase in range(8)[::direction]:
                self._write(self.STEP_SEQ[phase])
                time.sleep_ms(delay_ms)
        self.release()

    def angle(self, deg, delay_ms=2):
        steps = int(deg * (509 / 360))
        self.step(steps, delay_ms)

    def release(self):
        for c in self.coils:
            c.value(0)

motor = Stepper28BYJ48(MOTOR_PINS)

# 连接 MQTT
def mqtt_connect():
    c = MQTTClient(MQTT_CLIENT_ID, MQTT_SERVER, MQTT_PORT, MQTT_USER, MQTT_PWD)
    c.set_callback(on_msg)
    c.connect()
    c.subscribe(SUB_TOPIC)
    print("[MQTT] connected & subscribed")
    return c

# 收到控制指令
def on_msg(topic, msg):
    try:
        cmd = json.loads(msg)
        angle = cmd.get("angle", 0)
        #speed = max(1, cmd.get("speed", 2))  # 步间延时(ms)
        speed = max(1, min(10, cmd.get("speed", 2)))  # 限制速度范围 1-10
        delay_ms = 11 - speed  # 数值越大速度越快,延迟越小
        motor.angle(angle, delay_ms)

        # 回传状态
        stat = {"angle_done": angle, "speed_set": speed}
        client.publish(PUB_TOPIC, json.dumps(stat))
    except Exception as e:
        print("Bad msg:", e)

# 主协程
async def main():
    wifi_connect(WIFI_SSID, WIFI_PWD)
    global client
    client = mqtt_connect()

    while True:
        client.check_msg()
        await asyncio.sleep_ms(100)

asyncio.run(main())

保存代码并运行。

 

MQTTX 测试

新建连接,输入本地计算机 IP 地址、端口号、MQTT Broker 用户名、密码等;

运行连接,添加订阅主题 esp/stepper/status 获取监听消息;

在发送界面输入主题 esp/stepper/cmd 向 EMQX 发送指令消息;

mqttx_stepper_mqtt.jpg

 

定义旋转角度和速度,步进电机旋转 20 °,速度取值范围 1-10;

 

stepper_mqtt_run.gif

 

HA 测试

进入 HA 所在文件夹,打开 configuration.yaml 配置文件,添加数字显示控件和按钮控件

mqtt:
  number:
    - name: "Step Motor"
      unique_id: stepper_angle
      command_topic: "esp/stepper/cmd"
      state_topic: "esp/stepper/status"
      value_template: "{{ value_json.angle_done }}"
      min: -360
      max: 360
      step: 1
      unit_of_measurement: "°"
      optimistic: false
  button:
    - name: "CW 90°"
      command_topic: "esp/stepper/cmd"
      payload_press: '{"angle":90,"speed":10}'
      unique_id: stepper_cw_90
    - name: "CCW 90°"
      command_topic: "esp/stepper/cmd"
      payload_press: '{"angle":-90,"speed":10}'
      unique_id: stepper_ccw_90

保存更改并重新加载配置以应用更改;

进入 HA 概览页面,编辑仪表盘,添加卡片,找到新增的 Step Motor 实体和正反旋转按钮并添加。

流程图

ha_mqtt_stepper.jpg

控制面板

确认硬件连接完成且 MQTTX 通信测试无误;

点击 HA 卡片按钮,实现步进电机正反旋转的远程网络控制;

cw_stepper.jpg

总结

本文介绍了 DFRobot FireBeetle 2 ESP32 P4 开发套件通过无线 WiFi 模块和 MQTT 协议实现 Home Assistant 远程控制步进电机旋转的项目设计,为该开发板在物联网和远程控制领域的应用提供了参考。

评论

user-avatar
  • 无垠的广袤

    无垠的广袤2025.08.08

    项目固件及烧录方式详见:https://makelog.dfrobot.com.cn/article-317940.html

    0