به کمک آردوینو و ماژول جهت یاب GY-511 قطب نما بسازید

فهرست مطالب

مقدمه

در برخی از پروژه‌های الکترونیکی نیاز داریم جهت جغرافیایی را در هر لحظه بدانیم و عملیات مورد نظر را با توجه به آن انجام دهیم. در این آموزش می‌خواهیم ماژول جهت یاب LSM303DLHC GY-511 را به کمک آردوینو راه‌اندازی کنیم و به کمک آن یک قطب نما‌ی دیجیتال بسازیم.  در ابتدا با این ماژول و نحوه کار آن آشنا می‌شویم و در ادامه نحوه راه اندازی آن با آردینو را خواهیم دید.

آنچه در این آموزش یاد می گیرید

اطلاعاتی درباره‌ ماژول جهت یاب

ماژول جهت یاب یا قطب نمای LSM303DLHC GY-511 یک سنسور شتاب سنج خطی دیجیتال و سنسور مغناطیسی دیجیتال سه بعدی است. این سنسور توانایی اندازه گیری شتاب خطی در مقیاس های کامل ±2g / ±4g / ±8g / ±16 gو میدان های مغناطیسی در مقیاس های کامل ±1.3 / ±1.9 / ±2.5 / ±4.0 / ±4.7 / ±5.6 / ±8.1 گوس را دارد. وقتی این ماژول در میدان مغناطیسی قرار میگیرد طبق قانون لورنتز جریان تحریکی در سیم پیچی‌های میکروسکوپی آن القا میشود. ماژول جهت یاب این جریان را به ولتاژ دیفرانسیلی در خروجی مربوط به هر جهت مختصات تبدیل میکند. با توجه به این ولتاژها می‌توان میدان مغناطیسی را در هر جهت محاسبه کرد و موقعیت جغرافیایی را به دست آورد.
نکته
یکی دیگر از ماژول‌های جهت یاب متداول، ماژول QMC5883L می‌باشد. این ماژول که ساختار و کاربرد مشابهی با ماژول LMS303 دارد، در نحوه عملکرد کمی متفاوت است. پس در هنگام انجام پروژه‌ها دقت کنید که اگر ماژول شما QMC5882L می‌باشد، از کتابخانه و کد‌های مناسب آن که در آموزش قرار داده می‌شود استفاده کنید.

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

سخت افزارهای مورد نیاز

آردوینو UNO R3 × 1
ماژول قطب نمای سه محوره GY-511 × 1
سروو موتور × 1
نمایشگر کاراکتری 1602 × 1
سیم جامپر برد بورد × 1

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

Arduino IDE

راه‌اندازی ماژول جهت یاب GY-511 با آردینو

ماژول جهت یاب GY-511  دارای 8 پین است که برای راه‌اندازی آن توسط آردوینو به 4 پین آن نیاز دارید. ارتباط ماژول GY-511 با آردینو از طریق پروتکل I2C می‌باشد. در نتیجه باید پین های SDA (خروجی ارتباط I2C) و  SCK(ورودی کلاک I2C) ماژول را به پین‌های مربوط به ارتباط I2C آردوینو متصل کنیم.
نکته
همان طور که مشاهده می‌کنید برای این پروژه‌ه از ماژول GY-511 استفاده شده است، اما شما میتوانید از این آموزش برای راه اندازی سایر ماژول‌های جهت یاب سری LMS303 نیز استفاده کنید.

کالیبراسیون ماژول قطب نمای GY-511

برای جهت یابی ابتدا نیاز داریم که ماژول را کالیبره کنیم، یعنی رنج اندازه گیری آن را بین 0 تا 360 درجه تنظیم کنیم. برای این کار اتصالات ماژول به آردینو را مانند شکل زیر انجام دهید و کدی که در ادامه می‌بینید را روی برد خود آپلود کنید. پس از اجرای کد اعدادی که در پنجره سریال مانیتور به شما نشان داده می‌شود، کمترین و بیشترین رنج اندازه‌گیری در راستای X، Y و Z می‌باشند. در قسمت بعد به این اعداد نیاز خواهید داشت، آن‌ها را یادداشت کنید.

سیم بندی

کد

در برنامه زیر به کتابخانه‌های Wire.h، مربوط به ارتباط I2C و LMS303.h ، مربوط به ماژول جهت یاب، نیاز خواهید داشت. می‌توانید این کتابخانه‌ها را از لینک‌های زیر دانلود کنید:

LMS303.h Library

Wire.h Library

نکته
اگر از QMC5883 استفاده می‌کنید، به کتابخانه زیر نیاز خواهید داشت. MechaQMC5883L.h در این قسمت کد مربوط به ماژول LMS303 را بررسی می‌کنیم، اما شما می‌توانید کد مربوط به ماژول QMC را نیز در ادامه دانلود کنید.
/*   
Compass Calibration
by Hanie Kiani 
Home
*/ #include <Wire.h> #include <LSM303.h> LSM303 compass; LSM303::vector<int16_t> running_min = {32767, 32767, 32767}, running_max = {-32768, -32768, -32768}; char report[80]; void setup() { Serial.begin(9600); Wire.begin(); compass.init(); compass.enableDefault(); } void loop() { compass.read(); running_min.x = min(running_min.x, compass.m.x); running_min.y = min(running_min.y, compass.m.y); running_min.z = min(running_min.z, compass.m.z); running_max.x = max(running_max.x, compass.m.x); running_max.y = max(running_max.y, compass.m.y); running_max.z = max(running_max.z, compass.m.z); snprintf(report, sizeof(report), "min: {%+6d, %+6d, %+6d} max: {%+6d, %+6d, %+6d}", running_min.x, running_min.y, running_min.z, running_max.x, running_max.y, running_max.z); Serial.println(report); delay(100); }
  compass.enableDefault();

آماده سازی و مقدار دهی اولیه ماژول

  compass.read();

خواندن مقادیر خروجی ماژول جهت یاب

   running_min.z = min(running_min.z, compass.m.z);
  running_max.x = max(running_max.x, compass.m.x);

یافتن کمترین و بیشترین رنج اندازه گیری ماژول با مقایسه مقادیر اندازه‌گیری شده

ساخت یک قطب نمای دیجیتال

پس از کالیبره کردن ماژول، می‌خواهیم با اتصال یک سروموتور به آن قطب نما بسازیم. به طوری که نشانگر سروموتور، همانند عقربه‌ی قرمز قطب نما، همیشه جهت شمال را به ما نشان دهد. برای این کار ابتدا جهت جغرافیایی به کمک ماژول جهت یاب محاسبه شده و به آردینو ارسال می‌شود. سپس با اعمال ضریب مناسب محاسبه میکنیم سروموتور باید چند درجه بچرخد تا نشانگر آن همچنان به سمت شمال مغناطیسی باشد. در نهایت آن زاویه را به سروموتور اعمال میکنیم.

سیم بندی

کد

در این قسمت علاوه بر کتابخانه های قبلی به کتایخانه Servo.h نیز نیاز دارید. این کتابخانه به صورت پیش‌فرض روی نرم افزار آردینو شما قرار دارد.

/*   
Compass Heading
by Hanie Kiani 
Home
*/ #include <Wire.h> #include <LSM303.h> #include <Servo.h> LSM303 compass; int servoPin = 3; Servo Servo1; void setup() { Serial.begin(9600); Wire.begin(); Servo1.attach(servoPin); compass.init(); compass.enableDefault(); compass.m_min = (LSM303::vector<int16_t>){-32767, -32767, -32767}; compass.m_max = (LSM303::vector<int16_t>){+32767, +32767, +32767}; } void loop() { compass.read(); float heading =compass.heading((LSM303::vector<int>){0, 0, 1}); Serial.println(heading); Servo1.write(180-heading); delay(100); }
 Servo Servo1;

معرفی سروموتور

  Servo1.attach(servoPin); 
 compass.init();
 compass.enableDefault();
تنظیمات اولیه ماژول جهت یاب و سروموتور آرگومان تابع Servo1.attach() شماره پینی است که سروموتور را به آن متصل کرده‌ایم.
 compass.m_min = (LSM303::vector){-32767, -32767, -32767};
  compass.m_max = (LSM303::vector){+32767, +32767, +32767};

در این قسمت مینیمم و ماکزیمم رنجی که در قسمت قبل به دست آورده‌ایم را برای آردوینو تعریف میکنیم.

 float heading =compass.heading((LSM303::vector){0, 0, 1});

تابع heading() زاویه محور‌های مختصات را نسبت به یک محور ثابت میخواند. شما میتوانید محور ثابت خود را توسط برداری در آرگومان تابع تعریف کنید. به طور مثال در اینجا با معرفی(LSM303::vector<int>){0, 0, 1}  محور Z به عنوان محور ثابت در نظر گرفته شده است.

Servo1.write(heading);
با تابع Servo1.write()  مقدار زاویه خوانده شده توسط ماژول جهت یاب، به سروموتور اعمال می‌شود.
نکته
توجه داشته باشید که سروموتور ممکن است یک میدان مغناطیسی داشته باشد، پس بهتر است سروموتور و ماژول جهت یاب را در فاصله مناسبی از هم قرار دهید که این میدان مغناطیسی باعث انحراف ماژول جهت یاب نشود.

یگ گام جلوتر

  • با اضافه کردن ماژول ESP8266 این قابلیت را به سیستم اضافه کنید که موقعیت شما را در هر لحظه به تلفن همراه شما گزارش کند.

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

Comments (4)

  • فرزاد Reply

    سلام.
    کاربرد شتاب سنج تو این ماژول چیه ؟
    چه تاثیری در روند اندازه گیری قطب نما داره؟؟

    آگوست 28, 2019 at 1:00 ب.ظ
    • سعید حسینی Reply

      سلام.
      یه ویژگی دیگه این ماژول شتاب سنجی هست، برای پیدا کردن قطب زمین همون مگنتومترش کافیه.

      سپتامبر 1, 2019 at 7:48 ق.ظ
  • مصطفی Reply

    این ماژول میزان زاویه برحسب درجه نشون میده؟
    اگر بخوایم سروو موتور نسبت به سطح زمین توسط ماژول شتاب سنج در زاویه های های ۰ و ۳۰ و ۶۰ و ۹۰ و ۱۲۰ و ۱۵۰ و ۱۸۰ تنظیم کنیم باید چیکار کنیم؟

    دسامبر 25, 2021 at 11:20 ب.ظ
    • مهران ملکی Reply

      سلام.
      این ماژول یک مقدار به عنوان زاویه برمیگردونه که الزاما دقیقا بر حسب درجه نیست. در واقع باید کالیبراسیون رو خودتون انجام بدید. روش کالیبراسیون هم برای همه سنسورها مشابه همدیگه ست، یک بار ماژول رو در یک حالت که از نظر خودتون زاویه 0 هست قرار میدید. مقداری که ماژول برمیگردونه رو یاداشت میکنید. یکبار هم ماژول رو در حالت 90 درجه قرار میدید و مقدار برگردونده شده توسط ماژول رو یادداشت میکنید. بعد با داشتن این دو مقدار میتونید فرمول لازم برای اینکه مقدار برگردونده شده توسط ماژول رو به زاویه تبدیل کنید، بدست بیارید. یعنی در واقع باید mapping لازم رو انجام بدید.

      دسامبر 26, 2021 at 9:18 ق.ظ

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

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