التحكم بالروبوت عبر الهاتف الذكي

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

bluetooth-controlled-robot-car

القطع المطلوبة:

الأدوات التي تحتاجها لهذا المشروع :

4WD Robot Chassis kit

L298 Motor driver

L298 H bridge Module

serial port bluetooth module hc-06

وحدة البلوتوث (HC-06)

battery holder

حامل البطارية

arduino uno r3

Arduino Uno R3

Jumper Wires Male/Male

 اسلاك توصيل ذكر/ذكر  (Jumper Wires Male Male)

Female-Male Jumper Wires

 اسلاك توصيل أنثى/ذكر (Jumper Wires Female/male)

 

ما هو الروبوت ؟

الروبوت هو جهاز كهروميكانيكي قادر على التفاعل بطرية أو بأخرى مع بيئته، و اتخاذ قرارات مستقلة أو إجراءات من أجل تحقيق مهنمة محددة.
يتكون الروبوت من العناصر التالية:
1- الهيكل.
2- المشغل الميكانيكي .
3- وحدة التحكم.
4-المدخلات/ الحساسات.
5- امدادات الطاقة.
في الخطوات التالية سنذكر كل عنصر من العناصر المذكورة اعلاه، بحث يمكن أن نفهمها بسهولة.

الهيكل (Structure / Chassis) :

smartphone-controlled-arduino-robot

يتألف الهيكل من المكونات الفزيائية. الروبوت يتكون من مكون او اكثر من المكونات الفزيائية التي تتحركة لتنفيذ مهام معينة. وفي حالتنا هيكل السيارة و العجلات تمثل هيكل الروبوت

المشغل الميكانيكي Actuator :

smartphone-controlled-arduino-robot

المحرك هو جهاز يقوم بتحويل الطاقة (في مجال الروبوت، تكون الطاقة الكهربائية) الى طاقة حركية. تنتج معظم المحركات إما الحركة الدورانية أو الخطية.
في حالتنا المحرك هو(DC Gear motor)  وهو بالاساس عبارة عن محرك  DC مركب مع علبة تروس (gear) تعمل على تقليل سرعة المحرك و زيادة عزم الدورات .

هيكل الروبوت 

قطع اربع قطع من أسلاك (الحمراء و السوداء) مع طول حوالي 5-6 انش. قم بتجريد السلك من العازل في كل نهاية , ثم قم بلحم الأسلاك على المحركات.

smartphone-controlled-arduino-robot

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

تركيب المحرك :

smartphone-controlled-arduino-robot

لاحظ أن الأسلاك على كل محرك تشير الى إتجاه مركز الهيكل.

smartphone-controlled-arduino-robot

قم بضم اثنان من الأسلاك الحمراء و اثنان من الاسلاك السوداء معا على كل جانب من جوانب الهيكل. بعد الانضمام, سيكون لديك اثنان من النهايات على الجانب الايمن و اثنان على الجانب الأيسر.

تثبيت السقف العلوي:

بعد تركيب الاربع محركات في الطابق السفلي، قم بتركيب السقف العلوي. ثم قم بسحب نهايات الاسلاك نحو السطح العلوي.

smartphone-controlled-arduino-robot

هناك حاجة إلى المتحكم (العقل) لتحريك الروبوت من مكان إلى أخر. المتحكم له القدرة على تنفيذ برنامج و يكون مسؤولا عن جميع العمليات الحسابية، واتخاذ القرارات، و الاتصال . في هذا المشروع سيتم استخدام متحكمArduino  كـوحدة تحكم.

يمكنك استخدام وحدة التحكم لدوران المحركات في إتجاه واحد. ولكن اذا كنت تريد أن تكون  قادر على التحكم في المحرك بإتجاهات مختلفة (الأمام ،الخلف، يمين، ويسار) مع لوحة التحكم, فإنك بحاجة إلى مزيد من الدوائر . انت بحاجة إلى H-Bridge.

 L298  H Bridge Module

smartphone-controlled-arduino-robot

H-Bridge، يقوم بتحريك محرك الـ DC بإتجاه الامام و الخلف. وهو يتكون من اربع مفاتيح الكترونية S1,S2,S3,S4  (Transistors / MOSFETS / IGBT).

smartphone-controlled-arduino-robot

الية العمل: انظر للصورة اعلاه لفهم ألية العمل للـ H-Bridge . المفاتيح في نفس الجهة إما (S1,S2) أو  (S3,S4)لا يتم إغلاقهم بنفس الوقت , سيتم حدوث ماس كهربائي .
H-bridge توفر لك دائرة متكاملة، أو يمكنك أن تقوم ببناء الدائرة بنفسك عن طريق إستخدام اربع Transistor او MOSFETs. في هذا المشروع سيتم استخدام  L298 H-bridge Module الذي يمكن من خلاله التحكم في سرعة واتجاه المحركات.

وصف مداخل و مخراج الـ L298H-bridge Module : 

smartphone-controlled-arduino-robot

توصيل الدائرة  

توصيل الدائرة

الخطوات لتوصيل الدائرة 

 

قم بتوصيل الأسلاك الحمراء للمحركين على كل جهة معا و الأسلاك السوداء معا.

smartphone-controlled-arduino-robot

MOTOR A هو المسؤول عن المحركات على الجانب الأيمن, وفي المقابل يتم ربط المحركات على الجانب الايسر للـ MOTOR B.

اتبع التعليمات التالية ليتم توصيل كل شي :

smartphone-controlled-arduino-robot
يمكنك العودة لمشروع نظام التحكم في الإضاءة عبر البلوتوث للإطلاع على الشرح المتعلق بوحدة البلوتوث .

برمجة الأردوينو

في الكود البرمجي سنقوم بمراجعة البيانات الواردة وتنفيذ عملية المقارنة ، اذا كانت البيانات المستقبلة من الهاتف الذكي F يتم تحريك الروبوت للأمام و إذا كانت B يتم تحريكه للخلف و اذا كانت R  يتم تغير حركة لليمين و L  للتحرك لليسار. ويتم إيقافة إذا كانت البيانات المستقبلة 0 .

قم برفع البرنامج التالي إلى متحكم الأردوينو:

char data = 0;            //Variable for storing received data
#define right1 7 //IN1
#define right2 8
#define rightE 9
#define left1 6
#define left2 5
#define leftE 10

void Forward(); 
void Backward(); 
void Left(); 
void Right(); 
void Stop1(); 

void setup()
{
   Serial.begin(9600);   //Sets the baud for serial data transmission                               
   pinMode(left1, OUTPUT); 
   pinMode(left2, OUTPUT); 
   pinMode(leftE, OUTPUT); 
   pinMode(right1, OUTPUT);
   pinMode(right2, OUTPUT);
   pinMode(rightE, OUTPUT);
   delay(1000);
}
void loop()
{
   if(Serial.available() > 0)      
   {
     data = Serial.read();        //Read the incoming data & store into data    
      switch (data){
        case 'F':
            Forward();
            break; 
        case 'B':
            Backward();
            break; 
        case 'L':
           Left();           
           break; 
        case 'R':
           Right(); 
           break; 
        case '0':
           Stop1();
           break; 
      }
  } 
}
void Forward(){
  digitalWrite(right1,1); 
  digitalWrite(right2,0); 
  analogWrite(rightE, 255);      
  digitalWrite(left1,1); 
  digitalWrite(left2,0); 
  analogWrite(leftE, 255);                                                                                                                                                                                                                                                        
}
void Backward(){
  digitalWrite(right1,0); 
  digitalWrite(right2,1); 
  analogWrite(rightE, 255); 
  digitalWrite(left1,0); 
  digitalWrite(left2,1); 
  analogWrite(leftE, 255); 
}
void Left(){
  digitalWrite(right1,1); 
  digitalWrite(right2,0); 
  analogWrite(rightE, 255); 
  digitalWrite(left1,0); 
  digitalWrite(left2,1); 
  analogWrite(leftE, 255); 
  
}
void Right(){
  digitalWrite(right1,0); 
  digitalWrite(right2,1); 
  analogWrite(rightE, 255); 
  digitalWrite(left1,1); 
  digitalWrite(left2,0); 
  analogWrite(leftE, 255); 
}
void Stop1(){
  digitalWrite(left1,0); 
  digitalWrite(left2,0); 
  analogWrite(leftE, 0); 
  digitalWrite(right1,0); 
  digitalWrite(right2,0); 
  analogWrite(rightE, 0); 
}

 شرح الكود :

أولا لفعم الية العمل قم بالاطلاع على الجدول التالي. هو مفيد جدا أثناء كتابة التعليمات البرمجي :

smartphone-controlled-arduino-robot

في قسم الـ Loop يتم قراءة البيانات التي تم إرسالها من قبل الهاتف الذكي ثم يتم التحقق منها. فمثلا إذا كانت حرف “F” يتم إستدعاء الدالة Forward()ليتم تحريك الروبوت إلى الأمام ،وإذا كات حرف “B” يتم إستدعاء الدالة backward() ليتم تحريك الروبوت للخلف.

data = Serial.read();        //Read the incoming data & store into data    
      switch (data){
        case 'F':
            Forward();
            break; 
        case 'B':
            Backward();
            break; 
        case 'L':
           Left();           
           break; 
        case 'R':
           Right(); 
           break; 
        case '0':
           Stop1();
           break; 
      }

نقوم بإنشاء الدالة Forward() , Backward() , Right(),Left() لتحكم في إتجاهات الروبوت.
و الدالة Stop1() لإيقاف حركة الروبوت

void Stop1(){
  digitalWrite(left1,0); 
  digitalWrite(left2,0); 
  analogWrite(leftE, 0); 
  digitalWrite(right1,0); 
  digitalWrite(right2,0); 
  analogWrite(rightE, 0); 
}

تطبيق الاندرويد

في هذا المشروع لن يتم تغطية طريقة برمجة تطبيق الاندرويد , يمكنك تحميل البرنامج من هنا

كيف يمكن استخدام التطبيق؟
1- قم بتنزيل البرنامج من هنا
2- قم بإقتران جهازك مع البلوتوث   HC-06:
– تشغيل البلوتوث HC-06.
– تفحص الجهاز المتوفر .
-يتم الاقتران الى البلوتوث عن طريق ادخال كلمة المرور الافتراضية  1234 او   0000.
3- قم بفتح التطبيق , ثم قم بالضغط على زر الاجهزة المقترنة  ثم قم بإختيار وحدة البلوتوث الخاصة بك (HC-06) .

smartphone-controlled-arduino-robot

قم بالضغط على الأسهم لتغير حركة الروبوت و على زر Stop لإيقاف الحركة .

smartphone-controlled-arduino-robot



التحكم في محرك التيار المستمر بإستخدام L298

في هذا المشروع، سنتعلم فكرة عمل الدارة المتكاملة L298. ونتعرف على كيفية استعمالها للتحكم في تشغيل وإيقاف محرك التيار المستمر، وعكس اتجاه حركته. تستخدم هذه في مشاريع الروبوت مثل، متتبع المسار.

التحكم-فى-محرك-تيار-مستمر-باستخدام-l298

المكونات المطلوبة

arduino uno r3

Arduino Uno

L298 Motor driver

L298 Motor Driver

9V DC Motor

DC Motor

9VDC 1000mA regulated switching power adapter

DC Power Supply

Full size breadboard 830

Breadboard

Breadboard Jumper Wire 65 pcs

Wires

H-Bridge :

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

فكرة عمله :

الصورة التالية توضح كيف يتركب الـ H-Bridge:

hbridge-arduino

عند تشغيل كلا الترانزستور 1 و 4 يعمل المحرك نحو الإتجاه الأول وعند تشغيل الترانزستور 2 و 3 يعمل المحرك في الإتجاه المعاكس للإتجاه السابق.

وبذلك، يتم عكس الدوران اتوماتيكيا دون الحاجة إلى تغيير التوصيل يدويا. على عكس محرك التيار المستمر، الذي يتم تعكس اتجاهه عن طريق عكس اطراف المحرك مع مصدر التيار الكهربائي.

التحكم-فى-اتجاه-دوران-محرك-تيار-مستمر-ب
التحكم-فى-اتجاه-دوران-محرك-تيار-مستمر-ب

في الحالة الأولى، سيدور المحرك مع إتجاه عقارب الساعة. وبعكس توصيل الأطراف (كما هو موضح بالحالة الثانية) سينعكس إتجاه الدوران ليصبح عكس عقارب الساعة.

L298 Motor Driver

هو عبارة عن H-Bridge تم تجميعها ووضعها معا في IC ، ليتم استخدامها بسهولة.  يمكن إستخدام واحد من IC للتحكم في محركين في نفس الوقت. لكل محرك مخرج خاص به وأطراف تحكم خاصة.

l298-motor-driver

الاطراف المستخدمة

Output A طرفى المحرك
VCC طرف البطارية الموجب
5v 5v فى الاردوينو
GND gnd فى الاردوينو
IN1 12 فى الاردوينو
IN2 13 فى الاردوينو

شرح الدارة

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

قم بتوصيل الدارة كما هو موضح بالصورة :

التحكم-فى-محرك-تيار-مستمر-باستخدام-l298

 

ولنتمكن من تشغيل المحرك في إتجاهين، يتم تشغيل الطرف الأول من الـ L298 للأردوينو في المحرك، فيدور المحرك في الإتجاه الأول. وعند تشغيل الطرف الثاني سيدور بالإتجاه المعاكس.

 

التحكم-فى-محرك-تيار-مستمر-باستخدام-l298

الكود البرمجي :

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

قم بتحميل الكود التالي إلى الأردوينو :

#define MOTOR_IN1 12
#define MOTOR_IN2 13  

void motor_forward(void);  // a function that will be called to rotate it clockwise
void motor_reverse(void);  // a function that will be called to totate it counter-clockwise
void motor_stop(void);     // a function that will be called to stop the rotation

void setup() {
  pinMode(MOTOR_IN1, OUTPUT);  // set the first pin of the relay as output
  pinMode(MOTOR_IN2, OUTPUT);  // set the 2nd pin of the relay as output
}

void loop() {
  motor_forward();             // move forward/clockwise
  delay(3000);                 // keep rotating cw for 3 seconds
  motor_stop();                // stop rotating
  delay(3000);                 // stand still for 3 seconds
  motor_reverse();             // reverse the rotation direction/ccw
  delay(3000);                 // keep rotating ccw for 3 seconds
  motor_stop();                // stop rotating
  delay(3000);                 // stand still for 3 seconds
}

void motor_forward(void)       // the function that will cause the motor to rotate cw
{
  digitalWrite(MOTOR_IN1, HIGH);
  digitalWrite(MOTOR_IN2, LOW);
}

void motor_reverse(void)       // the function that will cause the motor to rotate ccw
{
  digitalWrite(MOTOR_IN1, LOW);
  digitalWrite(MOTOR_IN2, HIGH);
}

void motor_stop(void)          // the function that will cause the motor to stop rotating
{
  digitalWrite(MOTOR_IN1, LOW);
  digitalWrite(MOTOR_IN2, LOW);
}

 شرح الكود :

قمنا سابقا بتوصيل طرفى كلا من الترانزستور (IN1,IN2) بمنفذ 12 و 13 للأردوينو . لذلك قمنا بتسمية كلا المنفذين للأردونو تبعا لما تم توصيله بالدارة.

نقوم بتعرف المتغيرات IN1 و IN2 ( أطراف الـ H-bridge الموصله بالاردوينو) كمخرج.

void setup() {
  pinMode(MOTOR_IN1, OUTPUT);  // set the first pin of the relay as output
  pinMode(MOTOR_IN2, OUTPUT);  // set the 2nd pin of the relay as output
}

في دالة ()loop، نقوم أولا بإستدعاء الدالة ()motor_forward . تقوم هذه الدالة بتشغيل المحرك مع اتجاه عقارب الساعة لمدة 3 ثوان ((delay(3000) . ثم نقوم باستخدام الدالة ()motor_stop ، لإيقاف المحرك عن العمل لمدة 3 ثوان. ثم يتم عكس اتجاه حركة المحرك باستخدام الدالة ()motor_reverse لمدة 3 ثوان. ومن ثم يعود ليكرر نفس هذه المهمة من البداية مرة أخرى.

void loop() {
  motor_forward();             // move forward/clockwise
  delay(3000);                 // keep rotating cw for 3 seconds
  motor_stop();                // stop rotating
  delay(3000);                 // stand still for 3 seconds
  motor_reverse();             // reverse the rotation direction/ccw
  delay(3000);                 // keep rotating ccw for 3 seconds
  motor_stop();                // stop rotating
  delay(3000);                 // stand still for 3 seconds
}

الدلة ()motor_forward، تقوم بتحريك المحرك بإتجاه عقارب الساعة. تتم هذه العملية عن طريق جعل قيمة IN1 للمرحل HIGH والطرف الآخر LOW .

void motor_forward(void)       // the function that will cause the motor to rotate cw
{
  digitalWrite(MOTOR_IN1, HIGH);
  digitalWrite(MOTOR_IN2, LOW);
}

تعمل هذه الدالة ()motor_reverse بشكل مشابه للدالة السابقة، إلا أنها تعكس اتجاه دوران المحرك. تتم هذه العملية عن طريق جعل قيمة IN2 للمرحل HIGH، وIN1 قيمة LOW .

void motor_reverse(void)       // the function that will cause the motor to rotate ccw
{
  digitalWrite(MOTOR_IN1, LOW);
  digitalWrite(MOTOR_IN2, HIGH);
}

دالة ()motor_stop، تقوم بإيقاف المحرك تماما عن الحركة، عن طريق جعل قيمة كلا الطرفين LOW فلا يصل التيار للمحرك فيتوقف.

void motor_stop(void)          // the function that will cause the motor to stop rotating
{
  digitalWrite(MOTOR_IN1, LOW);
  digitalWrite(MOTOR_IN2, LOW);
}