در این آموزش به کمک ماژول ژایرو MPU6050 مقادیر x, y و z را در محیط ۳D بدست آورده و سپس به کمک نمایشگر Oled و برد ESP8266 مقادیر نمایش خواهیم داد. بدست آوردن چنین مقادیری برای پروژه هایی که نیاز به چنین مقادیری برای راهاندازی دارند بسیار مفید است، برای مثال PID کنترلر ها، پهباد ها و در مجموع در مواردی که نیاز داریم با تغییر موقعیت ماژول تغییراتی را در خروجی مشاهده کنیم. در ادامه این آموزش با مرجع تخصصی آردوینو به زبان فارسی، دیجی اسپارک همراه باشید.
ماژول شتاب سنج MPU6050
حالا زمان این رسیده با سخت افزار اصلی این آموزش، یعنی MPU6050 بیشتر آشنا بشیم. Mpu6050 دارای یک شتاب سنج سه محوره و یک ژیروسکوپ سه محوره MEMS میباشد. دقت ماژول مبدل آنالوگ به دیجیتال ۱۲ بیت بوده و میتواند مقادیر X ، Y ، Z را در یک زمان اندازه گیری کند. بافر این ماژول از نوع FIFO با ظرفیت ۱۰۲۴ بایت میباشد. این ماژول به عنوان Slave به آردوینو توسط پایههای SCL و SDA متصل میشود. با استفاده از پردازشگر دیجیتال، ۴ خروجی برای دستیابی به دقت قابل توجه، در حرکتهای کند و سریع در سنسور فراهم کرده است. با این روش کاربر میتواند بازه اندازه گیری را متناسب با شتاب یا سرعت تغییر دهد. به همین منظور در قسمت ژیروسکوپ سنسور چهار بازه ۲۵۰±، ۵۰۰±، ۱۰۰۰± و ۲۰۰۰± درجه بر ثانیه و در قسمت شتاب سنج سنسور چهار بازه ۲g، ±۴g، ±۸g، ±۱۶g± برای کاربر قابل انتخاب خواهد بود. توجه داشته باشید که ولتاژ کاری این ماژول ۳ الی ۵ ولت میباشد.
برد ESP8266
تراشه های ESP8266 از موارد محبوب در زمینه اینترنت اشیا هستند که نسبت به دیگر نمونه ها کیفیت بهتر و همچنین قیمت پایین تری نیز دارند، هسته مرکزی این ماژول ESP8266 EX می باشد که در واقع زیر این شیلد فلزی قرار گرفته است، در ضمن این شیلد فلزی به منظور کاهش نویز و همچنین محافظت از قطعات SMD حساس این ماژول قرار داده شده است. این ماژول ها در سری های مختلفی تولید میشوند از جمله esp01 و esp12، در واقع تفاوتی که مدل ها با یکدیگر دارند تعداد GPIO ها و همچنین حافظه آن ها است البته معمولا از نظر ظاهری نیز تفاوت هایی که با یکدیگر دارند که قابل تشخیص است. این ماژول ها از شبکه WIFI داخلی پشتیبانی میکنند، این میکرو کنترلر ها اولین بار در سال ۲۰۱۴ به بازار عرضه شدند. ESP8266 دارای ۱۳ GPIO و همچنین یک ورودی آنالوگ (A0) است.
ماژول نمایشگر Oled 1306
معمولا در پروژه های اینترنت اشیا و دیگر پروژه های امبدد از برای نمایش متن و مقادیر مختلف از نمایشگر های Oled استفاده می شود، این ماژول ها بدر انواع مختلق بسته به نوع ذرایور اندازه یافت می شوند که یکی از پرطرفدار ترین آن ها SSD1306 می باشد، این نوع از Oled ها معمولا در اندازه های ۰٫۹۶ و ۱٫۳ اینچ ساخته می شوند همچنین پروتکل ارتباطی Oled ها I2C می باشد.
توضیح تکمیلی
در این پروژه با راهاندازی ماژول MPU6050، بدست آوردن مقادیر X, Y, Z و در نهایت چاپ آنها در نمایشگر Oled میتوانیم مقادیر ذکر شده را در لحظه مشاهده کنیم، از آنجایی که پروژه با برد ESP8266 راهاندازی میشود در آموزش های قادر خواهیم بود با استفاده از قابلیت wifi برد مقادیر را به مقصد مشخص ارسال و یا برای نمونه در صفحه وب نمایش دهیم.
وسایل موردنیاز
نصب کتابخانه مورد نیاز
ابتدا در نرم افزار Arduino IDE اقدام به نصب کتابخانه مورد نیاز خواهیمکرد. مراحل زیر را دنبال کنید:
- این مسیر را دنبال کنید Sketch > Include Library > Manage Libraries
- کلمه Adafruit SSD1306 را جستجو کنید.
- کتابخانه را نصب کنید.
- سپس کلمه “GFX” را جستجو کنید و آن را نصب کنید.
تست و راهاندازی
در اولین مرحله، اقدام به راهاندازی ماژول و چاپ مقادیر X, Y, Z در سریال مانیتور نرم افزار Arduino IDE خواهیمکرد و در ادامه با اضافه کردن نمایشگر Oled به مدار، قادر خواهیم بود مقادیر را در نمایشگر Oled نیز مشاهده کنیم. اتصالات را مطابق جداول زیر برقرار کنید، همچنین کد را با تنظیمات پیشفرض در برد ESP8266 خود کامپایل کنید.
ابتدا کد های این بخش از پروژه را بررسی خواهیم کرد، در این قسمت کتابخانه های موردنیاز را فراخوانی خواهیم کرد.
#include<Wire.h> #include <SPI.h> #include <ESP8266WiFi.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h>
در این قسمت طول و عرض نمایشگر Oled را وارد میکنیم.
#define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64
در این قسمت متغیر های مربوز به مقادیر X, Y, Z را معرفی میکنیم.
double x; double y; double z;
در بخش void loop توابع مربوط به راه اندازی نمایشگر Oled را فراخوانی میکنیم، برای مثال اندازه فونت و رنگ متون را مشخص خواهیمکرد.
display.clearDisplay(); display.setTextColor(WHITE); display.setTextSize(2); display.setCursor(0,5); display.print("DigiSpark"); display.display();
این بخش از کد مربوط به تبدیل رادیان به درجه است.
x= RAD_TO_DEG * (atan2(-yAng, -zAng)+PI); y= RAD_TO_DEG * (atan2(-xAng, -zAng)+PI); z= RAD_TO_DEG * (atan2(-yAng, -xAng)+PI);
در ادامه برای چاپ مقادیر مورد نیاز در سریال مانیتور از چند خط زیر استفاده خواهیم کرد.
Serial.print("AngleX= "); Serial.println(x); Serial.print("AngleY= "); Serial.println(y); Serial.print("AngleZ= "); Serial.println(z);
همچنین کد های زیر برای چاپ مقادیر در نمایشگر Oled هستند.
display.clearDisplay(); display.setTextSize(2); display.setCursor(0,0); display.print("X: "); display.println(x); display.setTextSize(2); display.setCursor(0,20); display.print("Y: "); display.println(y); display.setTextSize(2); display.setCursor(0,40); display.print("Z: "); display.println(z); display.display();
کد کامل، آماده برای آپلود.
#include<Wire.h> #include <SPI.h> #include <ESP8266WiFi.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels #define OLED_RESET -1 // Reset pin # (or -1 if sharing reset pin) Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); const int MPU_addr=0x68; int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ; int minVal=265; int maxVal=402; double x; double y; double z; void setup(){ Wire.begin(); Wire.beginTransmission(MPU_addr); Wire.write(0x6B); Wire.write(0); Wire.endTransmission(true); Serial.begin(9600); if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { Serial.println(F("SSD1306 allocation failed")); for(;;); // Don't proceed, loop forever } display.display(); delay(2); display.clearDisplay(); display.clearDisplay(); display.setTextColor(WHITE); display.setTextSize(2); display.setCursor(0,5); display.print("DigiSpark"); display.display(); delay(3000); } void loop(){ Wire.beginTransmission(MPU_addr); Wire.write(0x3B); Wire.endTransmission(false); Wire.requestFrom(MPU_addr,14,true); AcX=Wire.read()<<8|Wire.read(); AcY=Wire.read()<<8|Wire.read(); AcZ=Wire.read()<<8|Wire.read(); int xAng = map(AcX,minVal,maxVal,-90,90); int yAng = map(AcY,minVal,maxVal,-90,90); int zAng = map(AcZ,minVal,maxVal,-90,90); x= RAD_TO_DEG * (atan2(-yAng, -zAng)+PI); y= RAD_TO_DEG * (atan2(-xAng, -zAng)+PI); z= RAD_TO_DEG * (atan2(-yAng, -xAng)+PI); Serial.print("AngleX= "); Serial.println(x); Serial.print("AngleY= "); Serial.println(y); Serial.print("AngleZ= "); Serial.println(z); Serial.println("--------------------"); display.clearDisplay(); display.setTextSize(2); display.setCursor(0,0); display.print("X: "); display.println(x); display.setTextSize(2); display.setCursor(0,20); display.print("Y: "); display.println(y); display.setTextSize(2); display.setCursor(0,40); display.print("Z: "); display.println(z); display.display(); delay(5); }
جمع بندی
در این آموزش با استفاده از ماژول MPU6050 و همچنین برد ESP8266 و نمایشگر Oled توانستیم مقادیر بدست آمده از ماژول ژایرو را در سریال مانیتور نرمافزار Arduino IDE و نمایشگر Oled چاپ کنیم، در آموزش های آینده بدلیل استفاده از برد ESP8266، میتوانیم مقادیر را در صفحه وب نمایش دهیم.
- تنظیمات منوی tools در نرم افزار آردوینو نیز مانند تصویر زیر است.
چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند میتوانید از همین طریق اطلاع رسانی کنید.
در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.
عرض سلام . من می خوام میزان پرش یک فرد رو در راستای عمود بدست بیارم . با استفاده از این سنسور و برنامه امکان پذیر هست؟
با سلام
بایستی بر اساس دقت مورد نیاز دیتاشیت سنسورها را مطالعه کنید.