ArduinoCar

سيارة الأردوينو :

يوجد العديد من نماذج السيارات الجاهزة للأردوينو مثل نموذج 4 عجلات أو 3 عجلات. في هذا الدرس سنقوم بشرح النموذج المصنوع من مادة الـ Acrylic  الذي يحتوي على 3 عجلات . يأتي النموذج مع  2 محركات مع علبة سرعة، حامل بطاريات AA ومجموعة من المسامير . الهيكل مجهز بثقوب لإضافة كافة الحساسات والمحلقات ولوحات التطوير المختلفة.

 

المكونات :

  • اردوينو أونو
  • مجسم السيارة 
  • درع التحكم بالمحركات L293D
  • بطارية (مصدر طاقة)
  • اسلاك متنوعة M-M M-F

لوحة (درع) L293D:

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

تعد اللوحة مفيدة في الكثير من التطبيقات حيث أنها تسهل عملية التوصيل بشكل كبير جدا .يستخدم الدرع بشكل اساسي لتكبير التيار الواصل للمحركات. حيث أن بورد الأردوينو غير قادر على تزويد المحركات بالتيار المطلوب.

تعطي منافذ الأردوينو (I/O) تيار قدره 20mA فقط بينما تحتاج المحركات في حالة كانت تعمل بدون أحمال إلا حوالي 120mA. يمكن تغذية الدرع بمصدر خارجي حتى 36 فولت.

 
يعد متحكم المحركات L298N البديل الأول للدرع في كثير من التطبيقات التي تتطلب تيارا أعلى. كما يمكن استخدامه مع الأعديد من المتحكمات من شركة أردوينو كـالأردوينو نانو او حتى مع المتحكمات الأخرى كـالرازبري باي و PIC.

التوصيل

لاحظ توصيل المحركين في مداخل المحركات 1 و 2. بعد ذلك تم توصيل بطارية في مدخل الطاقة.

الطاقة

يمكن أن تواجه الكثير من المشاكل مع البطارية التقليدية المستخدمة مثل بطاريات AA أو  بطارية (9V) حيث يؤدي سحب التيار العالي من المحركات لحدوث مشاكل في الأردونو و نفاذ سعة  البطارية سريعا. لذا يمكنك اسبتادلها ببطاريات الليثيوم القابلة للشحن أو ببنك الطاقة.

تسع الخلية الواحدة من بطايات اللثيوم 2400mAh بالمقابل 550mAh هي سعة البطارية التقليدية.

كما ننصح باستخدام مصدري طاقة منفصلين،  مصدر لتغذية الأردوينو والآخر لتغذية المحركات. 

المكتبة

يجب تنزيل مكتبة Adafruit Motor Shield Library الخاصة باللوحة L293D حيث تسهل عملية البرمجة بشكل كبير. يمكن تنزيل المكتبة عن طريق الـ Arduino IDE أو من الـ Github في الرابط التالي:

تمرين 1:

في هذا التمرين البسيط تسير السيارة للأمام  لـ  3 ثواني ثم تقف لمدة ثانية  ثم تدور لليمين لزمن 3 ثواني تقف لمدة ثانية ثم تكمل بنفس الطريقة للخلف ولليسار. لتبسيط الكود يمكنك وضع الأوامر الخاصة بكل حركة داخل دالة وفي حال اردت تنفيذ الحركة يمكنك استدعاء الدالة.

الكود

				
					#include <AFMotor.h>
AF_DCMotor motor1(1);   //Left Motor
AF_DCMotor motor2(2);   //Right Motor

void setup() {}

void loop(){
 //stop
  motor1.setSpeed(0); 
  motor1.run(RELEASE);// you need 2 commands to stop
  motor2.setSpeed(0); 
  motor2.run(RELEASE);
  delay(1000);
  //FORWARD
  motor1.setSpeed(255); // speed (0 -255 ) 
  motor1.run(FORWARD); //motor move clockwise
  motor2.setSpeed(255); 
  motor2.run(FORWARD);
  delay(3000);
  //stop
  motor1.setSpeed(0); 
  motor1.run(RELEASE);// you need 2 commands to stop
  motor2.setSpeed(0); 
  motor2.run(RELEASE);
  delay(1000);
//RIGHT
  motor1.setSpeed(255); 
  motor1.run(FORWARD);
  motor2.setSpeed(255); 
  motor2.run(BACKWARD); 
  delay(3000);
   //stop
  motor1.setSpeed(0); 
  motor1.run(RELEASE); 
  motor2.setSpeed(0); 
  motor2.run(RELEASE);
  delay(1000);
  //BACKWARD
  motor1.setSpeed(255); 
  motor1.run(BACKWARD); 
  motor2.setSpeed(255); 
  motor2.run(BACKWARD); 
  delay(3000);
  //stop
  motor1.setSpeed(0);
  motor1.run(RELEASE); 
  motor2.setSpeed(0); 
  motor2.run(RELEASE);
  delay(1000); 
  //LEFT
  motor1.setSpeed(255); 
  motor1.run(BACKWARD); 
  motor2.setSpeed(255); 
  motor2.run(FORWARD);
  delay(3000);
}

				
			

سيارة تجنب الاصطدام

من الممكن جعل الروبوت (السيارة) قادرة على تفادي الاصطدام  بمعرفة المسافة بين السيارة والأجسام المحيطة. يمكن استخدام حساس الموجات فوق الصوتية للحصول على المسافة واذا ماكانت أصغر من حد معين يتم تغير اتجاه السيارة. 

يمكن تثبيت حساس الالتراسونيك في مقدمة السيارة بشكل ثابت أو على محرك سيرفو. في هذه الحالات يسمح محرك السيرفو بـتوجيه الحساس لليمين واليسار مما يعطي قراءة ادق عن البيئة المحيطة بالسيارة. على كل حال في هذا لمثال سيتم استخدام الحساس بدون محرك السيرفو للتبسيط.
 

التوصيل

لاحظ أن توصيل الحساس بالأردوينو يتطلب 4 منافذ بالشكل الموضح. حيث يتم تغذية الطاقة بمنفذين 5v وGND. ويستم المنفذين trig و echo للارسال واستقبال الموجات الفوق صوتية.

لاحظ أن الشيلد يمنع الوصول للمنافذ الرقمية لذا يمكن استخدام منافذ الدخل التماثلي كمنافذ دخل رقمي اي يمكن توصيل المنفذين trig و echo بـ A0 و A1 

تمرين 2:

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

المسافة = السرعة * الزمن

يتم تفعيل الحساس لاطلاق موجات باعطائه قيمة HIGH لمنفذ  الـ Trig لمدة عشرة مايكروثانية. بعد ذلك يمكن معرفة المدة الزمنية باستخدام الدالة (pulseIn(echoPin, HIGH وتستخدم الدالة pulseIn لحساب الفترة الزمنية لتغير حالة المنفذ

من LOW لـ HIGH.

سرعة الصوت في الهواء تساوي 340.29 متر للثانية الواحدة الذي يساوي

0.034 سم/مايكروثانية. القيام بهذا التحويل مطلوب للحصول على المسافة بوحدة السنتميتر. كما يتم قسمة الزمن على 2 لان الزمن الذي تم الحصول عليه هو زمن انطلاق الموجة وارتدادها اي انه ضعف الزمن بين السيارة والجسم.

لاحظ أن الكود يقوم بتوجيه  السيارة للحركة للأمام ما دامت الماسافة اكبر من 20 سم اما في حال كانت المسافة مساوية لـ 20 أو اقل تقوم السيارة بالوقوف والدواران نحو اليمين (بتحريك العجل في الجهة اليسرى نحو الأمام والعجل في الجهة اليسرى نحو الخلف) لمدة نصف ثانية ومن ثم تعود للحركة في اتجاه الامام. يمكنك تغير الحركة لاي جهة تريدها مثلا يمكنك جعل السيارة تتجه نحو اليسار بدلا من اليمين عند وصول المسافة لـ 20سم .

الكود

				
					#include <AFMotor.h>
AF_DCMotor motor1(3); //left
AF_DCMotor motor2(2);  //right

int trigPin = A0; 
int echoPin = A1;    
float duration, distance;

void Right(){
  motor1.setSpeed(255); //Define maximum velocity
  motor1.run(FORWARD); //rotate the motor clockwise
  motor2.setSpeed(255); 
  motor2.run(BACKWARD); 
  }

void Forward() {
  motor1.setSpeed(255); 
  motor1.run(FORWARD);
  motor2.setSpeed(255); 
  motor2.run(FORWARD); 
}

void setup(){
  pinMode(trigPin, OUTPUT);         
  pinMode(echoPin, INPUT);          
  }

void loop(){
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);   
  digitalWrite(trigPin, HIGH);     // send waves for 10 us
  delayMicroseconds(10);
  duration = pulseIn(echoPin, HIGH); // receive reflected waves
  distance = (duration/2)*0.034  ;// convert to distance in cm
  delay(10);
  if (distance > 20) {
   Forward();
 }        
  if (distance <= 20) {
  Right();
  delay(200);
  Forward();}}

				
			

سيارة تتبع المسار

في بعض التطبيقات قد نحتاج لجعل السيارة تسير في مسار محدد ومن أحد الأساليب لتحقيق ذلك وضع خط وجعل السيارة تتبع هذا الخط . يمكن استخدام حساس الأشعة تحت الحمراء IR حيث يقوم الحساس بإطلاق ضوء على الاسطح وينتظر انعكاس الضوء المطلق. في الأسطح المعتمة لن تتم عملية الانعكاس. لذا يمكننا تمييز كل من الأسطح الساطعة والمعتمة حسب حدوث انعكاس الضوء من عدمه.

تعتمد الفكرة على وضع حساسين IR في الجزء السفلي من السيارة وفي المسار يتم وضع خط بلون أسود بحيث يكون الخط في المنتصف بين الحساسين. وبما أن الخط في المنتصف اذا كلا الحساسين سيكون فوق السطح الساطع لذا تتجه السيارة للأمام. لكن في حالة كان أحد احساسات فوق الخط الأسود سيتم تعديل حركة السيارة لليمين أو اليسار حسب جهة الحساس لتتوافق مع المسار.

التوصيل

يوجد نوعين مشهورين من حساس الـ IR تعمل بنفس الطريقة لكن يكمن الأختلاف بأن النوع الأول (على اليسار في الصورة) مخصص للأستخدامات العامة بينما يتخصص الثاني في تطبيقات السيارات حيث ان المرسل والمستقبل الخاصين بالحساس يتم تثبيتهم اسفل الحساس لتسهيل التثبيت على الهيكل. على العموم يمكن استخدام كلا الحساسين. في هذا الدرس سيتم استخدام النوع الثاني. يتم توصيل الحساس الأول بالمنفذ A0 والثاني بـ A1.

تمرين 3:

عندما يميل المسار ويكون الحساس الأيسر على الخط الأسود يرسل الحساس قيمة 1 مما يعني أن السيارة  على وشك الخروج من المسار في اتجاه اليمين لذا يتم تعديل الإتجاه بتوجيهها نحو اليسار. نفس الحالة تتبع مع الحساس الأيمن إذا ما أعطى القيمة 1.

الكود

				
					#include <AFMotor.h>
#define left A0 //left sensor
#define right A1 //right sensor

AF_DCMotor motor1(1); //left motor
AF_DCMotor motor2(2);  //right motor

void Forward(){
    motor1.run(FORWARD);
    motor1.setSpeed(250);
    motor2.run(FORWARD);
    motor2.setSpeed(250);}

void Right(){
    motor1.run(FORWARD);
    motor1.setSpeed(250);
    motor2.run(RELEASE);
    motor2.setSpeed(0)}

void Left(){
    motor1.run(RELEASE);
    motor1.setSpeed(0);
    motor2.run(FORWARD);
    motor2.setSpeed(250);}

void Stop(){
    motor1.run(RELEASE);
    motor1.setSpeed(0);
    motor2.run(RELEASE);
    motor2.setSpeed(0);}

void setup() {
  pinMode(left,INPUT);
  pinMode(right,INPUT);
}
void loop(){
  if(digitalRead(left)==0 && digitalRead(right)==0)
    {Forward();}
  else if(digitalRead(left)==1 && analogRead(right)==0)
    {Left();}
  else if(digitalRead(left)==0 && digitalRead(right)==1)
    {Right();}
  else if(digitalRead(left)==1 && digitalRead(right)==1)
    {Stop();}}
				
			

انتقل إلى المتجر

هيكل سيارة عجلتين

55.00 ر.س
شاهد المثال

درع متحكم المحركات L293D

20.00 ر.س

اردوينو اونو | ARDUINO UNO

70.00 ر.س

حزمة أسلاك متنوعة

20.00 ر.س
انتقال إلى الأعلى