Cảm biến lùi xe / đỗ xe trong gara (còi kêu nhanh dần khi lại gần)

Đo khoảng cách bằng sóng siêu âm 2cm–4m, báo bằng 3 đèn xanh–vàng–đỏ và còi kêu nhanh dần khi xe tiến gần vật cản, kêu liền khi dưới 20cm. Dùng gắn tường gara để đỗ xe đúng chỗ, hoặc làm cảm biến lùi cho xe đạp điện, xe đồ chơi, robot.

⏱ 60 phút🔧 Mới học💰 Linh kiện ~111.200đ🧠 Arduino Nano⚡ Nguồn USB 5V

✅ Đã kiểm thử

Luật điệnKhông lỗiSai chân, chập nguồn, quá áp 5V vào chân 3,3V, thiếu đi-ốt, thiếu trở kéo…
Mô phỏng SPICE2/2 kịch bản · 16 phép đo đạtDòng/áp từng linh kiện ở trường hợp xấu nhất (ngspice)
Biên dịch codeĐạt · dùng 15% bộ nhớarduino:avr:nano
Xem chi tiết 16 phép đo

Trường hợp xấu nhất: 3 đèn + còi cùng bật, đang phát xung đo

  • Q1: dẫn 29.2mA, Vce=0.03V (bão hòa tốt).
  • D1: dòng 8.2mA (cho phép 20.0mA).
  • D2: dòng 8.5mA (cho phép 20.0mA).
  • D3: dòng 9.0mA (cho phép 20.0mA).
  • Chân D4 cấp 8.2mA (an toàn ≤ 20.0mA).
  • Chân D5 cấp 8.5mA (an toàn ≤ 20.0mA).
  • Chân D6 cấp 9.0mA (an toàn ≤ 20.0mA).
  • Chân D8 cấp 4.1mA (an toàn ≤ 20.0mA).
  • Tổng dòng đỉnh từ USB 104.0mA (đủ với cục sạc 5V 1A).
  • Dòng LED xanh: 8.2mA ✓
  • Dòng LED vàng: 8.5mA ✓
  • Dòng LED đỏ: 9.0mA ✓
  • Dòng qua còi: 29.2mA ✓
  • Áp chân ECHO vào D10: 5.00V ✓

Không có vật cản (tất cả tắt)

  • Tổng dòng đỉnh từ USB 45.0mA (đủ với cục sạc 5V 1A).
  • Còi tắt: 0.0mA ✓
Kiểm lần cuối: 16:27:16 12/11/2026

Nguyên lý hoạt động

Arduino phát xung 10µs vào chân TRIG. HC-SR04 bắn 8 xung siêu âm 40kHz rồi giữ chân ECHO ở mức cao suốt thời gian sóng đi tới vật và dội về. Khoảng cách = thời gian × 0,0343 cm/µs ÷ 2. Mạch đo 5 lần liên tiếp và lấy giá trị giữa (trung vị) để loại bỏ các lần dội sai. Trên 100cm thì đèn xanh. 50–100cm đèn vàng, còi bíp chậm. 20–50cm đèn đỏ, còi bíp nhanh dần. Dưới 20cm còi kêu liền. Mỗi LED ăn khoảng 8mA qua trở 330Ω; còi ăn khoảng 30mA nên đi qua transistor S8050.

Sơ đồ đấu dây

Mỗi màu là một dây. Chấm tròn là điểm hàn. Chạm vào tên dây trong bảng để làm nổi bật.

5V5VGNDGNDTRIGTRIGECHOECHOBZ_DRVBZ_DRVBZ_BASEBZ_BASEBZ_COLBZ_COLG_DRVG_DRVG_AG_AY_DRVY_DRVY_AY_AR_DRVR_DRVR_AR_AU1 · Arduino Nano5VD4D5D6D8D9D10GNDR2 · Điện trở 330Ω12D1 · Đèn LED 5mmA · chân dài (+)K · chân ngắn (−)R3 · Điện trở 330Ω12D2 · Đèn LED 5mmA · chân dài (+)K · chân ngắn (−)R4 · Điện trở 330Ω12D3 · Đèn LED 5mmA · chân dài (+)K · chân ngắn (−)R1 · Điện trở 1kΩ12Q1 · Transistor NPN S8050B (gốc)C (góp)E (phát)U2 · Cảm biến siêu âm HC-SR04VCCECHOTRIGGNDBZ1 · Còi chip chủ động 5V-+
#DâyNối các điểm
1đỏ
5V
U1 5V ⟷ U2 VCC ⟷ BZ1 +
2đen
GND
U1 GND ⟷ U2 GND ⟷ Q1 E (phát) ⟷ D1 K · chân ngắn (−) ⟷ D2 K · chân ngắn (−) ⟷ D3 K · chân ngắn (−)
3vàng
TRIG
U1 D9 ⟷ U2 TRIG
4xanh lá
ECHO
U2 ECHO ⟷ U1 D10
5xanh dương
BZ_DRV
U1 D8 ⟷ R1 1
6tím
BZ_BASE
R1 2 ⟷ Q1 B (gốc)
7xanh ngọc
BZ_COL
BZ1 - ⟷ Q1 C (góp)
8nâu
G_DRV
U1 D4 ⟷ R2 1
9hồng
G_A
R2 2 ⟷ D1 A · chân dài (+)
10xám
Y_DRV
U1 D5 ⟷ R3 1
11xanh rêu
Y_A
R3 2 ⟷ D2 A · chân dài (+)
12tím nhạt
R_DRV
U1 D6 ⟷ R4 1
13vàng
R_A
R4 2 ⟷ D3 A · chân dài (+)

Danh sách linh kiện

Ký hiệuLinh kiệnGiá tham khảo
U1Arduino Nano V3 (ATmega328P, chip nạp CH340)85.000đTìm mua
U2Cảm biến siêu âm HC-SR04 (4 chân VCC-TRIG-ECHO-GND)20.000đTìm mua
Q1Transistor S8050 (TO-92)500đTìm mua
R1Điện trở 1kΩ 1/4W (nâu-đen-đỏ)200đTìm mua
BZ1Còi chip chủ động 5V4.000đTìm mua
D1LED xanh lá 5mm (green)300đTìm mua
D2LED vàng 5mm (yellow)300đTìm mua
D3LED đỏ 5mm (red)300đTìm mua
R2Điện trở 330Ω 1/4W (cam-cam-nâu)200đTìm mua
R3Điện trở 330Ω 1/4W (cam-cam-nâu)200đTìm mua
R4Điện trở 330Ω 1/4W (cam-cam-nâu)200đTìm mua
Tổng (chưa gồm board hàn, dây, thiếc)111.200đ

Các bước làm

Code nạp cho mạch

Chọn board Arduino Nano.

/*
  Mạch Gọn — Cảm biến lùi xe / đỗ xe gara
  Board : Arduino Nano (ATmega328P)
  Chân  : D9 -> TRIG, D10 <- ECHO (HC-SR04, 5V)
          D8 -> R 1k -> B S8050 (còi chủ động)
          D4/D5/D6 -> 330Ω -> LED xanh/vàng/đỏ
*/
#include <Arduino.h>

// ----- Cấu hình (cm) -----
const uint8_t PIN_TRIG = 9, PIN_ECHO = 10, PIN_BUZ = 8;
const uint8_t PIN_G = 4, PIN_Y = 5, PIN_R = 6;
const int FAR_CM   = 100;  // xa hơn: an toàn, đèn xanh
const int MID_CM   = 50;   // 50–100: đèn vàng, bíp chậm
const int STOP_CM  = 20;   // dưới 20: còi kêu liền
const int MAX_CM   = 400;  // ngoài tầm đo
const uint8_t SAMPLES = 5; // số lần đo để lấy trung vị
const uint32_t IDLE_SILENT_MS = 30000; // đứng yên ở vùng đỏ quá 30s thì tắt còi (xe đã đỗ)

int lastCm = -1;
uint32_t stableSince = 0;
int stableRef = -1;

// đo 1 lần, trả về cm (-1 nếu không có tiếng dội)
int measureOnce() {
  digitalWrite(PIN_TRIG, LOW);  delayMicroseconds(3);
  digitalWrite(PIN_TRIG, HIGH); delayMicroseconds(10);
  digitalWrite(PIN_TRIG, LOW);
  unsigned long us = pulseIn(PIN_ECHO, HIGH, 25000UL);  // ~4,3m tối đa
  if (us == 0) return -1;
  int cm = (int)(us * 0.0343 / 2.0 + 0.5);
  return (cm >= 2 && cm <= MAX_CM) ? cm : -1;
}

// lọc trung vị: bỏ các lần dội sai
int measureMedian() {
  int v[SAMPLES]; uint8_t n = 0;
  for (uint8_t i = 0; i < SAMPLES; i++) {
    int cm = measureOnce();
    if (cm > 0) v[n++] = cm;
    delay(12);  // chờ sóng dội cũ tắt hẳn
  }
  if (n == 0) return -1;
  for (uint8_t i = 1; i < n; i++) { int k = v[i]; int j = i - 1; while (j >= 0 && v[j] > k) { v[j + 1] = v[j]; j--; } v[j + 1] = k; }
  return v[n / 2];
}

void leds(bool g, bool y, bool r) { digitalWrite(PIN_G, g); digitalWrite(PIN_Y, y); digitalWrite(PIN_R, r); }

void setup() {
  Serial.begin(9600);
  pinMode(PIN_TRIG, OUTPUT); pinMode(PIN_ECHO, INPUT);
  pinMode(PIN_BUZ, OUTPUT); pinMode(PIN_G, OUTPUT); pinMode(PIN_Y, OUTPUT); pinMode(PIN_R, OUTPUT);
  // tự kiểm tra đèn + còi lúc bật
  leds(1, 0, 0); delay(150); leds(0, 1, 0); delay(150); leds(0, 0, 1); delay(150); leds(0, 0, 0);
  digitalWrite(PIN_BUZ, HIGH); delay(60); digitalWrite(PIN_BUZ, LOW);
  Serial.println(F("Cam bien lui xe san sang"));
}

void loop() {
  int cm = measureMedian();
  uint32_t now = millis();
  if (cm < 0) cm = MAX_CM + 1;  // không có vật trong tầm
  // làm mượt nhẹ
  lastCm = lastCm < 0 ? cm : (lastCm * 2 + cm) / 3;

  // phát hiện xe đã dừng hẳn (khoảng cách không đổi ±2cm) để tắt còi
  if (stableRef < 0 || abs(lastCm - stableRef) > 2) { stableRef = lastCm; stableSince = now; }
  bool parked = now - stableSince > IDLE_SILENT_MS;

  uint16_t onMs = 0, offMs = 0;
  if (lastCm > FAR_CM) { leds(1, 0, 0); }
  else if (lastCm > MID_CM) { leds(0, 1, 0); onMs = 60; offMs = 600; }
  else if (lastCm > STOP_CM) {
    leds(0, 0, 1);
    onMs = 50;
    offMs = map(lastCm, STOP_CM, MID_CM, 60, 300);  // càng gần càng nhanh
  } else { leds(0, 0, 1); onMs = 200; offMs = 0; }   // kêu liền

  if (parked && lastCm <= MID_CM) { onMs = 0; leds(0, 0, (now / 1000) % 2); }  // đã đỗ: chỉ nháy đỏ

  if (onMs) {
    digitalWrite(PIN_BUZ, HIGH); delay(onMs);
    if (offMs) { digitalWrite(PIN_BUZ, LOW); delay(offMs); }
  } else {
    digitalWrite(PIN_BUZ, LOW); delay(100);
  }

  static uint32_t lastLog = 0;
  if (now - lastLog > 500) {
    lastLog = now;
    Serial.print(F("Khoang cach: "));
    if (lastCm > MAX_CM) Serial.println(F("ngoai tam")); else { Serial.print(lastCm); Serial.println(F(" cm")); }
  }
}

🔌 Cắm thử trên breadboard

Cắm nháp trên board cắm trước cho chắc, chạy đúng rồi hãy làm mạch in. Sơ đồ này do máy tự xếp từ chính netlist ở trên và đã đối chiếu lại: hai chân cùng một cột (cùng nửa board) là thông nhau, không có net nào bị chập.

+−+−551010151520202525303035354040JIHGFEDCBAU1 · Arduino NanoGND5VD4D5D6D8D9D10U2Q1 S8050R1 1kBZ1+D1 greenD2 yellowD3 redR2 330R3 330R4 330
  • Mỗi cột 5 lỗ trong cùng một nửa board thông nhau; hai nửa cách nhau bởi rãnh giữa.
  • Hai đường kẻ dọc mép board là đường nguồn: hàng + (vạch đỏ) và hàng − (vạch xanh). Nhớ bắc dây nối đường nguồn trên với đường nguồn dưới nếu dùng cả hai nửa.
  • Màu dây trên hình trùng với màu trong bảng nối dây ở mục Sơ đồ, cắm theo màu cho dễ dò.

🧲 Mạch in để ủi (PCB 1 mặt)

Bản mạch in một mặt đồng, tự xếp linh kiện và tự đi dây, đã kiểm quy tắc khoảng cách và đối chiếu đúng 100% với sơ đồ nguyên lý ở trên. In tỉ lệ 1:1 rồi ủi lên tấm đồng.

Kích thước board76,2×61,0 mm53 lỗ khoan · mũi 0,8 / 0,9 / 1mm
Đi dây 1 mặt17 đoạn · 546,7 mm · 1 cầu nhảyCầu nhảy = đoạn dây hàn ở mặt linh kiện
Kiểm tra bản mạchĐạt DRC · khớp 100% netlistĐường ≥0,8mm, khe ≥0,5mm; mọi net đối chiếu lại từ hình học thật
Mặt đồng — đã lật gương sẵn để in rồi ủi úp xuống tấm đồng
Mặt linh kiện — vị trí, chiều cắm và tên từng chân
U1U2Q1R1BZ1D1D2D3R2R3R4D1D0RSTGNDD2D3D4D5D6D7D8D9D10D11D12VINGND2RST25VA7A6A5A4A3A2A1A0AREF3V3D13VCCTRIGECHOGND
Cầu nhảy cần hàn (dây đơn ở mặt linh kiện):
  • net GND: U1.GND → U2.GND
Hướng dẫn ủi – ăn mòn – khoan – hàn (đầy đủ)

Hướng dẫn làm mạch in bằng phương pháp ủi

Mạch: Cảm biến lùi xe / đỗ xe trong gara (còi kêu nhanh dần khi lại gần)

Kích thước board: 76,2×61,0 mm · 53 lỗ khoan (mũi 0,8, 0,9 và 1 mm) · 17 đoạn mạch, tổng 546,7 mm · 1 cầu nhảy.

Quy tắc đã kiểm: đường mạch rộng 0,8mm (nguồn và GND 1mm), khe cách tối thiểu 0,5mm. Mạch in đã được máy đối chiếu đúng 100% với sơ đồ nguyên lý.

1. In đúng tỉ lệ 1:1

  • In trang "MẶT ĐỒNG" bằng máy in LASER, đặt tỉ lệ 100%, KHÔNG chọn "Fit to page" hay "Scale to fit".
  • Dùng thước trên bản in đo lại đoạn 100mm: phải đúng 100mm mới dùng được.
  • In trên giấy in ảnh bóng, giấy decal bóc, hoặc giấy tạp chí láng. Mực càng dày càng tốt.
  • Trang "MẶT ĐỒNG" đã được LẬT GƯƠNG sẵn: úp mặt có mực vào tấm đồng là đúng chiều.

2. Chuẩn bị tấm đồng

  • Cắt phíp đồng (board đồng một mặt) lớn hơn kích thước mạch mỗi bề khoảng 5mm.
  • Chà mặt đồng bằng giấy nhám mịn (P800–P1200) rồi rửa sạch, lau khô. Mặt đồng phải sáng, không vết dầu mỡ, không chạm tay vào.

3. Ủi mực sang đồng

  • Úp mặt có mực vào tấm đồng, dùng băng keo giấy dán cố định một cạnh.
  • Bàn ủi để mức nóng nhất (cotton/linen), KHÔNG dùng chế độ phun hơi nước.
  • Ủi đè mạnh và đều 3–5 phút, tập trung từng vùng nhỏ, chú ý các góc và mép.
  • Để nguội hẳn rồi ngâm cả tấm vào nước ấm 5–10 phút, bóc giấy thật nhẹ. Giấy decal thì bóc khi còn ấm.
  • Soi kỹ: chỗ nào mực bị thiếu hoặc đứt đường thì tô lại bằng bút lông dầu (bút CD) rồi để khô.

4. Ăn mòn (etching)

  • Pha dung dịch sắt(III) clorua FeCl3 theo hướng dẫn trên bao bì, hoặc dung dịch oxy già + muối ăn + a-xít; dùng hộp nhựa, KHÔNG dùng đồ kim loại.
  • Nhiệt độ dung dịch khoảng 40–50°C thì ăn nhanh hơn. Lắc nhẹ hộp cho đều, thường 10–25 phút là xong.
  • An toàn: đeo găng tay cao su và kính bảo hộ, làm ở nơi thoáng. Dung dịch ăn mòn làm hỏng quần áo, bồn rửa và gây bỏng rát da.
  • Xong thì rửa board bằng nước sạch, lau khô, dùng xăng thơm hoặc axeton lau sạch lớp mực.
  • Dung dịch đã dùng KHÔNG đổ xuống bồn rửa hay cống; đựng vào can kín và bỏ đúng nơi thu gom chất thải.

5. Khoan lỗ

  • Đối chiếu trang "BẢN VẼ LỖ KHOAN" để biết lỗ nào dùng mũi nào.
  • Dùng mũi khoan 0,8mm, 0,9mm và 1mm, khoan từ MẶT ĐỒNG vào để mũi tự định tâm giữa pad.
  • Khoan tốc độ cao, đẩy nhẹ; mũi nhỏ rất dễ gãy. Khoan xong chà nhẹ bavia hai mặt.

6. Hàn linh kiện

  • Linh kiện cắm ở MẶT KHÔNG CÓ ĐỒNG, hàn ở mặt đồng. Theo trang "MẶT LINH KIỆN" để đặt đúng vị trí và đúng chiều.
  • Hàn linh kiện thấp trước (điện trở, đi-ốt), cao sau (tụ, hàng chân, board vi điều khiển).
  • Chú ý chiều: LED chân dài là (+); đi-ốt có vạch trắng là K; tụ hoá có vạch là (−); transistor theo mặt chữ như nét vẽ đỏ.
  • Mạch này còn 1 CẦU NHẢY: hàn đoạn dây đơn ở mặt linh kiện theo nét đỏ gạch trên bản vẽ:
  • cầu nhảy net GND: từ U1.GND sang U2.GND
  • Trước khi cấp điện: đo thông mạch giữa chân nguồn và GND — KHÔNG được kêu (không được chập).

Lưu ý với board vi điều khiển

  • Board nhái có thể khác thứ tự chân. Đối chiếu tên chân in cạnh từng lỗ trên trang "MẶT LINH KIỆN" với chữ in trên board thật TRƯỚC KHI ăn mòn. Nếu khác, đừng hàn mà báo lại để sửa bản vẽ.
Bản vẽ lỗ khoan
BẢN VẼ LỖ KHOAN (nhìn từ mặt linh kiện)mũi khoan 0,8mm — 11 lỗmũi khoan 0,9mm — 8 lỗmũi khoan 1mm — 34 lỗ

Đo kiểm bằng đồng hồ vạn năng

Giữa VCC và GND của HC-SR044,6 – 5,1V
Serial Monitor 9600 khi để tay cách 30cmkhoảng 28–32 cm
Đưa tay lại gần dầnĐèn xanh → vàng → đỏ, còi bíp nhanh dần rồi kêu liền dưới 20cm

Sửa lỗi thường gặp

Luôn báo 0cm hoặc không đo được

Kiểm tra TRIG/ECHO có bị đảo không; HC-SR04 cần đúng 5V. Vật mềm (vải, bông) hấp thụ sóng nên khó đo.

Số đo nhảy lung tung

Code đã lọc trung vị; nếu vẫn nhảy, giữ dây ngắn hơn, tránh đặt cảm biến sát tường bên (sóng dội ngang).

Còi không kêu

Kiểm tra là còi chủ động và chiều E-B-C của S8050.

Đèn quá sáng/quá tối

Đổi trở 330Ω thành 220Ω (sáng hơn) hoặc 1kΩ (tối hơn); không dùng dưới 150Ω.

⚠️ An toàn

  • Mạch 5V an toàn khi chạm.
  • Gắn trên xe thật: dùng nguồn 5V qua bộ đổi điện USB tẩu sạc, không đấu thẳng vào điện 12V của xe.
  • Chỉ là thiết bị hỗ trợ, luôn quan sát khi lùi xe.