المسافة والحضور والحركة
يحتاج نظام التحكّم كثيرا إلى أجوبة عن أسئلة بسيطة: كم يبعد الجسم عنّا؟ هل دخل أحد إلى الغرفة؟ في هذا الفصل نتعرّف على حسّاسين يجيبان عن هذين السؤالين: الحسّاس فوق الصوتي وحسّاس الحركة. لكل حسّاس نرسم التوصيل، نكتب برنامجا كاملا مُرّ بالترجمة، ونحسب ما سنقرؤه على الشاشة التسلسلية. وفي آخر الفصل نلقي نظرة سريعة على حسّاسات أخرى للمسافة والحركة.
- نفهم كيف يقيس الحسّاس فوق الصوتي المسافة من زمن الصدى، ونحسبها حسب d = v·t2 وبالاختصار d ≈ t58.
- نوصل الوحدة HC-SR04 بالمتحكّم ونقيس عرض النبضة بالأمر pulseIn() مع مهلة انتظار.
- نبني نظام مساعدة الركن: طنّان يصفّر أسرع كلما اقترب الجسم.
- نوصل حسّاس الحركة HC-SR501 ونشغّل مصباحا لمدّة محدّدة بعد آخر حركة بواسطة millis().
- نقارن بين حسّاسات المسافة والحركة: ماذا يقيس كل منها، ما مداه، وهل مخرجه تماثلي أم رقمي.
חיישן מרחק על-קולי – الحسّاس فوق الصوتي HC-SR04 (Ultrasonic Distance Sensor)
الصوت يذهب إلى الجسم ثم يعود منه، فالطريق الذي يقطعه هو 2·d ، ولذلك نقسم على 2 في القانون التالي. سرعة الصوت في الهواء نحو 343 m/s عند 20 °C. وهي تتغيّر قليلا مع درجة حرارة الهواء، لكن التغيّر صغير في مشاريعنا، فنعدّها ثابتة.
| الرمز | المعنى | وحدة القياس |
|---|---|---|
| d | المسافة بين الحسّاس والجسم | [m] |
| t | زمن الذهاب والإياب، وهو عرض النبضة على الطرف ECHO | [s] |
| v | سرعة الصوت في الهواء، نحو 343 m/s | [m/s] |
من أين يأتي العدد 58؟ الحسّاس يعطينا الزمن بالميكروثانية، ونريد المسافة بالسنتيمتر. نكتب السرعة بهذه الوحدات، 343 m/s = 0.0343 cm/µs ، ونعوّض في القانون:
أي أن الصوت يحتاج نحو 58 µs ليذهب سنتيمترا واحدا ويعود.
الفرق بين الطريقتين 0.2 cm فقط، لأن 58 قريب جدا من 58.31.
الوحدة HC-SR04: الأطراف وطريقة العمل – המודול HC-SR04: הדקים ואופן הפעולה:
| الخاصية | القيمة |
|---|---|
| التغذية | 5 V و 15 mA |
| تردد الموجة | 40 kHz |
| مدى القياس | من 2 cm إلى 4 m |
| زاوية القياس | نحو 15° |
| نبضة القدح | t ≥ 10 µs |
| بين قياسين | t ≥ 60 ms |
الحسّاس رقمي: له مدخل ومخرج رقميان فقط. المتحكّم يرفع TRIG مدّة 10 µs، وهذه نبضة القدح (פולס הדק). عندها ترسل الوحدة رشقة من 8 دورات بتردد 40 kHz وترفع ECHO، وتخفضه عندما يصل الصدى. عرض النبضة (רוחב הפולס) على ECHO هو الزمن t. القيم في الجدول «قيمة نموذجية حسب ورقة البيانات»، وقد تختلف قليلا بين الصانعين.
لقياس عرض النبضة نستعمل pulseIn(): ينتظر حتى يرتفع الطرف ثم يعيد مدّة بقائه مرتفعا بالميكروثانية. الوسيط الثالث 30000UL هو مهلة الانتظار (זמן המתנה מרבי): إذا لم تصل نبضة خلال 30 ms يعيد 0. هذه المهلة تكفي لمسافة حتى 514 cm ، أي أكثر من مدى الحسّاس.
const int TRIG = 9;
const int ECHO = 10;
const float V = 0.0343; // speed of sound: 343 m/s = 0.0343 cm/us
void setup() {
Serial.begin(9600);
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
}
void loop() {
digitalWrite(TRIG, HIGH); // 10 us trigger pulse
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
unsigned long t = pulseIn(ECHO, HIGH, 30000UL); // 0 = timeout
Serial.print("t = "); Serial.print(t);
if (t == 0) {
Serial.println(" us no echo");
} else {
Serial.print(" us d = "); Serial.print(V * t / 2, 1);
Serial.println(" cm");
}
delay(100);
}t = 583 us d = 10.0 cm t = 2915 us d = 50.0 cm t = 5831 us d = 100.0 cm t = 11662 us d = 200.0 cm t = 0 us no echo
القراءة النموذجية لأجسام على بعد 10، 50، 100، 200 سنتيمترا، والسطر الأخير بلا جسم: لم يعد صدى فأعاد pulseIn القيمة 0.
أ. نحسب المسافة بالقانون.
ب. نحسبها بالاختصار.
מערכת עזר לחניה – مثال تطبيقي: نظام مساعدة الركن (Parking Assist)
الحسّاس فوق الصوتي يقيس المسافة إلى الحائط، والطنّان (זמזם) يصفّر أسرع كلما اقتربت السيارة. نقسم المسافة إلى أربع مناطق، ونضيف طنّانا سلبيا بين D8 والأرضي. الأمر tone(BUZZ, 2000, 60) يُخرج موجة مربّعة بتردد 2000 Hz مدّة 60 ms ثم يتوقف وحده. بدل delay طويل بين الصفّارات نقارن millis() بوقت الصفّارة السابقة، فيبقى القياس سريعا.
| المنطقة | المسافة | الطنّان |
|---|---|---|
| 0 | أكثر من 100 cm | صامت |
| 1 | من 50 إلى 100 cm | كل 500 ms |
| 2 | من 25 إلى 50 cm | كل 200 ms |
| 3 | 25 cm أو أقل | متواصل: قف! |
const int TRIG = 9, ECHO = 10, BUZZ = 8; // BUZZ: passive buzzer
const unsigned int GAP[] = {0, 500, 200, 0}; // ms between beeps
unsigned long lastBeep = 0;
void setup() {
Serial.begin(9600);
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
}
void loop() {
digitalWrite(TRIG, HIGH); delayMicroseconds(10); digitalWrite(TRIG, LOW);
unsigned long t = pulseIn(ECHO, HIGH, 30000UL);
float d = (t == 0) ? 999.0 : t / 58.0; // no echo = far away
int z = (d > 100) ? 0 : (d > 50) ? 1 : (d > 25) ? 2 : 3;
if (z == 0) noTone(BUZZ);
else if (z == 3) tone(BUZZ, 2000); // stop: continuous tone
else if (millis() - lastBeep >= GAP[z]) {
tone(BUZZ, 2000, 60); // short beep
lastBeep = millis();
}
Serial.print("d = "); Serial.print(d, 1);
Serial.print(" cm zone "); Serial.println(z);
delay(60);
}d = 999.0 cm zone 0 d = 150.8 cm zone 0 d = 90.5 cm zone 1 d = 40.2 cm zone 2 d = 12.1 cm zone 3
سيارة تقترب من الحائط، والسطر الأول بلا صدى. المسافة المعروضة أكبر قليلا من الحقيقية: 150.8 cm لجسم على بعد 150 cm ، لأن البرنامج يقسم على 58 بدل 58.31. حدود المناطق بزمن الصدى: t = 58·d ، أي 5800 ، 2900 و 1450 µs.
חיישן תנועה PIR – حسّاس الحركة بالأشعة تحت الحمراء HC-SR501 (PIR Motion Sensor)
في داخله عنصر كهروحراري (פירואלקטרי) له نصفان، وفوقه قبّة بيضاء هي عدسة فرينل (עדשת פרנל) تقسم مجال الرؤية إلى قطاعات. عندما يعبر إنسان من قطاع إلى قطاع يصل إلى النصفين إشعاع مختلف فيرتفع المخرج. لذلك الإنسان الجالس بلا حراك «يختفي» بعد قليل: الحسّاس يكشف التغيّر وليس الوجود.
| الخاصية | القيمة في HC-SR501 («قيمة نموذجية حسب ورقة البيانات») |
|---|---|
| جهد التغذية | من 4.5 V إلى 20 V |
| المخرج | رقمي: 3.3 V عند الحركة، 0 V بدونها |
| مدى الكشف | حتى نحو 7 m ، ويُضبط بالمقاومة المتغيّرة Sx |
| زاوية الكشف | مخروط أقل من 120° |
| زمن الإمساك Tx (זמן השהיה) | يُضبط بالمقاومة المتغيّرة Tx: من ثوانٍ قليلة إلى بضع دقائق |
| زمن التسخين بعد التشغيل | حتى نحو دقيقة |
على الوحدة أيضا جسر صغير لاختيار وضع إعادة القدح (מצב הפעלה חוזרת). في الوضع H تبدأ كل حركة جديدة زمن الإمساك من البداية، فيبقى المخرج مرتفعا ما دامت الحركة مستمرة. في الوضع L ينخفض المخرج بعد Tx حتى لو استمرت الحركة. القيم تختلف قليلا بين نُسخ الوحدة.
مخرج الحسّاس 3.3 V والمتحكّم يُغذّى بـ 5 V. حسب ورقة بيانات ATmega328P يُقرأ الطرف HIGH ابتداءً من نحو 3 V ، و 3.3 V أكبر من ذلك، فنوصل المخرج مباشرة بالطرف D2 (وهذا آمن أيضا لـ ESP32). مصباح البيان على D7 ومعه مقاومة 330 Ω على التوالي، فيمرّ فيه تيار نحو 9 mA.
نريد أن يُضيء المصباح عند الحركة ويبقى مضاءً 30 s بعد آخر حركة. نضبط الوحدة على الوضع H وعلى أقصر Tx ، ونترك حساب المدّة للبرنامج: نحفظ في lastMotion وقت آخر قراءة HIGH ، ونطفئ عندما يمرّ 30 s منذ ذلك الوقت.
const int PIR = 2, LAMP = 7;
const unsigned long HOLD = 30000UL; // ms after the last motion
unsigned long lastMotion = 0;
bool lampOn = false;
void report(const char *msg) {
Serial.print("t = "); Serial.print(millis() / 1000.0, 1);
Serial.print(" s "); Serial.println(msg);
}
void setup() {
Serial.begin(9600);
pinMode(PIR, INPUT); pinMode(LAMP, OUTPUT);
delay(60000UL); // PIR warm-up
Serial.println("ready");
}
void loop() {
unsigned long now = millis();
if (digitalRead(PIR) == HIGH) {
lastMotion = now; // motion: restart the timer
if (!lampOn) {
lampOn = true; digitalWrite(LAMP, HIGH); report("lamp ON");
}
}
if (lampOn && now - lastMotion >= HOLD) {
lampOn = false; digitalWrite(LAMP, LOW); report("lamp OFF");
}
}ready t = 65.2 s lamp ON t = 114.7 s lamp OFF t = 152.3 s lamp ON t = 185.1 s lamp OFF
آخر قراءة HIGH في الحركة الأولى عند 68.4 s ، والحركة الثانية بدأت عند 81 s:
فبقي المصباح مضاءً، والحركة الثانية بدأت العدّ من جديد. آخر قراءة HIGH فيها عند 84.7 s:
חיישני מרחק ותנועה נוספים – حسّاسات أخرى للمسافة والحركة (Other Distance and Motion Sensors)
إلى جانب الحسّاس فوق الصوتي وحسّاس الحركة نلتقي في المشاريع بحسّاسات أخرى للمسافة والحركة. لا نتوسّع فيها في هذا الكتاب، لكن من المفيد أن نعرف ماذا يقيس كل منها، ما مداه، ما نوع مخرجه، وأين يُستعمل. الجدول يقارن بينها وبين الحسّاسين اللذين تعلّمناهما:
| الحسّاس | ماذا يقيس؟ | المدى النموذجي | المخرج | استعمال نموذجي |
|---|---|---|---|---|
| فوق صوتي HC-SR04 | المسافة من زمن الصدى | من 2 cm إلى 4 m | نبضة رقمية على ECHO | مساعدة الركن، مستوى سائل |
| حسّاس الحركة HC-SR501 | تغيّر الأشعة الحرارية: حركة إنسان | حتى نحو 7 m | رقمي: نعم / لا | إضاءة الدرج، إنذار |
| حسّاس المسافة بالأشعة تحت الحمراء (Sharp GP2Y0A21) | المسافة من موضع الضوء المنعكس عن الجسم | من 10 cm إلى 80 cm | جهد تماثلي، والعلاقة غير خطّية | روبوت يتجنّب العوائق |
| المرمِّز الدوّار (KY-040) | زاوية دوران المحور واتجاهه | دوران بلا حدّ، 20 نبضة في الدورة | نبضات رقمية على قناتين A و B | مقبض قائمة أو صوت، موضع محور محرّك |
| مقياس التسارع (MPU6050) | التسارع وميل الجهاز عن الأفق | من ±2 g حتى ±16 g | رقمي عبر ناقل البيانات I2C | كشف الميل، روبوت متوازن، عدّ الخطوات |
ملخّص قوانين الفصل:
| القانون | الصيغة |
|---|---|
| المسافة بطريقة الصدى | d = v·t2 |
| الاختصار (v = 343 m/s) | d[cm] ≈ t[µs]58 |
| زمن الصدى لمسافة معلومة | t[µs] ≈ 58·d[cm] |
قاموس المصطلحات – מילון מונחים:
| بالعربية | بالعبرية (كما تظهر في الامتحان) | English |
|---|---|---|
| الحسّاس فوق الصوتي | חיישן על-קולי | Ultrasonic sensor |
| الصدى | הד | Echo |
| سرعة الصوت | מהירות הקול | Speed of sound |
| نبضة القدح | פולס הדק (טריגר) | Trigger pulse |
| عرض النبضة | רוחב הפולס | Pulse width |
| مهلة الانتظار | זמן המתנה מרבי | Timeout |
| الطنّان (البازر) | זמזם | Buzzer |
| حسّاس الحركة بالأشعة تحت الحمراء | חיישן תנועה (PIR) | Passive infrared sensor |
| حسّاس سلبي | חיישן סביל (פסיבי) | Passive sensor |
| العنصر الكهروحراري | גביש פירואלקטרי | Pyroelectric element |
| عدسة فرينل | עדשת פרנל | Fresnel lens |
| زمن الإمساك | זמן השהיה | Hold (delay) time |
| وضع إعادة القدح | מצב הפעלה חוזרת | Retrigger mode |
| حسّاس المسافة بالأشعة تحت الحمراء | חיישן מרחק אינפרא-אדום | IR distance sensor |
| المرمِّز الدوّار | מקודד סיבובי | Rotary encoder |
| مقياس التسارع | מד תאוצה | Accelerometer |
أسئلة للتمرين:
أ. نحسب المسافة بالقانون.
ب. نحسبها بالاختصار.
ب. برنامج يستعمل مهلة 10000 µs: ما أبعد مسافة يقيسها؟
أ. قياس مستوى الماء في خزّان من أعلاه.
ب. إضاءة الدرج عندما يصعد إنسان.
ج. مقبض نديره في الاتجاهين لاختيار بند في قائمة.
د. كشف ميل منصّة عن الأفق.
أ. HC-SR04.
ب. HC-SR501.
ج. حسّاس المسافة Sharp.