آموزش راه اندازی ماژول مکان یابی DWM1000 با آردوینو

فهرست مطالب

ویژگی های ماژول مکان یابی DWM1000

DWM1000 یک ماژول ترنسیور سازگار با IEEE802.15.4-2011 UWB است که بر پایه ی آی سی DecaWave’s DW1000 ساخته شده است. این ماژول با استفاده از سیستم مکان یابی بی درنگ یا به اختصار RTLS می تواند موقعیت اجسام را با دقت 10 سانتی متر اندازه گیری کند. این ماژول قابلیت ایجاد ارتباط با سرعت 6.8Mb/s و دامنه ارتباطی 300 متر را دارد. از این ماژول همچنین در شبکه های سنسور وایرلس (WSN) نیز استفاده می شود.

توجه
  • برای راه اندازی این ماژول به حداقل 2 عدد از آن نیاز دارید.
  • جهت اتصال مطمئن این ماژول به میکرو کنترلر بهتر ازست یک PCB طراحی کنید.
  • برای دریافت نمونه طرح و راهنمایی بیشتر به اینجا و اینجا مراجعه کنید.

جهت دریافت دیتاشیت ماژول مکان یابی DWM1000 اینجا کلیک کنید.

معرفی پایه ها (Pinout) ماژول مکان یابی DWM1000

ماژول DWM1000 دارای 24 پایه به شرح زیر است:

  • 3V: تغذیه ماژول – 3.3 ولت
  • GND: زمین
  • IRQ: وقفه از سوی ماژول
  • SCK: همزمان سازی برای پروتکل SPI
  • MOSI: خط ارسالی اطلاعات برای پروتکل SPI
  • MISO: خط دریافتی اطلاعات برای پروتکل SPI
  • CS: انتخاب دستگاه های زیر مجموعه برای پروتکل SPI

پین اوت (Pinout) این ماژول را می توانید در تصویر زیر مشاهده کنید.

لوازمی که به آن احتیاج دارید

قطعات مورد نیاز

آردوینو UNO R3 × 1
ماژول مکان یابی DWM1000 × 1
مبدل منطقی دو طرفه × 1
ماژول تنظیم کننده ولتاژ Ams1117 × 1
سیم جامپر × 1

نرم افزارهای مورد نیاز

آردوینو IDE

راه اندازی ماژول مکان یابی DWM1000 با آردوینو

گام اول: سیم بندی

مطابق مدار زیر، ماژول را به آردوینو وصل کنید.

گام دوم: کد

ابتدا کتابخانه زیر را  بر آردوینوی خود نصب کنید. 

https://github.com/thotro/arduino-dw1000

توجه

اگر نیاز به راهنمایی بیشتر برای نصب کتابخانه بر روی آردوینو دارید، می توانید به آموزش نصب کتابخانه بر آردوینو مراجعه کنید.

کد زیر را روی برد اول آردوینوی خود آپلود کنید.

    /**
 * 
 * @todo
 *  - move strings to flash (less RAM consumption)
 *  - fix deprecated convertation form string to char* startAsAnchor
 *  - give example description
 */
#include <SPI.h>
#include "DW1000Ranging.h"

// connection pins
const uint8_t PIN_RST = 9; // reset pin
const uint8_t PIN_IRQ = 2; // irq pin
const uint8_t PIN_SS = SS; // spi select pin

void setup() {
  Serial.begin(115200);
  delay(1000);
  //init the configuration
  DW1000Ranging.initCommunication(PIN_RST, PIN_SS, PIN_IRQ); //Reset, CS, IRQ pin
  //define the sketch as anchor. It will be great to dynamically change the type of module
  DW1000Ranging.attachNewRange(newRange);
  DW1000Ranging.attachBlinkDevice(newBlink);
  DW1000Ranging.attachInactiveDevice(inactiveDevice);
  //Enable the filter to smooth the distance
  //DW1000Ranging.useRangeFilter(true);
  
  //we start the module as an anchor
  DW1000Ranging.startAsAnchor("82:17:5B:D5:A9:9A:E2:9C", DW1000.MODE_LONGDATA_RANGE_ACCURACY);
}

void loop() {
  DW1000Ranging.loop();
}

void newRange() {
  Serial.print("from: "); Serial.print(DW1000Ranging.getDistantDevice()->getShortAddress(), HEX);
  Serial.print("\t Range: "); Serial.print(DW1000Ranging.getDistantDevice()->getRange()); Serial.print(" m");
  Serial.print("\t RX power: "); Serial.print(DW1000Ranging.getDistantDevice()->getRXPower()); Serial.println(" dBm");
}

void newBlink(DW1000Device* device) {
  Serial.print("blink; 1 device added ! -> ");
  Serial.print(" short:");
  Serial.println(device->getShortAddress(), HEX);
}

void inactiveDevice(DW1000Device* device) {
  Serial.print("delete inactive device: ");
  Serial.println(device->getShortAddress(), HEX);
}

کد زیر را روی برد دوم آردوینوی خود آپلود کنید.

    /**
 * 
 * @todo
 *  - move strings to flash (less RAM consumption)
 *  - fix deprecated convertation form string to char* startAsTag
 *  - give example description
 */
#include <SPI.h>
#include "DW1000Ranging.h"

// connection pins
const uint8_t PIN_RST = 9; // reset pin
const uint8_t PIN_IRQ = 2; // irq pin
const uint8_t PIN_SS = SS; // spi select pin

void setup() {
  Serial.begin(115200);
  delay(1000);
  //init the configuration
  DW1000Ranging.initCommunication(PIN_RST, PIN_SS, PIN_IRQ); //Reset, CS, IRQ pin
  //define the sketch as anchor. It will be great to dynamically change the type of module
  DW1000Ranging.attachNewRange(newRange);
  DW1000Ranging.attachNewDevice(newDevice);
  DW1000Ranging.attachInactiveDevice(inactiveDevice);
  //Enable the filter to smooth the distance
  //DW1000Ranging.useRangeFilter(true);
  
  //we start the module as a tag
  DW1000Ranging.startAsTag("7D:00:22:EA:82:60:3B:9C", DW1000.MODE_LONGDATA_RANGE_ACCURACY);
}

void loop() {
  DW1000Ranging.loop();
}

void newRange() {
  Serial.print("from: "); Serial.print(DW1000Ranging.getDistantDevice()->getShortAddress(), HEX);
  Serial.print("\t Range: "); Serial.print(DW1000Ranging.getDistantDevice()->getRange()); Serial.print(" m");
  Serial.print("\t RX power: "); Serial.print(DW1000Ranging.getDistantDevice()->getRXPower()); Serial.println(" dBm");
}

void newDevice(DW1000Device* device) {
  Serial.print("ranging init; 1 device added ! -> ");
  Serial.print(" short:");
  Serial.println(device->getShortAddress(), HEX);
}

void inactiveDevice(DW1000Device* device) {
  Serial.print("delete inactive device: ");
  Serial.println(device->getShortAddress(), HEX);
}

آموزش های مشابه

Comments (20)

  • رسول Reply

    باسلام و عرض ادب

    من میخوام تو فضای بسته مثلا ساختمون، روی میز چندتا نود بکارم که فاصله این نودا از هم کمه، مثلا سی چهل سانتی متر، بعدش محل این نود ها بصورت انلاین به
    سیستم رایانم ارسال بشه. نمیخوام از GPS استفاده کنم و اینکه یکبار شکل رو مربع در نظر بگیریم. حالا اگه تعداد بیشتر بشه (مثلا برای 8 ضلعی بخوام موقعیت نود هارو بدست بیارم) باید چیکار کنم؟ شما میدونید من باید از کجا شروع کنم؟ تخصص من این نیست فقط میخوام از این سنسورا استفاده کنم. ممنون میشم در اسرع وقت راهنماییم بفرمایید

    بااحترام
    موسوی

    ژانویه 27, 2021 at 1:57 ب.ظ
    • مهران ملکی Reply

      سلام.
      برای این کار نیاز به 8 سنسور dwm1000 به همراه 8 تا برد آردوینو دارید. که یکی از این بردهای آردوینو به عنوان مستر با بقیه آردوینوها در ارتباط باشه و همچنین اطلاعات رو به رایانه منتقل کنه. یعنی به تعداد نودها به برد آردوینو و این سنسور نیاز دارید.

      ژانویه 27, 2021 at 5:18 ب.ظ
      • رسول Reply

        ایمیل من seyyedrasoulmousavi95@gmail.com هستش. اگه شما نحوه ساختشو میدونید لطفا پیام بدید بتونم با شما در ارتباط باشم برای ساختش. بابت هزینه هم صحبت میکنیم اگه کار رو بپذیرید.

        ژانویه 27, 2021 at 5:26 ب.ظ
  • سامان Reply

    سلام
    وقتتون بخیر
    امکان استفاده از nodemcu و حذف مبدل منطقی دو طرفه و ماژول تنظیم کننده ولتاژ وجود دارد؟
    سپاس

    اکتبر 23, 2022 at 2:07 ب.ظ
    • مهران ملکی Reply

      سلام
      وقت شما هم بخیر
      بله، در صورتی که از بردی مثل NodeMCU و یا سایر میکروکنترلرهایی که بر پایه 3ولت کار میکنن استفاده کنید نیازی دیگه به استفاده از مبدل منطقی دوطرفه و ماژول تنظیم‌کننده ولتاژ نیست.

      اکتبر 28, 2022 at 3:53 ب.ظ
  • راهنما Reply

    سلام
    وقتتون بخیر
    ما در نظر داریم دوتا وسیله ی متحرک با سرعت نسبتا زیاد را مسافت یابی کنیم. به صورت آنی.
    چه ماژول UWB را توصیه میکنید؟
    اگر این ماژول را خریداری کنیم موفق به این کار میشویم؟ لنگر ثابت هم نداشته باشیم
    این دوتا خودشان دو به دو میتوانند فاصله را محاسبه کنند؟ یا نیاز به میکرو برای محاسبات دارد؟؟
    و برای اینکه فاصله ی محاسبه شده ی اینها را داشته باشیم روی گوشی موبایل را روی PC باید این فاصله ی محاسبه شده را با چه رابطی دریافت کنیم؟

    دسامبر 20, 2022 at 9:36 ب.ظ
    • علی عبدالملکی Reply

      سلام وقت بخیر
      سرعت زیادی که میفرمایید دقیقا چه قدر هست؟
      سرعت انتقال دیتای این ماژول تا 6 مگابیت بر ثانیه است که کاربرد real time location هم داره
      این سنسور دارای cpu مجزا نیست پس برای کار کردن باهاش یه میکروکنترلر یا برد جدا میخوایید
      فاصله محاسبه شده رو میتونید به Esp32 بدید بعدش از طریق Wifi یا BLE به گوشیتون بفرستید

      فوریه 28, 2023 at 4:31 ب.ظ
  • مانی Reply

    سلام
    وقت بخیر

    میخواستم دلیل استفاده از میکروکنترلر خارجی مثل Arduino رو بدونم، دقیقا برای چی این میکروکنترلر کنار ماژول dwm1000 استفاده میشه؟
    فقط برای پروگرم کردن هستش یا اینکه پردازش و … هم روی میکروی خارجی متصل به dwm1000 انجام میشه؟

    فوریه 3, 2023 at 10:45 ب.ظ
    • علی عبدالملکی Reply

      سلام
      شما از ماژول dwm1000 به تنهایی نمیتونید استفاده کنید ، خودش دارای میکرو یا پردازنده ایی نیست
      برای استفاده از این ماژول حتما بردی با پردازشگر باید باشه

      فوریه 28, 2023 at 9:49 ق.ظ
      • بهار Reply

        سلام
        میخوام بدونم بر چه اساسی این کد نوشته شده؟

        مارس 22, 2023 at 11:32 ب.ظ
        • محمد دمیرچی Reply

          با سلام
          در ابتدای آموزش ذکر شده است رفرنسی که از آن برای نوشتن این آموزش استفاده شده است چه چیزی می باشد.
          می توانید رفرنس را مطالعه بفرمایید

          آوریل 8, 2023 at 5:10 ب.ظ
  • بهار Reply

    من با کسی که کد راه اندازی dwm1000 نوشته کار دارم لطفا ایمیل بدین یه راهنمایی ازتون میخواستم.

    مارس 22, 2023 at 11:36 ب.ظ
    • محمد دمیرچی Reply

      با سلام
      سوال خودتون رو بپرسید
      در توانمان باشد جواب خواهیم داد

      آوریل 8, 2023 at 5:06 ب.ظ
      • بهار Reply

        آقای دمیرچی من به کمکتون نیاز دارم میشه آی دی در بله یا ایتا بهم بدین تا باهاتون مستقیم در ارتباط باشم
        من باید این ماژول را با آرم راه اندازی کنم اما قبلش باید درکی از ماژول و نحوه عملکردش داشته باشم تا کد را بهتر و با درک بالا بنویسیم دیتاشیت را میخونم اما درکش نمیکنم ماژول چطور داره کار میکنه به طور مثال tag چه اطلاعاتی برای anchor ارسال میکنه و اون چی جواب میده

        آوریل 10, 2023 at 8:05 ب.ظ
  • فرزاد Reply

    سلام وقتتون بخیر
    یه سوال داشتم خدمتتون
    آیا برای tag ها هم استفاده از میکروکنترلر واجب هست؟
    یعنی میتونیم ماژولی که به صورت tag توسط میکرو پیکربندی شده رو از میکرو جدا کنیم و فقط به تغذیه وصل بشه؟

    ژوئن 15, 2023 at 12:58 ق.ظ
    • محمد دمیرچی Reply

      با سلام
      بلی باید از میکروکنترلر در هر 2 سمت استفاده شود.

      ژوئن 17, 2023 at 3:09 ب.ظ
  • فرزاد محمدي Reply

    سلام وقت بخير
    در حالتي كه ما از ماژول DWM1000 به عنوان tag استفاده مي كنيم، پس از تظيمات اوليه آيا بايد به صورت مداوم به ميكرو متصل باشه تا اطلاعات رو براي anchor ارسال كنه؟
    ايميل بنده fa.mohammadi@ut.ac.ir

    ژوئن 17, 2023 at 12:42 ب.ظ
    • محمد دمیرچی Reply

      با سلام
      استفاده از میکروکنترلر الزامی می باشد.

      ژوئن 17, 2023 at 3:17 ب.ظ
  • عرفان نعمتی Reply

    سلام وقت بخیر
    من میخوام بدون gps یک ربات پرنده را موقعیت یابی کنم، برای اینکار مدنظرم هست که از uwb و ins به صورت تلفیقی استفاده کنم.
    بنظر شما برای کاربرد گفته شده این روش مناسب هست؟
    ممنون میشم اگه نظری دارید بفرمایید.

    سپتامبر 16, 2023 at 4:10 ب.ظ
    • محمد دمیرچی Reply

      با سلام
      جناب سنسور های موقعیت یاب مشابه DWM1000 یا uwb از 4 سنسور تشکل می شود که 3 عدد از آنها به عنوان محیط فضای کلی شما می شود و باید این 3 عدد را به صورت مثلثی با فاصله از هم قرار بدهید
      سنسور چهارم نیز در این وسط قرار میگیرد و براساس موقعیت مکانی که نسبت به این 3 سنسور دارند موقعیت یابی میشود.
      از آنجایی که شما میخواهید از ربات پرنده استفاده کنید پیشنهاد میکنم از همان gps استفاده کنید و در صورتی که مشکل شما دقت اندازه گیری می باشد می توانید از gps هایی که مود rtk را ساپورت میکنند استفاده کنید. دقت خیلی بالاتری را به شما میدهند.

      سپتامبر 17, 2023 at 1:16 ب.ظ

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.