Measure distance with an HC-SR04 ultrasonic sensor
متوسط
أو تصفّح كل الدروس.
- 503قطعة على المنضدة
- 44لوحة تعمل الآن
- 1.00xزمن حقيقي، على كل لوحة
HC-SR04 هو الحساس الذي يبدأ به كل صف، لأنه لا يخفي فيه شيئًا: لا ناقل ولا عنوان ولا مكتبة عليك أن تثق بها. ترسل إليه نبضة فيرسل لك نبضة، وطول الثانية هو المسافة. الدائرة أعلاه توصّل واحدًا منه بـArduino Uno وتحوّل القراءة إلى حساس ركن، بصافرة تصفّر أسرع كلما اقترب الجدار ومصباح أحمر داخل خط التوقف.
افتحه في المحرر واسحب المنزلق على الحساس لتحريك الجدار. تطبع الشاشة التسلسلية المسافة بالسنتيمتر والفاصل بين الصفيرات.
What you need
- Arduino Uno
- حساس الموجات فوق الصوتية HC-SR04
- صافرة
- LED أحمر ومقاومة 220 ohm
- لوحة تجارب وأسلاك توصيل
Wiring
| القطعة والطرف | يتصل بـ | ملاحظة |
|---|---|---|
| HC-SR04 VCC | 5 V | تريد الوحدة 4.5 V أو أكثر |
| HC-SR04 GND | GND | |
| HC-SR04 TRIG | الطرف 7 | تطلق اللوحة نبضة على هذا الطرف |
| HC-SR04 ECHO | الطرف 6 | مرتفع طوال المدة التي يستغرقها الصوت للعودة |
| طنّان | الطرف 9 | الساق الأخرى إلى GND |
| LED أحمر، عبر 220 ohm | الطرف 8 | يضيء داخل خط التوقف |
كيف يقيس الحساس
أبقِ TRIG مرتفعًا عشر ميكرو ثوانٍ على الأقل فترسل الوحدة دفعة قصيرة من صوت 40 kHz، ثم تجعل ECHO مرتفعًا بالمدة التي يستغرقها الصوت ليصل إلى الجسم ويعود. ينتقل الصوت بنحو 343 مترًا في الثانية في درجة حرارة الغرفة، أي 0.0343 سنتيمتر في الميكرو ثانية، ويقطع الرحلة مرتين. فالمسافة بالسنتيمتر هي زمن الصدى بالميكرو ثانية مقسومًا على نحو 58، وهو الرقم الذي يقسم عليه كل كود HC-SR04.
تحتفظ قطعة Mokxi بتوقيت ورقة البيانات: يرتفع ECHO بعد 460 ميكرو ثانية من الزناد، ويبقى مرتفعًا 58 ميكرو ثانية لكل سنتيمتر، وإذا لم يكن شيء في المدى يبقى مرتفعًا طوال مهلة 38 ملي ثانية كاملة. وتأتي سرعة الصوت من درجة حرارة هواء تستطيع ضبطها على القطعة، لذلك يقرأ كود يقسم على 58 جدارًا على بعد متر واحد على أنه 104 سنتيمترات عند التجمد، وهذا ما تفعله وحدة حقيقية أيضًا.
الكود، مشروحًا
يقرأ المثال الحساس عبر دالة مساعدة صغيرة تطلق الزناد وتقيس الصدى وتعيد الملي مترات، أو صفرًا إذا لم يعد شيء. وعند كتابتها يدويًا بـpulseIn()، وهي الطريقة التي تتبعها معظم الشروح، يكون القياس خمسة أسطر.
سلوك الركن دالة واحدة. داخل 15 سنتيمترًا تحمل نغمة واحدة طويلة وتضيء الـLED. وبين ذلك ومترين، يزداد الفاصل بين الصفيرات خطيًا من 90 ملي ثانية إلى 900. وما بعد مترين تبقى صامتة. وتنتهي كل حلقة بانتظار 60 ملي ثانية، وهذا الرقم مهم: تطلب ورقة البيانات 60 ملي ثانية بين النبضات، لأن صدى النبضة السابقة ما زال يتردد في الغرفة.
const int TRIG = 7;
const int ECHO = 6;
long readCm() {
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
long us = pulseIn(ECHO, HIGH, 38000);
return us / 58;
}جرّبه في المحرر
افتح الدائرة في المحرر واختر الحساس. خاصية temperature فيه هي درجة حرارة الهواء، 20 درجة افتراضيًا. اضبطها على 0 فيقرأ الجدار نفسه على بعد أكبر ببضعة سنتيمترات، لأن الصوت أبطأ في الهواء البارد؛ واضبطها على 40 فيقرأ أقرب. الكود لم يتغير، وكذلك لن يتغير في وحدة حقيقية.
بعد ذلك، غيّر delay(60) في نهاية كل فرع من loop() إلى delay(20). سيبقى كثير من النبضات دون إجابة، لأن الوحدة ما زالت تنتظر انطفاء صدى النبضة الأخيرة وتتجاهل زنادًا يأتي مبكرًا جدًا، فتبدأ الشاشة التسلسلية بخلط «لا شيء في المدى» مع مسافات حقيقية. أعدها إلى 60 فتعود كل قراءة حقيقية.
لمشروع مختلف بالتوصيل نفسه، احذف كود الصافرة واطبع المسافة على راسم المخطط التسلسلي بدل ذلك، فيصبح لديك جهاز قياس مسافة بسيط.
Common mistakes
إرسال النبضات أسرع من كل 60 ملي ثانية. تعود القراءة الأولى وتُتجاهل البقية، لأن الوحدة ترفض الإطلاق وهي ما زالت تصغي. تفعل القطعة المحاكاة الشيء نفسه، فيظهر الخطأ هنا قبل أن يظهر على مكتبك.
تبديل TRIG وECHO. لا ينكسر شيء، لكن اللوحة تنتظر نبضة لا تأتي أبدًا، وتكون كل قراءة صفرًا أو المهلة كاملة.
نسيان المهلة. عندما لا يكون شيء في المدى يستمر الصدى 38 ملي ثانية، وpulseIn() دون مهلة تنتظر ثانية كاملة قبل أن تستسلم، مما يجعل بقية الكود يبدو عالقًا.
الوثوق بآخر ملي متر. HC-SR04 الحقيقي دقيق إلى بضعة ملي مترات في أحسن الأحوال ويرتبك بالأسطح الناعمة أو المائلة. القراءة المحاكاة دقيقة تمامًا، وهذا مفيد لتعلّم الكود لكنه ألطف من المنضدة الحقيقية.
توصيل ECHO مباشرةً بلوحة 3.3 فولت. تقود الوحدة ECHO عند 5 فولت. في Uno لا بأس بذلك؛ أما في ESP32 أو Pico فتحتاج دائرة حقيقية إلى مقسّم مقاومات على ذلك الخط.
الأسئلة
ما مدى HC-SR04؟
من نحو 2 سنتيمتر إلى 4 أمتار. تعدّ القطعة المحاكاة أي شيء أقرب من 20 ملي مترًا أو أبعد من 4000 على أنه لا شيء في المدى.
لماذا نقسم على 58؟
يستغرق الصوت نحو 29 ميكرو ثانية ليقطع سنتيمترًا في درجة حرارة الغرفة، ويقطع الصدى المسافة مرتين، ذهابًا وإيابًا. 29 ضرب 2 يساوي 58.
هل أستطيع استخدام HC-SR04 مع ESP32؟
نعم، بالكود نفسه. في العتاد الحقيقي لا تتحمل أطراف ESP32 جهد 5 فولت، فضع مقسّمًا على ECHO، مثلًا 1 k و2 k، ليخفضه إلى نحو 3.3 فولت.
هل يحاكي المحاكي الصوت نفسه؟
لا. لا توجد زاوية حزمة ولا انعكاس عن مشهد. القطعة ساعة إيقاف تبقي ECHO مرتفعًا طوال الرحلة ذهابًا وإيابًا بسرعة الصوت، والمسافة تُضبط على منزلق. وهذا يكفي لكتابة الكود وتصحيحه تمامًا كما يعمل على العتاد.
واصل
ابنِ هذا على أرض الواقع
افتح المحرر وغيّر قيمة وشاهد الرقم يتحرك معها. لا شيء لتثبّته ولا حاجة إلى حساب.