البرمجة :
سنقوم بكتابة برنامج يقوم بإرسال إشارة دوران محرك السيرفو بزاوية معينة وحساب المسافة الموجودة امام المستشعر عند تلك الزاوية. ثم يتم ارسال هذه النتائج إلى المنفذ التسلسلي.
وبدلا من قراءة هذه النتائج على الشاشة التسلسلية (Serial Monitor) نقوم بتشغيل برنامج الماتلاب. نقوم بالماتلاب بعمل كود خاص به ليتم تشغيله لإجراء بعض الحسابات ومن ثم إعطاء مخطط بسيط لخريطة المكان.
برمجة الأردوينو :
#include <Servo.h> #include <NewPing.h> #define TRIGGER_PIN 12 #define ECHO_PIN 11 #define MAX_DISTANCE 200 NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); Servo myservo; int pos = 0; int it = 10; void setup() { myservo.attach(9); Serial.begin(9600); delay(3000); } void loop() { int i = 0; int t = 0; int a = 0; for (i = 0; i < 180; i ++) { unsigned int uS = sonar.ping(); myservo.write(i); delay(20); for (t = 0; t < it; t++) { uS = sonar.ping(); a = uS/US_ROUNDTRIP_CM + a; delay(30); } a = a / (it-1); t = 0; Serial.println(a); a = 0; } }
شرح الشفرة البرمجية (Code):
في البداية قمنا بادراج المكتبات المستخدمة مثل مكتبة السيرفو ومكتبة حساس الموجات فوق الصوتية ثم قمنا بتسمية منافذ الأردوينو المستخدمة في المشروع :
#include <Servo.h> #include <NewPing.h> #define TRIGGER_PIN 12 #define ECHO_PIN 11 #define MAX_DISTANCE 200
بعد ذلك اعلنا عن المتغيرات اللازمة مثل المتغيرات الخاصة بالسيرفو و حساس الموجات فوق الصوتية والتي تستخدمها المكتبات ايضا. اعلنا عن متغير pos المستخدم في تسجيل موضع السيرفو و المتغير it المستخدم كعداد.
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); Servo myservo; int pos = 0; int it = 10;
في الدالة ()setup قمنا بوضع الاعدادات اللازمة مثل تشغيل السيرفو و السيريال ثم الانتظار 3 ثوان حتى نضمن ان المحرك اصبح في وضعه الصحيح :
void setup() { myservo.attach(9); Serial.begin(9600); delay(3000); }
في الدالة ()loop نقوم بتحريك السيرفو حركة واحدة واخذ 10 قراءات للحساس، لحساب المتوسط لها، ثم كتابتها على المنفذ التسلسلي الذي لاحقا سنقوم باستقبال النتائج من خلاله على برنامج الماتلاب.
ثم بعد ذلك نقوم بتحريك السيرفو درجة اخرى و ننفذ كل ماسبق مرة اخرى و هكذا حتى يكتمل دوران السيرفو 180 درجة .
void loop() { int i = 0; int t = 0; int a = 0; for (i = 0; i < 180; i ++) { unsigned int uS = sonar.ping(); myservo.write(i); delay(20); for (t = 0; t < it; t++) { uS = sonar.ping(); a = uS/US_ROUNDTRIP_CM + a; delay(30); } a = a / (it-1); t = 0; Serial.println(a); a = 0; } }
السبب في اخذ 10 قراءات و حساب المتوسط لها للحصول على دقة أعلى، لان من الممكن ان تكون احدى القراءات غير سليمة بسبب الضوضاء او لأي سبب اخر.