آردوینو نمایشگر OLED پروژه های آردوینو

آموزش راه اندازی ماژول قطب نما با نمایشگر OLED برد آردوینو

آموزش ماژول قطب نما gy271 آردوینو
نوشته شده توسط علیرضا قربانی

در پست‌های قبلی به آموزش راه‌‌اندازی ماژول قطب‌نمای HMC5883 gy-271 به همراه نمایش آن بر روی LCD کاراکتری با استفاه از کتابخانه Adafruit_HMC5883_Unifiedپرداختیم. در این قسمت  به آموزش راه‌اندازی ماژول HMC5883 gy-271 با استفاده از کتابخانه compass به همراه نمایش جهت ناوربری بر روی OLED  می‌پردازیم. در ادامه با مرجع تخصصی آردوینو ، دیجی اسپارک همراه باشید.gy271 HMC8358  یک قطب نمای سه محوره دیجیتال است که میتواند شدت میدان مغناطیسی را تا ۸+/- گائوس با دقت ۵ میلی گائوس اندازه گیری کند. توسط ماژول HMC5883 میتوان زاویه خود را نسبت به محور ها با دقت ۱ الی ۲ درجه محاسبه نمود. از ماژول HMC5883 GY271 میتوان در سیستم ناوبری اتوماتیک ، سیستم های جهت یابی ربات استفاده نمود .

 


ماژول HMC5883 gy-271


ماژول HMC5883 یک سنسور قطب‌نما ۳ محوره (۳-axis magnetometer) است که برای اندازه‌گیری شدت میدان مغناطیسی در سه جهت مختصاتی (شمال-جنوب، شرق-غرب و بالا-پایین) استفاده می‌شود. این ماژول از یک تراشه‌ی حسگری با نام Honeywell HMC5883 استفاده می‌کند که از ماهواره‌های مصنوعی و سایر سیستم‌های موقعیت‌یابی مانند GPS و GLONASS برای تعیین جهت استفاده می‌شود. این ماژول با کمک تراشه‌ها و مدارات مجتمع دیگر کنترل و ارتباط با میکروکنترلرها و سیستم‌های دیگر را آسان می‌کند.با استفاده از ماژول HMC5883 یا GY-271، می‌توانید جهت‌یابی و اندازه‌گیری جهت با دقت بالا را در پروژه‌های مختلفی مانند رباتیک، هواپیماهای بدون سرنشین (درون)، ردیابی جهت و غیره به‌کار ببرید. این ماژول‌ها به عنوان یکی از عناصر مهم در ردیابی مسیر و جهت‌یابی در بسیاری از کاربردها مورد استفاده قرار می‌گیرند.


مشخصات ماژول قطب‌نمایgy-271


مشخصات فنی ماژول HMC5883 (GY-271) به شرح زیر است:

  • نوع سنسور: Magnetometer (قطب‌نما) ۳ محوره
  • تراشه‌ی سنسور: Honeywell HMC5883
  • ولتاژ کاری: ۳٫۳ ولت یا ۵ ولت (قابل تنظیم)
  • رابط ارتباطی: I2C (TWI)
  • دقت اندازه‌گیری: ۱٫۰ میلی‌تسلا (mT) یا ۰٫۱ گوس (Gauss)
  • محدوده‌ی اندازه‌گیری: ±۱٫۳ تسلا تا ±۸٫۱ تسلا (به طور پیش‌فرض ±۱٫۳ تسلا)
  • قابلیت کالیبراسیون دیجیتال
  • دمای کاری: -۴۰ درجه سانتی‌گراد تا +۸۵ درجه سانتی‌گراد
  • سرعت انتقال داده‌ها در رابط I2C: حداکثر ۴۰۰ کیلوهرتز
  • واحد اندازه‌گیری: تسلا (Tesla) یا گوس (Gauss)
  • اندازه‌ی ماژول: ۱۴٫۵ میلی‌متر در ۱۸٫۵ میلی‌متر
  • سیستم‌عامل‌های پشتیبانی‌شده: اندروید، آردوینو، رزبری‌پای و سیستم‌های دیگر با اتصال I2C

 

  • پروتکل ارتباطی I2C
  • دارای دقت ۱ تا ۲ درجه
  • ADC داخلی ۱۲ بیتی
  • دیتاریت ۱۶۰ هرتز
  • اندازه گیری ۸ تا ۸- شدت میدان مغناطیسی

 


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


آردوینو Uno

ماژول قطب نمای HMC5883 gy 271

ماژول OLED I2C

آموزش ماژول HMC5883 gy271

 


روش تست و راه اندازی HMC5883


برای نمایش جهت ناوبری از ماژول OLED I2C استفاده شده است که آموزش‌ها و کتابخانه آن در لینک زیر موجود می‌باشد:

آموزش  ماژول نمایشگر OLED I2C در آردوینو بخش اول

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

دانلود کتابخانه compass.h

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

محور مغناطیسی زمین با محور جغرافیایی آن (محور چرخش زمین) به طور کامل موازی نیست. در نتیجه خواندن یک قطب‌نما تا حدودی از شمال جغرافیایی انحراف دارد. این انحراف که با مکان تغییر می‌کند وردش مغناطیسی یا میل مغناطیسی نامیده می‌شود.میل مغناطیسی، در هر نقطه از زمین، زاویه بین شمال حقیقی و شمال مغناطیسی در آن نقطه است؛ یعنی زاویهٔ بین سمتی که عقربهٔ قطب‌نما نشان می‌دهد، و سمت شمال جغرافیایی. برخی از منابع مختلف میل مغناطیسی را «وردش مغناطیسی» هم می‌نامند که درست است. برخی هم به اشتباه آن را انحراف مغناطیسی گفته‌اند، ولی این واژه، برای انحراف ناچیز عقربهٔ قطب‌نما در اثر عوامل محیطی (مانند وسایل آهنی و منابع الکتریکی و غیره) است و هیچ ارتباطی با زاویه میل مغناطیسی در یک محل ندارد.

آموزش راه اندازی ماژول قطب نما GY271 HMC5883L

برای بدست آوردن جهت شمال مغناطیسی ابتدا باید میل مغناطیسی را  بر اساس مراحل زیر بدست آوردیم. برای پیدا کردن میل مغناطیسی می‌بایست ابتدا وارد سایت زیر شویم.

http://www.magnetic-declination.com/

در این سایت مقدار فیلد Magnetic declination برابر میل مغناطیسی می‌باشد.

آموزش راه اندازی ماژول قطب نما GY271 HMC5883L

در عکس بالا شما دو عدد °۳ و همچنین ’۴۹ را مشاهده میکنید. عدد ۴۹ بر پایه ی واحد دقیقه‌ی قوسی(هر دقیقه قوسی معادل  یک شصتم یک درجه است) می‌باشد و باید آن را به درجه تبدیل کنید و به عدد ۳ اضافه کنید.

۴۹÷۶۰=۰٫۸۱۶۶۶۶۶

۳+۰٫۸۱۶۶۶۶=۳٫۸۱۶۶۶۶۶۶

 


کد آردوینو


کد را کپی و در نرم افزار آردوینو اجرا کنید. قبل از آپلود کتابخانه ها را نصب کنید.

 

#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 استفاده کنید. سپس پارامترهای دریافتی را برای کالیبره کردن ربات در مسیر مورد نظرتان، تغییر بدهید.

          • ممنونم از راهنماییتون
            میتونید به این منظور مدل چندتا سنسور مورد اطمینان رو معرفی کنید؟

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

                • سلامت باشید. بستگی به پروژه مورد استفاده شما، گستره زیادی از سنسورها را میتوانید انتخاب کنید. از جمله اینکه پردازش تصویر، سنسور فراصوت برای تشخیص مانع و… میتوانید استفاده کنید. همگی اینها به سناریو تعریف شده مرتبط میباشند.

  • با سلام و احترام
    من کد رو روی آردوینو آپلود کردم اما روی نمایشگر یه تصویر برفکی نشون میده فقط…!
    همه کتابخونه ها رو نصب کردم. نمایشگر هم دقیقا از همون نوعیه که Vcc سمت چپ هست.
    ممنون میشم راهنمایی کنید

    • سلام
      با توجه به اینکه آموزش مربوط به ۸ سال گذشته است، ممکن است نسخه قدیمی کتابخانه نمایشگر اجرا شده باشد و سازگاری نداشته باشد. از کتابخانه ssd1306 استفاده کنید.
      کد بررسی خواهد شد.

      • متشکرم که پاسخ دادید
        و ممنون میشم اگر یه بررسی بفرمایید که چرا کار نمیکنه…
        مطمئنا برای شما چند دقیقه بیشتر طول نمیکشه ولی متاسفانه من در زمینه آردوینو تازه کارم

          • سلام و ادب و احترام
            جناب طباطبایی من این کارو کردم بازم نشد و همش ارور میده
            از یس کارم گیره حاضرم هزینه این کارم بپردازم فقط این ماژول با همین نمایشگر جواب بده. ازتون خواهش میکنم اگه براتون مقدوره به دادم برسید…!

            • با سلام مجدد
              جناب حسام الدین ببینید شما چونکه اولین تجربه آردوینوییی هست که دارید به همین دلیل کمی به مشکل خوردید. این آموزش مربوط به حدود ۸ سال پیش است و کتابخانه‌های استفاده شده در آن با نسخه‌هایی که امروز در دسترس هستند بسیار متفاوت شده است. پیشنهاد میکنم کتابخانه ای که نصب کردید را حذف کنید و از نسخه‌های قدیمی تر آن استفاده کنید.