برد STM شتاب و ژایرو

راه اندازی ماژول GY-521 با استفاده از میکروکنترلر STM32

نوشته شده توسط علی زاهدی

سنسور های ژیروسکوپ کاربرد های فراوانی دارند. از جمله کاربرد های این نوع ماژول میتوان به کوادکوپتر ها ، ربات های مختلف و حتی موبایل اشاره نمود. پیش از این در آموزش های مختلفی این سنسور را با استفاده از برد های مختلفی راه اندازی کردیم. در این آموزش قصد داریم تا ماژول GY-521 که بر پایه تراشه mpu6050 است را با استفاده از میکروکنترلر STM32 راه اندازی کنیم. در ادامه با مرجع تخصصی بردهای امبدد به زبان فارسی، دیجی اسپارک همراه باشید.

 


ژیروسکوپ چیست؟


ژیروسکوپ وسیله ای برای اندازه گیری سرعت زاویه ای است. این دستگاه برای از اصل تکانه زاویه استفاده نموده و وضعیت جسم در فضا را با سه پارامتر Z ،Y ،X نشان میدهد. از جمله کاربرد های ژیروسکوپ به اندازه گیری و یا حفظ پایداری اشاره نمود. برای مثال در ماشین های پرنده مانند کوآدکوپتر ها از ژیروسکوپ برای پایدارسازی استفاده می شود. این سنسور در تلفن های هوشمند نیز کاربرد دارد. اگر توجه کرده باشید. زمانی که دستگاه را به صورت افقی نگه میدارید. وضعیت صفحه نمایش نیز مناسب با وضعیت دستگاه تغییر میکند. در واقع زمانی که وضعیت دستگاه را از عمودی به افقی تغییر می‌دهد. ژیروسکوپ موجود در دستگاه این تغییر را متوجه شده و این تغییرات را به CPU اعلام میکند. سپس CPU با توجه به داده های دریافت شده این تغییرات را بر روی صفحه نمیاش اعمال می‌کند. در تصویر زیر نمونه ای از ژیروسکوپ های مکانیکی را مشاهده می‌کند.

Gyroscope


معرفی ماژول GY-521


ماژول GY521 با تجمیع و ترکیب یک ژیروسکوپ ۳ محور با یک شتاب سنج ۳ محور روی یک چیپ سیلیکونی و بهره گیری از یک پردازشگر دیجیتال حرکت، قادر است الگوریتم های پیچیده ۹ محوری را اجرا کند.این ویژگی بسیاری از مشکلاتی را که در تنظیم محور افقی در سنسورهای مجزا ایجاد می گردد را بر طرف خواهد ساخت. برای دستیابی به دقت بالای اندازه گیری در حرکتهای کند و حرکتهای سریع در سنسور MPU-6050 امکانی فراهم شده تا کاربر بتواند بازه اندازه گیری را متناسب با شتاب یا سرعت زاویه ای تغییر دهد. از جمله ویژگی های این ماژول عبارتند از:

  • خروجی دیجیتال برای سه محور x, y و z در رنج قابل برنامه ریزی   ±۲۵۰، ±۵۰۰، ±۱۰۰۰ و ۲۰۰۰± درجه بر ثانیه
  • نمونه گیری داده ها به صورت ۱۶ بیتی
  • دارای فیلتر قابل برنامه ریزی دیجیتال
  • جریان مصرفی بسیار ناچیز در محدوده ۵ میکروآمپر تا ۳٫۶ میلی آمپر
  • دارای پروتکل I2C برای برقراری ارتباط با میکروکنترلرها

GY-521


اتصالات ماژول GY-521


همانطور که در بخش قبلی گفته شد. ماژول GY-521 برای برقراری ارتباط با میکروکنترلرها از پروتکل I2C استفاده می‌کند. بنابر این از پایه های SDA و SCL ماژول دو سیم به پایه های PB6 و PB7 برد STM32 که به ترتیب پایه های SCL و SDA از I2C1 این میکروکنترلر هستند، وصل می‌کنیم. برای نمایش پارامتر های دریافتی از ماژول GY-521 از یک LCD کاراکتری استفاده شده است. بر روی لینک آموزش نحوه راه اندازی LCD کاراکتری بر روی میکروکنترلر های STM32 کلیک کنید تا با نحوه راه اندازی آن آشنا شوید. اتصالات پروژه به صورت زیر است.

 

Schematic

 


پیکربندی میکروکنترلر در STM32CubeMX


پس از ساخت پروژه در نرم افزار STM32CubeMX و انتخاب میکروکنترلر STM32F103C8 بایستی وارد بخش I2C شده و مطابق تصویر زیر آن را تنظیم کنید. در صوورتی که با پروتکل I2C آشنای ندارید. آموزش آشنایی با پروتکل I2C در میکروکنترلر های STM32 را مطالعه کنید. ادامه پس از انتخاب I2C مورد نظر بخش تنظیمات I2C را مطابق تصویر زیر تنظیم کنید.

سپس مطابق آموزش راه اندازی LCD کاراکتری با استفاده از میکروکنترلر STM32 بخش مربوط به LCD را تنظیم کنید. در این آموزش وضعیت پایه های مربوط به LCD به صورتی است که  در تصویر زیر مشاهده می‌کند.

STM32 Pinout

سپس از صفحه Clock Configuration فرکانس کاری میکروکنترلر را بر روی ۷۲ مگاهرتز تنظیم کنید. سپس در بخش Code Generator در قسمت Generated files تیک مربوط به گزینه Generate peripheral initialization as a pair of ‘.c/.h’ files per pripheral را بزنید. و سپس بر روی گزینه GENERATE CODE کلیک کرده و وارد نرم افزار KEIL شوید.

stm32cubemx Setting

 


کدنویسی پروژه در نرم افزار KEIL


ابتدا بایستی کتابخانه STM32 HAL library for GY-521 را دانلود نموده و به پروژه خود اضافه کنید. اگر با نحوه اضافه کردن کتابخانه به پروژه آشنایی ندارید. آموزش اضافه کردن کتابخانه به پروژه های STM32 در نرم‌افزار KEIL را مطالعه کنید. سپس بایستی در فایل main.c کد زیر را اضافه نمایید. توجه داشته باشید که کد زیر بایستی بصورت بخش به بخش در قسمت های معرفی شده قرار گیرند. بنابر این لطفا کد را به صورت کامل کپی نکنید. این کار ممکن است باعث ایجاد ارور نامه شود.

/* Private includes */
#include "mpu6050.h"
#include "character_lcd.h"
#include <stdio.h>

/* Private typedef */
MPU6050_t MPU6050;


/* Private variables */
char buffer[16];


int main(void)
{ 
  /* USER CODE BEGIN 2 */
  LCD_Config.Font = _FONT_5X10;
  LCD_Config.Mode = _4BIT_INTERFACE;
  LCD_Config.NumberOfLine = _2LINE_DISPLAY;
  LCD_Init();
  while(MPU6050_Init(&hi2c1) == 1){};
  
  while (1)
  {
    /* USER CODE BEGIN 3 */
	MPU6050_Read_All(&hi2c1, &MPU6050);
	sprintf(buffer,"X=%2.2f  Z=%2.2f",MPU6050.Gx,MPU6050.Gz);
	LCD_GotoXY(0,0);
	LCD_PutString(buffer);
	sprintf(buffer,"Y=%2.2f   ",MPU6050.Gy);
	LCD_GotoXY(0,1);
	LCD_PutString(buffer);
	HAL_Delay (500);
  }
}

در کد بالا پس از اضافه کردن فایل کتابخانه های مورد نیاز برنامه، یک متغیر از نوع ساختار MPU6050_t همچنین یک آرایه برای نمایش اعداد دریافتی از ماژول بر روی LCD تعریف شده است. در حلقه اصلی تابع مربوط به تنظیمات ماژول MPU6050_Init بصورتی تعریف شده است که اگر ماژول به درستی متصل شده و توسط برنامه شناسایی شد. ادامه برنامه اجرا شود. در غیر این صورت برنامه در این قسمت متوقف خواهد شد. در ادامه توسط تابع MPU6050_Read_All تمامی مقادیر Z ،Y ،X در متغیر که با ساختار MPU6050_t تعریف شده است، ذخیره خواهد شد. در آخر مقادیر دریافتی توسط دستور sprintf در آرایه مربوط به LCD ذخیره و نمایش داده می شود.

 


جمع بندی


در این آموزش ابتدا با ژیروسکوپ ها آشنا شدیم. سپس ماژول GY-521 که یک ژیروسکوپ سه محوره است، را مورد بررسی قرار دادیم. در ادامه اتصالات پروژه به همراه شماتیک آن معرفی شد. سپس نحوه پیکربندی میکروکنترلر برای راه اندازی LCD و ماژول GY-521 توضیح داده شد. در آخر کد پروژه به همراه توضیح بخش های مختلف آن بصورت کامل توضیح داده شد.

 


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


 

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

 

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

 

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

علی زاهدی

برنامه نویس و طراح سیستم های مبتنی بر میکروکنترلر

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

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

۹ دیدگاه

  • سلام خیلی ممنون از مطالب مفیدی که میذارین واقعا عالین ، من نتونستم کتابخانه رو از لینکی گذاشتین دانلود کنم اگر امکان داره لطفا فایل کتابخانه رو برای دانلود قرار بدین

    • با سلام
      لینک دانلود کتابخانه مربوط به گیت هاب است. لطفا در ادامه همین بخش بفرمایید به چه صورت اقدام کرده‌اید تا بتوانم مشکل شما را حل کنم.

  • سلام و خسته نباشید .
    میکرو من در بخش init متوقف شده و جلو تر نمی رود. این را از طریق تعریف یک فلگ و دیدن اون در محیط دیباگ فهمیدم.
    به نظرتون چجور رفعش کنم؟
    لازمه یه ماژول دیگه بگیرم؟

    • با سلام
      از سالم بودن ماژول و همچنین وصل بودن اتصالات اطمینان حاصل فرمایید. برای تست ماژول میتواند از یک برد آردوینو استفاده کنید.

  • سلام
    اگر که قرار باشد با تکان دادن ماژول mpu6050 ، مقدار x,y,z را در صفحه نمایش نشان دهد؛
    این یعنی مستر در حالت read قرار دارد و دیجیتال به انالوگ تبدیل میشود؟

    • با سلام
      ماژول MPU6050 داده مربوط به XYZ را تشخیص داده و با استفاده از پروتکل I2C این داده ها را به سمت میکروکنترلر ارسال می‌کند. اگر به کد دقت کنید. تابعی در ابتدای حلقه While قرار دارد که عملیات خواندن را انجام می‌دهد. در این تابع ابتدا درخواست ارسال اطلاعات از Master که میکروکنترلر STM32 است به سمت Slave که ماژول MPU6050 است ارسال می‌شود. سپس Master در حالت خواندن قرار گرفته و اطلاعات ار سمت Slave به Master ارسال می‌شود.

  • سلام وقت بخیر، من میخوام با نرم افزار stm32 یک حرکت دایره ای بااستفاده از ربات انجام بدم شما میتونید کمک کنید؟

    • با سلام
      بایستی درباره پروژه مورد نظر خود توضیحات بیشتری ارائه دهید تا بتوانیم به شما کمک کنیم.

  • سلام. ممنون از آموزش کاربردی تون
    من این پروژه رو انجام دادم اما عددی که مشاهده میکنم بسیار متغیر و نویز دار هست. چطور میشه دقت رو بالاتر برد؟

    • با سلام
      روش های مختلفی برای ان کار وجود دارند مانند تعریف بازه برای نمایش داده های دریافتی از سنسور تا در صورتی که از بازه ای که دائما در آن تغییر میکند خارج شد داده ها نمایش داده شود.