در این پروژه با استفاده سناریو یک طرفه پروتکل ESP-NOW مقادیر ماژول MPU6050 شامل x ,y ,z را به برد مقصد ارسال خواهیم کرد. به عبارت دیگر با یک برد ESP از راه دور توسط جابجایی سنسور شتاب و ژایرو در فضا، به برد دیگری اطلاعات را ارسال میکنیم. برای ارسال اطلاعات سنسور MPU6050 در برد ESP32 تحلیل و به سمت برد Wemos به تراشه ESP8266 ارسال خواهد شد. در ادامه این پروژه با مرجع تخصصی آردوینو به زبان فارسی، دیجی اسپارک همراه باشید.
ماژول MPU6050
حالا زمان این رسیده با سخت افزار اصلی این آموزش، یعنی MPU6050 بیشتر آشنا بشیم. Mpu6050 دارای یک شتاب سنج سه محوره و یک ژیروسکوپ سه محوره MEMS میباشد. دقت ماژول مبدل آنالوگ به دیجیتال ۱۲ بیت بوده و میتواند مقادیر X ، Y ، Z را در یک زمان اندازه گیری کند. بافر این ماژول از نوع FIFO با ظرفیت ۱۰۲۴ بایت میباشد. این ماژول به عنوان Slave به آردوینو توسط پایههای SCL و SDA متصل میشود. با استفاده از پردازشگر دیجیتال، ۴ خروجی برای دستیابی به دقت قابل توجه، در حرکتهای کند و سریع در سنسور فراهم کرده است. با این روش کاربر میتواند بازه اندازه گیری را متناسب با شتاب یا سرعت تغییر دهد. به همین منظور در قسمت ژیروسکوپ سنسور چهار بازه ۲۵۰±، ۵۰۰±، ۱۰۰۰± و ۲۰۰۰± درجه بر ثانیه و در قسمت شتاب سنج سنسور چهار بازه ۲g، ±۴g، ±۸g، ±۱۶g± برای کاربر قابل انتخاب خواهد بود. توجه داشته باشید که ولتاژ کاری این ماژول ۳ الی ۵ ولت میباشد.
پروتکل ESP-Now
پروتکل ESP-NOW نوعی ارتباطی بی سیم است که توسط Espressif ساخته شده و دارای قابلیت انتقال پکت است. این پروتکل چندین دستگاه را قادر می سازد تا به روشی آسان با یکدیگر صحبت کنند و اطلاعات را بصورت بهینه بین یکدیگر انتقال دهند. این پروتکل مشابه اتصال بی سیم ۲٫۴GHz است، که اغلب در ماوس های بی سیم استفاده می شود. بنابراین، جفت شدن دستگاه ها قبل از برقراری ارتباط لازم است. این به این معنی است که پس از جفت شدن دستگاه ها با یکدیگر، اتصال پایدار است. به عبارت دیگر، اگر بطور ناگهانی یکی از ESP های شما قطع شود یا ریست شود، هنگام راه اندازی مجدد بطور خودکار اتصال برقرار می شود.
مزیت های پروتکل ESP-NOW
- انتقال داده تا ۲۵۰ بایت.
- بهره مندی از ارتباط رمزگذاره شده.
-
استفاده از Call Back برای اطلاع رسانی به لایه های مختلف در صورت موفقیت یا عدم موفقیت در انتقال داده.
محدودیت های پروتکل ESP-NOW:
- حدکثر محدوده ۲۵۰payload بایت.
- حداکثر پشتیبانی از ۱۰عدد SoftAP رمزگذاری شده.
- حداکثر تعداد پشتیباتی در حالت رمزگذاری نشده ۲۰ عدد.
نقش فرستنده و گیرنده
در پروژه ارسال اطلاعات سنسور MPU6050 از دو عدد برد وایفای برای تحلیل دیتا و ارتباط با پروتکل ESP NOW استفاده کردهایم، که یکی از وظیفه تحلیل مقادیر بدست آمده از ماژول mpu6050 و با توجه به ساختار دیتای مشخص شده در کد برنامه، ارسال مقادیر به سمت برد دوم یا دریافت کننده را دارد. در ادامه برد دریافت کننده را داریم که در این پروژه از ESP8266 استفاده کردهایم و این تراشه وظیفه هماهنگی با برد اول در سناریو، یعنی برد ارسال کننده را دارد و همچنین با توجه به ساختار مشخص شده از قبل مقادیر را دریافت، تحلیل و در سریال مانیتور نمایش میدهد.
پروژه ارسال اطلاعات سنسور MPU6050
در پروژه ارسال اطلاعات سنسور MPU6050 ابتدا با استفاده از برد ESP32 و مقادیر بدست آمده از سنسور MPU6050 را تحلیل میکنیم و با راهاندازی پروتکل ESP-NOW مقادیر را به برد دوم یعنی Wemos ارسال خواهیم کرد. که در سریال مانیتور مقادیر بدست آمده قابل مشاهده خواهد بود، و در برد ارسال کننده وضعیت ارسال دیتا پس از ارسال هر payload گزارش میشود.
وسایل مورد نیاز
برد ESP برپایه تراشه ESP8266 یا ESP32
نصب کتابخانه مرجع
در صورت دریافت هرگونه ارور مبنی بر عدم وجود کتابخانه espnow.h طبق مراحل زیر پیش بروید.
- این مسیر را دنبال کنید Sketch > Include Library > Manage Libraries
- کلمه espnow را جستجو کنید.
- کتابخانه را نصب کنید.
بدست آوردن مک آدرس ESP32
پیش از این در آموزش راه اندازی پروتکل ESP-Now روش بدست آوردن مک آدرس را توضیح دادیم. چنانچه این مورد را اطلاعی ندارید، کافیست به پست اشاره شده مراجعه کنید.
کد و شماتیک فرستنده
در این مرحله ابتدا اتصالات بین ماژول MPU6050 و برد ESP32 را برقرار میکنیم، ماژول mpu6050 از پروتکل i2c برای راهاندازی استفاده میکند پس تنها با استفاده از دو پین SCL , SDA و همچنین تغذیه ماژول میتوان آن را راهاندازی کرد. اتصالات را مطابق جدول و یا شماتیک زیر برقزار کنید.
- شماتیک بخش فرستنده و تحلیل دیتا MPU6050
پس از اتصالات نوبت به کد پروژه ارسال اطلاعات سنسور MPU6050 میرسد، ابتدا بخش هایی از این کد را بررسی میکنیم، البته همانطور تا الان متوجه شدی این پروژه شامل دو بخش کد میباشد که در ادامه به آن نیز خواهیم پرداخت. در چند خط اول کتابخانه های مورد نیاز را فراخوانی میکنیم.
#include <esp_now.h> #include <WiFi.h> #include <SPI.h> #include "I2Cdev.h" #include "MPU6050.h"
در این بخش مک آدرس ESP دریافت کننده را بصورت هگز وارد میکنیم، در واقع پشت هردو حرف یا رقم ۰x قرار میگیرد.
uint8_t broadcastAddress1[] = {0xBC,0xDD,0xC2,0xB3,0xC4,0xC2};
در این قسمت ساختار داده خود را خواهیم ساخت، از آنجایی که مقادیر x, y, z دریافت خواهند شد به نسبت آنها چنین متغیر هایی تعریف خواهد شد.
typedef struct test_struct { int x; int y; int z; } test_struct;
مقادیر بدست آمده از ماژول MPU6050 را که در بخش اول کد بدست آورده و ذخیره کردیم را در بخش loop فراخوانی میکنیم.
accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
کد کامل این بخش از پروژه برای ارسال مقادیر
#include <esp_now.h> #include <WiFi.h> #include <SPI.h> #include "I2Cdev.h" #include "MPU6050.h" MPU6050 accelgyro; int16_t ax, ay, az; int16_t gx, gy, gz; #define OUTPUT_READABLE_ACCELGYRO uint8_t broadcastAddress1[] = {0xBC,0xDD,0xC2,0xB3,0xC4,0xC2}; typedef struct test_struct { int x; int y; int z; } test_struct; test_struct test; void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) { char macStr[18]; Serial.print("Packet to: "); // Copies the sender mac address to a string snprintf(macStr, sizeof(macStr), "%02x:%02x:%02x:%02x:%02x:%02x", mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]); Serial.print(macStr); Serial.print(" send status:\t"); Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail"); } void setup() { Serial.begin(115200); #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE Wire.begin(); #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE Fastwire::setup(400, true); #endif accelgyro.initialize(); WiFi.mode(WIFI_STA); if (esp_now_init() != ESP_OK) { Serial.println("Error initializing ESP-NOW"); return; } esp_now_register_send_cb(OnDataSent); esp_now_peer_info_t peerInfo; peerInfo.channel = 0; peerInfo.encrypt = false; memcpy(peerInfo.peer_addr, broadcastAddress1, 6); if (esp_now_add_peer(&peerInfo) != ESP_OK){ Serial.println("Failed to add peer"); return; } } void loop() { accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); test.x = random(ax); test.y = random(ay); test.z = random(az); esp_err_t result = esp_now_send(0, (uint8_t *) &test, sizeof(test_struct)); if (result == ESP_OK) { Serial.println("Sent with success"); } else { Serial.println("Error sending the data"); } delay(500); }
کد مرجع برای دریافت دیتا در برد Wemos
در بخش گیرنده بعد از فراخوانی کتابخانه ها و تنظیم ساختار داده مانند بخش قبل دیتای دریافتی را به پروتکل معرفی میکنیم تا قابل نمایش باشد.
memcpy(&myData, incomingData, sizeof(myData));
در این دو خط مقام master یا slave بودن ESP و حالت فعلی را مشخص میکنیم.
esp_now_set_self_role(ESP_NOW_ROLE_SLAVE); esp_now_register_recv_cb(OnDataRecv);
کد کامل بخش گیرنده پروژه ارسال اطلاعات سنسور MPU6050
#include <ESP8266WiFi.h> #include <espnow.h> typedef struct temp_struct { int x; int y; int z; } temp_struct; temp_struct myData; void OnDataRecv(uint8_t * mac, uint8_t *incomingData, uint8_t len) { memcpy(&myData, incomingData, sizeof(myData)); Serial.print("Bytes received: "); Serial.println(len); Serial.print("X= "); Serial.println(myData.x); Serial.print("Y= "); Serial.println(myData.y); Serial.print("Z= "); Serial.println(myData.z); Serial.println(); } void setup() { Serial.begin(115200); WiFi.mode(WIFI_STA); if (esp_now_init() != 0) { Serial.println("Error initializing ESP-NOW"); return; } esp_now_set_self_role(ESP_NOW_ROLE_SLAVE); esp_now_register_recv_cb(OnDataRecv); } void loop() { }
جمع بندی
در این پروژه با استفاده پروتکل ESP-NOW مقادیر یک ماژول MPU6050 را در مقصد مورد نظر که در این سناریو یک ESP32 بود دریافت و تحلیل کردیم و سپس با ارتباط بی سیم به مقصد، یعنی بک برد Wemos با تراشه ESP8266 ارسال کرده و در سریال مانیتور نمایش دادیم.
چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند میتوانید از همین طریق اطلاع رسانی کنید.
در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.
سلام وقتتون بخیر. من با استفاده از nodemsu esp8266 میخوام این سنسور رو راه اندازی کنم اتصالات رو برقرار میکنم کد و کتاب خونه هاش رو هم نصب میکنم بعد از اپلود کردن وقتی وارد سریال مانیتور میشم چیزی نمایش داده نمیشه وقتی دکمه rst روی برد رو میزنم یک خط به صورت عجیب غریب و با علامتای مختلف رو نشون میده بانی که تو کد نوشته شده و باندی که تو مانیتور سریال هست رو هم یکی میگیرم ممنون میشم کمک کنید
با سلام
ارور دریافتی را کپی کنید تا بررسی شود.