بسم الله الرحمن الرحيم ..
كثيراً من الأعضاء قد ناقش أو أراد بعض نماذج من الأفكار لأعمال المشاريع الروبوتيكس 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
تحياتي للجميع ..