亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

Arduino 超声波雷达:HC-SR04 + 舵机 + Processing 可视化全攻略

项目概述

经典入门级雷达项目:HC-SR04 超声波测距 + SG90 舵机扫描(15°~165°),Arduino 采集角度与距离经串口发送,Processing 绘制绿色扫描线、同心圆弧、红色目标点、实时角度/距离文本,酷似军用雷达屏幕。

硬件清单

Arduino 超声波雷达:HC-SR04 + 舵机 + Processing 可视化全攻略
Arduino 超声波雷达:HC-SR04 + 舵机 + Processing 可视化全攻略
Arduino 超声波雷达:HC-SR04 + 舵机 + Processing 可视化全攻略

电路连接

Arduino 超声波雷达:HC-SR04 + 舵机 + Processing 可视化全攻略

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 代码(含固定分辨率版与自适应版)已在文末给出。下载运行,即刻拥有专属桌面雷达!

制造工艺

  1. 用 Arduino 打造绚丽显示器 Ambilight 系统
  2. 用 Arduino UNO 和 OLED 显示屏制作经典 Pong 游戏:分步教程
  3. 舵机驱动避障机器人:基于 Arduino 与 HC-SR04 构建
  4. Arduino 音频频率检测:基于 FFT 测量最响亮声音峰值
  5. 自制 Arduino 电子宠物「Tamaguino」:复刻经典 Tamagotchi 全攻略
  6. 智能无线开关控制器:Arduino + 433MHz 远程操控墙壁开关
  7. Arduino 井字棋游戏:MAX7219 点阵屏 + 纸板外壳 DIY
  8. 基于 Arduino Nano 的智能运动感应水枪
  9. 使用 SparkFun 7 段数码管构建可靠的 Arduino 倒计时器
  10. Arduino 向日葵:制作电子向日葵追踪阳光
  11. 自制 Arduino 遥控保时捷赛车:从改装底盘到手机 App 控制全攻略
  12. 紧凑型Arduino雷达系统:HC-SR04超声波传感器配1.8英寸显示屏