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

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

Majd.S
:: مهندس ::
تاريخ التسجيل: Mar 2014
الدولة: YEMEN
المشاركات: 5
نشاط [ Majd.S ]
قوة السمعة:0
قديم 03-03-2014, 02:01 PM المشاركة 1   
افتراضي Drive Motors with ARDUINO Twitter FaceBook Google+



بسم الله الرحمن الرحيم ..

كثيراً من الأعضاء قد ناقش أو أراد بعض نماذج من الأفكار لأعمال المشاريع الروبوتيكس Robotics .. أي كيفية التحكم بالموتورات أو ال Stepper Motors أو Servo Motors وجعلها تتحرك وفق نمط معين تحت نظام تحكمي يستقبل مدخلاته اما عبر المتحسسات كما هو معروف أو مايسمى ب JoyStick, أي أن المستخدم هو اللذي يقوم بعمل النمط الحركي لهذا الروبوت .. وهنا في هذا الموضوع, قد سنحت لي الفرصه لأجلس قليلا مع أدواتي وقمت بعمل محاكاه حتى يتم دراستها وتطويرها وبل تطبيقها عملياً بقدر المستطاع ..


تمثل المحاكاه هنا روبوت بسيط ذو عجلتين يقوم المتحكم بتحديد الأتجاهات عبر الضغط على أزرار معينه BushButtons , وهناك أربعة إتجاهات وهي كالتالي :

عند النقر على زر A يتحرك الروبوت الى الأمام
عند النقر على زر B يتحرك الروبوت الى الخلف
عند النقر على زر C يتحرك الروبوت الى اليسار
عند النقر على زر D يتحرك الروبوت الى اليمين
وعند عدم النقر على أي زر لا يتحرك الروبوت " وهو الأمر المنطقي :mrgreen: :eh: "

وال ARDUINO سيتيح لي إمكانيه التحكم بالموتورات التي ستتمثل بعجلات الروبوت.
قمت هنا بإستخدام IC معين لتحريك الموتورات وهي L293D وهي مشهوره وإستخدامها سهل جدا , طبعا اذا كنت تمتلك موتورات ذو قوه ال 5V فأنت لست بحاجه الى هذه ال IC , ولكن يفضل إستخدامها حتى تستطيع تزويد الموتورات بمصدر طاقه خارجي اكبر من 5V ولا تعتمد على مصدر ال ARDUINO المحدود ب 5V & 3.3V ..

نبذه عن L293D IC ..


ببساطه وبإختصار, وضيفه هذه ال IC هي التحكم بحركه الموتور أما بإتجاه عقارب الساعه او عكس عقارب الساعه عبر منفذين أثنين لكل موتور وهما IN1 & IN2 وهناك أيضا منفذ للسماح بهذين المنفذين بالعمل وهو EN1 أي إختصارا لكلمه Enable 1 ..
مثلا أذا أردنا تحريك الموتور الأول بإتجاه عقارب الساعه فكل ماسنحتاجه هو تفعيل المنفذ EN1 اي بإرسال أشاره تماثليه Logic High , و إرسال أما إشاره تماثليه Logic High أو PWM الى IN1 و Logic Low الى IN2 .. والعكس صحيح .. أي اذا أردنا تحريكه في الإتجاه المعاكس أو عكس عقارب الساعه فيجب إرسال إشاره Logic Low الى IN1 و Logic High الى IN2 مع إبقاء المنفذ EN1 مفعل أو Logic High كما ذكرنا..

ونفس الطريقه لتحريك الموتور الثاني .. نقوم بتفعيل المنفذ الرئيسي وهو المسمى ب EN2 ومن ثم التحكم بإتجاه حركه الموتور بواسطه المنافذ IN3 & IN4 بنفس الطريقه التي ذكرناها في الأعلى ..
طبعا IC L293D لها القدره على التحكم بموتورين فقط في أنٍ واحد .. وإذا كان المشروع يتضمن أكثر من موتور فنستطيع إستخدام أكثر منIC L293D ..

طريقه ربط الموتورات بهذا ال IC بسيطه وهي كالتالي :



وهذه هي الدائره بواسطه برنامج البروتوس Protues ISIS ..




وهذا هو الكود البرمجي

كود:
#define EN1 2     // enable pin of L293D is connected to digital pin 2
#define EN2 4     // enable pin of L293D is connected to digital pin 4
#define IN1 3     // Output from ARDUINO to control the Motor_1, if IN1 +ve & IN2 -ve then the rotation is CW
#define IN2 5     // CW, if IN1 -ve & IN2 +ve then the rotation is CCW.
#define IN3 9     // Same as IN1 and IN2, IN3 and IN4 to control Motor_2
#define IN4 11
#define FWD  13    // Farward Button
#define REVS 12    // Reverse Button
#define LEFT  7    // Left Button
#define RIGHT 6    // Right Button


void setup() { 
  pinMode(EN1,OUTPUT);      // All control pins of the motor ae defined as Output.
  pinMode(EN2,OUTPUT);
  pinMode(IN1,OUTPUT);
  pinMode(IN2,OUTPUT);
  pinMode(IN3,OUTPUT);
  pinMode(IN4,OUTPUT);
  
  pinMode(FWD,  INPUT);     // The bush buttons are defined as Input.
  pinMode(REVS, INPUT);
  pinMode(LEFT, INPUT);
  pinMode(RIGHT,INPUT);
  
  //Serial.begin(9600);      // Used for monitoring, will be shown latter.
}

void loop() {
 if (digitalRead(FWD)) { 
  digitalWrite(EN1,HIGH);      // To enable Motor_1 
  digitalWrite(EN2,HIGH);      // To enable Motor_2  
  analogWrite(IN1,255); // this function is to use the PWM instead of applying only Constant logic High
  digitalWrite(IN2,LOW); // The value can be changed as required from 0 as Logic 0 to 255 as High
  analogWrite(IN3,255);   // Moving the Motor_2 in CW direction with Motor_1
  digitalWrite(IN4,LOW);
 }
 else if (digitalRead(REVS)) { 
   digitalWrite(EN1,HIGH);    // Moving both motors in the CCW diection 
   digitalWrite(EN2,HIGH);
   analogWrite(IN1,0);
   analogWrite(IN2,255);
   analogWrite(IN3,0);
   analogWrite(IN4,255);
 }
 else if (digitalRead(LEFT)) { 
   digitalWrite(EN1,LOW);    // To move the robot in LEFT direction the right motor shuld run and the 
   digitalWrite(EN2,HIGH);   // other shuld be off or disabled 
   analogWrite(IN1,0);
   analogWrite(IN2,0);
   analogWrite(IN3,255);
   analogWrite(IN4,0);
 }
 else if (digitalRead(RIGHT)) { 
   digitalWrite(EN1,HIGH);
   digitalWrite(EN2,LOW);
   analogWrite(IN1,255);
   analogWrite(IN2,0);
   analogWrite(IN3,0);
   analogWrite(IN4,0);
 }
 
 else { 
   digitalWrite(EN1,LOW);    // If no button bushed the whole robot is in stop position.
   digitalWrite(EN2,LOW);
   analogWrite(IN1,0);
   analogWrite(IN2,0);
   analogWrite(IN3,0);
   analogWrite(IN4,0);
 }

}
أكتفي بهذا القدر لهذا الوقت
وسأترك المجال لإنتقادر وافكار حول تطوير هذا المشروع البسيط .. حيث يحتوي على بعض العيوب التي يجب أن تدرس وتناقش هنا ومعالجتها أما برمجيا "وهو المستحسن" أو بتغير أو أضافه عناصر الى الدائره ..

لي عوده ...

هنا مرفقات المشروع ..
أستخدمت برنامج ال Protues ISIS 7.10 وبيئة ARDUINO IDE 1.0.5
تحياتي للجميع ..

اعلانات

Majd.S
:: مهندس ::
تاريخ التسجيل: Mar 2014
الدولة: YEMEN
المشاركات: 5
نشاط [ Majd.S ]
قوة السمعة:0
قديم 03-03-2014, 02:06 PM المشاركة 2   
افتراضي


أرجو من الإداره الفاضله السماح لي بتعديل مشاركتي حيث أن الصور لم تظهر بعد إعتماد الموضوع ولكن كانت تظهر أثناء المعاينة ..
وشكرا ..

تحياتي للجميع ..

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

Majd.S
:: مهندس ::
تاريخ التسجيل: Mar 2014
الدولة: YEMEN
المشاركات: 5
نشاط [ Majd.S ]
قوة السمعة:0
قديم 06-03-2014, 01:24 PM المشاركة 3   
افتراضي


عوده للموضوع السابق .. لقد قمت بعمل بعض التعديلات على هذا المشروع .. حيث أن من عيوب هذا الروبوت حاليا هو أليه التحكم به والتي هي يدوية أو Manual Controlled بواسطة زرائر التحكم الموجوده في الرسمه السابقه .. والتي تعني أن المتحكم يجب أن يتحرك مع الروبوت اينما ذهب "لأن الروبوت موصول مع زرائر التحكم بواسطه الأسلاك" .. ولكي نقوم بالتخلص من هذه المعضله البسيطه , سنقوم بالتحكم بالروبوت بواسطه اللاسلكي .. أي أننا سنقوم بربط الزرائر بموديول أخر يقوم بتحويل النقرات على هذه الزرائر الى أوامر ترسل عبر الأثير لاسلكيا .. وفي حالتي هذه .. الموديول المستخدم هو من نوع Xbee Series 1 mW dB واللذي ببساطه يقوم بإستقبال الإشارات وتحويلها الى بيانات ترسل للأردوينو عبر منفذ السيريال المعروف UART .. وأيضا يقوم بإرسال البيانات من الأردوينو الى الأثير بنفس الطريقه ..
ولمزيد من المعلومات حلو كيفيه إرسال البيانات تواليا أو Serially من وإلى الأردوينو , كل ماعليك هو قرائه ملفات المساعده التي تدعمها بيئه الأردوينو ..Arduino IDE Help ..

قمت بتعديل الدائره قليلا .. وأيضا الكود البرمجي وهما بالمرفقات ..




وهذه هي مرفقات المشروع http://ecstudents.com/forum/download...de=view&id=498



لكي أحاكي عملية نقل البيانات ألى الأردوينو , قمت بإدراج محاكي مراسل البيانات واللذي يدعى Virtual Terminal ..



كود:
#define EN1 2     // enable pin of L293D is connected to digital pin 2
#define EN2 4     // enable pin of L293D is connected to digital pin 4
#define IN1 3     // Output from ARDUINO to control the Motor_1, if IN1 +ve & IN2 -ve then the rotation is CW
#define IN2 5     // CW, if IN1 -ve & IN2 +ve then the rotation is CCW.
#define IN3 9     // Same as IN1 and IN2, IN3 and IN4 to control Motor_2
#define IN4 11
//#define FWD  13    // Farward Button
//#define REVS 12    // Reverse Button
//#define LEFT  7    // Left Button
//#define RIGHT 6    // Right Button


void setup() { 
  pinMode(EN1,OUTPUT);      // All control pins of the motor ae defined as Output.
  pinMode(EN2,OUTPUT);
  pinMode(IN1,OUTPUT);
  pinMode(IN2,OUTPUT);
  pinMode(IN3,OUTPUT);
  pinMode(IN4,OUTPUT);
  
  //pinMode(FWD,  INPUT);     // The bush buttons are defined as Input.
  //pinMode(REVS, INPUT);
  //pinMode(LEFT, INPUT);
  //pinMode(RIGHT,INPUT);
  
  Serial.begin(9600);      // Used for monitoring, will be shown latter.
}

void loop() {
 if (Serial.read() == 'W' || Serial.read() == 'w') { 
  Serial.print("\n FARWARD ");
  digitalWrite(EN1,HIGH);      // To enable Motor_1 
  digitalWrite(EN2,HIGH);      // To enable Motor_2  
  analogWrite(IN1,255); // this function is to use the PWM instead of applying only Constant logic High
  digitalWrite(IN2,LOW); // The value can be changed as required from 0 as Logic 0 to 255 as High
  analogWrite(IN3,255);   // Moving the Motor_2 in CW direction with Motor_1
  digitalWrite(IN4,LOW);
  delay(500);
  
 }
 else if (Serial.read() == 'S' || Serial.read() == 's') {
   Serial.print(" REVERS \n"); 
   digitalWrite(EN1,HIGH);    // Moving both motors in the CCW diection 
   digitalWrite(EN2,HIGH);
   analogWrite(IN1,0);
   analogWrite(IN2,255);
   analogWrite(IN3,0);
   analogWrite(IN4,255);
   delay(500);
 }
 else if (Serial.read() == 'A' || Serial.read() == 'a') { 
   Serial.print(" LEFT \n");
   digitalWrite(EN1,LOW);    // To move the robot in LEFT direction the right motor shuld run and the 
   digitalWrite(EN2,HIGH);   // other shuld be off or disabled 
   analogWrite(IN1,0);
   analogWrite(IN2,0);
   analogWrite(IN3,255);
   analogWrite(IN4,0);
   delay(500);
 }
 else if (Serial.read() == 'D' || Serial.read() == 'd') { 
   Serial.print(" RIGHT \n");
   digitalWrite(EN1,HIGH);
   digitalWrite(EN2,LOW);
   analogWrite(IN1,255);
   analogWrite(IN2,0);
   analogWrite(IN3,0);
   analogWrite(IN4,0);
   delay(500);
 }
   
 else {
   digitalWrite(EN1,LOW);    // If no button bushed the whole robot is in stop position.
   digitalWrite(EN2,LOW);
   analogWrite(IN1,0);
   analogWrite(IN2,0);
   analogWrite(IN3,0);
   analogWrite(IN4,0);
   delay(500);
  
 }

}
أرجوا التجربه .. وأنا مستعد لمزيد من النقاش حول تطوير وتحسين هذا الروبوت المتواضع .. :mrgreen:

تحياتي للجميع ..


Majd.S
:: مهندس ::
تاريخ التسجيل: Mar 2014
الدولة: YEMEN
المشاركات: 5
نشاط [ Majd.S ]
قوة السمعة:0
قديم 08-03-2014, 03:38 PM المشاركة 4   
افتراضي


السلام عليكم ..

أخيراً أستكملت عملية تجميع و بناء الروبوت بالرغم من نقص بعض القطع المطلوبه خصوصا المتعلقه بالتحكم بالموتورات .. لأن ال IC L293D تقريبا غير موجود " في عدن تقريبا" , وكل ما أذهب الى المحل المحترم يقول لي دي Integrated Circuit واقول له نعم هي كذلك .. وبعد !! :wtf:

على العموم لقد بنيت الروبوت مبدئيا ليتحرك الى الأمام والخلف .. والتحكم به من خلال Xbee Series 1 وهي مودويولز تقوم بترجمه الأوامر وإرسالها تواليا Serially كما أسلفنا في السابق ..

والروبوت المستخدم في مشروعي يحتوي على 4 Geared DC Motors .. وبسبب نقص بعض الموارد لدي "والتي في طور قدومها في القريب إن شاء الله" أستخدمت Motor Driver module واللذي يستطيع تحريك موتور واحد فقط .. لذلك قمت بربط جميع الموتورات بهذا الموديول حتى تتحرك سويا .. وحالما تتوفر لدي القطع سأقوم بتعديل هذه الجزئيه ..




هذا الكود وفيه بعض التعديلات عن الكود المستخدم في المحاكاه ..

كود:
char Byt , Msg[] = (" \n  Waiting Commands...");
void setup() { 
  Serial.begin(9600);
  
  pinMode(7,OUTPUT);
  pinMode(3,OUTPUT);
  pinMode(13,OUTPUT);
  Serial.write(Msg);
  delay(1000);
}

void Stop(void) {
       //digitalWrite(2,LOW);
       digitalWrite(3,LOW);
       
       delay(100);}
       
       
void loop() {Byt = '0';
 if (Serial.available() > 0){
   Byt = Serial.read();
    if(Byt == 'S' || Byt == 's') {
      analogWrite(3,120);
      digitalWrite(7,HIGH);
     
     Serial.write("  Reverse Move");
     delay(1000);
     Stop();
      
    }
    else if(Byt == 'W' || Byt == 'w') {
      
      analogWrite(3,120);
      digitalWrite(7w,LOW);
      Serial.write("  Forward Move");
     delay(1000);
     Stop();
      
  }
  else {Stop();
        digitalWrite(13,HIGH);
       Serial.write("  StOOOOOOOOOP");
   }
}
}
التعديلات هنا هي أني استخدمت ال PWM بدلا من إستخدام الإشاره الثابته والممثله ب HIGH = 5V .. وهذا لأني أريد التحكم بسرعه دوران الموتور .. وهنا أستخدمت PWM = 120 حيث أن ال PWM =255 هي أعلى قيمه وتماثل ال 5V تقريبا .. أي أنني استخدمت تقريبا نصف القيمه العليا ..

وهناك أيضا بعض الرسائل التي يقوم الأردوينو المتحكم بالموتور إرسالها الى جهاز الكمبيوتر لكي اتأكد من أن عمليه الإرسال والإستقبال قد تمت بنجاح .. بمعنى أنه عندما أقوم بالنقر على زر W or w ويصل هذا الأمر الى الأردوينو فأنه يقوم بإرسال رد الى الكمبيوتر بأنه أستلم الأمر ويقوم بتنفيذ هذا الأمر تبعا ..

وهذه صوره الروبوت


وهذا عرض للتجربه ..
http://www.youtube.com/watch?v=DUJb1...ature=youtu.be

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

تحياتي للجميع ..


bufahad
:: مهندس ::
تاريخ التسجيل: Feb 2009
الدولة: الكويت
المشاركات: 15
نشاط [ bufahad ]
قوة السمعة:0
قديم 02-06-2014, 10:49 PM المشاركة 5   
افتراضي


جزاك الله خير على شرحك


الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,688
نشاط [ حسن هادي محمود ]
قوة السمعة:135
قديم 03-06-2014, 12:52 PM المشاركة 6   
افتراضي


السلام عليكم ..

أخيراً أستكملت عملية تجميع و بناء الروبوت بالرغم من نقص بعض القطع المطلوبه خصوصا المتعلقه بالتحكم بالموتورات .. لأن ال IC L293D تقريبا غير موجود " في عدن تقريبا" , وكل ما أذهب الى المحل المحترم يقول لي دي Integrated Circuit واقول له نعم هي كذلك .. وبعد !! :wtf:

على العموم لقد بنيت الروبوت مبدئيا ليتحرك الى الأمام والخلف .. والتحكم به من خلال Xbee Series 1 وهي مودويولز تقوم بترجمه الأوامر وإرسالها تواليا Serially كما أسلفنا في السابق ..

والروبوت المستخدم في مشروعي يحتوي على 4 Geared DC Motors .. وبسبب نقص بعض الموارد لدي "والتي في طور قدومها في القريب إن شاء الله" أستخدمت Motor Driver module واللذي يستطيع تحريك موتور واحد فقط .. لذلك قمت بربط جميع الموتورات بهذا الموديول حتى تتحرك سويا .. وحالما تتوفر لدي القطع سأقوم بتعديل هذه الجزئيه ..




هذا الكود وفيه بعض التعديلات عن الكود المستخدم في المحاكاه ..

كود:
char Byt , Msg[] = (" \n  Waiting Commands...");
void setup() { 
  Serial.begin(9600);
  
  pinMode(7,OUTPUT);
  pinMode(3,OUTPUT);
  pinMode(13,OUTPUT);
  Serial.write(Msg);
  delay(1000);
}

void Stop(void) {
       //digitalWrite(2,LOW);
       digitalWrite(3,LOW);
       
       delay(100);}
       
       
void loop() {Byt = '0';
 if (Serial.available() > 0){
   Byt = Serial.read();
    if(Byt == 'S' || Byt == 's') {
      analogWrite(3,120);
      digitalWrite(7,HIGH);
     
     Serial.write("  Reverse Move");
     delay(1000);
     Stop();
      
    }
    else if(Byt == 'W' || Byt == 'w') {
      
      analogWrite(3,120);
      digitalWrite(7w,LOW);
      Serial.write("  Forward Move");
     delay(1000);
     Stop();
      
  }
  else {Stop();
        digitalWrite(13,HIGH);
       Serial.write("  StOOOOOOOOOP");
   }
}
}
التعديلات هنا هي أني استخدمت ال PWM بدلا من إستخدام الإشاره الثابته والممثله ب HIGH = 5V .. وهذا لأني أريد التحكم بسرعه دوران الموتور .. وهنا أستخدمت PWM = 120 حيث أن ال PWM =255 هي أعلى قيمه وتماثل ال 5V تقريبا .. أي أنني استخدمت تقريبا نصف القيمه العليا ..

وهناك أيضا بعض الرسائل التي يقوم الأردوينو المتحكم بالموتور إرسالها الى جهاز الكمبيوتر لكي اتأكد من أن عمليه الإرسال والإستقبال قد تمت بنجاح .. بمعنى أنه عندما أقوم بالنقر على زر W or w ويصل هذا الأمر الى الأردوينو فأنه يقوم بإرسال رد الى الكمبيوتر بأنه أستلم الأمر ويقوم بتنفيذ هذا الأمر تبعا ..

وهذه صوره الروبوت


وهذا عرض للتجربه ..
http://www.youtube.com/watch?v=DUJb1...ature=youtu.be

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

تحياتي للجميع ..
السلام عليكم
شرح ممتاز الف شكر لك

عندي سؤال كيف نصمم درايفر محرك سيرفو

تحياتي

إضافة رد

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

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

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


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

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