قياس المسافة وكشف العوائق باستخدام Arduino وحساس الموجات فوق الصوتية
في الحلقة الرابعة من سلسلة Arduino من الصفر سنتعرف على طريقة استخدام مستشعر الموجات فوق الصوتية مع Arduino لاكتشاف العوائق وقياس المسافة. وسنطبق ذلك في دائرة عملية تستخدم مصباحين وجرسًا للتنبيه عند اقتراب جسم من المستشعر.
فيديو المشروع
يمكنكم مشاهدة الشرح والتجربة العملية كاملة في الفيديو رقم 4 من سلسلة Arduino من الصفر على قناة Naadi Tech – نادي الابتكار.
فكرة المشروع
يعتمد المشروع على إرسال موجات فوق صوتية نحو الجسم الموجود أمام المستشعر، ثم قياس الزمن الذي تستغرقه الموجات للذهاب إلى الجسم والانعكاس والعودة إلى المستشعر. انطلاقًا من هذا الزمن وسرعة الصوت يمكن للـ Arduino حساب المسافة.
بعد حساب المسافة يستخدم البرنامج حدًا قدره 50 سم لاتخاذ القرار. عندما يكون الجسم قريبًا يتم تشغيل مصباح التنبيه والجرس، وعندما يبتعد الجسم يتوقف الجرس وتتغير حالة المصابيح.
المكونات المطلوبة
- لوحة Arduino
- مستشعر موجات فوق صوتية HC-SR04 أو ما يعادله
- لوحة تجارب Breadboard
- مصباحان LED
- مقاومات مناسبة لحماية مصابيح LED
- جرس Buzzer
- أسلاك توصيل
- كابل USB
كيف يعمل مستشعر الموجات فوق الصوتية؟
يحتوي المستشعر على مرسل ومستقبل للموجات فوق الصوتية، إضافة إلى منافذ التغذية والتحكم. يستخدم منفذ TRIG لبدء القياس، بينما يعطينا منفذ ECHO مدة رحلة الموجة الصوتية.
إرسال الموجة
لبدء القياس يرسل Arduino نبضة إلى منفذ TRIG. في التجربة يتم إبقاء النبضة في المستوى العالي لمدة تتجاوز 10 ميكروثانية، فيرسل المستشعر حزمة من الموجات فوق الصوتية.
استقبال الصدى
إذا كان هناك جسم أمام المستشعر تنعكس الموجات وتعود إليه. يبقى خرج ECHO في المستوى العالي لمدة مرتبطة بزمن ذهاب الموجة إلى الجسم وعودتها.
حساب المسافة
سرعة الصوت التقريبية المستخدمة في المشروع هي 0.34 مليمتر لكل ميكروثانية، أي نحو 340 مترًا في الثانية. وبما أن الزمن المقاس يمثل رحلة الذهاب والعودة، نقسم النتيجة على 2 للحصول على المسافة إلى الجسم.
| العنصر | القيمة / المعادلة |
|---|---|
| سرعة الصوت التقريبية | 0.34 mm/µs |
| الزمن المقاس | زمن ذهاب وعودة الموجة |
| المسافة بالمليمتر | (المدة × 0.34) ÷ 2 |
| المسافة بالسنتيمتر | (المدة × 0.034) ÷ 2 |
يستخدم هذا النوع من المستشعرات عادةً لقياس المسافات القصيرة، ويمكن أن يصل مجال القياس في الوحدات الشائعة إلى عدة أمتار. تتأثر النتيجة الفعلية بشكل الجسم وزاويته والبيئة المحيطة.
أين يمكن استخدام المستشعر؟
- روبوتات اكتشاف وتفادي العوائق.
- قياس المسافات.
- أنظمة المساعدة على ركن السيارات.
- تشغيل إضاءة أو تنبيه عند اقتراب شخص.
- مشاريع الروبوتات والأتمتة التعليمية.
مخطط التوصيل
في المشروع يتم توصيل مستشعر الموجات فوق الصوتية مع Arduino، بالإضافة إلى مصباحين وجرس للتنبيه. التوصيلات الأساسية موضحة في الجدول التالي.
| المكوّن | المنفذ | التوصيل مع Arduino |
|---|---|---|
| Ultrasonic Sensor | VCC | 5V |
| Ultrasonic Sensor | GND | GND |
| Ultrasonic Sensor | TRIG | Digital 7 |
| Ultrasonic Sensor | ECHO | Digital 4 |
| LED الأول | الإشارة | Digital 10 |
| LED الثاني | الإشارة | Digital 13 |
| Buzzer | الإشارة | Digital 2 |
ملاحظة مهمة: استخدم مقاومة مناسبة على التوالي مع كل LED لحمايته والحد من التيار، وتأكد من اتجاه المصباح الصحيح قبل تشغيل الدائرة.
الكود الكامل للمشروع
int LEDB= 10 ; // منفد مصباح أزرق//
int LEDR= 13 ; // منفد مصباح أحمر//
int buzzer= 2 ;
int trigPin = 7;
int echoPin = 4; // منفد استشعار الحاجز//
int i = 0;
long duration ;
int distance;
const float SOUND_SPEED = 340.0 /1000;
void setup() {
// الإعداد الأولي//
pinMode(LEDB, OUTPUT); //نعلن المنفد رقم 10 خارجي//
pinMode(LEDR, OUTPUT); //نعلن المنفد رقم 13 خارجي//
pinMode(buzzer, OUTPUT); //نعلن المنفد رقم 2 خارجي//
pinMode(trigPin, OUTPUT); //نعلن المنفد رقم 7 داخل//
pinMode(echoPin, INPUT); //نعلن المنفد رقم 4 داخل//
Serial.begin(9600);
}
void loop() {
// حلقة متكررة //
digitalWrite(trigPin, LOW);
delayMicroseconds(5);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin,HIGH); //obstacle نقرأ المدخل 7 ونكتبه في المتغير //
distance = duration * SOUND_SPEED/2;
Serial.print("Distance : ");
Serial.println(distance);
if(distance < 500) { // إذا كانت قيمة المتغير تساوي LOW فيوجد حاجز //
digitalWrite(LEDB, HIGH);
digitalWrite(LEDR, LOW);
for(i=0;i<80;i++){
digitalWrite(buzzer,HIGH);
delay(1);//wait for 1ms
digitalWrite(buzzer,LOW);
delay(1);//wait for 1ms
}
} else{ // إذا لا يوجد حاجز //
digitalWrite(LEDB, LOW);
digitalWrite(LEDR, HIGH);
digitalWrite(buzzer, LOW);
}
delay(250); // نستشعر كل ربع ثانية //
}
شرح البرنامج
تعريف المنافذ والمتغيرات
في بداية البرنامج نعرّف منافذ المصباحين والجرس، إضافة إلى منفذي TRIG وECHO. كما نحتاج إلى متغيرات لتخزين مدة النبضة والمسافة المحسوبة وقيمة سرعة الصوت.
تهيئة الدائرة في setup()
داخل setup() نحدد اتجاه المنافذ باستخدام pinMode(). يكون TRIG مخرجًا لأن Arduino يرسل منه نبضة البدء، بينما يكون ECHO مدخلًا. كما يتم تشغيل الاتصال التسلسلي لعرض المسافة في Serial Monitor.
إرسال نبضة TRIG وقياس ECHO
داخل loop() يرسل Arduino نبضة قصيرة عبر TRIG لبدء القياس، ثم يقيس المدة التي يبقى خلالها ECHO في المستوى العالي. هذه المدة تمثل زمن رحلة الموجة إلى الجسم وعودتها.
حساب المسافة
بعد الحصول على المدة يحسب البرنامج المسافة باستخدام سرعة الصوت، مع القسمة على 2 لأن الموجة قطعت المسافة مرتين: ذهابًا وعودة.
تشغيل التنبيه حسب المسافة
يقارن البرنامج المسافة بالحد المستخدم في التجربة وهو 50 سم. عندما يصبح الجسم أقرب من هذا الحد تتغير حالة مصابيح LED ويتم تشغيل الجرس. وعندما يبتعد الجسم تتغير حالة المؤشرات ويتوقف التنبيه الصوتي.
ملاحظة حول الشرح في الفيديو: يوجد تكرار لفظي في وصف الشرط الثاني قرب الدقيقة 06:00. منطق التجربة يوضح أن الحالة الثانية تحدث عندما يكون الجسم خارج مسافة التنبيه، أي عند 50 سم أو أكثر.
عرض المسافة في Serial Monitor
يمكن فتح Serial Monitor في Arduino IDE لمشاهدة قيمة المسافة بين المستشعر والعائق مباشرة أثناء التجربة. وهذا مفيد لاختبار المشروع ومعايرة مسافة تشغيل التنبيه.
اختبار المشروع
بعد تركيب الدائرة ورفع البرنامج إلى Arduino، نقرب اليد أو جسمًا من المستشعر. عندما يدخل الجسم ضمن مسافة التنبيه يضيء مؤشر الاقتراب ويعمل الجرس. وعندما نُبعد الجسم يتوقف الجرس ويضيء المؤشر الآخر.
مشاكل شائعة وحلولها
| المشكلة | ما يجب التحقق منه |
|---|---|
| المسافة لا تظهر أو غير صحيحة | تحقق من توصيل TRIG وECHO ومن التغذية والأرضي. |
| القراءات غير مستقرة | ثبت المستشعر ووجهه نحو جسم مناسب وتجنب الأسطح شديدة الميل. |
| الجرس لا يعمل | تحقق من توصيله بالمنفذ رقم 2 ومن نوع الجرس المستخدم. |
| LED لا يضيء | تحقق من اتجاه LED والمقاومة والتوصيل بالمنفذ الصحيح. |
| Serial Monitor يعرض رموزًا غير مفهومة | تأكد من تطابق سرعة Serial Monitor مع القيمة المستخدمة في Serial.begin(). |
ماذا تعلمنا؟
- مبدأ عمل مستشعر الموجات فوق الصوتية.
- استخدام إشارات TRIG وECHO.
- حساب المسافة اعتمادًا على زمن رحلة الصوت.
- استخدام شرط برمجي لاتخاذ قرار حسب المسافة.
- التحكم في LED وBuzzer بواسطة Arduino.
- عرض القياسات في Serial Monitor.
أفكار لتطوير المشروع
يمكن استخدام نفس المبدأ لصناعة نظام مساعدة على ركن السيارة، أو روبوت يتفادى العوائق، أو نظام إنذار عند الاقتراب، أو تشغيل إضاءة تلقائيًا. ويمكن كذلك إضافة شاشة لعرض المسافة أو تغيير نمط صوت الجرس حسب قرب الجسم.
الخلاصة
تعلمنا في هذا المشروع كيف يمكن للـ Arduino استخدام الموجات فوق الصوتية لاكتشاف الأجسام وقياس المسافة إليها. ومن خلال إضافة مصابيح LED وجرس أصبح بإمكاننا تحويل القياس إلى نظام تنبيه بسيط يمكن تطويره واستخدامه في العديد من مشاريع الروبوتات والأتمتة.
تابعوا باقي حلقات سلسلة Arduino من الصفر على Naadi Tech – نادي الابتكار للمزيد من الشروحات والمشاريع العملية.
