![]() |
بعدما قدمنا عدة روبوتات بسيطة يمكن البدء بها بدون برمجة ولا اليكترونيك صعبة
نستعرض في هذه المرة أول روبوت يمكن القول عنه أنه البداية الفعلية في صناعة روبوتات متقدمة شيئا ما.
مستكشف الضوء هو مَركبة يمكنها التجوال بنفسها باحثة عن الضوء.
|
![]() |
تم استعمال عجلات مسننة (أو قل مدببة). لكن ليس مهما استعمال هذا النوع من العجلات.اذ لم تكن متواجدة عندك فاﻷحرى أن تحاول صنعها بنفسك أو تستبدلها بعجلات عادية وهذا هو اﻷسهل.
لكن دعنا نفترض أنه بإمكانك الحصول عليها إما عن طريق شرائها من خلال الانترنت أو محلات الاليكترونيك في بلدك.
نقول هنا أنك تحتاج قاعدة مزودة بمحركين وعلبة الدوائر المسننة (gearbox) وحاملة بطاريات وقاعدة.
من الاحسن إضافة طبقة أخرى على القاعدة الرئيسية للروبوت من أجل حمل لوحة Arduino. هذه الطبقة عبارة عن خُشيبة أو قطعة بلاستيكية مربعة الشكل.
إذا افترضنا أنك ستستعمل هذا النموذج بحذافره فدعني أقول لك أنه تم شراء علبة الدوائر المسننة مصحوبة بمحركين DC.
|
![]() |
تعمل المستشعرات CdS على استكشاف درجة سطوع الضوء حيث تتغير مقاومتهما الداخلية اعتمادا على كمية الضوء المستقبَلة. طريقة تركيب هذه المستشعرات تتمثل كالتالي:
يجب أن يوصل أحد مربطي كل مستشعر على حدى بالمدخل الأرضي (GND) لبطاقة Arduino.
ويوصل الطرف الآخر بالمدخل التناظري (analog input pin) للوحة Arduino.
|
void setup()
{
pinMode("analog pin", INPUT); digitalWrite("analog pin", HIGH); } |
![]() |
// قم بنسخ هذه الشفرة انطلاقا من هذا السطر
/***********************
شيفرة للتعامل مع المستشعرين
Anuj تم انجازه من طرف حقوق الطبع محفوظة التركيب على أرض الواقع Arduino مستشعرين متصلين بالأرضية والمدخل 1 (يسارا) والمدخل 2 (يمينا) لبطاقة *******************************************************/
// Arduino Duemilinove استعمال لوحة
/**************************تعريف الثوابت***************************/
/* سيستعمل هذا المتغير لتنشيط أو إقفال عمل المحرك اﻷيمن. موصول بقاعدة الترنزستور */
const int RightMotor = 2;
/* سيستعمل هذا المتغير لتنشيط أو إقفال عمل المحرك اﻷيمن. موصول بقاعدة الترنزستور */
const int LeftMotor = 3; const int RightSensor = 1; //سيستعمل هذا المتغير لقراءة قيمة المستشعر اﻷيمن
const int LeftSensor = 2; //يستعمل هذا المتغير لقراءة قيمة المستشعر اﻷيسر
تعريف المتغيرات//
int SensorLeft; // يستعمل للاحتفاظ بقيمة المستشعر اﻷيسر للاستعمال فيما بعد int SensorRight; // يستعمل للاحتفاظ بقيمة المستشعر اﻷيمن للاستعمال فيما بعد int SensorDifference; // يستعمل لاحتفاظ بالفارق بين قيمة اليمين واليسار void setup() // ستنفذ هذه الدالة مرة واحدة فقط لتهيئة البطاقة البرمجية
{
/* سنعرف المتغير LeftSensor كـ "مدخل" ليتم القراءة من خلاله فيما بعد*/
pinMode(LeftSensor, INPUT);
/* سنعرف المتغير RightSensor كـ "مدخل" ليتم القراءة من خلاله فيما بعد*/
pinMode(RightSensor, INPUT);
/* تفعيل ترانزستور pull-up داخلي*/
digitalWrite(A1, HIGH);
/* تفعيل ترانزستور pull-up داخلي ثاني*/
digitalWrite(A2, HIGH);
/* نعرف سرعة تحويل المعلومات*/
Serial.begin(9600);
/* إظهار رسالةلا غير بعد تنفيذ هذه الدالة*/
Serial.println(" \nReading Light sensors.");
} void loop() // ستنفذ هذه الدالة إلى ما لانهاية حتى يتم ايقاف الروبوت
{
SensorLeft = analogRead(LeftSensor); // قراءة قيمة المستشعر اﻷيسر والاحتفاظ بها delay(1); // انتظار 1 ميكروثانية وهي مهمة لجعل البطاقة تأخذ أنفاسها بعدما تنفيذ اﻷمر السابق SensorRight = analogRead(RightSensor); // قراءة قيمة المستشعر اﻷيمن والاحتفاظ بها delay(1); // انتظار 1 ميكروثانية وهي مهمة لجعل البطاقة تأخذ أنفاسها بعدما تنفيذ اﻷمر السابق
// لحساب القيمة المطلقة للفارق بين قيمة المستشعر اﻷيمن وقيمة المسشعر اﻷيسر
SensorDifference = abs(SensorRight – SensorLeft);
/**************************************************************
سيستعمل المقطع التالي من الشيفرة لإظهار بعض الجمل والقيم العددية للمتغيرات على الشاشة
أثناء البرمجة فقط لتتأكد من عمل هذه الشيفرة بشكل جيد لا غير.
هل تعرف ما يسمى هذا المقطع البسيط في عالم البرمجة؟
انه يسمى debugging
****************/
Serial.print("Left Sensor = "); // لإظهار الجملة بين اشارتي الاقتباس
Serial.print(SensorLeft); // لإظهار قيمة المتغير Serial.print("\t"); // إظهار فراغ متوسط Serial.print("Right Sensor = "); //لإظهار الجملة بين اشارتي الاقتباس Serial.print(SensorRight); // لإظهار قيمة المتغير Serial.print("\t"); // إظهار فراغ متوسط Serial.print("Sensor Difference = "); //لإظهار الجملة بين اشارتي الاقتباس Serial.print(SensorDifference); // لإظهار قيمة المتغير Serial.print("\n"); // للرجوع الى السطر } |
SensorLeft = analogRead(LeftSensor);
delay(1);
SensorRight = analogRead(RightSensor);
delay(1); |
SensorLeft = 1023 - analogRead(LeftSensor);
delay(1);
SensorRight = 1023 - analogRead(RightSensor);
delay(1); |
if(SensorDifference <= 75) // تم اعتبار 75 كعتبة عددية محددة
{ // اتجه أماما
} else if (RightSensor > Left sensor)
{
// اتجه يمينا } else if (LeftSensor > RightSensor)
{ // اتجه يسارا
} |
![]() |
ما زلت تتذكر أننا عرفنا متغييرين سميناهما: RightMotor و LeftMotor، أليس كذلك؟؟؟
يجب أن تعرف أو تتذكر أنه لإرسال أوامر التحكم الى المركبات الاليكترونية نستعمل الدالة digitalWrite والتي يمكن استخدامها بإعطاءها قيميتن: رقم المدخل الموصول به المركب الاليكتروني و الحالة التي نريد بها أن يتصرف المركب الاليكتروني.
في حالتنا هذه:
المركب الاليكتروني هو: المحرك.
والحالة هي:إما HIGH أي مشتغل أو LOW أي منطفئ.
|
if(SensorDifference <= 75) // اتجه أماما
{
digitalWrite(RightMotor, HIGH); digitalWrite(LeftMotor, HIGH); } else if (RightSensor > Left sensor) // اتجه يمينا
{
digitalWrite(RightMotor, LOW); digitalWrite(LeftMotor, HIGH); } else if (LeftSensor > RightSensor) // اتجه يسارا
{digitalWrite(RightMotor, HIGH);
digitalWrite(LeftMotor, LOW); } |
// قم بنسخ هذه الشفرة انطلاقا من هذا السطر
/********************شيفرة للتعامل مع المستشعرين Anuj تم انجازه من طرف
تعديل الشيفرة: محمد السهلي
حقوق الطبع محفوظة التركيب على أرض الواقع Arduino مستشعرين متصلين بالأرضية والمدخل 1 (يسارا) والمدخل 2 (يمينا) لبطاقة ********************************************************/ // Arduino Duemilinove استعمال لوحة
/*تعريف الثوابت*/
/* سيستعمل هذا المتغير لتنشيط أو إقفال عمل المحرك اﻷيمن. موصول بقاعدة الترنزستور */
const int RightMotor = 2;
/* سيستعمل هذا المتغير لتنشيط أو إقفال عمل المحرك اﻷيمن. موصول بقاعدة الترنزستور */
const int LeftMotor = 3; const int RightSensor = 1; // سيستعمل هذا المتغير لقراءة قيمة المستشعر اﻷيمن const int LeftSensor = 2; //سيستعمل هذا المتغير لقراءة قيمة المستشعر اﻷيسر
/*تعريف المتغيرات*/
int SensorLeft; // يستعمل للاحتفاظ بقيمة المستشعر اﻷيسر للاستعمال فيما بعد int SensorRight; // يستعمل للاحتفاظ بقيمة المستشعر اﻷيمن للاستعمال فيما بعد int SensorDifference; // يستعمل لاحتفاظ بالفارق بين قيمة اليمين واليسار void setup() // ستنفذ هذه الدالة مرة واحدة فقط لتهيئة البطاقة البرمجية
{
/* سنعرف المتغير LeftSensor كـ "مدخل" ليتم القراءة من خلاله فيما بعد*/
pinMode(LeftSensor, INPUT);
/* سنعرف المتغير RightSensor كـ "مدخل" ليتم القراءة من خلاله فيما بعد*/
pinMode(RightSensor, INPUT);
/* تفعيل ترانزستور pull-up داخلي*/
digitalWrite(A1, HIGH);
/* تفعيل ترانزستور pull-up داخلي ثاني*/
digitalWrite(A2, HIGH);
/* نعرف سرعة تحويل المعلومات*/
Serial.begin(9600);
/* إظهار رسالة*/
Serial.println(" \nReading Light sensors.");
} void loop() // ستنفذ هذه الدالة إلى ما لانهاية حتى يتم ايقاف الروبوت
{
SensorLeft = 1023 - analogRead(LeftSensor); // قراءة قيمة المستشعر اﻷيسر والاحتفاظ بها delay(1); // انتظار 1 جزء من الثانية وهي مهمة لجعل البطاقة تأخذ أنفاسها بعدما تنفيذ اﻷمر السابق SensorRight = 1023 - analogRead(RightSensor); // قراءة قيمة المستشعر اﻷيمن والاحتفاظ بها delay(1); // انتظار 1 جزء من الثانية وهي مهمة لجعل البطاقة تأخذ أنفاسها بعدما تنفيذ اﻷمر السابق
// لحساب القيمة المطلقة للفارق بين قيمة المستشعر اﻷيمن وقيمة المسشعر اﻷيسر
SensorDifference = abs(SensorRight – SensorLeft);
/************************************************************
سيستعمل المقطع التالي من الشيفرة لإظهار بعض الجمل والقيم العددية للمتغيرات على الشاشة
أثناء البرمجة فقط لتتأكد من عمل هذه الشيفرة بشكل جيد لا غير.
هل تعرف ما يسمى هذا المقطع البسيط في عالم البرمجة؟
انه يسمى debugging
****************/
Serial.print("Left Sensor = "); // لإظهار الجملة بين اشارتي الاقتباس
Serial.print(SensorLeft); // لإظهار قيمة المتغير Serial.print("\t"); // إظهار فراغ متوسط Serial.print("Right Sensor = "); // لإظهار الجملة بين اشارتي الاقتباس Serial.print(SensorRight); // لإظهار قيمة المتغير Serial.print("\t"); // إظهار فراغ متوسط Serial.print("Sensor Difference = "); // لإظهار الجملة بين اشارتي الاقتباس Serial.print(SensorDifference); // لإظهار قيمة المتغير
/**********************
هذا المقطع الرئيسي لتحرك الروبوت.
هنا نقوم بمعالجة وتحليل القيم وتوجيه الروبوت من خلالها
**************************************/
if(SensorDifference <= 75) // اتجه أماما
{
digitalWrite(RightMotor, HIGH); digitalWrite(LeftMotor, HIGH);
Serial.print(“Forward”); // فقط لإظهار رسالة مفادها أنه يتجه أماما
} else if (RightSensor > Left sensor) // اتجه يمينا
{
digitalWrite(RightMotor, LOW); digitalWrite(LeftMotor, HIGH);
Serial.print(“Right”); // فقط لإظهار رسالة مفادها أنه يتجه يمينا
} else if (LeftSensor > RightSensor) // اتجه يسارا
{
digitalWrite(RightMotor, HIGH); digitalWrite(LeftMotor, LOW);
Serial.print(“Left”); // فقط لإظهار رسالة مفادها أنه يتجه يسارا
}
Serial.print("\n"); // للرجوع الى السطر
} |