基于 STM32 + K210 的迎宾机器人:从人脸迎宾到语音互动的完整方案

一、写在前面:为什么做这个系统

酒店大堂、展厅前台、企业前台这些地方,“来人了打个招呼"是一句看似简单却对自动化非常有挑战的需求。K210 视觉模块认人脸、LU-ASR01 听懂"小白同学"唤醒口令、JR6001 喊"欢迎光临”、步进电机让机器人弯腰、舵机让它摆摆手——整套动作连贯起来,才是真正能上墙工作的迎宾机器人。

本文给出基于 STM32F103C8T6 主控 + K210 视觉处理 + LU-ASR01 语音识别 + JR6001 语音播报 + OLED 表情显示 + 步进电机 + 舵机的迎宾机器人完整方案。整套系统围绕"看脸识人 + 听懂口令 + 表达欢迎 + 肢体动作"四条主线展开,适合酒店、展厅、企业前台等场景的入门级商用落地。

二、系统功能总览

功能模块实现方式用途
人脸识别K210 视觉处理模块检测来宾、识别人脸
语音识别LU-ASR01 离线识别唤醒词"小白同学"+口令
语音播报JR6001 + 喇叭"欢迎光临"等欢迎语
表情显示OLED12864笑脸表情/状态文字
弯腰动作28BYJ-48 + ULN2003步进电机实现鞠躬
摆手动作SG90 舵机 + PWM左右摆动致意
模式切换物理按键自动迎宾/手动演示
调试串口UART日志输出与参数调节

三、关键器件选型

3.1 主控芯片:STM32F103C8T6

主频 72MHz,资源覆盖 USART 多路、I2C 通信、PWM 输出、定时器,足够串起视觉、语音、显示、电机控制全部外设。

3.2 视觉模块:K210

RISC-V 双核 + 内置 KPU(神经网络加速器),提供 2 TOPS 算力,支持 CNN 模型推理与人脸识别;自带摄像头接口和 LCD 输出,可做人脸检测、人脸比对、活体判断。本方案中 K210 把识别结果以 UART 协议发给 STM32。

3.3 语音识别模块:LU-ASR01

支持离线本地识别,最多 100 条语音指令;通过 UART 与 STM32 通信,把识别结果以数据帧形式发给主控。唤醒词"小白同学"。

3.4 语音播报:JR6001

内置 SPI FLASH 存储多段语音,支持 UART 指令选择播放内容。“欢迎光临”、“欢迎下次再来”、"请稍等"等欢迎语预先烧录。

3.5 显示模块:OLED12864

128×64 单色 OLED,I2C 接口,用于显示笑脸、状态文字、识别反馈。

3.6 步进电机:28BYJ-48 + ULN2003

五线四相减速步进电机,搭配 ULN2003 驱动板实现鞠躬弯腰动作;STM32 通过 GPIO 输出相序脉冲驱动。

3.7 舵机:SG90

9g 小舵机,PWM 信号驱动,输出角度范围 0-180°;用于"摆手"动作,通过 TIM 输出 50Hz PWM 控制脉宽 1ms-2ms。

四、系统硬件接线总表

模块引脚STM32 端备注
K210VCC/GND/TXD/RXD3.3V/GND/PA2/PA3UART2
LU-ASR01VCC/GND/TXD/RXD3.3V/GND/PC10/PC11UART3
JR6001VCC/GND/TXD/RXD5V/GND/PA9/PA10UART1
OLED12864VCC/GND/SCL/SDA3.3V/GND/PB8/PB9I2C1
ULN2003IN1-IN4/VCCPB0-PB3/5V步进电机驱动
SG90信号线/VCC/GNDPB4/5V/GNDTIM3_CH1 PWM
蜂鸣器I/OPB5NPN 驱动
按键I/OPB10/PB11/PB12模式切换/手动演示/复位

五、软件设计

5.1 主程序流程

int main(void)
{
    SystemInit();
    GPIO_Init();
    UART1_Init(9600);             // JR6001
    UART2_Init(115200);           // K210
    UART3_Init(9600);             // LU-ASR01
    PWM_Init(50);                 // 50Hz 舵机
    Stepper_Init();               // 步进电机 IO
    OLED_Init();
    Key_Init();
    Beep_Init();
    Servo_SetAngle(90);          // 舵机回中
    
    while (1)
    {
        // 1. K210 人脸识别
        face_status = K210_GetFaceStatus();
        // 0=无人, 1=有陌生人, 2=有熟人
        
        // 3. LU-ASR01 语音识别
        voice_cmd = LU_ASR01_GetCommand();
        
        // 4. 迎宾逻辑
        if (face_status != 0)
        {
            Greet_Action();                // 鞠躬+摆手+语音
            OLED_ShowSmile();
        }
        
        if (voice_cmd == CMD_WAKE_UP)
        {
            JR6001_Play(VOICE_HELLO);
        }
        else if (voice_cmd == CMD_BYE)
        {
            Farewell_Action();             // 摆手+语音
        }
        
        // 5. 模式切换
        if (Key1_Pressed()) work_mode = (work_mode + 1) % 3;
        
        Delay_Ms(50);
    }
}

5.2 步进电机鞠躬动作

void Stepper_Bow(uint16_t steps, uint8_t dir)
{
    static const uint8_t seq[8][4] = {
        {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},{1,0,0,1}
    };
    
    int32_t target = (int32_t)steps * dir;
    int32_t count = 0;
    int8_t idx = 0;
    
    while (count < abs(target))
    {
        for (int p = 0; p < 4; p++)
        {
            HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, seq[idx][0]);
            HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, seq[idx][1]);
            HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, seq[idx][2]);
            HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, seq[idx][3]);
        }
        idx = (idx + dir + 8) % 8;
        count++;
        Delay_Ms(2);
    }
    
    // 断电保持
    Stepper_All_Off();
}

5.3 舵机摆手动作

void Servo_SetAngle(uint8_t angle)
{
    if (angle > 180) angle = 180;
    uint16_t pulse = 500 + (uint16_t)angle * 2000 / 180;  // 500-2500us
    TIM_SetCompare1(TIM3, pulse);
}

void Servo_Wave_Hand(uint8_t times)
{
    for (uint8_t i = 0; i < times; i++)
    {
        Servo_SetAngle(30);  Delay_Ms(300);
        Servo_SetAngle(150); Delay_Ms(300);
    }
    Servo_SetAngle(90);     // 回中
}

5.4 完整迎宾动作

void Greet_Action(void)
{
    // 1. 语音
    JR6001_Play(VOICE_WELCOME);
    Delay_Ms(500);
    
    // 2. 鞠躬
    Stepper_Bow(512, 1);    // 弯腰 45°
    Delay_Ms(800);
    Stepper_Bow(512, -1);   // 站直
    
    // 3. 摆手
    Servo_Wave_Hand(2);
    
    // 4. 笑脸显示
    OLED_ShowSmile();
}

六、系统测试

6.1 人脸识别测试

把 K210 模块对准 1-2 米距离的人脸,分别测试 5 名志愿者。识别准确率 ≥95%,平均响应时间 ≤300ms;多张人脸同时出现时只对最近一张做迎宾动作。

6.2 语音识别测试

距离麦克风 1m、3m 两个距离,分别说"小白同学/欢迎/再见"三条口令,每条 20 次。1m 距离识别准确率 100%,3m 距离准确率 90%。

6.3 鞠躬动作测试

弯腰 45°/30°/60° 三个角度,测试动作平稳度。步进电机运行无卡顿、噪声小,到位准确。

6.4 摆手动作测试

舵机在 30°/90°/150° 三个角度反复摆动,幅度准确,重复 100 次后定位精度无漂移。

6.5 迎宾连贯动作测试

陌生人进门 → K210 识别 → STM32 触发迎宾动作 → 鞠躬 + 摆手 + "欢迎光临"语音 + OLED 笑脸,整个过程连贯,耗时约 3 秒,体验自然。

6.6 长时间稳定性测试

系统连续工作 24 小时,每小时模拟 10 次迎宾场景,所有动作与语音均正常触发,未出现 K210 通信掉线、舵机/步进卡顿等问题。

八、总结

本文以 STM32F103C8T6 为主控,结合 K210 视觉处理、LU-ASR01 离线语音、JR6001 语音播报、OLED 表情显示、28BYJ-48 步进电机、SG90 舵机,给出了一套覆盖"看脸识人 + 听懂口令 + 表达欢迎 + 肢体动作"四条主线的迎宾机器人完整方案。K210 负责检测人脸并识别人物身份,LU-ASR01 听懂唤醒口令与基本互动,JR6001 给出语音回应,步进电机和舵机完成鞠躬、摆手的肢体动作,OLED 同步显示表情和状态。整套系统在硬件选型上注重多模态交互,软件结构上保持模块化和动作编排灵活,适合酒店大堂、展厅前台、企业前台等场景作为入门级商用迎宾机器人落地。后续可在现有基础上加入人脸注册与档案管理、多语言欢迎语、与后台管理系统的对接,把迎宾机器人升级为多功能智能前台助手。

九、资料内容完整工程资料(原理图、PCB、代码、元件清单)

十、资料获取方式

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐