Thùng rác thông minh tự mở nắp khi đưa tay lại gần

Đưa tay (hoặc túi rác) cách miệng thùng dưới 20cm thì nắp tự mở bằng động cơ servo, rút tay ra 3 giây thì tự đóng. Không phải chạm tay, hợp vệ sinh cho bếp, phòng khám, lớp học. Lắp được cho thùng rác nắp lật cỡ nhỏ và vừa (nắp nhẹ dưới 200g).

⏱ 90 phút🔧 Mới học💰 Linh kiện ~137.000đ🧠 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 SPICE1/1 kịch bản · 3 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 18% bộ nhớarduino:avr:nano
Xem chi tiết 3 phép đo

Đang mở nắp (servo chạy, cảm biến đang đo)

  • Tổng dòng đỉnh 695.1mA: dùng cục sạc điện thoại 5V ≥1A, cổng USB máy tính có thể không đủ.
  • Mức tín hiệu điều khiển servo (cần ≥ 2V): 5.00V ✓
  • Áp chân ECHO vào D8: 5.00V ✓
  • Dòng chân D9 cấp cho dây tín hiệu servo: 0.0mA ✓
Lưu ý:
  • Tổng dòng đỉnh 695.1mA: dùng cục sạc điện thoại 5V ≥1A, cổng USB máy tính có thể không đủ.
Kiểm lần cuối: 17:08:36 12/11/2026

Nguyên lý hoạt động

Cảm biến siêu âm HC-SR04 gắn ở mặt trước nắp, đo khoảng cách tới tay mỗi 60ms (lọc trung vị 3 lần đo). Khi dưới 20cm, Arduino xuất xung điều khiển 50Hz vào dây cam của servo để quay cần tới góc mở (mặc định 100°). Khi tay đã rút ra 3 giây, servo quay từ từ về góc đóng rồi ngắt xung để servo không rung và đỡ tốn điện. Servo lúc khởi động ăn tới khoảng 650mA trong tích tắc, nên có tụ 470µF đặt sát chân nguồn servo để Arduino không bị sụt áp khởi động lại; tổng dòng đỉnh khoảng 0,7A nên dùng cục sạc 5V từ 1A trở lên.

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.

⚡ Mô phỏng tương tácBấm thử — mạch được giải ngay trên máy bạn, điện áp và dòng hiện lên sơ đồ bên dưới.
Chân D7điều khiển U2
Chân D9điều khiển M1
U2 · ECHOngõ ra Cảm biến siêu âm HC-SR04

Đây là mô phỏng một chiều (DC) ở trạng thái tĩnh: dùng để kiểm tra mức áp, dòng và công suất. Hiệu ứng nhấp nháy, PWM hay giao tiếp số do code quyết định nên không chạy ở đây.

5V5VGNDGNDTRIGTRIGECHOECHOSERVO_SIGSERVO_SIGU1 · Arduino Nano5VD7D8D9GNDU2 · Cảm biến siêu âm HC-SR04VCCECHOTRIGGNDM1 · Động cơ servo SG90VCC · dây đỏSIG · dây camGND · dây nâuC1 · Tụ điện 470µF-+
#DâyNối các điểmÁp mô phỏng
1đỏ
5V
U1 5V ⟷ U2 VCC ⟷ M1 VCC · dây đỏ ⟷ C1 +—
2đen
GND
U1 GND ⟷ U2 GND ⟷ M1 GND · dây nâu ⟷ C1 -—
3vàng
TRIG
U1 D7 ⟷ U2 TRIG—
4xanh lá
ECHO
U2 ECHO ⟷ U1 D8—
5xanh dương
SERVO_SIG
U1 D9 ⟷ M1 SIG · dây cam—

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-SR0420.000đTìm mua
M1Động cơ servo SG90 (nắp nặng 150–300g thì đổi MG90S bánh răng kim loại, cùng chân)30.000đTìm mua
C1Tụ hóa 470µF 10V hoặc 16V (470u)2.000đTìm mua
Tổng (chưa gồm board hàn, dây, thiếc)137.000đ

Các bước làm

Code nạp cho mạch

Cài thư viện: Servo (Arduino IDE → Library Manager). Chọn board Arduino Nano.

/*
  Mạch Gọn — Thùng rác tự mở nắp
  Board : Arduino Nano (ATmega328P)
  Chân  : D7 -> TRIG, D8 <- ECHO (HC-SR04)
          D9 -> dây cam servo SG90 (đỏ 5V, nâu GND), tụ 470µF sát nguồn servo
  Thư viện: Servo (có sẵn trong Arduino IDE)
*/
#include <Arduino.h>
#include <Servo.h>

// ----- Cấu hình -----
const uint8_t PIN_TRIG = 7, PIN_ECHO = 8, PIN_SERVO = 9;
const int ANGLE_CLOSED = 0;     // góc nắp đóng (độ)
const int ANGLE_OPEN   = 100;   // góc nắp mở (độ)
const int OPEN_CM      = 20;    // đưa tay gần hơn khoảng này thì mở
const uint32_t HOLD_MS = 3000;  // rút tay bao lâu thì đóng
const uint8_t CLOSE_STEP_MS = 12; // đóng từ từ: mỗi độ 12ms

Servo lid;
bool isOpen = false;
uint32_t lastSeen = 0;
int angleNow = ANGLE_CLOSED;

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, 20000UL);   // tối đa ~3,4m
  if (us == 0) return -1;
  int cm = (int)(us * 0.0343 / 2.0 + 0.5);
  return cm >= 2 ? cm : -1;
}

int measureMedian3() {
  int a = measureOnce(); delay(10);
  int b = measureOnce(); delay(10);
  int c = measureOnce();
  // lần nào không đo được coi như rất xa
  if (a < 0) a = 999; if (b < 0) b = 999; if (c < 0) c = 999;
  return max(min(a, b), min(max(a, b), c));
}

void moveTo(int target, uint8_t stepMs) {
  if (!lid.attached()) lid.attach(PIN_SERVO);
  int dir = target > angleNow ? 1 : -1;
  if (stepMs == 0) { angleNow = target; lid.write(target); delay(350); return; }
  while (angleNow != target) { angleNow += dir; lid.write(angleNow); delay(stepMs); }
  delay(150);
}

void setup() {
  Serial.begin(9600);
  pinMode(PIN_TRIG, OUTPUT);
  pinMode(PIN_ECHO, INPUT);
  lid.attach(PIN_SERVO);
  lid.write(ANGLE_CLOSED);       // về góc đóng lúc bật điện (dùng để lắp cần)
  delay(600);
  lid.detach();                  // ngắt xung: servo không rung, đỡ tốn điện
  Serial.println(F("Thung rac thong minh san sang"));
}

void loop() {
  int cm = measureMedian3();
  uint32_t now = millis();
  bool near = cm <= OPEN_CM;

  if (near) {
    lastSeen = now;
    if (!isOpen) {
      Serial.print(F("Tay cach ")); Serial.print(cm); Serial.println(F(" cm -> MO NAP"));
      moveTo(ANGLE_OPEN, 0);      // mở nhanh
      isOpen = true;
    }
  } else if (isOpen && now - lastSeen >= HOLD_MS) {
    Serial.println(F("DONG NAP"));
    moveTo(ANGLE_CLOSED, CLOSE_STEP_MS);  // đóng từ từ, êm
    lid.detach();
    isOpen = false;
  }

  static uint32_t lastLog = 0;
  if (now - lastLog > 1000) { lastLog = now; Serial.print(F("Khoang cach: ")); Serial.print(cm >= 999 ? -1 : cm); Serial.println(F(" cm")); }
  delay(40);
}

🔌 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.

+−+−551010151520202525JIHGFEDCBAU1 · Arduino NanoGND5VD7D8D9U2M1C1 470u+
  • 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 board48,3×48,3 mm39 lỗ khoan · mũi 0,9 / 1mm
Đi dây 1 mặt8 đoạn · 177,8 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
U1U2M1C1D1D0RSTGNDD2D3D4D5D6D7D8D9D10D11D12VINGND2RST25VA7A6A5A4A3A2A1A0AREF3V3D13VCCTRIGECHOGNDGNDVCCSIG
Cầu nhảy cần hàn (dây đơn ở mặt linh kiện):
  • net GND: U1.GND → C1.-
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: Thùng rác thông minh tự mở nắp khi đưa tay lại gần

Kích thước board: 48,3×48,3 mm · 39 lỗ khoan (mũi 0,9 và 1 mm) · 8 đoạn mạch, tổng 177,8 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,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 C1.-
  • 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,9mm — 2 lỗmũi khoan 1mm — 37 lỗ

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

Giữa dây đỏ và dây nâu của servo4,7 – 5,1V (không sụt dưới 4,5V lúc servo quay)
Serial Monitor khi đưa tay cách 15cmBáo khoảng 15cm và "MO NAP"
Rút tay raSau 3 giây nắp tự đóng từ từ

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

Servo giật giật, Arduino tự khởi động lại

Nguồn yếu: dùng cục sạc ≥1A, dây USB ngắn tốt; kiểm tra tụ 470µF đã hàn đúng chiều và sát servo.

Nắp không mở nổi

Nắp quá nặng hoặc cần đẩy quá gần bản lề: dời điểm đẩy xa bản lề hơn, hoặc đổi sang servo MG90S.

Tự mở khi không có ai

Cảm biến dội vào thành thùng/tường: nghiêng cảm biến lên một chút hoặc giảm OPEN_CM xuống 15.

Servo kêu rè ở vị trí đóng

Code đã ngắt xung sau khi đóng; nếu vẫn kêu, chỉnh ANGLE_CLOSED lệch 3–5° để servo không bị kẹt vào nắp.

⚠️ An toàn

  • Mạch 5V an toàn; để xa nước, đặt board trong hộp kín.
  • Không để ngón tay vào khe bản lề khi nắp đang đóng.