团队作业的博客
📝 协作后台

🤖 情感互动机器人 / Emotional Robot

基于 Arduino 开发的老年情感陪伴机器人与 Web 可视化监测底座

Emotional Companion Robot Poster

📢 情感陪伴机器人展板

项目 9:16 概念展板,展示了机器人的工业设计美学与核心交互理念。

🔍 查看原图 / Fullscreen

✨ 核心系统亮点 / System Highlights

高性能 Uno R4 WiFi

采用 Renesas RA4M1 主控,内置 ESP32-S3 提供高速的本地与物联网控制。

🔄
双向远程 MQTT 网关

集成 Adafruit IO 云端通道,实现低延迟的双向指令下发与遥测上报。

🧠
迟滞比较器消抖

硬件层使用双阈值迟滞(Hysteresis)算法,有效滤除物理环境突发扰动。

😴
自动休眠与大刺激惊醒

15秒无活动自动进入打盹(SLEEP)状态,仅大动静或声音方可惊醒,防止视觉过载。

📺 表情模拟器 / Face Simulator

实时渲染机器人头部 OLED 屏幕表情与情感状态响应:

CALM

🎛️ 传感器数值模拟器 / Interactive Input Simulator:

超声波距离 / HC-SR04 Distance 100 cm
声音强度 / HS-S05B Sound 150

📡 物联网广域网连接 / IoT MQTT Connection

使用 Adafruit IO 的 MQTT 协议,实现 GitHub 网页端与物理机器人的跨地域双向互联。

⚪ 未连接

📊 传感器实时数据 / Telemetry

🎤 Sound Level
150 RAW
📏 Distance
100 cm
🤖 Mood State
CALM

🖥️ 串口调试终端 / Arduino Console

💡 项目概念 / Project Concept

本项目致力于针对独居老年人(或其他需要情感关怀的特殊群体),开发一款低成本、高可靠性、具备柔和感官体验的情感陪伴机器人。机器人通过主动感知环境声音和老年人的接近距离,自动调整自身的表情状态(平静、快乐、伤心、微笑、难过、兴奋),从而提供无声但温馨的“情绪陪伴”。设计理念遵循非侵入式、低感官刺激、可预测性,避免突兀的声光报警给老年人带来焦虑,为老年人构筑一个充满安全感的交互环境。

👥

缓解孤独感 / Relieve Loneliness

通过实时表情交互,为独居老人提供温馨的视觉陪伴与互动反馈。

🌿

低感官刺激 / Low Stimulation

不使用刺眼的强光或刺耳 of 警报音,完全通过平滑的 OLED 表情温和响应。

💓

防抖动平滑 / Anti-Flicker

设置最短表情显示延迟(630ms),避免因短暂外界噪音造成表情剧烈跳动。

🌐

IoT 远程互联 / IoT Connected

支持将交互频率、声音及距离数据上传云端,让子女能远程感知父母的活跃状态。

🔄 核心交互逻辑 / Core Interaction

🚶
动作 (Action)
走近/远离 & 说话/发出声音
📡
感知 (Sensing)
超声波测距 & 声音检测
🧠
控制 (Control)
Arduino 情绪状态机
💫
反馈 (Feedback)
SSD1306 表情变化
状态转移机制:机器人会根据手部或人体的接近距离环境声强,在 6 个情绪状态之间平滑切换。为防止表情频繁抖动,代码内置了 MIN_DISPLAY_TIME (630ms) 的最短状态显示时间锁。

🏗️ 整体结构层 / System Architecture

🎤

一、听觉感知层 / Sound Input

利用 HS-S05B 声音模块捕捉老人的说话声、呼唤声或室内环境噪音。通过滤波算法滤除随机毛刺,计算出平滑的声强数据。

HS-S05B 传感器一阶低通滤波环境声强级
📏

二、距离感知层 / Distance Input

利用 HC-SR04 超声波测距传感器,实时计算老人的接近距离。采用三点中值滤波算法,消除测距异常跳变,确保数据准确稳定。

HC-SR04 传感器三点中值滤波人体接近感知
📺

三、视觉表达层 / Visual Output

将 0.96" SSD1306 OLED 屏幕作为机器人的“面部”,由 Adafruit_SSD1306 库驱动,以 42ms 的帧间隔(24FPS)平滑循环显示当前情绪的动态点阵图画。

SSD1306 屏幕Adafruit 绘图库情绪位图点阵24FPS 动画
☁️

四、IoT 数据链 / IoT Base

利用 Arduino 控制器的联网功能,将获取的距离、声音及情绪数据推送至 Web 可视化网关,方便监护人或看护中心监测老年人的日常起居活跃度。

Uno R4 WiFiWeb 实时看板起居轨迹遥测

📡 硬件设备详情 / Hardware Details

🔌

Arduino Uno R4 WiFi

微控制器 | 主控芯片

作为核心控制大脑,负责传感器数据滤波、情绪状态机判定、SSD1306 屏幕像素驱动以及数据串口/网络外发。

📏

HC-SR04 超声波测距传感器

距离传感器 | GPIO

利用声波发射与接收的时间差计算距离。测距范围 2cm - 400cm,分辨率可达 3mm。主要判定近距交互(迟滞比较:切入 < 40cm,切出 > 50cm)与远距陪伴状态(切入 > 85cm,切出 < 75cm)。

🎤

HS-S05B 声音检测传感器

声强传感器 | ADC 模拟量

内置驻极体话筒与放大器,输出代表声音强度的模拟变化波形。主控通过峰峰值检测提取音量,大声判定阈值设定为 LOUD > 250,小声与安静判定阈值设定为 QUIET > 30。

🖥️

SSD1306 0.96" OLED 点阵屏

显示模组 | I²C 协议

128x64 高对比度单色自发光点阵屏,运行在 400kHz 高速 I2C 模式,用于平滑播放 64x64 点阵的情感表情序列帧。

🧪 表情判定与状态机矩阵 / State Decision Matrix

机器人会周期性读取超声波距离与声音声强,并在每个 20ms 的循环周期内,根据下面的二维阈值状态转化矩阵决定目标情绪:

感应距离范围 (Distance) 声强状态 (Sound Level) 目标表情 (Target Mood) 交互含义与表现 (Behavioral Semantics)
近距离 < 40 cm (有人接近交互)
迟滞滤波:切入 <40cm,切出 >50cm
大声 (>250) EXCITED (兴奋) 老人正在开心凑近说话,发出大声互动,机器人开心睁大眼睛,加快眨眼。
近距离 < 40 cm (有人接近交互)
迟滞滤波:切入 <40cm,切出 >50cm
小声/安静 (<250) HAPPY (快乐) 老人静静陪伴在机器人跟前,无强声干扰,机器人报以温暖的快乐睁眼。
远距离 > 85 cm (无人在身旁)
迟滞滤波:切入 >85cm,切出 <75cm
大声 (>30) (远方动静) CALM (平静) 虽离得远,但能听到脚步或说话动静,保持平稳工作,重置孤独计时器。
远距离 > 85 cm (无人在身旁)
迟滞滤波:切入 >85cm,切出 <75cm
小声/安静 (<30) SAD (伤心) 无人在身旁且无动静,孤独计时器超过 10 秒即触发孤独/伤心动画。
中距离 40cm - 85cm (正常距离交互) 大声 (>30) SMILE (微笑) 老人正对着机器人发出声响互动,机器人露出眯眼喜悦微笑。
中距离 40cm - 85cm (正常距离交互) 小声/安静 (<30) CALM (平静) 老人在常规距离,但周围没有发出大声响,机器人保持平静待机。
全范围 (无交互刺激) 持续静止 (<30) SLEEP (打盹睡眠) 15秒极静自动休眠:持续 15 秒环境无声音且无运动,屏幕播放打盹动画。惊醒机制:外界距离变化 >30cm(且在1.2m内)或声音 >250 时瞬间恢复平静。

💻 Arduino 核心驱动代码 / Embedded Source Code

以下展示了 sketch_improve.ino 中最核心的传感器滤波处理与状态转移控制逻辑,体现了如何从硬件数据抽丝剥茧为老人的陪伴反馈:

// ==================== 情绪更新核心逻辑 ====================
void updateMood() {
  // 限制传感器物理采样频率为 20Hz (每 50ms 一次)
  static unsigned long lastSensorReadTime = 0;
  static int cachedDist = 100;
  static int cachedSound = 0;
  
  if (millis() - lastSensorReadTime >= 50 || lastSensorReadTime == 0) {
    lastSensorReadTime = millis();
    cachedDist = getDistance();
    currentDistance = cachedDist; // 更新全局变量,供 MQTT 传输
    cachedSound = getSoundIntensity();
    smoothSound = smoothSound * 0.6 + cachedSound * 0.4;
  }
  
  int dist = cachedDist;
  
  // 1. 稳态与活动检测(用于重置打盹计时器)
  bool motionDetected = (abs(dist - prevDist) > 15 && dist < 200);
  bool soundDetected = (smoothSound > 120);
  if (motionDetected || soundDetected) {
    lastStateChangeTime = millis(); 
    prevDist = dist;
    prevSound = smoothSound;
  }
  
  // 2. 深度打盹“惊醒”检测(休眠时,大刺激唤醒)
  if (currentMood == MOOD_SLEEP && !inTransition) {
    bool wakeMotion = (abs(dist - prevDist) > 30 && dist < 120);
    bool wakeSound = (smoothSound > 250);
    if (wakeMotion || wakeSound) {
      inTransition = true;
      transitionStartTime = millis();
      nextMood = MOOD_CALM;
      currentFrame = 4; // 闭眼开始过渡
      lastActiveTime = millis();
      lastStateChangeTime = millis();
      prevDist = dist;
      prevSound = smoothSound;
      return;
    }
  }
  
  // 3. 持续 15 秒静止无活动,自动进入打盹(SLEEP)状态
  if (millis() - lastStateChangeTime >= 15000 && !inTransition && currentMood != MOOD_SLEEP) {
    inTransition = true;
    transitionStartTime = millis();
    nextMood = MOOD_SLEEP;
    currentFrame = 4; // 闭眼过渡
    return;
  }
  
  // 处于睡眠状态且未被惊醒,不处理常规情绪转化
  if (currentMood == MOOD_SLEEP) return;

  const int LOUD = 250, QUIET = 30; // 调优后的音量噪声阈值

  // 4. 双阈值迟滞比较器 (Hysteresis) 消除距离边界处的表情抖动
  if (dist < 40) {
    isNear = true;
    isFar = false;
  } else if (dist > 50) {
    isNear = false;
  }

  if (dist > 85) {
    isFar = true;
    isNear = false;
  } else if (dist < 75) {
    isFar = false;
  }
  
  bool interacting = false;
  Mood targetMood = currentMood;
  
  if (isNear) {
    interacting = true;
    if (smoothSound > LOUD) targetMood = MOOD_EXCITED;
    else targetMood = MOOD_HAPPY;
  }
  else if (isFar) {
    if (smoothSound > QUIET) {
      interacting = true;
      targetMood = MOOD_CALM;
    } else {
      targetMood = MOOD_SAD; // 远距且无声,稳定触发孤独/伤心
    }
  }
  else {
    if (smoothSound > QUIET) {
      interacting = true;
      targetMood = MOOD_SMILE;
    } else {
      targetMood = MOOD_CALM;
    }
  }
  
  if (interacting) lastActiveTime = millis();
  
  // 10秒无交互超时触发伤心/孤独
  if ((millis() - lastActiveTime > LONELY_TIMEOUT) && (smoothSound < QUIET)) {
    targetMood = MOOD_SAD;
  }
  
  // 5. 情绪转换过渡限制:满足最小显示时间(630ms)时才允许切换
  if (targetMood != currentMood && !inTransition) {
    unsigned long now = millis();
    if (now - moodChangeTime >= MIN_DISPLAY_TIME) {
      inTransition = true;
      transitionStartTime = now;
      nextMood = targetMood;
      currentFrame = 4; // 开始闭眼动画,切入过渡帧
    }
  }
}

项目创新点 / Design Innovations

  • 🌱
    情感抚慰导向设计

    区别于常规避障或警报设备,本机器人完全服务于陪伴,表情慢变柔和,避免电子垃圾式突兀交互。

  • 🛡️
    中值与低通双重滤波

    软件端对 HC-SR04 使用三点中值滤波去噪,对 HS-S05B 采用一阶低通平滑,数据在物理层即干净抗干扰。

  • ⏱️
    防表情跳跃切换锁

    增加了 MIN_DISPLAY_TIME 表情最小显示周期锁,使得动画哪怕在剧烈干扰下也能播满 3 遍,视觉更顺畅。

  • 📉
    极简架构与极高性价比

    仅采用百元以下的主控与基本传感器,即可达到极为高雅且高还原度的情感表情算法表达,利于向社区普及。

📋 阶段总结与计划 / Project Roadmap

✅ 已完成 / Finished

  • 老年情感机器人核心定位与外观设计规划
  • 主控 Arduino 与超声波测距/声敏传感器硬件线路搭建
  • 一阶滤波及中值滤波等抗干扰算法开发
  • 一整套 64x64 表情位图帧的存储与播放管理
  • 防表情跳动状态机在 sketch_improve.ino 内的完整实现与联调

🔜 下一阶段计划 / Future Plans

  • 利用 3D 打印为机器人设计可爱、无攻击感的弧面外壳
  • 加入轻质 SG90 舵机模拟“眨眼晃脑”或“歪头倾听”的物理外壳动作
  • 引入 Wi-Fi 板载芯片将声音距离曲线无缝上报云端
  • 在养老社区开展真实老年用户陪护体验测试,打磨声强灵敏度