I96-2 双摇杆 HC-SR04 扫描测试
拆掉其余 3 个 SG90 后的新方案:只保留 D11 底座舵机,让它带动 HC-SR04 左右扫描测距,串口输出角度和距离,浏览器雷达 UI 实时显示。
D11 舵机 + HC-SR04
舵机每转一个角度测一次距离,输出 A:角度,D:距离。雷达 UI 读取串口后,把角度和距离画成扫描点。
① 接线说明
| 器件引脚 | 接到板上位置 | 说明 |
|---|---|---|
| 舵机信号线 | P9 = D11 | 原底座舵机口,不用改,舵机本来就接在这里。 |
| 舵机 +5V / GND | P9 | 舵机供电和地线保持原接法。 |
| HC-SR04 Trig | P10 信号脚 = D10 | 原大臂舵机口,现在空出来给 Trig 使用。 |
| HC-SR04 Echo | P11 信号脚 = D9 | 原小臂舵机口,现在空出来给 Echo 使用。 |
| HC-SR04 VCC | P10 或 P11 的 +5V 脚 | 两个口是同一路 5V,接哪个都可以。 |
| HC-SR04 GND | P10 或 P11 的 GND 脚 | 两个口是同一路 GND,接哪个都可以。 |
| P12 / D5 | 空着不接 | 本次扫描测试用不到。 |
只用 1 个舵机,电流比 4 个舵机同时动作小很多,电脑 USB 口通常够用;如果仍然复位,改用独立 5V 电源给舵机和 HC-SR04 供电,并且必须共地。
② 固件代码
Arduino IDE 直接上传版本
// HC-SR04 + D11 舵机扫描测试固件
#include <Arduino.h>
#include <Servo.h>
const uint8_t PIN_SERVO = 11;
const uint8_t PIN_TRIG = 10;
const uint8_t PIN_ECHO = 9;
const int SCAN_MIN = 0;
const int SCAN_MAX = 180;
const int STEP_DEG = 2;
const int STEP_DELAY_MS = 30;
Servo scanServo;
long readDistanceCm() {
digitalWrite(PIN_TRIG, LOW);
delayMicroseconds(2);
digitalWrite(PIN_TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(PIN_TRIG, LOW);
long duration = pulseIn(PIN_ECHO, HIGH, 30000UL);
if (duration == 0) return -1;
return duration / 58;
}
void sweepStep(int angle) {
scanServo.write(angle);
delay(STEP_DELAY_MS);
long distance = readDistanceCm();
Serial.print("A:");
Serial.print(angle);
Serial.print(",D:");
Serial.println(distance);
}
void setup() {
scanServo.attach(PIN_SERVO);
pinMode(PIN_TRIG, OUTPUT);
pinMode(PIN_ECHO, INPUT);
scanServo.write(90);
Serial.begin(115200);
Serial.println("BOOT: HC-SR04 scan test");
}
void loop() {
for (int angle = SCAN_MIN; angle <= SCAN_MAX; angle += STEP_DEG) {
sweepStep(angle);
}
for (int angle = SCAN_MAX; angle >= SCAN_MIN; angle -= STEP_DEG) {
sweepStep(angle);
}
}
核心逻辑:
readDistanceCm() 按 HC-SR04 标准时序发 Trig 脉冲,用 pulseIn() 量 Echo 高电平时间换算成厘米;sweepStep() 让舵机转到某个角度后测一次距离;loop() 做 0°→180°→0° 往返扫描。③ 数据流向
舵机转到角度 A
→
HC-SR04 测距离 D
→
串口打印 A:角度,D:距离
→
radar.html 读取串口
→
浏览器画雷达扫描图
④ 测试 UI
⑤ 客户回复话术
可直接复制给客户