آموزش ماژول قطب نما +نمایشگر OLED آردوینو
در پستهای قبلی به آموزش راهاندازی ماژول قطبنمای HMC5883 gy-271 به همراه نمایش آن بر روی LCD کاراکتری با استفاه از کتابخانه Adafruit_HMC5883_Unifiedپرداختیم. در این قسمت به آموزش راهاندازی ماژول HMC5883 gy-271 با استفاده از کتابخانه compass به همراه نمایش جهت ناوربری بر روی OLED میپردازیم. در ادامه با مرجع تخصصی آردوینو ، دیجی اسپارک همراه باشید.gy271 HMC8358 یک قطب نمای سه محوره دیجیتال است که میتواند شدت میدان مغناطیسی را تا ۸+/- گائوس با دقت ۵ میلی گائوس اندازه گیری کند. توسط ماژول HMC5883 میتوان زاویه خود را نسبت به محور ها با دقت ۱ الی ۲ درجه محاسبه نمود. از ماژول HMC5883 GY271 میتوان در سیستم ناوبری اتوماتیک ، سیستم های جهت یابی ربات و … استفاده نمود .
مشخصات ماژول قطبنمایgy-271
پروتکل ارتباطی I2C
دارای دقت ۱ تا ۲ درجه
ADC داخلی ۱۲ بیتی
دیتاریت ۱۶۰ هرتز
اندازه گیری ۸ تا ۸- شدت میدان مغناطیسی
سختافزار مورد نیاز
اتصالات
برای نمایش جهت ناوبری از ماژول OLED I2C استفاده شده است که آموزشها و کتابخانه آن در لینک زیر موجود میباشد:
آموزش ماژول نمایشگر OLED I2C در آردوینو بخش اول
در این آموزش از کتابخانه compass استفاده شده است که میتوایند آن را از لینک زیر دانلود نمایید.
توسط این کتابخانه میتوان زوایهی هر محور را نسبت به قطب شمال جغرافیایی اندازهگیری نمود.شمال جغرافیایی جهت قطب شمال جغرافیایی محلی است که محور گردش زمین سطح آنرا قطع میکند. هر نقطهای در سطح زمین که امتداد مستقیم آن به قطب شمال جغرافیایی برسد، شمال جغرافیایی یا شمال حقیقی یا شمال واقعی نامیده میشود. همه خطوط طول جغرافیایی، خطوط شمال واقعی هستند.شمال جغرافیایی در مقابل قطب مغناطیسی شمال بهکار میرود. بنابراین شمال حقیقی زمین از جهتی که قطبنماهای معمولی نشان میدهند، مقداری فاصله دارد.زاویه بین شمال حقیقی و شمال مغناطیسی، «میل مغناطیسی» نامیده میشود. برخی نقشهها تفاوت شمال حقیقی و شمال مغناطیسی را مشخص میکنند.قطبنمای ژیروسکوپی بر خلاف قطبنماهای عادی همواره جهت شمال حقیقی را نشان میدهد، نه شمال مغناطیس را؛ زیرا به مغناطیس وابستگی ندارد.
محور مغناطیسی زمین با محور جغرافیایی آن (محور چرخش زمین) به طور کامل موازی نیست. در نتیجه خواندن یک قطبنما تا حدودی از شمال جغرافیایی انحراف دارد. این انحراف که با مکان تغییر میکند وردش مغناطیسی یا میل مغناطیسی نامیده میشود.میل مغناطیسی، در هر نقطه از زمین، زاویه بین شمال حقیقی و شمال مغناطیسی در آن نقطه است؛ یعنی زاویهٔ بین سمتی که عقربهٔ قطبنما نشان میدهد، و سمت شمال جغرافیایی. برخی از منابع مختلف میل مغناطیسی را «وردش مغناطیسی» هم مینامند که درست است. برخی هم به اشتباه آن را انحراف مغناطیسی گفتهاند، ولی این واژه، برای انحراف ناچیز عقربهٔ قطبنما در اثر عوامل محیطی (مانند وسایل آهنی و منابع الکتریکی و غیره) است و هیچ ارتباطی با زاویه میل مغناطیسی در یک محل ندارد.
برای بدست آوردن جهت شمال مغناطیسی ابتدا باید میل مغناطیسی را بر اساس مراحل زیر بدست آوردیم:
برای پیدا کردن میل مغناطیسی میبایست ابتدا وارد سایت زیر شویم.
http://www.magnetic-declination.com/
در این سایت مقدار فیلد Magnetic declination برابر میل مغناطیسی میباشد.
در عکس بالا شما دو عدد °۳ و همچنین ’۴۹ را مشاهده میکنید. عدد ۴۹ بر پایه ی واحد دقیقهی قوسی(هر دقیقه قوسی معادل یک شصتم یک درجه است) میباشد و باید آن را به درجه تبدیل کنید و به عدد ۳ اضافه کنید.
۴۹÷۶۰=۰٫۸۱۶۶۶۶۶
۳+۰٫۸۱۶۶۶۶=۳٫۸۱۶۶۶۶۶۶
کدهای برنامه
#include "U8glib.h" #include <Wire.h> #include "compass.h" U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE | U8G_I2C_OPT_DEV_0); #define Task_t 10 int dt = 0; unsigned long t; void setup() { Serial.begin(9600); Wire.begin(); compass_offset_calibration(1); compass_init(0); } void loop() { t = millis(); float load; compass_scalled_reading(); Serial.print("x = "); Serial.println(compass_x_scalled); Serial.print("y = "); Serial.println(compass_y_scalled); Serial.print("z = "); Serial.println(compass_z_scalled); compass_heading(); //اضافه کردن میل مغناطیسی به شمال جغرافیایی برای بدست آوردن مقدار شمال مغناطیسی bearing += 3.81666666666; Serial.print("Heading angle = "); Serial.print(bearing); Serial.println(" Degree"); dt = millis() - t; load = (float)dt / (Task_t / 100); Serial.print("Load on processor = "); Serial.print(load); Serial.println("%"); u8g.firstPage(); do { draw(); } while (u8g.nextPage()); delay(100); } //تابع رسم void draw(void) { static int armLength = 20; static int cx = 64; static int cy = 20; int armX, armY; //convert degree to radian float bearingRad = bearing / 57.2957795; armX = armLength * cos(bearingRad); armY = -armLength * sin(bearingRad); u8g.setFont(u8g_font_unifont); u8g.setPrintPos(5, 28); u8g.print("N"); u8g.setPrintPos(0, 60); u8g.print(" "); u8g.setPrintPos(70, 60); u8g.print(bearing); u8g.drawLine(cx, cy, cx - armX, cy - armY); u8g.drawCircle(cx, cy, armLength, U8G_DRAW_ALL); }
توابع به کار رفته در کدهای فوق
compass_offset_calibration(int select)
این تابع برای کالیبراسیون ماژول قطبنما استفاده میشود.این تابع میتواند ۴ مقدار زیر را بپذیرد:
select=1
در این حالت میزان خطا کالبیره میشود.
select=2
در این حالت میزان انحراف از محورها کالیبره میشود.
select=3
در این حالت میزان انحراف از محورها و همچنین درصد خطا کالیبره میشود.
select=any
در این حالت عمل کالیبراسیون انجام نمیشود.
compass_init(int gain)
به وسیله این تابع میزان دقت اندازهگیری مشخص میشود.این تابع میتواند مقادیر زیر را دریافت کند:
gain=0: max scale = 0.73 gauss
gain=1: max scale = 0.92 gauss
gain=2: max scale = 1.22 gauss
gain=3: max scale = 1.52 gauss
gain=4: max scale = 2.27 gauss
gain=5: max scale = 2.56 gauss
gain=6: max scale = 3.03 gauss
gain=7: max scale = 4.35 gauss
compass_scalled_reading()
به وسیلهی این تابع مقدار اندازه گیری شده در راستای سه محور x , y و z بروزرسانی میشود و مقادیر آنها را در متغیرهایی به نام compass_x_scalled ، compass_y_scalled و compass_z_scalled میریزد.
compass_heading()
به وسیلهی این تابع علاوه بر بروزرسانی سه مقدار اندازه گیری شده در راستای سه محور x, y و z ، مقدار زاویهی ماژول نسبت به شمال جغرافیایی را بروزرسانی میکند و مقدار آن را در متغیری به نام bearing میریزد.
سلام
جناب مهندس چرا باید مقدار دقیقه را بعد از تبدیل، به عدد سه اضافه کنیم؟
درضمن ممنونم بابت آموزشتون
با سلام و عرض پوزش از مهندس عزیز که من جای ایشون پاسخ میدم
دوست عزیز اگه کد را دقیق مطالعه کرده باشید در یا کامنت جواب شما رو دادن که من مجددا آن را براتون می نویسم
“اضافه کردن میل مغناطیسی به شمال جغرافیایی برای بدست آوردن مقدار شمال مغناطیسی”
که این میل مغناطیسی با ممیز شناور طولانی انتخاب شده که کمترین مشکل مسیر یابی رو داشته باشیم
تشکر
ممنونم از سایت خوبی که دارید موفق باشید
سایت خوبی دارید موفق باشید
ممنون از لطفتون
سلام
یه سوال
چرا برخی از گوشی ها و اکثر تبلت ها قطب نما ندارن؟
سلام
یه سوال
چرا برخی از گوشی ها و اکثر تبلت ها قطب نما ندارن؟
مثلا تبلت لنوو نداره!
سلام ممنونم از سایت خوبی که دارید موفق باشید
ممنون از مطلب خوبتون موفق و پیروز باشید
با سلام و تشکر از سایت عالیتون
یک مشکلی رو برای این پروژه بهش برخورد کردم که بعد از چندروز تلاش بالاخره تونستم راه اندازیش کنم.
گفتم به اشتراک بذارم تا بقیه دوستان به این مشکل نخورن.
ماژول GY-271 که در این پروژه استفاده شده از نوع اورجینال هست که با کد HMC5883 شناخته میشه و روی IC کد L883 حک شده ولی متاسفانه اکثر ماژول های GY-271 موجود در بازار برای یک شرکت فرعی هستند و با کد QMC5883 شناخته میشن و روی IC کد DA5883 حک شده. برای راه اندازی این ماژول باید از کتابخونه جداگونه که برای QMC5883 هست استفاده کنید چون آدرس رجیستر و … این دو نوع ماژول کاملا باهم فرق دارن!
با سلام
از توجه شما سپاسگزارم. موارد را منتشر کردیم، لطفا دقت داشته باشید اگر دیگر کاربران سوالی بپرسند، شما میتوانید در پاسخ به ایشان سهیم باشید.
سلام.یعنی این برنامه ای که الان دوستمون گذاشته تو این پست روی QMC5883 جواب نمیده ؟؟؟
سلام. وقت بخیر. ایا اشیای فلزی دوروبر ماژول روی اطلاعات دریافتی ماژول تاثیرگذاره؟ یا مثلا اگر تو یه ربات استفاده کنیم موتور ربات تاثیر میذاره در کارکرد ماژول؟؟
با سلام
پیرو پاسخ قبلی، این موضوع بستگی به نوع ماژول دارد. بایستی اطلاعات دیتاشیت را بررسی کنید. در خصوص ربات بایستی پیش از انتخاب ماژول سناریو مورد نظر را کامل بررسی کنید. اینکه برای چه منظوری تصمیم به استفاده از ماژول قطب نما گرفته شده است، بسیار اهمیت دارد.
میخوام تو یه ربات جاروبرقی استفاده کنم از ماژول قطب نما بخاطر اینکه یه مسیر مستقیم رو طی کنه و به چپ یا راست منحرف نشه روی موکت یا فرش. به عبارتی تغییر زاویه نده تو حرکت
با سلام مجدد
برای این منظور استفاده از قطب نما انتخاب مناسبی نمیباشد. پیشنهاد میشود از ماژولهای حرکتی و ژایرو به همراه سنسور IR و یا SRF استفاده کنید. سپس پارامترهای دریافتی را برای کالیبره کردن ربات در مسیر مورد نظرتان، تغییر بدهید.
ممنونم از راهنماییتون
میتونید به این منظور مدل چندتا سنسور مورد اطمینان رو معرفی کنید؟
سلامت باشید، به لینک شتاب و ژایرو مراجعه کنید، انواع مختلفی وجود دارند. پیشنهاد بنده gy-291 میباشد. البته نیاز به استفاده از سنسورهای تکمیلی هم وجود دارد.
ممنون از پاسخگوییتون
میتونم خواهش کنم بگید سنسورهای تکلمیلی مولا چه سنسوری؟
یکم بیشتر راهنمایی کنید ممنون میشم
سلامت باشید. بستگی به پروژه مورد استفاده شما، گستره زیادی از سنسورها را میتوانید انتخاب کنید. از جمله اینکه پردازش تصویر، سنسور فراصوت برای تشخیص مانع و… میتوانید استفاده کنید. همگی اینها به سناریو تعریف شده مرتبط میباشند.