اینترنت اشیا IOT برد Esp32 برد ESP8266 برد ویموس Wemos شتاب و ژایرو

پروژه ارسال اطلاعات سنسور MPU6050 با پروتکل ESP-NOW و برد ESP32

نوشته شده توسط CiferTech

در این پروژه با استفاده سناریو یک طرفه پروتکل 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± برای کاربر قابل انتخاب خواهد بود. توجه داشته باشید که ولتاژ کاری این ماژول ۳ الی ۵ ولت می‌باشد.

راه اندازی ماژول MPU6050 - دیجی اسپارک

 


پروتکل ESP-Now


پروتکل ESP-NOW نوعی ارتباطی بی سیم است که توسط Espressif ساخته شده و دارای قابلیت انتقال پکت است. این پروتکل چندین دستگاه را قادر می سازد تا به روشی آسان با یکدیگر صحبت کنند و اطلاعات را بصورت بهینه بین یکدیگر انتقال دهند. این  پروتکل مشابه اتصال بی سیم ۲٫۴GHz است، که اغلب در ماوس های بی سیم استفاده می شود. بنابراین، جفت شدن دستگاه ها قبل از برقراری ارتباط لازم است. این به این معنی است که پس از جفت شدن دستگاه ها با یکدیگر، اتصال پایدار است. به عبارت دیگر، اگر بطور ناگهانی یکی از ESP های شما قطع شود یا ریست شود، هنگام راه اندازی مجدد بطور خودکار اتصال برقرار می شود.

تبادل اطلاعات ماژول MPU6050 با پروتکل ESP-Now - دیجی اسپارک

 

مزیت های پروتکل ESP-NOW

  • انتقال داده تا ۲۵۰ بایت.
  • بهره مندی از ارتباط رمزگذاره شده.
  • استفاده از Call Back برای اطلاع رسانی به لایه های مختلف در صورت موفقیت یا عدم موفقیت در انتقال داده.

محدودیت های پروتکل ESP-NOW:

  • حدکثر محدوده ۲۵۰payload بایت.
  • حداکثر پشتیبانی از ۱۰عدد SoftAP رمزگذاری شده.
  • حداکثر تعداد پشتیباتی در حالت رمزگذاری نشده ۲۰ عدد.

 


نقش فرستنده و گیرنده


در پروژه ارسال اطلاعات سنسور MPU6050 از دو عدد برد وای‌فای برای تحلیل دیتا و ارتباط با پروتکل ESP NOW استفاده کرده‌ایم، که یکی از وظیفه تحلیل مقادیر بدست آمده از ماژول mpu6050 و با توجه به ساختار دیتای مشخص شده در کد برنامه، ارسال مقادیر به سمت برد دوم یا دریافت کننده را دارد. در ادامه برد دریافت کننده را داریم که در این پروژه از ESP8266 استفاده کرده‌ایم و این تراشه وظیفه هماهنگی با برد اول در سناریو، یعنی برد ارسال کننده را دارد و همچنین با توجه به ساختار مشخص شده از قبل مقادیر را دریافت، تحلیل و در سریال مانیتور نمایش می‌دهد.

 


پروژه ارسال اطلاعات سنسور MPU6050


در پروژه ارسال اطلاعات سنسور MPU6050 ابتدا با استفاده از برد ESP32 و مقادیر بدست آمده از سنسور MPU6050 را تحلیل می‌کنیم و با راه‌اندازی پروتکل ESP-NOW مقادیر را به برد دوم یعنی Wemos ارسال خواهیم کرد. که در سریال مانیتور مقادیر بدست آمده قابل مشاهده خواهد بود، و در برد ارسال کننده وضعیت ارسال دیتا پس از ارسال هر payload گزارش می‌شود.

پروژه ارسال اطلاعات سنسور MPU6050 - دیجی اسپارک

 


وسایل مورد نیاز


برد wemos

برد ESP برپایه تراشه ESP8266 یا ESP32

ماژول ژایرو MPU6050

 


نصب کتابخانه مرجع


در صورت دریافت هرگونه ارور مبنی بر عدم وجود کتابخانه espnow.h طبق مراحل زیر پیش بروید.

  1. این مسیر را دنبال کنید Sketch Include Library > Manage Libraries
  2. کلمه espnow را جستجو کنید.
  3. کتابخانه را نصب کنید.

 


بدست آوردن مک آدرس ESP32


پیش از این در آموزش راه اندازی پروتکل ESP-Now روش بدست آوردن مک آدرس را توضیح دادیم. چنانچه این مورد را اطلاعی ندارید، کافیست به پست اشاره شده مراجعه کنید.

 


کد و شماتیک فرستنده


در این مرحله ابتدا اتصالات بین ماژول MPU6050 و برد ESP32 را برقرار می‌کنیم، ماژول mpu6050 از پروتکل i2c برای راه‌اندازی استفاده می‌کند پس تنها با استفاده از دو پین SCL , SDA و همچنین تغذیه ماژول می‌توان آن را راه‌اندازی کرد. اتصالات را مطابق جدول و یا شماتیک زیر برقزار کنید.

اتصالات ماژول MPU6050 به برد ESP32 - دیجی اسپارک

  • شماتیک بخش فرستنده و تحلیل دیتا MPU6050

شماتیک اتصالات ماژول MPU6050 به ESP32 - دیجی اسپارک

 

 

پس از اتصالات نوبت به کد پروژه ارسال اطلاعات سنسور 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 ارسال کرده و در سریال مانیتور نمایش دادیم.

 

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

 

در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.

 

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

CiferTech

تبادل نظر و رفع عیب با ثبت دیدگاه

۲ دیدگاه

  • سلام وقتتون بخیر. من با استفاده از nodemsu esp8266 میخوام این سنسور رو راه اندازی کنم اتصالات رو برقرار میکنم کد و کتاب خونه هاش رو هم نصب میکنم بعد از اپلود کردن وقتی وارد سریال مانیتور میشم چیزی نمایش داده نمیشه وقتی دکمه rst روی برد رو میزنم یک خط به صورت عجیب غریب و با علامتای مختلف رو نشون میده بانی که تو کد نوشته شده و باندی که تو مانیتور سریال هست رو هم یکی میگیرم ممنون میشم کمک کنید