Cảm biến PIR quen thuộc trong các mạch đèn tự động có ba nhược điểm khó chịu: nó đo nhiệt nên hôm nào trời nóng là báo liên tục, nó chỉ thấy vật thể phát nhiệt đi ngang qua vùng nhìn nên ai đi chậm hoặc bị tấm kính chắn là mất tín hiệu, và nó không phân biệt được người đang đi vào hay đi ra. Cảm biến radar 5.8GHz xử lý cả ba điểm đó bằng một nguyên lý khác hẳn: phát sóng liên tục rồi lắng nghe sóng dội về từ vật đang chuyển động.

Bài này dựng một cảm biến radar 5.8GHz cho Home Assistant theo cách đơn giản nhất: module KW007-SE nối với board ESP32-C3 bằng đúng ba sợi jumper, đầu ra GPO là mức logic cao/thấp, ESPHome đọc chân GPIO và đẩy trạng thái lên Home Assistant. Không hàn, không thư viện phức tạp, không cần thêm bo mạch trung gian. Chế độ I2C của module (đọc khoảng cách, phân biệt hướng đi) sẽ để dành cho bài sau, vì đấu dây lại từ đầu vẫn dùng đúng module đó.

Chuẩn bị linh kiện

Danh sách dưới đây là bản dựng tối giản, mọi thứ nối bằng jumper trên breadboard nên có thể tháo ra đấu lại trong vài phút.

  • Cảm biến radar 5.8GHz KW007-SE (KeyWave). Ngoài ba chân dùng trong bài (3V3, GND, GPO) module còn chân DELAY để chỉnh thời gian giữ và các chân phục vụ chế độ I2C.
  • Board ESP32-C3, bài gốc dùng Baguette C3. Bất kỳ board ESP32 nào có cổng USB và chân GPIO đều thay được, chỉ cần sửa số chân trong cấu hình.
  • Cáp USB-C có truyền dữ liệu (cáp sạc rẻ tiền thường chỉ có hai dây nguồn và sẽ không hiện cổng nối tiếp).
  • Breadboard nửa size và ba sợi jumper đực-đực.
  • Tuỳ chọn: một điện trở 1/4W nếu muốn rút ngắn thời gian giữ, một tụ 10µF nếu nguồn 3.3V không sạch.

Cảm biến radar 5.8GHz hoạt động thế nào

Cảm biến radar 5.8GHz phát một sóng mang liên tục ở 5.8GHz, bước sóng khoảng 51,7mm. Khi sóng chạm vào một vật đang di chuyển, tần số của phần sóng dội về bị lệch đi, gọi là hiệu ứng Doppler. Độ lệch tính theo công thức fd = 2v/λ, với v là vận tốc theo phương tới module và λ là bước sóng. Người đi bộ 1 m/s tạo độ lệch chừng 38Hz, hoàn toàn tách được khỏi sóng phát.

Bên trong module, mạch trộn lấy sóng phát trừ sóng thu để ra tín hiệu trung tần rất nhỏ, khuếch đại lên, lọc băng hẹp rồi so với một ngưỡng. Khi biên độ vượt ngưỡng, đầu ra GPO kéo lên mức cao 3.3V; khi hết chuyển động, GPO xuống mức thấp sau một khoảng giữ. Với cách đấu dây trong bài, ESP32-C3 chỉ việc đọc mức logic đó, toàn bộ phần xử lý tương tự nằm trong module.

Ba hệ quả kỹ thuật cần nhớ trước khi lắp đặt:

  • Cảm biến radar nhìn xuyên nhựa, gỗ, vách thạch cao, nên có thể giấu sau mặt tủ hoặc vỏ nhựa in 3D. Kim loại và nước thì chặn gần như hoàn toàn, đừng đặt sau tấm nhôm hay sát bình nước nóng.
  • Nó bắt chuyển động chứ không bắt sự có mặt. Ngồi yên đọc sách là mất tín hiệu, đây là điểm khác biệt so với các module presence 24GHz dùng cho phát hiện người đứng yên.
  • Vật đi càng chậm thì độ lệch Doppler càng nhỏ và tầm phát hiện càng ngắn. Cùng một người, đi nhanh bắt xa hơn đi rón rén.
Tiêu chí Cảm biến PIR Cảm biến radar 5.8GHz
Nguyên lý Đo thay đổi nhiệt hồng ngoại trong vùng nhìn Đo dịch tần Doppler của sóng 5.8GHz dội về
Người đứng yên Không phát hiện Không phát hiện, vì không có dịch tần
Đặt sau vỏ nhựa Không được, phải hở mắt thấu kính Được, chỉ cần tránh vỏ kim loại
Ảnh hưởng nhiệt độ môi trường Rất mạnh, trời nóng là báo sai Gần như không, chỉ phụ thuộc chuyển động
Vùng phủ Hình nón hẹp theo thấu kính Fresnel Gần như đẳng hướng quanh module
Phân biệt hướng đi Không Có, nhưng phải dùng chế độ I2C
Cảm biến radar 5.8GHz KW007-SE cắm bên trái breadboard, board Baguette C3 ESP32-C3 cắm bên phải
Cảm biến radar KW007-SE gắn một đầu breadboard, board ESP32-C3 gắn đầu còn lại để đi dây jumper.

Đấu dây: ba sợi jumper, không hàn

Đặt board ESP32-C3 ở một đầu breadboard, cảm biến radar ở đầu kia, chừa khoảng trống ở giữa cho ba sợi jumper. Cắm module sao cho hai hàng chân rơi vào hai rãnh khác nhau của breadboard, nếu không chân 3V3 và GND sẽ chập vào nhau.

Chân trên board ESP32-C3 Chân trên KW007-SE Chức năng
3V 3V3 Nguồn 3.3V
G GND Mass chung
4 GPO Tín hiệu ra mức cao/thấp

Ba lưu ý khi đi dây. Thứ nhất, module chạy 3.3V, đừng lấy chân 5V, radar 5.8GHz sẽ nóng và sai ngưỡng. Thứ hai, GPO đã là logic 3.3V nên đấu thẳng vào GPIO, không cần cầu phân áp, và tuyệt đối không cấp áp cao hơn vào chân này. Thứ ba, mass phải chung giữa board và module, nếu không tín hiệu sẽ trôi theo nhiễu nguồn và cảm biến báo loạn.

Ba sợi jumper đỏ, đen, vàng nối cảm biến radar KW007-SE với board Baguette C3
Chỉ ba sợi: đỏ là 3V, đen là GND, vàng là tín hiệu GPO xuống GPIO4.

Khi đổi board, cảm biến radar vẫn giữ nguyên cách đấu, chỉ có số chân GPIO là thay đổi. Chọn chân GPIO thường, tránh các chân strapping như GPIO9 (chân vào chế độ nạp), GPIO8 và GPIO2 trên ESP32-C3, vì điện áp trên đó lúc khởi động có thể làm board không boot. Trên Baguette C3, chân số 4 nối với GPIO4 và đây là lựa chọn an toàn.

Cấu hình ESPHome cho cảm biến radar

Cắm board đã gắn cảm biến radar vào máy tính bằng cáp USB-C. Bài gốc nạp firmware từ laptop chứ không phải từ máy chủ Home Assistant, cách này tránh được phiền toái khi máy chủ đặt xa và cổng USB không nằm trong tầm với.

Mở ESPHome Device Builder, chọn Create a new project, gõ hoặc chọn ESP32-C3 rồi chọn Generic ESP32-C3 Board. Đặt tên thiết bị, bài gốc dùng KW007-Baguette, tên này sẽ thành hostname và định danh thiết bị trong Home Assistant.

Hộp thoại Select your board của ESPHome với board Generic ESP32-C3 được chọn
Chọn Generic ESP32-C3 Board, hoặc board tương ứng nếu bạn dùng chip ESP32 khác.

Trang cấu hình hiện ra với rất nhiều mục, phần lớn bỏ qua được. Kéo xuống cuối file YAML và dán thêm khối sau:

binary_sensor:
  - platform: gpio
    pin: GPIO4
    name: "Motion"
    device_class: motion

Bốn khoá trong khối này làm đúng bốn việc: platform: gpio khai báo đọc mức logic trên chân, pin: GPIO4 chỉ định chân nhận tín hiệu từ GPO, name đặt tên entity hiển thị, và device_class: motion cho Home Assistant biết đây là cảm biến chuyển động để dùng đúng icon, logbook và câu lệnh tự động hoá. Thiếu device_class thì vẫn chạy nhưng entity chỉ là binary_sensor chung chung. Từ đây, mỗi lần đầu ra GPO lên mức cao, cảm biến radar sẽ đẩy trạng thái on lên Home Assistant và giữ nguyên cho tới khi hết thời gian giữ.

Trình soạn YAML của ESPHome với khối binary_sensor platform gpio pin GPIO4 được thêm ở cuối file
Khối binary_sensor được dán vào cuối file cấu hình của KW007_Baguette.

Nạp firmware qua USB

Bấm Save rồi Install. ESPHome hỏi nạp theo cách nào, chọn Plug into this computer cho lần đầu, vì board chưa có firmware và chưa vào được Wi-Fi. Các lần cập nhật sau có thể chọn nạp qua mạng.

Hộp thoại How do you want to install the firmware với tuỳ chọn Plug into this computer
Lần đầu phải nạp qua USB, các lần cập nhật sau có thể nạp qua mạng.

Quá trình biên dịch lần đầu mất vài phút vì ESPHome phải tải toolchain và thư viện về máy. Cửa sổ hiện thời gian đã chạy, cứ để yên, đừng đóng tab.

Hộp thoại Compiling firmware của ESPHome hiển thị thời gian đã chạy
Lần biên dịch đầu mất vài phút vì phải tải toolchain và thư viện về máy.

Build xong, bạn sẽ thấy thông báo trang không nạp được qua USB vì không chạy HTTPS hoặc localhost. Đây không phải lỗi. Trình duyệt chặn Web Serial trên trang HTTP, nên ESPHome đẩy file firmware sang một tab web.esphome.io và nạp từ đó, toàn bộ diễn ra cục bộ trong máy bạn, firmware không đi qua server nào.

Thông báo Firmware built kèm nút Open USB flasher trong ESPHome
Vì trang chạy HTTP nội bộ nên ESPHome đẩy file sang web.esphome.io để nạp.

Bấm Open USB flasher, chọn Connect & Install, rồi chọn cổng USB JTAG/serial debug unit. ESP32-C3 có bộ USB Serial/JTAG nằm ngay trong chip nên hệ điều hành thấy nó dưới tên đó chứ không phải tên board. Nếu phân vân giữa nhiều cổng, rút board ra rồi xem mục nào biến mất.

Danh sách cổng nối tiếp trong trình duyệt với mục USB JTAG/serial debug unit (COM6)
ESP32-C3 hiện lên dưới tên USB JTAG/serial debug unit, không phải tên board.

Sau khi chọn cổng, màn hình đen hiện log nạp firmware cho cảm biến radar. Chờ tới khi thấy các dòng báo board kết nối Wi-Fi hoặc thông báo hoàn tất, đó là lúc firmware đã chạy và thiết bị đã lên mạng. Nếu quá ba phút không thấy gì, kiểm tra lại cáp và cổng USB trước khi nghi ngờ board.

Đưa cảm biến radar vào Home Assistant

Vào Settings > Devices & Services, thẻ Discovered sẽ có mục mang tên bạn đã đặt, kèm nhãn ESPHome. Bấm Add, chọn khu vực, và bạn sẽ dừng ở trang thiết bị quen thuộc.

Màn hình Devices and Services của Home Assistant hiện thẻ Discovered KW007_Baguette ESPHome
Thiết bị hiện trong mục Discovered ngay khi vào được Wi-Fi.

Entity cảm biến radar nằm trong mục Sensors, trạng thái Detected khi GPO ở mức cao và Clear khi xuống mức thấp. Nhật ký hoạt động cho thấy từng cặp Detected/Clear, nhìn vào đó là biết cảm biến đang bắt đúng nhịp hay báo loạn.

Trang thiết bị KW007_Baguette trong Home Assistant với entity Motion đang Detected
Entity Motion nhảy Detected/Clear theo mức logic trên chân GPO của cảm biến radar.

Giờ có thể dùng entity này làm trigger cho bất cứ thứ gì Home Assistant điều khiển được. Một automation đèn hành lang thường có ba phần: trigger là trạng thái của cảm biến radar chuyển sang on, condition là trời tối hoặc cảm biến ánh sáng dưới ngưỡng, action là bật đèn kèm hẹn giờ tắt. Nhớ rằng tín hiệu giữ nguyên 64 giây sau lần chuyển động cuối, nên đừng đặt điều kiện tắt đèn sau 30 giây, đèn sẽ tắt trong lúc còn người đi lại.

Chỉnh thời gian giữ bằng điện trở

Với cảm biến radar đấu ba dây, GPO giữ mức cao đúng 64 giây tính từ lần phát hiện chuyển động gần nhất. Có chuyển động mới trong khoảng đó thì đồng hồ đếm lại từ đầu. Với đèn cầu thang, 64 giây là vừa; với cảnh báo cửa, 64 giây là quá dài vì một lần đi qua cửa sẽ giữ trạng thái suốt hơn một phút.

Muốn đổi thời gian giữ của cảm biến radar, nối một điện trở giữa chân DELAY và GND của module. Bảng dưới là giá trị nhà sản xuất đưa ra:

Thời gian giữ Điện trở nối vào chân DELAY
1 giây 270kΩ
16 giây 0Ω, nối thẳng DELAY xuống GND
32 giây 150kΩ
64 giây Không nối gì (mặc định)

Bảng này không tuyến tính theo giá trị điện trở, và thực tế có sai lệch giữa các module. Bài gốc ghi nhận chỉ có điện trở 200kΩ trong tay và đo được khoảng 1 giây thay vì 32 giây như suy đoán từ bảng.

Vì vậy hãy chọn điện trở gần giá trị mong muốn rồi đo lại bằng đồng hồ hoặc bằng log của Home Assistant, đừng tin tuyệt đối vào con số in trên giấy. Nếu chỉ cần rút ngắn thời gian báo trên Home Assistant mà không muốn hàn, có thể giữ nguyên phần cứng và dùng bộ lọc delayed_off của ESPHome để tắt trạng thái sớm hơn, nhưng nhớ rằng làm vậy là cắt bớt tín hiệu thật chứ không thay đổi hành vi của module.

Xử lý sự cố thường gặp

Bốn nhóm lỗi của cảm biến radar dưới đây chiếm gần hết các ca hỏi trên diễn đàn: nguồn nhiễu, chọn sai chân, mạng không thấy thiết bị, và hiểu sai thời gian giữ.

Hiện tượng Nguyên nhân Cách xử lý
Entity luôn Detected dù phòng trống Đầu ra GPO của cảm biến radar đang ở mức cao do rung mặt bàn, hoặc dây tín hiệu chạm nhầm vào 3V3 Đặt breadboard lên mặt phẳng cố định, đo GPO bằng đồng hồ khi yên tĩnh, kiểm tra lại dây vàng về đúng chân 4
Báo loạn khi bật quạt hoặc đèn huỳnh quang Nhiễu nguồn trên rail 3.3V lan vào mạch khuếch đại của module Thêm tụ 10µF giữa 3V3 và GND sát chân module, dùng nguồn riêng cho board thay vì lấy từ cổng USB của máy tính
Bắt chuyển động ở phòng bên cạnh Sóng 5.8GHz của cảm biến radar xuyên vách nhựa, gỗ mỏng, hoặc phản xạ qua gương Xoay hướng module, dời khỏi vách ngăn, dán một miếng kim loại nhỏ phía sau module làm mặt chắn
Home Assistant không thấy thiết bị mDNS không đi qua được VLAN, hoặc board chưa vào Wi-Fi Thêm thiết bị thủ công bằng hostname hoặc IP, xem log ESPHome, kiểm tra lại SSID và mật khẩu Wi-Fi
Nạp xong không thấy Wi-Fi, có mạng tên KW007_Baguette SSID là băng 5GHz, ESP32-C3 chỉ có Wi-Fi 2.4GHz, hoặc sai mật khẩu Vào captive portal của mạng dự phòng để nhập lại SSID 2.4GHz, hoặc nạp lại với secret đúng
Board không boot sau khi gắn cảm biến Dùng chân strapping như GPIO9, GPIO8, GPIO2 cho tín hiệu cảm biến Đổi sang chân thường như GPIO4, GPIO5, GPIO6, sửa đúng số chân trong YAML rồi nạp lại
Trình duyệt không hiện cổng USB Cáp chỉ có dây nguồn, hoặc cổng USB của máy tính không cấp đủ dòng Đổi sang cáp có truyền dữ liệu, thử cổng USB khác, rút bớt thiết bị USB khác
Mỗi lần có người là giữ trạng thái hơn một phút Thời gian giữ mặc định 64 giây của module Nối điện trở vào chân DELAY theo bảng phía trên, hoặc rút ngắn bằng bộ lọc trong ESPHome

Ứng dụng thực tế

Với đèn hành lang hoặc đèn cầu thang, cảm biến radar 5.8GHz hợp hơn PIR ở chỗ không bị ánh nắng và nhiệt độ phòng làm sai, lại giấu được sau mặt công tắc nhựa. Với tủ trưng bày hoặc cửa hàng, module đặt trong vỏ nhựa sau tấm ốp, người đi ngang qua là Home Assistant bật đèn và bắt đầu đếm; muốn đếm số lượt thì đếm các cạnh lên của entity thay vì đếm thời gian bật.

Với nhà có nuôi chó mèo, cảm biến radar sẽ bắt cả thú cưng vì nó chỉ quan tâm tới chuyển động. Cách xử lý thực dụng là đặt module cao trên 1,5m và hướng xuống hành lang, hoặc kết hợp thêm một cảm biến khác để lọc. Ngược lại, nếu bài toán là phát hiện người ngồi làm việc trong phòng, cảm biến radar 5.8GHz không làm được, phải dùng module presence 24GHz chuyên cho việc đó.

Hướng nâng cấp tiếp theo là chế độ I2C của chính module này: cùng một mạch, đấu thêm hai dây tín hiệu, đọc được cường độ tín hiệu Doppler và phân biệt vật đang tiến vào hay lùi ra. Nhờ vậy cảm biến radar có thể làm bộ đếm người vào ra thay vì chỉ báo có chuyển động. Tài liệu tham chiếu cho các thanh ghi và chế độ này nằm trong repo KeyWave trên GitHub.

Ba điểm đáng nhớ từ bản dựng này: cảm biến radar 5.8GHz chỉ cần ba dây vì mọi phần xử lý tương tự đã nằm trong module, đầu ra GPO là logic 3.3V nên đấu thẳng vào GPIO là đủ; ESPHome biến một chân GPIO thành entity chuyển động chỉ với bốn dòng YAML, không cần viết firmware C++; và thời gian giữ 64 giây là tham số cần chỉnh đầu tiên khi cảm biến báo sai nhịp, trước khi nghĩ tới việc thay module. Cùng chuyên mục Thủ thuật Raspberry Pi còn các bài khác về ghép cảm biến và board nhúng vào một hệ thống tự động hoá chung.

Nguồn: The Pi Hut