لنتحدث عن واحدة من تلك اللحظات في الورشة التي تجعل الجميع يمسك رأسه.
يأتي الطالب بحماس: يا أستاذ الكود جاهز، كل شيء تمام، هيا نجرب! تضعان الروبوت في بداية ممر بأمل كبير. الممر فارغ. لا جدار ولا عائق. لكن ما إن يتحرك الروبوت حتى يتوقف فجأة مذعورا — يرجع أو يدور في مكانه كأنه اصطدم بجدار غير مرئي.
يسقط وجه الطالب: لكن يا أستاذ الطريق كان فارغا — لماذا توقف؟ وأنت تبتسم... لأنك تعرف ماذا أخطأ الروبوت في فهمه.
ماذا يحدث حين يتشوش الحساس؟
المصدر غالبا حساسنا الشهير بعين الخفاش: HC-SR04. يرسل نبضة صوت وينتظر الصدى.
الحياة الحقيقية ليست مختبرا نظيفا. أحيانا يمتص القماش الصوت. وأحيانا تكون الزاوية خاطئة فلا يعود الصدى. عندها لا يستطيع الحساس القياس. ما يريد قوله للأردوينو: لم أستطع قياس المسافة. لا أعلم.
كيف يقول ذلك؟ بإشارة خطأ معروفة: قيمة 0 كبيرة واضحة.
اختلافه عن نصيحتنا الشقيقة: في لماذا يرى روبوتك أشباحا؟ كنا نصفّي القراءات العشوائية الخاطئة (الضوضاء) بالمتوسط. هنا المسألة مختلفة: الحساس يعيد عمدا 0 = فشل القياس. ونحن نظن خطأ أن الصفر يعني التصقت بجدار.
خطأ الرياضيات البريء
في كود الطالب غالبا هذا السطر البريء:
if (distance < 15) {
stopNow();
}
يرسل الحساس 0. يحسب الروبوت ببساطة: هل 0 أصغر من 15؟ نعم — وأصغر بكثير!
فيظن المسكين أن أنفه ملتصق بجدار ويضغط زر الذعر. لا يوجد جدار. فقط حساس مرتبك فشل في القياس. الروبوت لا يرى أشباحا; يسيء تفسير رمز خطأ.
الخبرة تقول: علّم الروبوت المنطق
علّمه هذا: الـ 0 لا تعني أنك اقتربت جدا. تعني أن الحساس فشل. لا تعتبرها عائقا — تجاوزها.
المنطق القديم: إن كانت المسافة أقل من 15 فتوقف.
المنطق المجرب: إن كانت المسافة أقل من 15 و ليست 0 فتوقف.
if (distance > 0 && distance < 15) {
stopNow();
}
هذا كل شيء. بهذه اللمسة الصغيرة يتوقف الروبوت عن معاملة أصفار الخطأ كعوائق ويرد فقط على المسافات الحقيقية.
ويمكنك دمجه مع المتوسط أيضا: خذ عينات واحسب المتوسط، ثم أبقِ شرط distance > 0 في القرار. ليسا خصمين; يكملان بعضهما.
تذكر; الروبوتات فن إدارة عتاد غير مثالي بكود ذكي.