سنتعلَّمُ في هذهِ المقالةِ ربطَ حسَّاسِ التَّسارُعِ GY-521 معَ لوحةِ الأردوينو (Arduino).
يتضَّمنُ حسَّاسُ GY-521 شريحةَ InvenSense MPU6050 التِّي تحتوي على مقياسِ تسارُعٍ ثلاثِّيّ المحاوِرِ، حسَّاسُ جيروسكوب gyro ثلاثِّي المحاوِرِ يتميَّز بأنَّ له 6 درجاتٍ حرية (6 DOF) كما تحتوي الشَّريحةُ أيضَّاً على محوِّلٍ تشابهيّ رَقَمِّي بدِّقةِ 16 بتاً في كُلِّ قناةٍ ووَحدَةٍ DMP (مُعالِجُ حركةٍ رَقَمِّي). وَحدةُ DMP مسؤوّلةٌ عن تجميعِ البياناتِ الأوليَّةِ وإجراءِ بعضِ العمليَّاتِ الحسابيَّةِ لإزالةِ الأخطَّاءِ.
مُخطَّطُ أرجُلِ حسَّاسِ GY-521:
تحتوي لوحةُ GY-521 على 8 أرجُلٍ وهي كما يلي:
- VCC: دَخلُ 5 فولت أو 3.3 فولت.
- GND: الأرضيّ.
- SCL (Serial clock line خَطُّ نبضَاتِ السَّاعةِ التسلسُلّي): مَسؤُولٌ عن اتصالِ I2C الأساسِّي.
- SDA (Serial data line خَطُّ البياناتِ التسلسُلّي): مَسؤُولٌ عن اتصالِ I2C الأساسِّي.
- XCA (Auxiliary clock line خَطُّ نبضَاتِ السَّاعةِ المُساعِد): مَسؤُولٌ عن اتصالِ I2C المُساعِد.
- XDL (Auxiliary data line خَطُّ البياناتِ المُساعِد): مَسؤُولٌ عن اتصالِ I2C المُساعِد.
- ADO: مَسؤُولٌ عن واجِهَةِ السَّيدِ أو التَّابِعِ.
- INT: خاصٌّ بالمُقاطَعَةِ.
تحتوي اللَّوحةُ على مُنظِّمِ جُهدٍ لتحويلِ الجهدِ من 5 فولت الى 3.3 فولت، كما تحتوي على شريحة InvenSense MPU6050 التي تحتوي على حسَّاسِ التسَّارُعِ وجيروسكوب.
المواصفات:
مواصفاتُ حسَّاسِ GY-521 MPU6050 :
- مَجالُ حسَّاسِ التَّسارُعِ هو ±2 و ±4 و ±8 و ±16 جرام.
- مَجالُ حسَّاسِ الجيروسكوب ±250 و ±500 و ±1000 و ±2000 ميكرومتر/درجة.
- يترَاوَحُ مَجالُ الجهدِ من 3.3 فولت إلى 5 فولت. يُمكِنُنا تغذيَتُهُ بـ 5 فولت؛ لأنَّ الحسَّاسَ يحتوي على مُنظِّمِ جُهدٍ يُحَوِّلُ الدَّخلَ من 5 فولت الى 3.3 فولت.
مَبْدَأُ العملِ:
يقيسُ الحسَّاسُ التَّسارُعَ اعتِمَاداً على التَّغيُّرِ في السِّعَةِ، حيثُ أنَّ لهيكَلِهِ كُتلةً مُتَّصِلةً بنابِضٍ يتحرَّكُ في اتِّجاهٍ واحدٍ ولهُ ألواحٌ خارجيَّةٌ ثابتَّةٌ. لذلِّكَ، عندما يتمُّ تَطبيقُ التَّسارُعِ في أيِّ اتِّجاهٍ فإنَّ السِّعةَ بينَ الصَّفائِحِ والكُتلةِ ستتَّغيَّرُ بحيثُ تتوافقُ قيمُ هذا التَّغيِّر في السِّعةِ مع قيمِ التَّسارُعِ.
يستقبلُ الأردوينو قيمَ التَّسارُعِ من الحسَّاسِ ثُمَّ يَحسُبُ قيمَ المَيلِ والانحِرافِ والدَّورانِ باستخدامِ توابعٍ تُقدِّمُها مكتبةُ MPU6050.
تُعرَضُ قيمُ الانحرافِ والدَّورانِ على الشَّاشةِ التَّسلسُليَّة كما في الصُّورةِ المُوضَّحةِ أدناه. عِلماً أنَّ قيمَ الانحرافِ والدَّورانِ ستتَّغيَّرُ على الشَّاشةِ وِفقاً لحركةِ الحسَّاسِ.
مُخطَّطُ الدَّارةِ:
فيما يلي توصيلاتُ GY-521 MPU6050 مع Arduino Uno:
- VCC في GY-521 مع 5 فولت أو 3.3 فولت في Arduino Uno.
- GND في GY-521 مع GND في Arduino Uno.
- SCL في GY-521 مع A5 في Arduino Uno.
- SDA في GY-521 مع A4 في Arduino Uno.
تَستَخدمُ كُلّ من الأطراف SDA و SCL في GY-521 لاتصالِ I2C لذلكَ يجبُ توصيلُها مع الأطرافِ SDA و SCL في لوحةِ Arduino Uno و هي A5 و A4 على التوالي. لذلكَ، نقومُ بتوصيلِ SDA و SCL من GY-521 إلى A5 و A4 من Arduino Uno.
يحتوي GY-521 MPU 6050 أيضاً على اثنتين من SDA وSCL إضافيَّتين وكأنَّهما وحدةُ تحكمٍ I2C إضافيَّةٍ ل GY-521 MPU6050. تَسمحُ هذهِ الأطرافُ الإضافيَّةُ ل GY-521 MPU 6050 بالعملِ كسيدٍ للناقلِ I2C الثاني. الهدفُ من I2C الإضافيّ هو إذا كُنتَ ترغبُ في إضافةِ حسَّاسٍ آخرَ (على سبيل المِثَّال حسَّاسُ المغناطيسيةِ)، فيمكنك توصيلهُ مباشرةً ب GY-521 الذي سيقرأُ القيمَ بعدَ ذلِكَ.
الكود البرمجي/البرنامج:
قُمْ بتنزيلِ المكتبةِ قبلَ تحميلِ الكودِ في برنامَجِ Arduino IDE من هنا وأضِفْها إلى مُجلَدِ المكتبةِ.
شرح الكود البرمجي:
نحتاجُ أولاً لتضمينِ المكتبات إِذْ تُتيحُ مكتبةُ wire اتصالَ I2C بينَ الأردوينو والحسَّاسِ. وبما أنَّ حسَّاسَ GY-521 MPU6050 مع الأردوينو عبرَ بروتوكول I2C لذلك نحتاجُ لإضافةِ مكتبة wire.
تُساعِدنا مكتبةُ MPU6050 في التعامُلِ مع الحسَّاس والحصولِ على قيمِ الدَّورانِ والانحرافِ.
نعرِفُ متغيِّراً لحسَّاسِ التَّسارُع من النَّوعِ MPU6050.
#include <Wire.h>
#include <MPU6050.h>
MPU6050 acceleromete;
تحقَّقنا في تابعِ setup فيما إذا كانَ حسَّاسُ التَّسارُعِ يسّتشعِرُ القيمَ بشَّكلٍ صحيحٍ أم لا. فإذا كانَ الحسَّاسُ يعملُ بشَّكلٍ صحيح فسوفَ يتلَّقى الأردوينو القيمَ لحسابِ الدَّورانِ والانحرافِ. خلافاً لذلكَ سوفَ يعرِضُ الأردوينو “فشلَ القراءةِ من المُستشعِرِ. هناكَ شيءٌ خاطئٌ! ” على الشَّاشةِ التسلسُلّية.
while(!accelerometer.begin(MPU6050_SCALE_2000DPS, MPU6050_RANGE_2G)
{
Serial.println(“Failed to read from the sensor. Something is Wrong!”);
delay(500);}
نأخذ بعد ذلك القراءات من حسّاس MPU6050 ونخزِّنها في متغيِّر يسمى “sensor_data” ثم نحسب قِيَم الانحراف باستخدام قِيَم بيانات حسّاس القراءة ونعرض هذه القيم على الشاشة التسلسُلّية.
Vector sensor_data = accelerometer.readNormalizeAccel();
int pitch_value = -(atan2(sensor_data.XAxis, sqrt(sensor_data.YAxis*sensor_data.YAxis+ sensor_data.ZAxis*sensor_data.ZAxis))*180.0)/M_PI;
Serial.print(” Pitch = “);
Serial.print(pitch_value);
كما نحسبُ قيمَ الدَّورانِ باستخدامِ بياناتِ الحسَّاسِ ونعرِضُ هذهِ القيمَ على الشَّاشةِ التسلسُلّية.
int roll_value = (atan2(sensor_data.YAxis, sensor_data.ZAxis)*180.0)/M_PI;
Serial.print(” Roll = “);
Serial.println(roll_value);
delay(10);
هكذا نكون قد وضَّحنا كيفيَّةَ ربطِ حسَّاسِ التَّسارُع بـ Arduino.
صور الخرج:
صور للمشروع:
المصدر: هنا
ترجمة: مجد زهرة ، مراجعة: علي العلي، تدقيق لغوي: بولا ابراهيم، تصميم: علي العلي، تحرير: رؤى حمود.