UWB چیست و چرا از WiFi یا BLE دقیقتر است؟
UWB (Ultra-Wideband) یک تکنولوژی رادیویی است که پالسهای بسیار کوتاه در طیف وسیع (۳.۱–۱۰.۶GHz) ارسال میکند. با اندازهگیری دقیق زمان رفت و برگشت پالس (ToF — Time of Flight) میتوان فاصله را با دقت ۱۰–۳۰cm اندازه گرفت — در مقابل WiFi که ۱–۲m و BLE که ۵–۱۰m خطا دارد. iPhone 11 به بعد و AirTag از UWB استفاده میکنند.
ماژول DWM1000 ساخت Decawave (حالا Qorvo) یکی از ارزانترین (~۳۵۰K) ماژولهای UWB برای آردوینو است. برای ناوبری داخل ساختمان حداقل ۳ Anchor ثابت و یک Tag (Rover) لازم است.
🛠️ کارت پروژه
| دقت موقعیت | ~۱۰–۳۰cm در فضای باز، ۲۰–۵۰cm داخل |
| تعداد ماژول | ۳ Anchor + ۱ Tag = ۴ ماژول DWM1000 |
| بودجه | ~۱.۵M تومان (۴ ماژول + Arduino) |
معماری سیستم UWB Anchor/Tag
کد Anchor — DWM1000
// کتابخانه: arduino-dw1000 (GitHub: thotro)
#include <DW1000.h>
#include <DW1000Ranging.h>
#define ANCHOR_ID "01:00:22:EA:82:60:3B:9C"
void setup(){
DW1000Ranging.startAsAnchor(ANCHOR_ID, DW1000.MODE_LONGDATA_RANGE_LOWPOWER);
}
void loop(){
DW1000Ranging.loop();
}
کد Tag + Trilateration
// موقعیت Anchorها (متر)
float ax[]={0, 8, 4};
float ay[]={0, 0, 6};
float d[3]; // فاصله از هر Anchor
void trilaterate(float &px, float &py){
// Least Squares برای ۳ Anchor
float A = 2*(ax[1]-ax[0]);
float B = 2*(ay[1]-ay[0]);
float C = d[0]*d[0]-d[1]*d[1]-ax[0]*ax[0]+ax[1]*ax[1]-ay[0]*ay[0]+ay[1]*ay[1];
float D = 2*(ax[2]-ax[0]);
float E = 2*(ay[2]-ay[0]);
float F = d[0]*d[0]-d[2]*d[2]-ax[0]*ax[0]+ax[2]*ax[2]-ay[0]*ay[0]+ay[2]*ay[2];
px = (C*E-F*B)/(A*E-D*B);
py = (A*F-D*C)/(A*E-D*B);
}