Arduino Yun + 超声波传感器构建 180° 环境扫描成像仪:配合 MATLAB 可视化
项目原理
利用 HC-SR04 超声波测距模块安装在 Tower Pro MG996R 舵机臂上,舵机以 1° 步进扫描 0°~180°。每个角度采集 10 次超声波读数取平均,通过串口实时发送至 PC。PC 端运行 MATLAB 脚本,将极坐标 (角度, 距离) 转换为笛卡尔坐标 (x, y) 并实时绘制散点图,形成类似激光雷达的 2D 环境轮廓。
硬件清单
- Arduino Yun (或 Uno/Nano 等任意 Arduino 兼容板) ×1
- HC-SR04 超声波模块 ×1
- Tower Pro MG996R 金属齿轮舵机 ×1
- Arduino 原型扩展板 ×1 (便于焊接排针)
- 双面胶、万用板、排针排母若干
- 跳线 ×10
机械组装
- 在万用板焊接 HC-SR04 排针座,用双面胶固定于舵机舵盘 (舵机臂) 上,传感器朝前。
- 将舵机机身用双面胶粘贴在原型扩展板凸出的 USB 接口一侧,整体形似 "Wall-E 腹部"。
- 接线:HC-SR04 VCC/Trig/Echo/GND → 5V/D12/D11/GND;舵机信号线 → D9,电源并联 5V/GND (建议外接 5V 2A 电源避免 USB 电流不足)。
Arduino 固件 (核心逻辑)
#include <Servo.h>
#include <NewPing.h>
#define TRIGGER_PIN 12
#define ECHO_PIN 11
#define MAX_DISTANCE 200
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
Servo myservo;
const int samples = 10;
void setup() {
myservo.attach(9);
Serial.begin(9600);
delay(3000); // 等待 MATLAB 打开串口
}
void loop() {
for (int angle = 0; angle < 180; angle++) {
myservo.write(angle);
delay(20); // 舵机到位
long sum = 0;
for (int i = 0; i < samples; i++) {
sum += sonar.ping_cm();
delay(30);
}
int avg = sum / samples;
Serial.println(avg); // 每行一个整数 cm
}
}
MATLAB 可视化脚本
theta = 0:(pi/180):pi; % 0~180° 弧度
s = serial('COM10'); % 修改为实际端口
s.BaudRate = 9600;
fopen(s);
num = zeros(1,180);
for i = 1:180
num(i) = str2double(fgets(s));
end
fclose(s);
% 极坐标转笛卡尔
x = num .* cosd(0:179);
y = num .* sind(0:179);
figure;
plot(x, y, 'b.', 'MarkerSize', 6);
axis equal; grid on;
xlabel('X (cm)'); ylabel('Y (cm)');
title('180° Ultrasonic Scan');
实测效果与误差分析
实测在一个 60×40 cm 纸箱内,扫描结果能清晰还原箱体轮廓,但存在以下误差源:
- 舵机运动抖动导致声波波前倾斜,边缘读数偏大。
- HC-SR04 最小测距 2 cm,最大 200 cm,超过范围返回 0 或 200。
- 超声波波束角约 15°,平行墙面会产生多径反射噪点。
改进方向:
- 改用 TFmini Plus 等 ToF 激光雷达模块,分辨率 cm 级、扫描频率 100Hz。
- 舵机改为步进电机 + 编码器闭环,消除抖动。
- 在 Arduino 端实现滑动窗口中值滤波,减少离群值。
- 将 MATLAB 替换为 Python (pyserial + matplotlib) 实现跨平台免费部署。
扩展应用
- 机器人避障与 SLAM 入门实验平台。
- 结合摄像头做传感器融合 (超声波测距 + 视觉语义)。
- 教学演示:声纳原理、极坐标转换、串口通信、实时绘图。
原理图与资源
Fritzing 文件 YunConfig.fzz 包含完整接线,可在 Schematics 标签页下载。
制造工艺
- 用 Arduino 打造绚丽显示器 Ambilight 系统
- 基于 Arduino Uno 的人体检测救援机器人:传感器集成分步指南
- 用 Arduino 制作超声波悬浮装置:分步指南
- FlickMote:基于手势的智能家居红外遥控器
- Arduino 与智能手机打造智能电压表——简单易做的 DIY 项目
- 基于 Arduino 与 MAX30100 的实时物联网心率监测系统
- Android 手势遥控车:Raspberry Pi + Arduino 101 + 电机扩展板,I2T 协同控制
- 智能物联网罐:ESP8266 + Arduino + 超声波传感器实时监测罐内物位
- Arduino Uno WiFi 网页服务器:通过浏览器控制 LED 开关
- Arduino UNO 自制循迹小车:从零构建自主巡线机器人
- Arduino 自动化 Chrome 恐龙游戏 - LDR 光敏电阻 + Python 实现全自动跳跃
- Arduino Mega 2560 综合实训平台 - 传感器/电机/显示/PCB 一体化开发板