这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【2026 Let's do 第3期】基于边缘AI的电机状态检测过程帖

共1条 1/1 1 跳转至页

【2026 Let's do 第3期】基于边缘AI的电机状态检测过程帖

助工
2026-11-12 20:27:07     打赏

实现ST开发板开发环境的搭建,声音以及灯光的基本控制,并输出串口信息;

硬件准备

  • NUCLEO-C562RE 开发板 1 块

  • Arduino 传感器拓展板 1 块

  • 蜂鸣器模块 1 个

  • 杜绑线若干

2_bb.png

开发环境说明

本次活动我尝试使用 Zephyr 进行开发,在 Zephyr 官方恰好有本次活动的开发支持。基于 Zephyr 可以非常简单地实现与上位机的串口通信。只需要新建工程后配置启动 Console 即可。

代码实现

Zephyr 工程配置

CONFIG_CONSOLE=y
CONFIG_UART_CONSOLE=y
CONFIG_PRINTK=y
CONFIG_SERIAL=y
CONFIG_GPIO=y

串口输出

printk("==================================================\n");
printk(" Motor State Detector based on Edge AI\n");
printk(" Mode         : INFERENCE\n");
printk(" Peripherals  : LED Buzzer LIS3DHTR OLED Stepper\n");
printk("==================================================\n");

效果展示

2026-11-09-09-03-17.png

实现加速度计传感器数据的采集,并通过串口进行打印;

硬件准备

  • NUCLEO-C562RE 开发板 1 块

  • Arduino 传感器拓展板 1 块

  • Grove - 三轴数字加速度计 (LIS3DHTR) 1 个

  • QWiic - Grove 连接线 1 根

Grove - 三轴数字加速度计 (LIS3DHTR) 通过QWiic - Grove 连接线连接到 Arduino 传感器拓展板的 Qwiic 接口。如下图所示:

bb.png

代码实现

int accel_sample_fetch(struct accel_sample *out)
{
    int rc;
    struct sensor_value sv[3];

    if (out == NULL) {
        return -EINVAL;
    }

    rc = sensor_sample_fetch(accel_dev);
    if (rc < 0) {
        return rc;
    }

    /* 一次取三轴:比分三次通道读取少两次 I2C 往返 */
    rc = sensor_channel_get(accel_dev, SENSOR_CHAN_ACCEL_XYZ, sv);
    if (rc < 0) {
        return rc;
    }

    /* sensor_value:val1 为整数 m/s^2,val2 为百万分之一余数;
     * mg = (val1 * 1e6 + val2) / 9807,1 mg = 9.80665e-3 m/s^2。
     * +/-2 g 量程结果在 +/-2000 内,int16_t 可容纳。
     */
    out->x = (int16_t)(((sv[0].val1 * 1000000) + sv[0].val2) / 9807);
    out->y = (int16_t)(((sv[1].val1 * 1000000) + sv[1].val2) / 9807);
    out->z = (int16_t)(((sv[2].val1 * 1000000) + sv[2].val2) / 9807);

    out->seq = g_seq++;
    out->ts_ms = k_uptime_get();
    return 0;
}

效果展示

2026-11-09-09-03-17.png


获取并整理电机运行状态(停止与启动)加速度数据,满足NanoEdge AI Studio工具获取数据要求;

硬件准备

  • NUCLEO-C562RE 开发板 1 块

  • Arduino 传感器拓展板 1 块

  • Grove - 三轴数字加速度计 (LIS3DHTR) 1 个

  • QWiic - Grove 连接线 1 根

  • 齿轮步进电机驱动套件 1 套

  • 杜绑线若干

Grove - 三轴数字加速度计 (LIS3DHTR) 通过QWiic - Grove 连接线连接到 Arduino 传感器拓展板的 Qwiic 接口。并使用杜绑线连接齿轮步进电机驱动套件到 Arduino 传感器拓展板的相应引脚。 如下面包板接线图所示:

面包板接线图_bb.png

代码实现

int collector_write_window_flat(const struct accel_sample *samples, size_t n)
{
    /* 行缓冲:最坏 n*3 个值 x "-2000,"6 字符 = 900 字节(n=50),
     * 取 1024 留余量;静态分配避免占栈
     */
    static char line[1024];
    size_t len = 0;
    size_t i;

    if (samples == NULL || n == 0U) {
        return -EINVAL;
    }

    for (i = 0U; i < n; i++) {
        int rc;
        int v;

        v = samples[i].x;
        rc = snprintf(line + len, sizeof(line) - len,
                  len == 0U ? "%d" : ",%d", v);
        if (rc < 0 || (size_t)rc >= sizeof(line) - len) {
            return -ENOSPC;
        }
        len += (size_t)rc;

        v = samples[i].y;
        rc = snprintf(line + len, sizeof(line) - len, ",%d", v);
        if (rc < 0 || (size_t)rc >= sizeof(line) - len) {
            return -ENOSPC;
        }
        len += (size_t)rc;

        v = samples[i].z;
        rc = snprintf(line + len, sizeof(line) - len, ",%d", v);
        if (rc < 0 || (size_t)rc >= sizeof(line) - len) {
            return -ENOSPC;
        }
        len += (size_t)rc;
    }

    line[len] = '\n';
    len++;
    line[len] = '\0';
    printk("%s", line);
    return 0;
}

效果展示

2026-11-12-20-11-05.png





关键词: Let's do      ST      STM32      Nano    

共1条 1/1 1 跳转至页

回复

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