قسم الميكروكنترولر والروبوت ودوائر الاتصال بالحاسب الالي قسم المتحكمات الـ microcontroller و المعالجات microprocessor و التحكم الرقمي بالكمبيوتر CNC والانظمة الآلية والروبوت Robots

أدوات الموضوع

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:333
قديم 12-03-2020, 07:31 PM المشاركة 1   
افتراضي عمل كاشف الموجات فوق الصوتية Ultrasonic Sensor HC-SR04 مع الاردوينو ومشروع متحكم Twitter FaceBook Google+



عمل كاشف الموجات فوق الصوتية Ultrasonic Sensor HC-SR04 مع الاردوينو ومشروع متحكم فى مستوى المياه بخزان .

ما هى الموجات فوق الصوتية؟
الموجات فوق الصوتية هي موجات صوت عالية النبرة high-pitched بترددات أعلى من الحد المسموع audible limit لسمع الإنسان.



يمكن أن تسمع آذان الإنسان موجات صوتية تهتز في النطاق من حوالي 20 مرة في الثانية (ضجيج هدير عميق) إلى حوالي 20000 مرة في الثانية (صفير عالي النبرة). ومع ذلك ، فإن الموجات فوق الصوتية لديها تردد أعلا من 20،000 هرتز ، وبالتالي تكون غير مسموعة للبشر.


نبذة عن الحساس HC-SR04 :
في جوهره ، يتكون مستشعر المسافة بالموجات فوق الصوتية HC-SR04 من محوِّلين للموجات فوق الصوتية ultrasonic transducers . يعمل أحدهما كجهاز إرسال يحول الإشارة الكهربائية إلى نبضات صوت فوق صوتية بتردد 40 كيلو هرتز. يستمع (يستقبل) المستقبل النبضات المرسلة. إذا استقبلها ، فإنه ينتج نبضة خرج يمكن استخدام عرضها لتحديد المسافة التي قطعتها النبضة.
المستشعر صغير وسهل الاستخدام في أي مشروع روبوتات ويوفر كشفًا ممتازًا عن مدى عدم التلامس بين 2 سم إلى 400 سم بدقة 3 مم. نظرًا لأنه يعمل على 5 فولت ، يمكن توصيله مباشرةً بأردوينو أو أي ميكروكنترولر 5V آخر.

المواصفات :
• جهد التشغيل : DC 5V .
• تيار التشغيل : 15mA .
• تردد التشغيل : 40KHz .
• أقصى مدى : 4m .
• أدنى مدى : 2cm .
• دقة المدى : 3mm .
• زاوية القياس : 15 degree .
• إشارة دخل البدء Trigger : 10Us TTL pulse .
• الأبعاد : 45 x 20 x 15 mm .

أطراف الحساس :



• الطرف VCC هو طرف مصدر القدرة للحساس والذى يتم توصيله بطرف 5V للاردوينو .
• الطرف Trig(Trigger) ويستخدم لبدء (قدح) trigger النبضات فوق الصوتية .
• الطرف Echo وينتج نبضة pulse عندما يتم استقبال إشارة منعكسة . طول النبضة يتناسب مع الزمن الذى أخذه من أجل كشف الإشارة المرسلة (زمن الإرسال + زمن الاستقبال) .
• الطرف GND يجب توصيله بأرضى الاردوينو .

مبدأ العمل :
يبدأ العمل ، عندما يتم تطبيق نبضة بعرض duration لا يقل عن 10 S (10 microseconds) على طرف البدء Trigger . استجابة لذلك يرسل الحساس سلسلة نبضات مكونة من ثماني نبضات عند تردد 40 كيلو هرتز 40 KHz . هذا النمط ذو 8 نبضات يشكل "بصمة الموجات فوق الصوتية" من الجهاز بشكل فريد ، مما يسمح للمستقبل بتمييز النمط المرسل عن الضوضاء فوق الصوتية المحيطة.
تنتقل النبضات الثمانية الفوق صوتية عبر الهواء مبتعدة عن جهاز الإرسال. في هذه الأثناء يصبح الطرف Echo فى الحالة HIGH للبدء في تشكيل بداية إشارة ارتداد الصدى.
في حالة ، إذا لم تنعكس هذه النبضات مرة أخرى ، فستنتهي إشارة الصدى بعد 38 مللي ثانية وتعود إلى المستوى المنخفض low . وبالتالي ، فإن نبضة 38 مللي ثانية تشير إلى عدم وجود أي عوائق داخل نطاق المستشعر.




إذا إنعكست هذه النبضات مرة أخرى ، يصبح الطرف Echo منخفضا low بمجرد استلام الإشارة. ينتج عن ذلك نبضة يتراوح عرضها بين 150 S إلى 25 mS ، اعتمادًا على الوقت الذي يستغرقه استقبال الإشارة.





ثم يتم استخدام عرض النبضة المستقبلة لحساب المسافة إلى كائن الانعكاس . يمكن أن يتم ذلك باستخدام معادلة بسيطة بين المسافة والسرعة الوقت.



لنأخذ مثالاً لجعله أكثر وضوحًا. لنفترض أن لدينا كائنًا أمام المستشعر على مسافة غير معروفة واستقبلنا نبضة بعرض 500 S على الطرف Echo . الآن دعنا نحسب مدى المسافة الموجودة من المستشعر إلى الكائن . سوف نستخدم المعادلة أدناه.
Distance = Speed x Time
هنا ، لدينا قيمة الوقت ، أي 500 s ونحن نعرف السرعة. ما السرعة التي لدينا؟ سرعة الصوت ، بالطبع! وهى 340 m/s . يتعين علينا تحويل سرعة الصوت إلى cm/s من أجل حساب المسافة بالسنتيمتر ، وهى 0.034 cm/s وبهذه المعلومات ، يمكننا حساب المسافة!
Distance = 0.034 cm/s x 500 s
ولكن تذكر أن النبضة تشير إلى الوقت الذي استغرقه إرسال الإشارة وانعكاسها مرة أخرى ، لذلك حتى تحصل على المسافة ، ستحتاج إلى قسمة النتيجة على 2 .
Distance = (0.034 cm/s x 500 s) / 2
Distance = 8.5 cm
الآن ، نحن نعلم أن الكائن على بعد 8.5 سم من المستشعر.



الدائرة الكهربية :



البرمجة :
1- فى البداية عليك تحديد الأطراف Trig و Echo. في هذه الحالة ، نستخدم الأطراف رقم 9 و 10 على لوحة Arduino ويُطلق عليهما اسم trigPin و echoPin. ستحتاج بعد ذلك إلى متغير نوع long يسمى “duration” لزمن الانتقال الذي ستحصل عليه من المستشعر ، ومتغير نوع عدد صحيح للمسافة distance.

كود:
// defines pins numbers
const int trigPin = 9;
const int echoPin = 10;

// defines variables
long duration;
int distance;

2- في دالة الإعداد setup ، يجب عليك تعريف trigPin كمخرج و echoPin كمدخل وكذلك بدء الاتصال التسلسلي لإظهار النتائج على الشاشة التسلسلية.

كود:
void setup() {
pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
pinMode(echoPin, INPUT); // Sets the echoPin as an Input
Serial.begin(9600); // Starts the serial communication
}

3- في الدالة loop :
أ‌- فى البداية ، يجب عليك التأكد من مسح clear الطرف trigPin ، لذا يجب عليك ضبط هذا الطرف على حالة LOW لمدة 2 s فقط .
ب‌- الآن لتوليد موجة فوق صوتية الصوت ، علينا أن نضع الطرف trigPin على الحالة HIGH لمدة 10 s .
ت‌- باستخدام الدالة pulseIn ، عليك قراءة زمن الانتقال ووضع هذه القيمة في المتغير duration . تحتوي هذه الدالة على وسيطين ، أولهما هو اسم طرف الصدى echo pin والثاني يمكنك كتابة إما HIGH أو LOW . في هذه الحالة ، HIGH تعني أن الدالة pulseIn ستنتظر حتى يبدأ الطرف الحالة HIGH بسبب موجة الصوت المرتد وسيبدأ التوقيت ، ثم ستنتظر أن يصبح الطرف LOW عندما تنتهي موجة الصوت والتي ستوقف التوقيت. في النهاية ، تقوم الدالة بإرجاع طول النبضة بالميكرو ثانية. للحصول على المسافة ، سنضرب الزمن فى 0.034 ونقسمها على 2. في النهاية سنقوم بطباعة قيمة المسافة على الشاشة التسلسلية.

كود:
void loop() {
// Clears the trigPin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
	
// Sets the trigPin on HIGH state for 10 micro seconds
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
	
// Reads the echoPin, returns the sound wave travel time in microseconds
duration = pulseIn(echoPin, HIGH);
	
// Calculating the distance
distance= duration*0.034/2;
	
// Prints the distance on the Serial Monitor
Serial.print("Distance: ");
Serial.println(distance);
}

البرنامج :

كود:
//Ultrasonic Sensor HC-SR04 and Arduino Tutorial
// defines pins numbers
const int trigPin = 9;
const int echoPin = 10;

// defines variables
long duration;
int distance;

void setup() {
pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
pinMode(echoPin, INPUT); // Sets the echoPin as an Input
Serial.begin(9600); // Starts the serial communication
}

void loop() {
// Clears the trigPin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
	
// Sets the trigPin on HIGH state for 10 micro seconds
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
	
// Reads the echoPin, returns the sound wave travel time in microseconds
duration = pulseIn(echoPin, HIGH);
	
// Calculating the distance
distance= duration*0.034/2;
	
// Prints the distance on the Serial Monitor
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" CM ");
}



إذا كنت ترغب في عرض النتائج من جهاز الاستشعار بالموجات فوق الصوتية HC-SR04 على شاشة LCD ، يمكنك استخدام البرنامج التالى :



كود:
#include <LiquidCrystal.h> // includes the LiquidCrystal Library
	
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); // Creates an LCD object. Parameters: (rs, enable, d4, d5, d6, d7)
	
const int trigPin = 9;
const int echoPin = 10;
	
long duration;
int distanceCm, distanceInch;
	
void setup() {
lcd.begin(16,2); // Initializes the interface to the LCD screen, and specifies the dimensions (width and height) of the display
	
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
}
	
void loop() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
	
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
	
duration = pulseIn(echoPin, HIGH);
distanceCm= duration*0.034/2;
distanceInch = duration*0.0133/2;
	
lcd.setCursor(0,0); // Sets the location at which subsequent text written to the LCD will be displayed
lcd.print("Distance: "); // Prints string "Distance" on the LCD
lcd.print(distanceCm); // Prints the distance value from the sensor
lcd.print(" cm");
delay(10);
lcd.setCursor(0,1);
lcd.print("Distance: ");
lcd.print(distanceInch);
lcd.print(" inch");
delay(10);
}

اعلانات

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:333
قديم 13-03-2020, 11:39 AM المشاركة 2   
افتراضي


مشروع مبين ومتحكم لمستوى (منسوب) المياه تلقائيا فى خزان باستخدام الاردوينو

في هذا المشروع الذي يستند إلى Arduino ، سنقوم بقياس مستوى الماء باستخدام أجهزة استشعار بالموجات فوق الصوتية ultrasonic . يعتمد المبدأ الأساسي لقياس المسافة بالموجات فوق الصوتية على الصدى ECHO. عندما ترسل الموجات الصوتية في البيئة ، فإنها تعود إلى الأصل كصدى ECHO بعد الارتداد من أي عقبة. لذلك علينا فقط حساب وقت الانتشار لكل من الموجة المرسلة والموجة المستقبلة يعني وقت المغادرة ووقت العودة إلى الأصل بعد ضرب أي عقبة. وبعد بعض الحسابات يمكننا الحصول على النتيجة وهي المسافة. يتم استخدام هذا المفهوم في مشروعنا للتحكم في المياه حيث يتم تشغيل مضخة محرك المياه تلقائيًا عندما يصبح مستوى الماء في الخزان منخفضًا.

الدائرة الكهربية :







في هذه الدائرة ، يتم وضع وحدة الاستشعار بالموجات فوق الصوتية في الجزء العلوي من خزان المياه . ستقوم وحدة الاستشعار هذه بقراءة المسافة بين وحدة المستشعر وسطح الماء ، وسوف تظهر المسافة على شاشة LCD مع رسالة “Water Space in Tank is:” . هذا يعني أننا نعرض هنا المكان الفارغً بدلاً من مستوى الماء. بسبب هذه الوظيفة ، يمكننا استخدام هذا النظام في أي خزان مياه. عندما يصل مستوى فراغ الماء إلى مسافة حوالي 30 سم ، يقوم Arduino بتشغيل مضخة المياه عن طريق تشغيل الريلاى . وحينها ستعرض شاشة LCD “LOW Water Level” “Motor turned ON” ، وسيبدأ ليد LED بيان حالة الريلاى في التوهج .
الآن إذا وصلت المساحة الفارغة على مسافة حوالي 12 سم ، يقوم اردوينو بإيقاف تشغيل الريلاى التتابع وستظهر شاشة LCD “Tank is full” “Motor Turned OFF” . الصفارة أيضا نعطى صفير لبعض الوقت ويتم فصل ليد بيان حالى الريلاى .

البرمجة :
1- فى بداية (مقدمة) البرنامج :
• يتم تضمين مكتبة LCD .
• تعريف الأطراف المستخدمة فى البرنامج لربط الأجهزة الخارجية مثل الحساس والريلاى والصفارة وشاشة LCD .
• إنشاء كائن من فئة الشاشة وليكن lcd مع تحديد الأطراف المستخدمة .
• إعلان المتغيرات المستخدمة .


كود:
#include <LiquidCrystal.h>
 
#define trigger 10
#define echo 11
#define motor 8
#define buzzer 12
 
LiquidCrystal lcd(7,6,5,4,3,2);
 
float time=0,distance=0;
int temp=0;

2- فى دالة الإعداد setup :
• تهيئة الشاشة LCD للعمل وتحديد نوعها 16 حرف (عامود) و 2 سطر (صف) .
• تحديد اتجاه الأطراف المستخدم خرج OUTPUT / دخل INPUT .
• عرض رسالة إفتتاحية Water Level فى السطر الأول و Indicator فى السطر الثانى لمدة (تأخير) 2 ثانية .


كود:
void setup()
{
 lcd.begin(16,2);

 pinMode(trigger,OUTPUT);
 pinMode(echo,INPUT);
 pinMode(motor, OUTPUT);
 pinMode(buzzer, OUTPUT);

 lcd.print("  Water Level ");
 lcd.setCursor(0,1);
 lcd.print("   Indicator  ");
 delay(2000);
}

3- الدالة loop وفيها يتم :
أ‌- الجزء الأول :
• مسح الشاشة .
• مسح المخرج trigger بجعله فى الحالة المنخفضة لمدة 2 ميكروثانية .
• جعل المخرج trigger فى الحالة المرتفعة لمدة 10 ثوانى حتى يتمكن الحساس من توليد الإشارة الفوق صوتية .
• إعادة مسح المخرج trigger بجعله فى الحالة المنخفضة لمدة 2 ثانية ، حيث يتم إرسال الإشارة فوق الصوتية واستقبالها بعد إنعكاسها من العائق ومن ثم تكوين نبضة مدتها تتناسب مع المسافة إلى العائق .
• الحصول على زمن النبضة time باستخدام الدالة pulseIn ومن ثم يمكن حساب المسافة distance .
• طباعة الرسالة Water Space In فى السطر الأول ، وفى السطر الثانى يتم طباعة Tank is: يليها قيمة المسافة distance ووحداتها Cm ، وذلك لمدة 2 ثانية .


كود:
void loop()
{
 lcd.clear();
 digitalWrite(trigger,LOW);
 delayMicroseconds(2);

 digitalWrite(trigger,HIGH);
 delayMicroseconds(10);

 digitalWrite(trigger,LOW);
 delayMicroseconds(2);

 time=pulseIn(echo,HIGH);
 distance=time*340/20000;

 //lcd.clear();
 lcd.print("Water Space In  ");
 lcd.setCursor(0,1);
 lcd.print("Tank is: ");
 lcd.print(distance);
 lcd.print("Cm");
 delay(2000);

ب‌- الجزء الثانى : عمليات المقارنة للتحكم التلقائى فى منسوب المياة ، وهنايتم تنفيذ واحدة من 3 حالات :
• الحالة الأولى : عندما يصل الخزان إلى حالة الملو إى المسافة أقل من 12 سم ، و (&&) المتغير temp==0 . عندئذ يتم إيقاف المحرك ، وإصدار صفير ، ومسح الشاشة وعرض Water Tank Full فى السطر الأول و Motor Turned OFF ولمدة 2 ثانية ، ثم إيقاف الصفير والانتظار 3 ثانية وأخيرا يتم تحويل المتغير temp=1 .
• الحالة الثانية : عندما يكون الحزان مملوء والمتغير temp==1 يتم : إيقاف المحرك ومسح الشاشة وعرض Water Tank Full و Motor Turned OFF لمدة خمس ثوانى .
• الحالة الثالثة : عندما تكون المسافة أكبر من 30 (بما فى ذلك حالة بدء ملو الخزان) يتم : تشغيل المحرك ، ومسح الشاشة وعرض LOW Water Level و Motor Turned ON والتأخير 5 ثانية وتحويل المتغير temp=0 .


كود:
 if(distance<12 && temp==0)
 {
     digitalWrite(motor, LOW);
     digitalWrite(buzzer, HIGH);

     lcd.clear();
     lcd.print("Water Tank Full ");
     lcd.setCursor(0,1);
     lcd.print("Motor Turned OFF");
     delay(2000);

     digitalWrite(buzzer, LOW);
     delay(3000);

     temp=1;
 }
 
  else if(distance<12 && temp==1)
 {
     digitalWrite(motor, LOW);

     lcd.clear();
     lcd.print("Water Tank Full ");
     lcd.setCursor(0,1);
     lcd.print("Motor Turned OFF");
     delay(5000);
 }
 
 else if(distance>30)
 {
   digitalWrite(motor, HIGH);

   lcd.clear();
   lcd.print("LOW Water Level");
   lcd.setCursor(0,1);
   lcd.print("Motor Turned ON");
   delay(5000);

   temp=0;
 }

}

البرنامج :

كود:
 
#include <LiquidCrystal.h>
 
#define trigger 10
#define echo 11
#define motor 8
#define buzzer 12
 
LiquidCrystal lcd(7,6,5,4,3,2);
 
float time=0,distance=0;
int temp=0

void setup()
{
 lcd.begin(16,2);

 pinMode(trigger,OUTPUT);
 pinMode(echo,INPUT);
 pinMode(motor, OUTPUT);
 pinMode(buzzer, OUTPUT);

 lcd.print("  Water Level ");
 lcd.setCursor(0,1);
 lcd.print("   Indicator  ");
 delay(2000);
}

void loop()
{
 lcd.clear();
 digitalWrite(trigger,LOW);
 delayMicroseconds(2);

 digitalWrite(trigger,HIGH);
 delayMicroseconds(10);

 digitalWrite(trigger,LOW);
 delayMicroseconds(2);

 time=pulseIn(echo,HIGH);
 distance=time*340/20000;

 //lcd.clear();
 lcd.print("Water Space In  ");
 lcd.setCursor(0,1);
 lcd.print("Tank is: ");
 lcd.print(distance);
 lcd.print("Cm");
 delay(2000);

if(distance<12 && temp==0)
 {
     digitalWrite(motor, LOW);
     digitalWrite(buzzer, HIGH);
     lcd.clear();
     lcd.print("Water Tank Full ");
     lcd.setCursor(0,1);
     lcd.print("Motor Turned OFF");
     delay(2000);

     digitalWrite(buzzer, LOW);
     delay(3000);

     temp=1;
 }
 
  else if(distance<12 && temp==1)
 {
     digitalWrite(motor, LOW);

     lcd.clear();
     lcd.print("Water Tank Full ");
     lcd.setCursor(0,1);
     lcd.print("Motor Turned OFF");
     delay(5000);
 }
 
 else if(distance>30)
 {
   digitalWrite(motor, HIGH);

   lcd.clear();
   lcd.print("LOW Water Level");
   lcd.setCursor(0,1);
   lcd.print("Motor Turned ON");
   delay(5000);

   temp=0;
 }

}

اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )
  
إضافة رد

العلامات المرجعية

«     الموضوع السابق       الموضوع التالي    »
أدوات الموضوع

الانتقال السريع إلى


الساعة معتمدة بتوقيت جرينتش +3 الساعة الآن: 07:31 AM
موقع القرية الالكترونية غير مسؤول عن أي اتفاق تجاري أو تعاوني بين الأعضاء
فعلى كل شخص تحمل مسئولية نفسه إتجاه مايقوم به من بيع وشراء وإتفاق وأعطاء معلومات موقعه
التعليقات المنشورة لا تعبر عن رأي موقع القرية الالكترونية ولايتحمل الموقع أي مسؤولية قانونية حيال ذلك (ويتحمل كاتبها مسؤولية النشر)

Powered by vBulletin® Version 3.8.6, Copyright ©2000 - 2025