Arduino 超声波雷达:HC-SR04 + 舵机 + Processing 可视化全攻略
项目概述
经典入门级雷达项目:HC-SR04 超声波测距 + SG90 舵机扫描(15°~165°),Arduino 采集角度与距离经串口发送,Processing 绘制绿色扫描线、同心圆弧、红色目标点、实时角度/距离文本,酷似军用雷达屏幕。
硬件清单
- Arduino Uno / Nano
- HC-SR04 超声波模块
- SG90 / MG90S 微型舵机
- 面包板、杜邦线、纸板/3D 打印支架(将超声波模块固定在舵机臂上)



电路连接
- HC-SR04:Trig → D10,Echo → D11,VCC/GND → 5V/GND
- 舵机信号线 → D12,电源并联 5V/GND(建议外接舵机供电,防止 Arduino 复位)

Arduino 端代码
舵机往返扫描,每度测一次距离,格式 角度,距离. 发送(逗号分隔、句点结束),便于 Processing 解析。
#include <Servo.h>
const int trigPin = 10, echoPin = 11;
long duration; int distance;
Servo myServo;
void setup() {
pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT);
Serial.begin(9600);
myServo.attach(12);
}
void loop() {
// 15° -> 165°
for (int i = 15; i <= 165; i++) {
myServo.write(i); delay(30);
distance = calculateDistance();
Serial.print(i); Serial.print(","); Serial.print(distance); Serial.print(".");
}
// 165° -> 15°
for (int i = 165; i > 15; i--) {
myServo.write(i); delay(30);
distance = calculateDistance();
Serial.print(i); Serial.print(","); Serial.print(distance); Serial.print(".");
}
}
int calculateDistance() {
digitalWrite(trigPin, LOW); delayMicroseconds(2);
digitalWrite(trigPin, HIGH); delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = duration * 0.034 / 2; // 声速 340m/s,单位 cm
return distance;
}
Processing 端可视化核心
坐标系与缩放
屏幕中心底部 (960,1000) 为雷达原点(1920×1080 分辨率)。扫描半径 950px 对应 40cm 量程,像素折算系数 pixsDistance = iDistance * 22.5。
核心绘图函数
// 雷达背景:同心圆弧 + 角度径向线
void drawRadar() {
pushMatrix(); translate(960, 1000);
noFill(); strokeWeight(2); stroke(98, 245, 31);
arc(0,0,1800,1800,PI,TWO_PI); // 40cm
arc(0,0,1400,1400,PI,TWO_PI); // 30cm
arc(0,0,1000,1000,PI,TWO_PI); // 20cm
arc(0,0,600,600,PI,TWO_PI); // 10cm
// 角度线 0,30,60,90,120,150,180
line(-960,0,960,0);
line(0,0,-960*cos(radians(30)),-960*sin(radians(30)));
...
popMatrix();
}
// 扫描线
void drawLine() {
pushMatrix(); strokeWeight(9); stroke(30,250,60);
translate(960,1000);
line(0,0,950*cos(radians(iAngle)),-950*sin(radians(iAngle)));
popMatrix();
}
// 目标点(红色线段从目标处延伸至最大半径)
void drawObject() {
pushMatrix(); translate(960,1000);
strokeWeight(9); stroke(255,10,10);
pixsDistance = iDistance * 22.5;
if (iDistance < 40) {
line(pixsDistance*cos(radians(iAngle)), -pixsDistance*sin(radians(iAngle)),
950*cos(radians(iAngle)), -950*sin(radians(iAngle)));
}
popMatrix();
}
// 文本信息
void drawText() { ... }
串口解析 serialEvent()
void serialEvent(Serial myPort) {
data = myPort.readStringUntil('.');
data = data.substring(0, data.length()-1);
index1 = data.indexOf(',');
angle = data.substring(0, index1);
distance = data.substring(index1+1);
iAngle = int(angle); iDistance = int(distance);
}
主循环 draw()
void draw() {
fill(98,245,31); textFont(orcFont);
// 残影效果:半透明黑矩形覆盖上部区域
noStroke(); fill(0,4); rect(0,0,width,1010);
fill(98,245,31);
drawRadar(); drawLine(); drawObject(); drawText();
}
自适应分辨率版本(推荐)
文末提供 通用版代码,所有坐标、半径、字体位置均用 width、height 相对计算,仅需修改 size(你的宽, 你的高) 即可适配任意屏幕。核心改动示例:
translate(width/2, height - height*0.074); // 雷达原点
arc(0,0, width-width*0.0625, ..., PI, TWO_PI); // 最外弧
pixsDistance = iDistance * ((height-height*0.1666)*0.025); // 动态折算
常见问题排查
- 串口乱码/卡顿:波特率一致、Processing 端口号正确、
bufferUntil('.')与 Arduino 发送末尾句点匹配。 - 测距跳变:超声波受多径反射影响,可在
calculateDistance()中加中值滤波(连续取 3~5 次中位值)。 - 舵机抖动:供电不足,外接 5V/1A 以上电源,舵机电源地与 Arduino 共地。
- 显示区域被切:使用自适应版代码,或手动调整
translate、arc半径参数。
完整 Processing 代码(含固定分辨率版与自适应版)已在文末给出。下载运行,即刻拥有专属桌面雷达!
制造工艺
- 用 Arduino 打造绚丽显示器 Ambilight 系统
- 用 Arduino UNO 和 OLED 显示屏制作经典 Pong 游戏:分步教程
- 舵机驱动避障机器人:基于 Arduino 与 HC-SR04 构建
- Arduino 音频频率检测:基于 FFT 测量最响亮声音峰值
- 自制 Arduino 电子宠物「Tamaguino」:复刻经典 Tamagotchi 全攻略
- 智能无线开关控制器:Arduino + 433MHz 远程操控墙壁开关
- Arduino 井字棋游戏:MAX7219 点阵屏 + 纸板外壳 DIY
- 基于 Arduino Nano 的智能运动感应水枪
- 使用 SparkFun 7 段数码管构建可靠的 Arduino 倒计时器
- Arduino 向日葵:制作电子向日葵追踪阳光
- 自制 Arduino 遥控保时捷赛车:从改装底盘到手机 App 控制全攻略
- 紧凑型Arduino雷达系统:HC-SR04超声波传感器配1.8英寸显示屏