تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects
منتديات الهندسة الكهربية والإلكترونية والميكاترونكس والكومبيوتر :: البرمجة بلغة ++C مع ++Microsoft Visual C :: منتدى الاردوينو Arduino
صفحة 3 من اصل 4
صفحة 3 من اصل 4 • 1, 2, 3, 4
رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects
الاردوينو والمحركات : DC motor ، Brushless DC Motor ، Servo Motor ، Stepper Motor
التحكم فى سرعة محرك تيار مستمر DC motor باستخدام الاردوينو ومقاومة متغيرة Potentiometer :
محرك التيار المستمر DC motor هو المحرك الأكثر استخدامًا في مشاريع الروبوتات والإلكترونيات. للتحكم في سرعة محرك التيار المستمر ، لدينا طرق مختلفة ، ولكن في هذا المشروع ، نتحكم في سرعة محرك التيار المستمر باستخدام تقتية تديل رض النبضة PWM. في هذا المشروع ، سنتمكن من التحكم في سرعة محرك التيار المستمر باستخدام مقاومة متغيرة ، ويمكننا ضبط السرعة عن طريق دوران مقبض المقاومة المتغيرة .
تعديل عرض النبضة PWM :
ما هو تعديل عرض النبضة ؟ هي تقنية باستخدامها يمكننا التحكم في الجهد أو القدرة . لفهم الأمر بشكل أكثر بساطة ، إذا كنت تستخدم 5 فولت لتشغيل محرك ، فسيتحرك المحرك بسرعة معينة ، والآن إذا قمنا بتخفيض الجهد المطبق بمقدار 2 يعني أننا نطبق 3 فولت على المحرك عندئذ تقل سرعة المحرك أيضًا. يستخدم هذا المفهوم في المشروع للتحكم في الجهد باستخدام PWM.
الآن إذا كان المفتاح في الشكل مغلقًا بشكل مستمر على مدار فترة زمنية ، فسيتم تشغيل ON المحرك بشكل مستمر خلال ذلك الوقت. إذا تم إغلاق المفتاح لمدة 8 مللي ثانية وفتح لمدة 2 مللي ثانية على مدار دورة 10 مللي ثانية ، فسيكون المحرك في وضع التشغيل فقط خلال 8 مللي ثانية. الآن ، الجهد المتوسط خلال فترة 10 مللي ثانية يساوى
وهذا ما يسمى دورة التشغيل duty cycle وهو 80% (8/ (8+2)) ، وبالتالي فإن متوسط جهد الخرج سيكون 80% من جهد البطارية. الآن ، لا يمكن للعين البشرية رؤية أن المحرك يعمل لمدة 8 مللي ثانية ، ثم لا يعمل لمدة 2 مللي ثانية ، لذلك سيبدو أن المحرك يدور بسرعة 80% .
في الحالة الثانية ، يتم إغلاق المفتاح لمدة 5 مللي ثانية ويفتح لمدة 5 مللي ثانية على مدار فترة 10 مللي ثانية ، وبالتالي فإن متوسط جهد الخرج سيكون 50% من جهد البطارية. إذا كان الجهد الكهربي للبطارية هو 5 فولت ودورة التشغيل 50% ، فإن متوسط الجهد الكهربي الطرفي سيكون 2.5 فولت.
في الحالة الثالثة ، تكون دورة التشغيل 20% ومتوسط الجهد الطرفي 20% من جهد البطارية.
الدائرة الكهربية :
البرنامج :
شرح البرنامج :
في الكود أعلاه ، يتم تهيئة المتغير c1 و c2 وتعيين الطرف التناظري A0 لخرج المقاومة المتغيرة و الطرف 12 لخرج PWM .
فى الدالة setup ، يتم تحديد الطرف A0 كدخل ، والطرف 12 كخرج :
الآن ، في الدالة loop ، نقرأ القيمة التناظرية (من A0) باستخدام analogRead(pot) ، ونحفظها في المتغير c2. ثم ، نطرح قيمة c2 من 1024 ونحفظ النتيجة في c1. ثم نجعل الطرف 12 الخاص بخرج PWM بالحالة المرتفعة HIGH ثم بعد تأخير بالقيمة c1 نجعل هذا الطرف LOW. مرة أخرى ، بعد تأخير بالقيمة c2 تستمر الحلقة.
سبب طرح قيمة التناظرية من 1024 ، هو أن المحول من تناظرى لرقمى فى الاردوينو بدقة 10 بت (وبالتالي فإن قيم الأعداد الصحيحة 0 - 2^10 = 1024 قيمة ). هذا يعني أنه سيتم توزيع جهود الدخل بين 0 و 5 فولت إلى قيم أعداد صحيحة بين 0 و 1024 . لذلك إذا ضربنا anlogValue فى (5/1024) ، نحصل على القيمة الرقمية لجهد الدخل .
شرح العمل:
في هذه الدائرة ، للتحكم في سرعة محرك التيار المستمر ، نستخدم مقاومة متغيرة 100 كيلو أوم لتغيير دورة التشغيل duty cycle لإشارة PWM. يتم توصيل المقاومة المتغيرة إلى طرف الدخل التناظرى A0 للاردوينو أونو ويتصل المحرك DC بالطرف 12 من الاردوينو (وهو طرف خرج PWM). عمل البرنامج بسيط للغاية ، لأنه يقرأ الجهد من الطرف التناظرى A0. الجهد التناظرى يتغير باستخدام المقاومة المتغيرة . بعد القيام ببعض الحسابات اللازمة ، يتم ضبط دورة التشغيل وفقًا لذلك.
على سبيل المثال ، إذا قمنا بإدخال جهد يناظر القيمة 256 إلى المدخل التناظرى ، فسيكون وقت التشغيل المرتفع HIGH time 768ms (1024-256) وسيكون وقت الفصل المنخفض LOW time مللي ثانية. لذلك ، فهذا يعني ببساطة أن دورة العمل هي 75% . لا تستطيع أعيننا رؤية مثل هذا التذبذب عالي التردد ويبدو أن المحرك يعمل ON باستمرار بقيمة 75% من السرعة. هكذا يمكننا التحكم في السرعة باستخدام المقاومة المتغيرة .
التحكم فى سرعة محرك تيار مستمر DC motor باستخدام الاردوينو ومقاومة متغيرة Potentiometer :
محرك التيار المستمر DC motor هو المحرك الأكثر استخدامًا في مشاريع الروبوتات والإلكترونيات. للتحكم في سرعة محرك التيار المستمر ، لدينا طرق مختلفة ، ولكن في هذا المشروع ، نتحكم في سرعة محرك التيار المستمر باستخدام تقتية تديل رض النبضة PWM. في هذا المشروع ، سنتمكن من التحكم في سرعة محرك التيار المستمر باستخدام مقاومة متغيرة ، ويمكننا ضبط السرعة عن طريق دوران مقبض المقاومة المتغيرة .
تعديل عرض النبضة PWM :
ما هو تعديل عرض النبضة ؟ هي تقنية باستخدامها يمكننا التحكم في الجهد أو القدرة . لفهم الأمر بشكل أكثر بساطة ، إذا كنت تستخدم 5 فولت لتشغيل محرك ، فسيتحرك المحرك بسرعة معينة ، والآن إذا قمنا بتخفيض الجهد المطبق بمقدار 2 يعني أننا نطبق 3 فولت على المحرك عندئذ تقل سرعة المحرك أيضًا. يستخدم هذا المفهوم في المشروع للتحكم في الجهد باستخدام PWM.
- الكود:
% Duty cycle = (TON/(TON + TOFF)) *100
Where, TON = HIGH time of the square wave
TOFF = LOW time of square wave
الآن إذا كان المفتاح في الشكل مغلقًا بشكل مستمر على مدار فترة زمنية ، فسيتم تشغيل ON المحرك بشكل مستمر خلال ذلك الوقت. إذا تم إغلاق المفتاح لمدة 8 مللي ثانية وفتح لمدة 2 مللي ثانية على مدار دورة 10 مللي ثانية ، فسيكون المحرك في وضع التشغيل فقط خلال 8 مللي ثانية. الآن ، الجهد المتوسط خلال فترة 10 مللي ثانية يساوى
- الكود:
Turn ON time/ (Turn ON time + Turn OFF time)
وهذا ما يسمى دورة التشغيل duty cycle وهو 80% (8/ (8+2)) ، وبالتالي فإن متوسط جهد الخرج سيكون 80% من جهد البطارية. الآن ، لا يمكن للعين البشرية رؤية أن المحرك يعمل لمدة 8 مللي ثانية ، ثم لا يعمل لمدة 2 مللي ثانية ، لذلك سيبدو أن المحرك يدور بسرعة 80% .
في الحالة الثانية ، يتم إغلاق المفتاح لمدة 5 مللي ثانية ويفتح لمدة 5 مللي ثانية على مدار فترة 10 مللي ثانية ، وبالتالي فإن متوسط جهد الخرج سيكون 50% من جهد البطارية. إذا كان الجهد الكهربي للبطارية هو 5 فولت ودورة التشغيل 50% ، فإن متوسط الجهد الكهربي الطرفي سيكون 2.5 فولت.
في الحالة الثالثة ، تكون دورة التشغيل 20% ومتوسط الجهد الطرفي 20% من جهد البطارية.
الدائرة الكهربية :
البرنامج :
- الكود:
int pwmPin = 12; // assigns pin 12 to variable pwm
int pot = A0; // assigns analog input A0 to variable pot
int c1 = 0; // declares variable c1
int c2 = 0; // declares variable c2
void setup() // setup loop
{
pinMode(pwmPin, OUTPUT);
pinMode(pot, INPUT);
}
void loop()
{
c2= analogRead(pot);
c1= 1024-c2; // subtracts c2 from 1000 ans saves the result in c1
digitalWrite(pwmPin, HIGH); //ON
delayMicroseconds(c1);//ON Time
digitalWrite(pwmPin, LOW); //OFF
delayMicroseconds(c2); //OFF Time
}
شرح البرنامج :
في الكود أعلاه ، يتم تهيئة المتغير c1 و c2 وتعيين الطرف التناظري A0 لخرج المقاومة المتغيرة و الطرف 12 لخرج PWM .
- الكود:
int pwmPin = 12;
int pot = A0;
int c1 = 0;
int c2 = 0;
فى الدالة setup ، يتم تحديد الطرف A0 كدخل ، والطرف 12 كخرج :
- الكود:
void setup() {
pinMode(pwmPin, OUTPUT); // declares pin 12 as output
pinMode(pot, INPUT); // declares pin A0 as input
}
الآن ، في الدالة loop ، نقرأ القيمة التناظرية (من A0) باستخدام analogRead(pot) ، ونحفظها في المتغير c2. ثم ، نطرح قيمة c2 من 1024 ونحفظ النتيجة في c1. ثم نجعل الطرف 12 الخاص بخرج PWM بالحالة المرتفعة HIGH ثم بعد تأخير بالقيمة c1 نجعل هذا الطرف LOW. مرة أخرى ، بعد تأخير بالقيمة c2 تستمر الحلقة.
سبب طرح قيمة التناظرية من 1024 ، هو أن المحول من تناظرى لرقمى فى الاردوينو بدقة 10 بت (وبالتالي فإن قيم الأعداد الصحيحة 0 - 2^10 = 1024 قيمة ). هذا يعني أنه سيتم توزيع جهود الدخل بين 0 و 5 فولت إلى قيم أعداد صحيحة بين 0 و 1024 . لذلك إذا ضربنا anlogValue فى (5/1024) ، نحصل على القيمة الرقمية لجهد الدخل .
- الكود:
void loop()
{
c2= analogRead(pot);
c1= 1024-c2;
digitalWrite(pwmPin, HIGH); // sets pin 12 HIGH
delayMicroseconds(c1); // waits for c1 uS (high time)
digitalWrite(pwmPin, LOW); // sets pin 12 LOW
delayMicroseconds(c2); // waits for c2 uS (low time)
}
شرح العمل:
في هذه الدائرة ، للتحكم في سرعة محرك التيار المستمر ، نستخدم مقاومة متغيرة 100 كيلو أوم لتغيير دورة التشغيل duty cycle لإشارة PWM. يتم توصيل المقاومة المتغيرة إلى طرف الدخل التناظرى A0 للاردوينو أونو ويتصل المحرك DC بالطرف 12 من الاردوينو (وهو طرف خرج PWM). عمل البرنامج بسيط للغاية ، لأنه يقرأ الجهد من الطرف التناظرى A0. الجهد التناظرى يتغير باستخدام المقاومة المتغيرة . بعد القيام ببعض الحسابات اللازمة ، يتم ضبط دورة التشغيل وفقًا لذلك.
على سبيل المثال ، إذا قمنا بإدخال جهد يناظر القيمة 256 إلى المدخل التناظرى ، فسيكون وقت التشغيل المرتفع HIGH time 768ms (1024-256) وسيكون وقت الفصل المنخفض LOW time مللي ثانية. لذلك ، فهذا يعني ببساطة أن دورة العمل هي 75% . لا تستطيع أعيننا رؤية مثل هذا التذبذب عالي التردد ويبدو أن المحرك يعمل ON باستمرار بقيمة 75% من السرعة. هكذا يمكننا التحكم في السرعة باستخدام المقاومة المتغيرة .
رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects
التحكم فى سرعة واتجاه محرك التيار المستمر باستخدام الدائرة المتكاملة L293D واستخدام PWM مع الاردوينو :
قبل المضي قدمًا ، نحتاج إلى مناقشة دائرة القنطرة H-BRIDGE. هذه الدائرة لها وظيفتان أساسيتان ، الأولى هى التشغيل والتحكم فى سرعة محرك التيار المستمر من إشارات التحكم ذات القدرة المنخفضة ، والآخرى هى تغيير اتجاه دوران محرك التيار المستمر.
نعلم جميعًا أنه بالنسبة لمحرك DC ، لتغيير اتجاه الدوران ، نحتاج إلى تغيير قطبية جهد تغذية المحرك . لذلك لتغيير القطبية نستخدم القنطرة H-bridge . الآن في الشكل أعلاه لدينا أربع مفاتيح .
كما هو مبين في الشكل ، لدوران المحرك يتم إغلاق المفاتيح A1 و A2. لذلك ، يمر التيار عبر المحرك من اليسار إلى اليمين ، كما هو موضح في الجزء الايسر من الشكل . الآن اعتبر أن المحرك يدور في اتجاه عقارب الساعة clockwise . الآن إذا تم فتح المفاتيح A1 و A2 ، ويتم إغلاق المفاتيح B1 و B2. يمر التيار عبر المحرك من اليمين إلى اليسار كما هو موضح في الجزء الأيمن من الشكل . اتجاه مرور التيار عكس إتجاه مروره فى الحالة الأولى وبالتالي نرى جهد معكوس عند طرف المحرك بالنسبة للحالة الأولى ، وبالتالي فإن المحرك يدور بعكس عقارب الساعة anti clock wise . هذه هي الطريقة التي تعمل بها القتطرة H-BRIDGE. ومع ذلك ، يمكن تشغيل محركات القدرة المنخفضة بواسطة الدائرة المتكاملة
H-BRIDGE IC L293D .
الدائرة المتكاملة L293D هى H-BRIDGE مصممة لتشغيل محركات التيار المستمر منخفضة القدرة كما فى الشكل أدناه تتكون هذا الدائرة المتكاملة من قنطرتين ، وبالتالي يمكنها تشغيل محركين DC. لذلك يمكن استخدامها لتشغيل محركات الروبوت من إشارات المتحكم الدقيق .
كما ذكرنا ، هذه الدائرة المتكاملة لديها القدرة على تغيير اتجاه دوران محرك التيار المستمر . يتم تحقيق ذلك من خلال التحكم في مستويات الجهد على INPUT1 و INPUT2.
لذلك ، كما هو موضح في الشكل أعلاه ، للدوران في اتجاه عقارب الساعة يجب أن يكون 2A مرتفعًا ويجب أن يكون 1A منخفضًا. وبالمثل بالنسبة لعقارب الساعة 1A يجب أن يكون مرتفعا و 2 A يجب أن تكون منخفضا .
الدائرة الكهربية :
فى البداية ، نحتاج إلى اختيار طرف إخراج PWM من ستة أطراف ، بعد ذلك نحتاج إلى تعيين هذا الطرف كخرج .
بعد ذلك ، نحتاج إلى تمكين خاصية PWM في الاردوينو أونو عن طريق استدعاء الدالة “analogWrite(pin, value)” . حيث يمثل "pin" رقم الطرف حيث نحتاج إلى إخراج PWM ، ولقد وضعناه على أنه "3". لذلك على الطرف PIN3 نحصل على خرج PWM.
القيمة value هي دورة التشغيل ON duty cycle ، وهى بين 0 (off دائمًا) و 255 (on دائمًا). نحن بصدد زيادة increment هذا العدد وخفضه decrement عن طريق الضغط على زر.
لدى الاردوينو أونو حد أقصى للدقة resolution هو "8" ، لا يمكنك أن تذهب أبعد من هنا ومن ثم تكون القيم 0-255 . ومع ذلك ، يمكنك تقليل دقة PWM باستخدام الأمر “analogWriteResolution()” ، عن طريق إدخال قيمة من 4-8 في الأقواس ، يمكننا تغيير قيمتها من أربعة بت PWM إلى ثمانية بت PWM.
المفتاح SW1 لتغيير اتجاه دوران محرك التيار المستمر .
البرنامج :
قبل المضي قدمًا ، نحتاج إلى مناقشة دائرة القنطرة H-BRIDGE. هذه الدائرة لها وظيفتان أساسيتان ، الأولى هى التشغيل والتحكم فى سرعة محرك التيار المستمر من إشارات التحكم ذات القدرة المنخفضة ، والآخرى هى تغيير اتجاه دوران محرك التيار المستمر.
نعلم جميعًا أنه بالنسبة لمحرك DC ، لتغيير اتجاه الدوران ، نحتاج إلى تغيير قطبية جهد تغذية المحرك . لذلك لتغيير القطبية نستخدم القنطرة H-bridge . الآن في الشكل أعلاه لدينا أربع مفاتيح .
كما هو مبين في الشكل ، لدوران المحرك يتم إغلاق المفاتيح A1 و A2. لذلك ، يمر التيار عبر المحرك من اليسار إلى اليمين ، كما هو موضح في الجزء الايسر من الشكل . الآن اعتبر أن المحرك يدور في اتجاه عقارب الساعة clockwise . الآن إذا تم فتح المفاتيح A1 و A2 ، ويتم إغلاق المفاتيح B1 و B2. يمر التيار عبر المحرك من اليمين إلى اليسار كما هو موضح في الجزء الأيمن من الشكل . اتجاه مرور التيار عكس إتجاه مروره فى الحالة الأولى وبالتالي نرى جهد معكوس عند طرف المحرك بالنسبة للحالة الأولى ، وبالتالي فإن المحرك يدور بعكس عقارب الساعة anti clock wise . هذه هي الطريقة التي تعمل بها القتطرة H-BRIDGE. ومع ذلك ، يمكن تشغيل محركات القدرة المنخفضة بواسطة الدائرة المتكاملة
H-BRIDGE IC L293D .
الدائرة المتكاملة L293D هى H-BRIDGE مصممة لتشغيل محركات التيار المستمر منخفضة القدرة كما فى الشكل أدناه تتكون هذا الدائرة المتكاملة من قنطرتين ، وبالتالي يمكنها تشغيل محركين DC. لذلك يمكن استخدامها لتشغيل محركات الروبوت من إشارات المتحكم الدقيق .
كما ذكرنا ، هذه الدائرة المتكاملة لديها القدرة على تغيير اتجاه دوران محرك التيار المستمر . يتم تحقيق ذلك من خلال التحكم في مستويات الجهد على INPUT1 و INPUT2.
لذلك ، كما هو موضح في الشكل أعلاه ، للدوران في اتجاه عقارب الساعة يجب أن يكون 2A مرتفعًا ويجب أن يكون 1A منخفضًا. وبالمثل بالنسبة لعقارب الساعة 1A يجب أن يكون مرتفعا و 2 A يجب أن تكون منخفضا .
الدائرة الكهربية :
فى البداية ، نحتاج إلى اختيار طرف إخراج PWM من ستة أطراف ، بعد ذلك نحتاج إلى تعيين هذا الطرف كخرج .
بعد ذلك ، نحتاج إلى تمكين خاصية PWM في الاردوينو أونو عن طريق استدعاء الدالة “analogWrite(pin, value)” . حيث يمثل "pin" رقم الطرف حيث نحتاج إلى إخراج PWM ، ولقد وضعناه على أنه "3". لذلك على الطرف PIN3 نحصل على خرج PWM.
القيمة value هي دورة التشغيل ON duty cycle ، وهى بين 0 (off دائمًا) و 255 (on دائمًا). نحن بصدد زيادة increment هذا العدد وخفضه decrement عن طريق الضغط على زر.
لدى الاردوينو أونو حد أقصى للدقة resolution هو "8" ، لا يمكنك أن تذهب أبعد من هنا ومن ثم تكون القيم 0-255 . ومع ذلك ، يمكنك تقليل دقة PWM باستخدام الأمر “analogWriteResolution()” ، عن طريق إدخال قيمة من 4-8 في الأقواس ، يمكننا تغيير قيمتها من أربعة بت PWM إلى ثمانية بت PWM.
المفتاح SW1 لتغيير اتجاه دوران محرك التيار المستمر .
البرنامج :
- الكود:
int i=0;//initializing a integer for incrementing and decrementing duty ratio.
void setup()
{
pinMode(3, OUTPUT); // sets the pin3 as output
pinMode(0, INPUT);// sets the pin0 as output
pinMode(1, INPUT);// sets the pin1 as output
}
void loop()
{
analogWrite(3, i); // analogWrite values from 0 to 255
if (digitalRead(0)==LOW)
{
if (i<255)
{
i++;//if pin0 is pressed and the duty ratio value is less than 255
delay(30);
}
}
if (digitalRead(1)==LOW)
{
if (i>0)
{
i--;// if pin1 is pressed and the duty ratio value is greater than 0
delay(30);
}
}
}
رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects
التحكم فى سرعة واتجاه محرك التيار المستمر DC motor باستخدام الدائرة المتكاملة L298 والاردوينو :
عن طريق توصيل الدائرة المتكاملة (القتطرة) L298 إلى الاردوينو ، يمكنك التحكم في محرك التيار المستمر DC.
محرك التيار المستمر ، هو أكثر أنواع المحركات شيوعًا. محركات التيار المستمر لها عادة طرفان ، طرف موجب والآخر سالب . إذا قمت بتوصيل هذين الطرفين مباشرة بالبطارية ، فسيتم دوران المحرك. إذا قمت بتبديل الطرفين ، فسيتم دوران المحرك في الاتجاه المعاكس.
للتحكم في اتجاه دوران محرك DC ، دون تغيير طريقة توصيل الأطراف ، يمكنك استخدام دائرة تسمى H-Bridge. هذه القنطرة عبارة عن دائرة إلكترونية يمكنها قيادة المحرك في كلا الاتجاهين. تُستخدم قنطرة H في العديد من التطبيقات المختلفة ، أحد أكثرها شيوعًا هو التحكم في المحركات في الروبوتات. يطلق عليها قتطرة (جسر) H-لأنها تستخدم أربعة ترانزستورات متصلة بطريقة تشبه "H" .
يمكنك استخدام الترانزستورات المنفصلة لإنشاء هذه الدائرة ، ولكن في هذا التدريب ، سنستخدم الدائرة المتكاملة L298. يمكن للدائرة المتكاملة L298 التحكم في سرعة واتجاه محركات التيار المستمر DC motors ومحركات الخطوة stepper motors ويمكنها التحكم في محركين في وقت واحد. معدل تيارها هو2Aلكل محرك. عند هذه التيارات ، سوف تحتاج إلى استخدام مصارف الحرارة heat sinks .
الشكل أدناه يبين توزيع أطراف الدائرة المتكاملة L298 :
هناك ثلاثة أطراف دخل لكل محرك ، هى Input1 (IN1), Input2 (IN2), Enable1 (EN1) للمحرك Motor1 و Input3, Input4, and Enable2 للمحرك Motor2.
نظرًا لأننا سنتحكم في محرك واحد فقط في هذا التدريب ، فسوف نوصل بين Arduino و IN1 (الطرف 5) و IN2 (الطرف 7) و Enable1 (الطرف6) من الدائرة المتكاملة L298. تعتبر الاطراف 5 و 7 مداخل رقمية ، أي تشغيل ON أو إيقاف OFF ، بينما يحتاج الطرف 6 إلى إشارة معدلة بعرض النبضة (PWM) للتحكم في سرعة المحرك.
يوضح الجدول التالي اتجاه دوران المحرك وفقًا للقيم الرقمية لكل من IN1 و IN2.
يتم توصيل الطرف IN1 من L298 إلى الطرف 8 من Arduino بينما يتم توصيل الطرف IN2 إلى الطرف 9 . هذه الأطراف الرقمية من Arduino تتحكم في اتجاه المحرك. ويتم توصيل الطرف EN A من الدائرة المتكاملة إلى الطرف PWM pin 3 من Arduino. هذا الطرف سوف يتحكم في سرعة المحرك.
لتعيين قيم أطراف الاردوينو 8 و 9 ، سوف نستخدم الدالة digitalWrite() ، ولتعيين قيمة الطرف 3 ، سوف نستخدم الدالة analogWrite() .
الدائرة الكهربية :
البرنامج :
يجب أن يدور المحرك أولاً في اتجاه عقارب الساعة (CW) لمدة 3 ثوانٍ ثم عكس اتجاه عقارب الساعة (CCW) لمدة 3 ثوانٍ.
عن طريق توصيل الدائرة المتكاملة (القتطرة) L298 إلى الاردوينو ، يمكنك التحكم في محرك التيار المستمر DC.
محرك التيار المستمر ، هو أكثر أنواع المحركات شيوعًا. محركات التيار المستمر لها عادة طرفان ، طرف موجب والآخر سالب . إذا قمت بتوصيل هذين الطرفين مباشرة بالبطارية ، فسيتم دوران المحرك. إذا قمت بتبديل الطرفين ، فسيتم دوران المحرك في الاتجاه المعاكس.
للتحكم في اتجاه دوران محرك DC ، دون تغيير طريقة توصيل الأطراف ، يمكنك استخدام دائرة تسمى H-Bridge. هذه القنطرة عبارة عن دائرة إلكترونية يمكنها قيادة المحرك في كلا الاتجاهين. تُستخدم قنطرة H في العديد من التطبيقات المختلفة ، أحد أكثرها شيوعًا هو التحكم في المحركات في الروبوتات. يطلق عليها قتطرة (جسر) H-لأنها تستخدم أربعة ترانزستورات متصلة بطريقة تشبه "H" .
يمكنك استخدام الترانزستورات المنفصلة لإنشاء هذه الدائرة ، ولكن في هذا التدريب ، سنستخدم الدائرة المتكاملة L298. يمكن للدائرة المتكاملة L298 التحكم في سرعة واتجاه محركات التيار المستمر DC motors ومحركات الخطوة stepper motors ويمكنها التحكم في محركين في وقت واحد. معدل تيارها هو2Aلكل محرك. عند هذه التيارات ، سوف تحتاج إلى استخدام مصارف الحرارة heat sinks .
الشكل أدناه يبين توزيع أطراف الدائرة المتكاملة L298 :
هناك ثلاثة أطراف دخل لكل محرك ، هى Input1 (IN1), Input2 (IN2), Enable1 (EN1) للمحرك Motor1 و Input3, Input4, and Enable2 للمحرك Motor2.
نظرًا لأننا سنتحكم في محرك واحد فقط في هذا التدريب ، فسوف نوصل بين Arduino و IN1 (الطرف 5) و IN2 (الطرف 7) و Enable1 (الطرف6) من الدائرة المتكاملة L298. تعتبر الاطراف 5 و 7 مداخل رقمية ، أي تشغيل ON أو إيقاف OFF ، بينما يحتاج الطرف 6 إلى إشارة معدلة بعرض النبضة (PWM) للتحكم في سرعة المحرك.
يوضح الجدول التالي اتجاه دوران المحرك وفقًا للقيم الرقمية لكل من IN1 و IN2.
يتم توصيل الطرف IN1 من L298 إلى الطرف 8 من Arduino بينما يتم توصيل الطرف IN2 إلى الطرف 9 . هذه الأطراف الرقمية من Arduino تتحكم في اتجاه المحرك. ويتم توصيل الطرف EN A من الدائرة المتكاملة إلى الطرف PWM pin 3 من Arduino. هذا الطرف سوف يتحكم في سرعة المحرك.
لتعيين قيم أطراف الاردوينو 8 و 9 ، سوف نستخدم الدالة digitalWrite() ، ولتعيين قيمة الطرف 3 ، سوف نستخدم الدالة analogWrite() .
الدائرة الكهربية :
البرنامج :
- الكود:
const int pwm = 3 ; //initializing pin 3 as pwm
const int in_1 = 8 ;
const int in_2 = 9 ;
//For providing logic to L298 IC to choose the direction of the DC motor
void setup()
{
pinMode(pwm,OUTPUT) ; //we have to set PWM pin as output
pinMode(in_1,OUTPUT) ; //Logic pins are also set as output
pinMode(in_2,OUTPUT) ;
}
void loop()
{
//For Clock wise motion , in_1 = High , in_2 = Low
digitalWrite(in_1,HIGH) ;
digitalWrite(in_2,LOW) ;
analogWrite(pwm,255) ;
/*setting pwm of the motor to 255
we can change the speed of rotaion
by chaning pwm input but we are only
using arduino so we are using higest
value to driver the motor */
//Clockwise for 3 secs
delay(3000) ;
//For brake
digitalWrite(in_1,HIGH) ;
digitalWrite(in_2,HIGH) ;
delay(1000) ;
//For Anti Clock-wise motion - IN_1 = LOW , IN_2 = HIGH
digitalWrite(in_1,LOW) ;
digitalWrite(in_2,HIGH) ;
delay(3000) ;
//For brake
digitalWrite(in_1,HIGH) ;
digitalWrite(in_2,HIGH) ;
delay(1000) ;
}
يجب أن يدور المحرك أولاً في اتجاه عقارب الساعة (CW) لمدة 3 ثوانٍ ثم عكس اتجاه عقارب الساعة (CCW) لمدة 3 ثوانٍ.
محرك السيرفو Servo Motor
محركات السيرفو Servo Motors
التحكم فى الموضع باستخدام محرك السيرفو والاردوينو :
محرك السيرفو (المؤازر) عبارة عن محرك تيار مستمر DC يتم التحكم بزاوية دورانه بدقة من خلال نظام تحكم بحلقة
تغذية عكسية مغلقة نموذجية. يدور محرك السيرفو فقط بقدر ما نريد ومن ثم يتوقف وينتظر الإشارة التالية بشكل يخالف محرك التيار المستمر DC التقليدي الذي يبدأ بالدوران عندما يتم تطبيق تغذية عليه ويستمر بالدوران حتى تتوقف التغذية عليه، بالتالي لا يمكننا التحكم بزاوية دورانه إلى مكان محدد. يوضح الشكل أدناه يبين نموذج لمحرك سيرفو.
لمحرك السيرفو ثلاث أسلاك : اثنان لتزويده بالطاقة (ground، Vcc)، والسلك الثالث يتم من خلاله تطبيق إشارة التحكم (نبضات PWM). في العادة لون سلك Vcc أحمر، ولون سلك الأرضي ground أسود أو بني، أما لون سلك إشارة التحكم أصفر أو أبيض أو برتقالي.
يتكون محرك السيرفو من الأجزاء التالية ، كما هو موضح في الشكل أدناه :
1- محرك تيار مستمر DC motor .
2- عامود الخرج output shaft (ذرا ع محرك السرفو).
3- سلسلة من التروس gears التي تصل محرك DC بعامود الخرج. الهدف منها تقليل سرعة محرك DC لتصبح مناسبة.
4- نظام تحكم الكتروني بمكان المقبض ذو تغذية عكسية مغلقة، ويتكون مما يلي:
أ- مقاومة متغيرة potentiometer: تتصل مع عامود الخرج أو في مكان ما من سلسلة التروس، تعطى جهدا متناسيا مع موضع العامود .
ب- مبدل (محول) converter نبضات تعديل عرض النبضة PWM إلى جهد.
ت- مقارن comparator: يعمل على مقارنة الجهد الناتج عن المقاومة المتغيرة مع الجهد الناتج عن المبدل.
كيف يعمل محرك السيرفو :
1- يطبق على المحرك إشارة تحكم على شكل إشارة تعديل عرض النبضة pulse width modulation ((PWM والتي ترددها 50 Hz (أي تتكرر الإشارة كل 1/50 = 20ms ) . عرض هذه النبضات هو الذي سيتحكم بزاوية الدوران كما سنرى.
2- يتم تحويل هذه النبضات إلى جهد مكافئ عن طريق مبدل PWM. كلما كان عرض هذه النبضات أكبر كلما كان الجهد الناتج أكبر.
3- تقدم المقاومة المتغيرة جهدا يتناسب مع مكان عامود الخرج .
4- يعمل المقارن على مقارنة الجهد الناتج عن المبدل والجهد الناتج عن المقاومة المتغيرة. الاختلاف ما بين الإشارتين يعرف بإشارة الخطأ error signal، والتي يتم تضخيمها، وتستخدم لقيادة محرك التيار المستمر DC.
5- يتحرك محرك DC، وعامود الخرج، وبالتالي الجهد الناتج عن المقاومة المتغيرة بحيث تؤدي العملية إلى إنقاص أو حذف إشارة الخطأ.
6- عندما يتم حذف إشارة الخطأ يكون عامود الخرج قد وصل إلى المكان أو الزاوية المطلوبة، ويتوقف محرك DC تبعا لذلك .
7- عند تغيير عرض نبضات PWM، سيتغير الجهد الناتج عن مبدل PWM وتنتج إشارة خطأ، ليتحرك المحرك وعامود الخرج إلى زاوية أخرى مطلوبة، ويتوقف عندها.
يبين الشكل أدناه العناصر الداخلية لمحرك السيرفو.
معظم محركات السيرفو تدور ضمن 180º، وبعض منها ضمن 360º. يتم التحكم بالزاوية الدقيقة من خلال عرض نبضات PWM ذات التردد 50Hz كما تم ذكره. تعتمد العلاقة ما بين عرض النبضة والزاوية على الشركات المصنعة للمحركات ولكن المبدأ الأساسي هو نفسه في كل محرك.
مثال عرض النبضات وزاوية الدوران: يوضح الشكل أدناه مثالا على العلاقة ما بين عرض النبضات وزاوية الدورات
• من أجل عرض نبضة مقداره 1ms تكون زاوية المحرك 0° .
• من أجل عرض نبضة مقداره 1.5ms تكون زاوية المحرك 90° .
• من أجل عرض نبضة مقداره 2ms تكون زاوية المحرك 180° .
يتحرك محرك السيرفو ما بين 0 و180 درجة، ولا يتحرك في دوران مستمر كما في محرك DC التقليدي.
التحكم فى الموضع باستخدام محرك السيرفو والاردوينو :
محرك السيرفو (المؤازر) عبارة عن محرك تيار مستمر DC يتم التحكم بزاوية دورانه بدقة من خلال نظام تحكم بحلقة
تغذية عكسية مغلقة نموذجية. يدور محرك السيرفو فقط بقدر ما نريد ومن ثم يتوقف وينتظر الإشارة التالية بشكل يخالف محرك التيار المستمر DC التقليدي الذي يبدأ بالدوران عندما يتم تطبيق تغذية عليه ويستمر بالدوران حتى تتوقف التغذية عليه، بالتالي لا يمكننا التحكم بزاوية دورانه إلى مكان محدد. يوضح الشكل أدناه يبين نموذج لمحرك سيرفو.
لمحرك السيرفو ثلاث أسلاك : اثنان لتزويده بالطاقة (ground، Vcc)، والسلك الثالث يتم من خلاله تطبيق إشارة التحكم (نبضات PWM). في العادة لون سلك Vcc أحمر، ولون سلك الأرضي ground أسود أو بني، أما لون سلك إشارة التحكم أصفر أو أبيض أو برتقالي.
يتكون محرك السيرفو من الأجزاء التالية ، كما هو موضح في الشكل أدناه :
1- محرك تيار مستمر DC motor .
2- عامود الخرج output shaft (ذرا ع محرك السرفو).
3- سلسلة من التروس gears التي تصل محرك DC بعامود الخرج. الهدف منها تقليل سرعة محرك DC لتصبح مناسبة.
4- نظام تحكم الكتروني بمكان المقبض ذو تغذية عكسية مغلقة، ويتكون مما يلي:
أ- مقاومة متغيرة potentiometer: تتصل مع عامود الخرج أو في مكان ما من سلسلة التروس، تعطى جهدا متناسيا مع موضع العامود .
ب- مبدل (محول) converter نبضات تعديل عرض النبضة PWM إلى جهد.
ت- مقارن comparator: يعمل على مقارنة الجهد الناتج عن المقاومة المتغيرة مع الجهد الناتج عن المبدل.
كيف يعمل محرك السيرفو :
1- يطبق على المحرك إشارة تحكم على شكل إشارة تعديل عرض النبضة pulse width modulation ((PWM والتي ترددها 50 Hz (أي تتكرر الإشارة كل 1/50 = 20ms ) . عرض هذه النبضات هو الذي سيتحكم بزاوية الدوران كما سنرى.
2- يتم تحويل هذه النبضات إلى جهد مكافئ عن طريق مبدل PWM. كلما كان عرض هذه النبضات أكبر كلما كان الجهد الناتج أكبر.
3- تقدم المقاومة المتغيرة جهدا يتناسب مع مكان عامود الخرج .
4- يعمل المقارن على مقارنة الجهد الناتج عن المبدل والجهد الناتج عن المقاومة المتغيرة. الاختلاف ما بين الإشارتين يعرف بإشارة الخطأ error signal، والتي يتم تضخيمها، وتستخدم لقيادة محرك التيار المستمر DC.
5- يتحرك محرك DC، وعامود الخرج، وبالتالي الجهد الناتج عن المقاومة المتغيرة بحيث تؤدي العملية إلى إنقاص أو حذف إشارة الخطأ.
6- عندما يتم حذف إشارة الخطأ يكون عامود الخرج قد وصل إلى المكان أو الزاوية المطلوبة، ويتوقف محرك DC تبعا لذلك .
7- عند تغيير عرض نبضات PWM، سيتغير الجهد الناتج عن مبدل PWM وتنتج إشارة خطأ، ليتحرك المحرك وعامود الخرج إلى زاوية أخرى مطلوبة، ويتوقف عندها.
يبين الشكل أدناه العناصر الداخلية لمحرك السيرفو.
معظم محركات السيرفو تدور ضمن 180º، وبعض منها ضمن 360º. يتم التحكم بالزاوية الدقيقة من خلال عرض نبضات PWM ذات التردد 50Hz كما تم ذكره. تعتمد العلاقة ما بين عرض النبضة والزاوية على الشركات المصنعة للمحركات ولكن المبدأ الأساسي هو نفسه في كل محرك.
مثال عرض النبضات وزاوية الدوران: يوضح الشكل أدناه مثالا على العلاقة ما بين عرض النبضات وزاوية الدورات
• من أجل عرض نبضة مقداره 1ms تكون زاوية المحرك 0° .
• من أجل عرض نبضة مقداره 1.5ms تكون زاوية المحرك 90° .
• من أجل عرض نبضة مقداره 2ms تكون زاوية المحرك 180° .
يتحرك محرك السيرفو ما بين 0 و180 درجة، ولا يتحرك في دوران مستمر كما في محرك DC التقليدي.
رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects
المكتبة Servo : Servo library
تتيح هذه المكتبة للوحة Arduino التحكم بمحركات السيرفو . تحتوي محركات السيرفو على تروس مدمجة وعامود shaft يمكن التحكم فيه بدقة. تسمح محركات السيرفو القياسية بوضع العمود في زوايا مختلفة ، تتراوح عادة بين 0 و 180 درجة. تتيح محركات السيرفو المستمرة الدوران ضبط دوران العمود على سرعات مختلفة.
تدعم مكتبة Servo ما يصل إلى 12 محركًا في معظم لوحات Arduino و 48 محركًا في Arduino Mega. على لوحات أخرى غير Mega ، يؤدي استخدام المكتبة إلى تعطيل الدالة analogWrite() (PWM) على الطرفين 9 و 10 ، سواء كان هناك Servo على تلك الأطراف أم لا. على Mega ، يمكن استخدام ما يصل إلى 12 سيرفو دون التداخل مع وظيفة PWM ؛ يؤدي استخدام 12 إلى 23 محركًا إلى تعطيل PWM على الأطراف 11 و 12.
لاستخدام هذه المكتبة يجب ضم الملف :
بعد استدعاء المكتبة يجب إنشاء كائن من الفئة Servo ، وليكن باسم servo ، أو أى اسم آخر ، مثال:
تحتوي محركات السيرفو على ثلاثة أسلاك: القدرة power والأرض ground والإشارة signal. سلك القدرة يكون عادة أحمرًا ، ويجب توصيله بالطرف 5V على لوحة Arduino. السلك الأرضي عادة ما يكون أسود أو بني ويجب توصيله بطرف أرضي على لوحة Arduino. طرف الإشارة يكون أصفرًا أو برتقاليًا أو أبيضًا ويجب أن يكون متصلاً بطرف رقمي على لوحة Arduino. لاحظ أن محركات السيرفو تسحب قدرًا كبيرًا من القدرة ، لذلك إذا كنت بحاجة إلى تشغيل أكثر من واحد أو اثنين ، فربما تحتاج إلى تشغيلها من مصدر منفصل (أى ليس الطرف +5V في Arduino). تأكد من توصيل الأرضى لكل من Arduino ومصدر القدرة الخارجية معًا.
دوال المكتبة :
1- الدالة attach()
الوصف : إلحاق (ربط) attach متغير Servo إلى طرف . لاحظ أنه في Arduino 0016 والإصدارات الأقدم ، تدعم مكتبة Servo محركات السيرفو فقط على الأطراف : 9 و 10. تحدد هذه الدالة الطرف pin الذى سيتم ربط محرك السيرفو معه.
الصيغة :
البارامترات :
المتغير servo : هو متغير من النوع Servo .
الطرف pin : هو رقم الطرف المتصل به السيرفو .
الحد الأدنى (اختيارى) min (optional) : عرض النبضة بالميكروثانية ، المقابلة لأدنى زاوية (0 درجة) على السيرفو (القيمة الافتراضية 544) .
الحد الأقصى (اختيارى) max (optional) : عرض النبضة بالميكروثانية ، المقابلة لأقصى زاوية (180 درجة) على السيرفو (القيمة الافتراضية 2400) .
مثال :
2- الدالة write() :
الوصف :
يكتب (يرسل) قيمة إلى السيرفو ، والتحكم على العامود وفقا لذلك. فى السيرفو القياسى ، سيؤدي ذلك إلى ضبط زاوية العامود (بالدرجات) ، مع تحريك العمود إلى ذلك الاتجاه. أى تعمل على ضبط زاوية محور المحرك تبعا للبارامتر angle من 0 وحتى 180. في سيرفو الدوران المستمر ، سيؤدي ذلك إلى ضبط سرعة السيرفو (مع 0 تكون بأقصى سرعة في اتجاه معين ، 180 تكون بأقصى سرعة في الآخر ، وقيمة بالقرب من 90 لا توجد حركة).
الصيغة :
البارامترات :
المتغير servo : متغير من النوع Servo .
الزاوية angle : القيمة المطلوب إرسالها إلى السيرفو ، من 0 إلى 180 .
مثال :
3- الدالة writeMicroseconds() :
الوصف :
تكتب (ترسل) قيمة بالميكرو ثانية (uS) إلى السيرفو ، والتحكم في العامود وفقا لذلك. على السيرفو القياسى ، سيؤدي ذلك إلى ضبط زاوية العمود. بالنسبة للسيرفو القياسى ، تكون قيمة البارامتر 1000 عكس اتجاه عقارب الساعة تمامًا ، بينما تكون القيمة 2000 في اتجاه عقارب الساعة تمامًا ، والقيمة 1500 في المنتصف.
يتم تحديد عرض نبضة إشارة PWM بوحدة الميكرو ثانية وبالتالي تحريك المحرك إلى زاوية محددة .
يستجيب سيرفو الدوران المستمر للدالة لوظيفة WriteMicrosecond بطريقة مماثلة للدالة write .
الصيغة :
البارامترات :
المتغير servo : متغير من النوع Servo .
الميكروثانية uS : قيمة البارامتر بالميكروثاتية (نوع int )
مثال :
4- الدالة read() :
الوصف : قراءة الزاوية الحالية للسيرفو (القيمة الممررة لأخر إستدعاء للدالة write() (.
الصيغة :
البارامترات :
المتغير servo : متغير من النوع Servo .
العائد :
زاوية السيرفو ، من 0 إلى 180 درجة .
5- الدالة attached()
الوصف :
اختبار ما إذا كان متغير Servo مرتبط إلى طرف pin .
الصيغة :
البارامترات :
المتغير servo : متغير من النوع Servo .
العائد :
صواب true إذا كان السرفو مرتبط إلى طرف ، خلاف ذلك false .
6- الدالة detach() :
الوصف :
فصل إرتباط Detach متغير Servo من طرفه . إذا تم فصل جميع متغيرات الفئة Servo ، عنئذ يمكن استخدام الأطراف 9 و 10 من أجل خرج PWM بالدالة analogWrite() .
الصيغة :
البارامترات :
المتغير servo : متغير من النوع Servo .
تتيح هذه المكتبة للوحة Arduino التحكم بمحركات السيرفو . تحتوي محركات السيرفو على تروس مدمجة وعامود shaft يمكن التحكم فيه بدقة. تسمح محركات السيرفو القياسية بوضع العمود في زوايا مختلفة ، تتراوح عادة بين 0 و 180 درجة. تتيح محركات السيرفو المستمرة الدوران ضبط دوران العمود على سرعات مختلفة.
تدعم مكتبة Servo ما يصل إلى 12 محركًا في معظم لوحات Arduino و 48 محركًا في Arduino Mega. على لوحات أخرى غير Mega ، يؤدي استخدام المكتبة إلى تعطيل الدالة analogWrite() (PWM) على الطرفين 9 و 10 ، سواء كان هناك Servo على تلك الأطراف أم لا. على Mega ، يمكن استخدام ما يصل إلى 12 سيرفو دون التداخل مع وظيفة PWM ؛ يؤدي استخدام 12 إلى 23 محركًا إلى تعطيل PWM على الأطراف 11 و 12.
لاستخدام هذه المكتبة يجب ضم الملف :
- الكود:
#include <Servo.h>
بعد استدعاء المكتبة يجب إنشاء كائن من الفئة Servo ، وليكن باسم servo ، أو أى اسم آخر ، مثال:
- الكود:
Servo servo;
تحتوي محركات السيرفو على ثلاثة أسلاك: القدرة power والأرض ground والإشارة signal. سلك القدرة يكون عادة أحمرًا ، ويجب توصيله بالطرف 5V على لوحة Arduino. السلك الأرضي عادة ما يكون أسود أو بني ويجب توصيله بطرف أرضي على لوحة Arduino. طرف الإشارة يكون أصفرًا أو برتقاليًا أو أبيضًا ويجب أن يكون متصلاً بطرف رقمي على لوحة Arduino. لاحظ أن محركات السيرفو تسحب قدرًا كبيرًا من القدرة ، لذلك إذا كنت بحاجة إلى تشغيل أكثر من واحد أو اثنين ، فربما تحتاج إلى تشغيلها من مصدر منفصل (أى ليس الطرف +5V في Arduino). تأكد من توصيل الأرضى لكل من Arduino ومصدر القدرة الخارجية معًا.
دوال المكتبة :
- الكود:
attach()
write()
writeMicroseconds()
read()
attached()
detach()
1- الدالة attach()
الوصف : إلحاق (ربط) attach متغير Servo إلى طرف . لاحظ أنه في Arduino 0016 والإصدارات الأقدم ، تدعم مكتبة Servo محركات السيرفو فقط على الأطراف : 9 و 10. تحدد هذه الدالة الطرف pin الذى سيتم ربط محرك السيرفو معه.
الصيغة :
- الكود:
servo.attach(pin)
servo.attach(pin, min, max)
البارامترات :
المتغير servo : هو متغير من النوع Servo .
الطرف pin : هو رقم الطرف المتصل به السيرفو .
الحد الأدنى (اختيارى) min (optional) : عرض النبضة بالميكروثانية ، المقابلة لأدنى زاوية (0 درجة) على السيرفو (القيمة الافتراضية 544) .
الحد الأقصى (اختيارى) max (optional) : عرض النبضة بالميكروثانية ، المقابلة لأقصى زاوية (180 درجة) على السيرفو (القيمة الافتراضية 2400) .
مثال :
[CODE#include <Servo.h>
Servo myservo;
void setup()
{
myservo.attach(9);
}
void loop() {}] [/CODE]
Servo myservo;
void setup()
{
myservo.attach(9);
}
void loop() {}] [/CODE]
2- الدالة write() :
الوصف :
يكتب (يرسل) قيمة إلى السيرفو ، والتحكم على العامود وفقا لذلك. فى السيرفو القياسى ، سيؤدي ذلك إلى ضبط زاوية العامود (بالدرجات) ، مع تحريك العمود إلى ذلك الاتجاه. أى تعمل على ضبط زاوية محور المحرك تبعا للبارامتر angle من 0 وحتى 180. في سيرفو الدوران المستمر ، سيؤدي ذلك إلى ضبط سرعة السيرفو (مع 0 تكون بأقصى سرعة في اتجاه معين ، 180 تكون بأقصى سرعة في الآخر ، وقيمة بالقرب من 90 لا توجد حركة).
الصيغة :
- الكود:
servo.write(angle)
البارامترات :
المتغير servo : متغير من النوع Servo .
الزاوية angle : القيمة المطلوب إرسالها إلى السيرفو ، من 0 إلى 180 .
مثال :
- الكود:
#include <Servo.h>
Servo myservo;
void setup()
{
myservo.attach(9);
myservo.write(90); // set servo to mid-point
}
void loop() {}
3- الدالة writeMicroseconds() :
الوصف :
تكتب (ترسل) قيمة بالميكرو ثانية (uS) إلى السيرفو ، والتحكم في العامود وفقا لذلك. على السيرفو القياسى ، سيؤدي ذلك إلى ضبط زاوية العمود. بالنسبة للسيرفو القياسى ، تكون قيمة البارامتر 1000 عكس اتجاه عقارب الساعة تمامًا ، بينما تكون القيمة 2000 في اتجاه عقارب الساعة تمامًا ، والقيمة 1500 في المنتصف.
يتم تحديد عرض نبضة إشارة PWM بوحدة الميكرو ثانية وبالتالي تحريك المحرك إلى زاوية محددة .
يستجيب سيرفو الدوران المستمر للدالة لوظيفة WriteMicrosecond بطريقة مماثلة للدالة write .
الصيغة :
- الكود:
servo.writeMicroseconds(uS)
المتغير servo : متغير من النوع Servo .
الميكروثانية uS : قيمة البارامتر بالميكروثاتية (نوع int )
مثال :
- الكود:
#include <Servo.h>
Servo myservo;
void setup()
{
myservo.attach(9);
myservo.writeMicroseconds(1500); // set servo to mid-point
}
void loop() {}
4- الدالة read() :
الوصف : قراءة الزاوية الحالية للسيرفو (القيمة الممررة لأخر إستدعاء للدالة write() (.
الصيغة :
- الكود:
servo.read()
البارامترات :
المتغير servo : متغير من النوع Servo .
العائد :
زاوية السيرفو ، من 0 إلى 180 درجة .
5- الدالة attached()
الوصف :
اختبار ما إذا كان متغير Servo مرتبط إلى طرف pin .
الصيغة :
- الكود:
servo.attached()
البارامترات :
المتغير servo : متغير من النوع Servo .
العائد :
صواب true إذا كان السرفو مرتبط إلى طرف ، خلاف ذلك false .
6- الدالة detach() :
الوصف :
فصل إرتباط Detach متغير Servo من طرفه . إذا تم فصل جميع متغيرات الفئة Servo ، عنئذ يمكن استخدام الأطراف 9 و 10 من أجل خرج PWM بالدالة analogWrite() .
الصيغة :
- الكود:
servo.detach()
البارامترات :
المتغير servo : متغير من النوع Servo .
رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects
أمثلة على التحكم فى الموضع باستخدام محرك السيرفو والأردوينو
مثال رقم 1 :
المطلوب :
التحكم في موضع عامود محرك سيرفو باستخدام زاوية محسوبة في البرنامج . على سبيل المثال ، تريد مستشعرًا على روبوت أن يتأرجح swing عبر قوس أو ينتقل إلى الموضع الذي تحدده.
الحل :
سوف نقوم باستخدم المكتبة Servo التى توزع مع بيئة تطوير الاردوينو . تتيح لك الإصدارات الحديثة من المكتبة توصيل إشارة السيرفو بأي طرف رقمي من Arduino.
الدائرة الكهربية :
البرنامج :
فى هذا المثال يتأرجح sweep عامود السيرفو بين 0 و 180 درجة. قد تحتاج إلى إخبار المكتبة بضبط الحد الأدنى والحد الأقصى للمواقع بحيث تحصل على نطاق الحركة الذي تريده. سيؤدي استدعاء الدالة Servo.attach باستخدام الوسائط الاختيارية للحد الأدنى والحد الأقصى من المواضع إلى ضبط الحركة:
نظرًا لأن محركات السيرفو النموذجية تستجيب للنبضات المقاسة بالميكروثانية وليس بالدرجات ، فإن الوسائط التالية لرقم الطرف تُبلغ مكتبة Servo بعدد الثواني التي يجب استخدامها عند طلب 0 درجة أو 180 درجة.
فيما يلي وسائط الدالة servo.attach(pin, min, max) :
• الطرف pin : رقم الطرف المتصل به محرك السيرفو .
• الحد الأدنى (اختيارى) min (optional) : عرض النبضة بالميكرو ثانية المقابلة للزاوية الأدنى (0 درجة) على السيرفو (القيمة الافتراضية 544) .
• الحد الأقصى (اختيارى) max (optional) : عرض النبضة بالميكرو ثانية المقابلة للزاوية الأقصى (180 درجة) على السيرفو (القيمة الافتراضية 2,400) .
مثال رقم 2 : التحكم فى سيرفو أو اثنين بمقاومة متغيرة أو حساس :
المطلوب :
التحكم في اتجاه الدوران وسرعة سيرفو أو اثنين باستخدام مقاومة متغيرة . على سبيل المثال ، تريد التحكم في المنظر وإمالة الكاميرا أو المستشعر المتصلين بمحركات السيرفو . يمكن أن تعمل هذا المثال مع أي جهد متغير من جهاز استشعار يمكن قراءته من مدخل تناظرى .
الحل :
يمكن استخدام نفس المكتبة كما هو الحال في المثال السابق ، مع إضافة كود لقراءة الجهد على المقاومة المتغيرة . هذه القيمة يتم عمل تغيير المقياس scale لها بحيث يتم تعيين موضع المقاومة المتغيرة (من 0 إلى 1023) إلى قيمة تتراوح بين 0 و 180 درجة .
الدائرة الكهربية :
البرنامج :
مثال رقم 3 :
التحكم في محركات السرفو باستخدام الاردوينو والازرار الضاغطة
في هذا التدريب ، سنتحكم في محرك السيرفو بواسطة ARDUINO UNO. يتم استخدام محركات السيرفو حيث تكون هناك حاجة لحركة أو وضع position عمود دوران بدقة . هذه المحركات ليست للتطبيقات عالية السرعة ، بل لتطبيقات السرعة المنخفضة ، وعزم الدوران المتوسط والوضع الدقيق . يتم استخدام هذه المحركات في آليات أذرع الربوت ، ومتحكمات الطيران وأنظمة التحكم.
الدائرة الكهربية :
في الاردوينو لدينا مكتبة معرفة مسبقًا ، والتي ستقوم بتعيين الترددات ونسب العمل وفقًا لذلك بمجرد استدعاء ملف الرأس أو تضمينه. في الاردوينو ، يتعين علينا ببساطة تحديد وضع السيرفو التي تحتاج إليه ويتم ضبط PWM تلقائيًا بواسطة الاردوينو .
الأشياء التي يتعين علينا القيام بها للحصول على وضع (موضع) position دقيق للسيرفو هي:
نحتاج أولاً إلى تعيين تردد إشارة PWM ولهذا يجب أن نستدعى ملف الرأس “#include <Servo.h>” ، بضم ذلك الملف في البرنامج ، يتم ضبط التردد تلقائيًا وسنستخدم بعض الشروط الخاصة ، والتي تمكن المستخدم من إدخال الموضع المطلوب مباشرة دون أي صعوبة .
نحتاج الآن إلى تعريف اسم كائن من الفئة Servo وليكن “Servo servo” ، هنا servo هو الاسم الذي تم اختياره ، لذلك أثناء الكتابة من أجل الموضع ، سنستخدم هذا الاسم ، وهذه الميزة تكون مفيدة عندما يكون لدينا العديد من محركات السيرفو للتحكم فيها.
الآن نقوم بإخبار الاردوينو بمكان توصيل طرف إشارة السيرفو أو حيث نحتاج إلى إنشاء إشارة PWM. للقيام بذلك ، لدينا الدالة “servo.attach(3);” ، وهنا نبلغ الاردوينو أننا وصلنا طرف إشارة السيرفو بالطرف 3.
كل ما تبقى هو تعيين الموضع position ، سنقوم بتعيين موضع السيرفو باستخدام الدالة “servo.write(30);” ، بهذا الأمر ، يتحرك محور السيرفو 30 درجة. بعد ذلك كلما احتجنا إلى تغيير موضع السيرفو ، نحتاج إلى استدعاء الدالة ”servo.write(needed_position_ angle);” . في هذه الدائرة سيكون لدينا زران يزيد أحدهما من وضعية السيرفو والآخر لتقليل موضع السيرفو .
البرنامج :
مثال رقم 1 :
المطلوب :
التحكم في موضع عامود محرك سيرفو باستخدام زاوية محسوبة في البرنامج . على سبيل المثال ، تريد مستشعرًا على روبوت أن يتأرجح swing عبر قوس أو ينتقل إلى الموضع الذي تحدده.
الحل :
سوف نقوم باستخدم المكتبة Servo التى توزع مع بيئة تطوير الاردوينو . تتيح لك الإصدارات الحديثة من المكتبة توصيل إشارة السيرفو بأي طرف رقمي من Arduino.
الدائرة الكهربية :
البرنامج :
- الكود:
#include <Servo.h>
Servo myservo; // create servo object to control a servo
int angle = 0; // variable to store the servo position
void setup()
{
myservo.attach(9); // attaches the servo on pin 10 to the servo object
}
void loop()
{
for(angle = 0; angle < 180; angle += 1) // goes from 0 degrees to 180 degrees
{ // in steps of 1 degree
myservo.write(angle); // tell servo to go to position in variable 'angle'
delay(20); // waits 20ms between servo commands
}
for(angle = 180; angle >= 1; angle -= 1) // goes from 180 degrees to 0 degrees
{
myservo.write(angle); // tell servo to go to position in variable ' angle '
delay(20); // waits 20ms between servo commands
}
}
فى هذا المثال يتأرجح sweep عامود السيرفو بين 0 و 180 درجة. قد تحتاج إلى إخبار المكتبة بضبط الحد الأدنى والحد الأقصى للمواقع بحيث تحصل على نطاق الحركة الذي تريده. سيؤدي استدعاء الدالة Servo.attach باستخدام الوسائط الاختيارية للحد الأدنى والحد الأقصى من المواضع إلى ضبط الحركة:
- الكود:
myservo.attach(9,1000,2000 ); // use pin 9, set min to 1000us, max to 2000us
نظرًا لأن محركات السيرفو النموذجية تستجيب للنبضات المقاسة بالميكروثانية وليس بالدرجات ، فإن الوسائط التالية لرقم الطرف تُبلغ مكتبة Servo بعدد الثواني التي يجب استخدامها عند طلب 0 درجة أو 180 درجة.
فيما يلي وسائط الدالة servo.attach(pin, min, max) :
• الطرف pin : رقم الطرف المتصل به محرك السيرفو .
• الحد الأدنى (اختيارى) min (optional) : عرض النبضة بالميكرو ثانية المقابلة للزاوية الأدنى (0 درجة) على السيرفو (القيمة الافتراضية 544) .
• الحد الأقصى (اختيارى) max (optional) : عرض النبضة بالميكرو ثانية المقابلة للزاوية الأقصى (180 درجة) على السيرفو (القيمة الافتراضية 2,400) .
مثال رقم 2 : التحكم فى سيرفو أو اثنين بمقاومة متغيرة أو حساس :
المطلوب :
التحكم في اتجاه الدوران وسرعة سيرفو أو اثنين باستخدام مقاومة متغيرة . على سبيل المثال ، تريد التحكم في المنظر وإمالة الكاميرا أو المستشعر المتصلين بمحركات السيرفو . يمكن أن تعمل هذا المثال مع أي جهد متغير من جهاز استشعار يمكن قراءته من مدخل تناظرى .
الحل :
يمكن استخدام نفس المكتبة كما هو الحال في المثال السابق ، مع إضافة كود لقراءة الجهد على المقاومة المتغيرة . هذه القيمة يتم عمل تغيير المقياس scale لها بحيث يتم تعيين موضع المقاومة المتغيرة (من 0 إلى 1023) إلى قيمة تتراوح بين 0 و 180 درجة .
الدائرة الكهربية :
البرنامج :
- الكود:
#include <Servo.h>
Servo myservo; // create servo object to control a servo
int potpin = 0; // analog pin used to connect the potentiometer
int val; // variable to read the value from the analog pin
void setup()
{
myservo.attach(9); // attaches the servo on pin 9 to the servo object
}
void loop()
{
val = analogRead(potpin); // reads the value of the potentiometer
val = map(val, 0, 1023, 0, 179); // scale it to use it with the servo
myservo.write(val); // sets position to the scaled value
delay(15); // waits for the servo to get there
}
مثال رقم 3 :
التحكم في محركات السرفو باستخدام الاردوينو والازرار الضاغطة
في هذا التدريب ، سنتحكم في محرك السيرفو بواسطة ARDUINO UNO. يتم استخدام محركات السيرفو حيث تكون هناك حاجة لحركة أو وضع position عمود دوران بدقة . هذه المحركات ليست للتطبيقات عالية السرعة ، بل لتطبيقات السرعة المنخفضة ، وعزم الدوران المتوسط والوضع الدقيق . يتم استخدام هذه المحركات في آليات أذرع الربوت ، ومتحكمات الطيران وأنظمة التحكم.
الدائرة الكهربية :
في الاردوينو لدينا مكتبة معرفة مسبقًا ، والتي ستقوم بتعيين الترددات ونسب العمل وفقًا لذلك بمجرد استدعاء ملف الرأس أو تضمينه. في الاردوينو ، يتعين علينا ببساطة تحديد وضع السيرفو التي تحتاج إليه ويتم ضبط PWM تلقائيًا بواسطة الاردوينو .
الأشياء التي يتعين علينا القيام بها للحصول على وضع (موضع) position دقيق للسيرفو هي:
- الكود:
#include <Servo.h>
Servo servo;
servo.attach(servo_signal_pin_attached_to);
servo.write(needed_position_ angle);
نحتاج أولاً إلى تعيين تردد إشارة PWM ولهذا يجب أن نستدعى ملف الرأس “#include <Servo.h>” ، بضم ذلك الملف في البرنامج ، يتم ضبط التردد تلقائيًا وسنستخدم بعض الشروط الخاصة ، والتي تمكن المستخدم من إدخال الموضع المطلوب مباشرة دون أي صعوبة .
نحتاج الآن إلى تعريف اسم كائن من الفئة Servo وليكن “Servo servo” ، هنا servo هو الاسم الذي تم اختياره ، لذلك أثناء الكتابة من أجل الموضع ، سنستخدم هذا الاسم ، وهذه الميزة تكون مفيدة عندما يكون لدينا العديد من محركات السيرفو للتحكم فيها.
الآن نقوم بإخبار الاردوينو بمكان توصيل طرف إشارة السيرفو أو حيث نحتاج إلى إنشاء إشارة PWM. للقيام بذلك ، لدينا الدالة “servo.attach(3);” ، وهنا نبلغ الاردوينو أننا وصلنا طرف إشارة السيرفو بالطرف 3.
كل ما تبقى هو تعيين الموضع position ، سنقوم بتعيين موضع السيرفو باستخدام الدالة “servo.write(30);” ، بهذا الأمر ، يتحرك محور السيرفو 30 درجة. بعد ذلك كلما احتجنا إلى تغيير موضع السيرفو ، نحتاج إلى استدعاء الدالة ”servo.write(needed_position_ angle);” . في هذه الدائرة سيكون لدينا زران يزيد أحدهما من وضعية السيرفو والآخر لتقليل موضع السيرفو .
البرنامج :
- الكود:
int i=0;//initializing a integer for incrementing and decrementing duty ratio.
#include <Servo.h>// header file for controlling servo
Servo servo;//defining the name usage as servo itself
void setup()
{
pinMode(3, OUTPUT); // sets the pin3 as output
pinMode(0, INPUT);// sets the pin0 as input
pinMode(1, INPUT);// sets the pin1 as input
servo.attach(3);
}
void loop()
{
servo.write(i);//set servo potion ‘i’ degrees
if (digitalRead(0)==LOW)
{
if (i<180)
{
i++;//if pin0 is pressed and degrees is less than 180
delay(30);
}
}
if (digitalRead(1)==LOW)
{
if (i>0)
{
i--;// if pin1 is pressed and degrees is greater than 0
delay(30);
}
}
}
المحركات الخطوية Stepper Motors
المحركات الخطوية Stepper Motors
المرجع : كتاب الاردوينو من البداية حتى الاحتراف ، د.م/ حسين وفائى
تتميز المحركات الخطوية بأنها تتحرك على شكل خطوات متقطعة حيث يدور المحور بزاوية محددة مع كل نبضة كهربائية يتلقاها أحد ملفات المحرك من دون أية آلية تغذية عكسية feedback كما في محرك السيرفو، وهذا ما يجعل المحرك الخطوي أبسط وأقل تكلفة. تتغير زاوية دوران المحور تبعا لبنية المحرك الداخلية ولكنها محصورة عموما ما بين °0.9 حتى °90. لذلك تستخدم المحركات الخطوية في التطبيقات التي تتطلب دقة في الحركة مثل طابعات 3D ، والبلوتر plotter، ومحركات الأقراص الصلبة والليزرية، والماسح الضوئي scanner، وآلات CNC والروبوتات.
يتألف المحرك الخطوي من جزأين رئيسيين هما: العضو الدوار rotor، والجزء الثابت stator. العضوالدوار عبارة عن مغناطيس دائم، أما الجزء الثابت فيتألف من عدة ملفات تعمل كمغناطيس كهربائي عندما يمر بها تيار كهربائي. تسبب ملفات المغناطيس الكهربائي إلى أن ينحاز الجزء الدوار عندما يتم شحنها كهربائيا. يتم دفع العضوالدوار بالتناوب مع كل ملف يمر من خلاله تيار كهربائي.
يتغير جهد تغذية المحرك كثيرا تبعا لنوعه فقد يكون محصورا ضمن المجال 3V وحتى 10V . ويتغير أيضا التيار المستهلك فى المحرك عموما حسب المقاومة الخاصة بملفات المحرك .
يمكن إجمال مزايا المحرك الخطوي بما يلي :
• يقدم المحرك الخطوي دقة في تحديد الموقع حيث تصل دقة المحرك الخطوي الجيد إلى 3-5% وهذا الخطأ ليس تراكمي من خطوة إلى الأخرى.
• المحرك الخطوي رخيص التكلفة وسهل الاستخدام.
• المحرك الخطوي له عمر استخدام طويل جدا.
• يحافظ المحرك الخطوي على مكانه عندما لا يتم تطبيق نبضات كهربائية .
• لا يتأذى المحرك الخطوي بزيادة التحميل overloading، ويتوقف عن العمل فقط.
• تمتاز المحركات الخطوية بـعزم torque مرتفع عند السرعات المنخفضة.
العيوب :
• يحدث اهتزاز الرنين Resonance إذا لم يتم التحكم بشكل صحيح.
• عزم منخفض عند السرعات العالية.
• من الصعوبة أن يعمل بسرعات عالية.
• فاعلية (كفاءة) منخفضة Low Efficiency: تستهلك استطاعة أكثر مما تقدمه، لذلك تميل للعمل مع وجود حرارة.
يمكن تصنيف المحركات الخطوية إلى:
• محركات خطوية أحادية القطبية Unipolar.
• محركات خطوية ثنائية القطبية Bipolar.
سنتكلم في الفقرات التالية عن المحركات الخطوية التي تتحرك بـخطوة 90 درجة للتبسيط، مع العلم أن المحركات الأخرى لن تختلف عنها كثيرا وخصوصا أثناء قيادتها بلوحة الاردوينو .
المحرك الخطوى أحادى القطبية Unipolar Stepper Motor
يمر التيار في ملفات المحرك الخطوي أحادي القطبية باتجاه واحد لهذا تم تسميته بهذا الاسم. يتميز بأنه بسيط جدا، ومن مساوئه أن عزمه أقل لأنه لا يمكن تنشيط أكثر من نصف الملفات بنفس الوقت. يخرج من المحرك خمسة أو ستة أسلاك أو ثمانية أسلاك. في المحرك خماسي الأسلاك ترتبط الملفات بأحد أطرافها معا ويخرج منها سلك مشترك، والأسلاك الأربعة المتبقية لأطراف الملفات الأخرى. في المحرك سداسي الأسلاك يتشارك ملفان بأطرافهما بسلك مشترك، والملفان الآخران يتشاركان بسلك مشترك، والأسلاك الأربعة المتبقية لأطراف الملفات الأربعة الأخرى. عند وصل السلكين المشتركين معا سنحصل على محرك خماسي الأسلاك . في المحرك ثماني الأسلاك تكون الملفات مستقلة وكل سلكين في الخرج يمثلان ملف من الملفات الأربعة. يوضح الشكل محركات خطوية أحادية القطبية بأربعة ملفات خماسية وسداسية وثمانية الأسلاك.
يتم تنشيط الملفات الأربعة بطرق مختلفة هي :
• إثارة ملف واحد Wave drive or Single-Coil Excitation .
• خطوة كاملة Full step drive .
• نصف خطوة Half stepping .
• خطوة دقيقة Micro-stepping .
طريقة إثارة ملف واحد:
في هذه الطريقة يتم تطبيق جهد على ملف واحد (تنشيط ملف واحد) في كل مرة. نادرا ما تستخدم هذه الطريقة لأنها تقدم أقل من نصف عزم الدوران الاسمي للمحرك، بالتالي فإن حمولة المحرك لا يمكن أن تكون كبيرة. عموما تستخدم هذه الطريقة لحفظ الطاقة. يتم إتمام دورة كاملة على 4 مراحل. يبين الشكل كيفية عمل هذه الطريقة، والقيم المطلوب تطبيقها على الملفات الأربعة في كل مرحلة.
طريقة تحريك بخطوة كاملة:
هذه الطريقة الأكثر استخداما . يتم في هذه الطريقة تطبيق جهد على ملفين (أي تنشيط ملفين) في كل مرة، وهو ما يؤدي إلى الحصول على عزم اسمي كامل (%100) للمحرك. يتم إتمام دورة كاملة على 4 مراحل. يبين الشكل كيفية عمل هذه الطريقة، والقيم المطلوب تطبيقها على الملفات الأربعة في كل مرحلة.
طريقة تحريك بنصف خطوة:
تسمح هذه الطريقة بالحصول على دقة موقع مضاعفة من دون أي تغيير في التركيبية المادية للمحرك، حيث يتحرك المحرك بمقدار نصف خطوة بالمقارنة مع الطريقتين السابقتين. يتم إتمام دورة كاملة على 8 مراحل. يبين الشكل كيفية عمل هذه الطريقة، والقيم المطلوب تطبيقها على الملفات الأربعة في كل مرحلة.
طريقة Microstepping:
لا يتم في هذه الطريقة تغذية الملفات بنبضات وإنما بإشارة تشبه إشارة sin. بهذا الإسلوب يتم الانتقال من خطوة إلى الأخرى بشكل أنعم، وهذا ما يجعل المحرك الخطوي مناسبا للتطبيقات ذات الدقة العالية مثل أنظمة CNC. يدور المحرك الخطوي في هذه الطريقة بشكل مستمر تقريبا مثل محركات DC البسيطة.
يستجر المحرك الخطوي - كما في محركات التيار المستمر- تيارا لا بأس به لا تستطيع لوحة الاردوينو تأمينه لهذا لابد من استخدام دائرة عزل ما بين المتحكم و المحرك تؤمن له هذا التيار. هناك طرق عديدة يمكن بها تنفيذ دائرة العزل: ترانزستورات أو دائرات متكاملة مثل L293 أو UL2003.
سنستخدم دائرة ULN2003 التي تمتاز برخصها مقارنة مع L293.
الدائرة المتكاملة ULN2003
تتكون الدائرة المتكاملة ULN2003 من سبع بوابات التي تتصف بأنها تعمل كمصب للتيار فقط. القيمة العظمى للتيار 500 mA . يوضح الشكل بنية الدائرة ULN2003 وتوز يع أرجلها:
تعمل الأرجل من 1 و حتى 7 كمداخل لبوابات الدائرة، والأرجل من 10 وحتى 16 كمخارج للبوابات. الرجل رقم 8 يتم وصلها إلى الأرضي المشترك. الرجل 9 تتصل مع مهابط ثنائيات، من الممكن عدم وصل هذه الرجل ، أو قد يتم وصلها مع تغذية المحرك كما سنرى لاحقا. يوضح الجدول كيفية عمل البوابة.
لإيضاح عمل بوابة دارة ULN2003 لندرس الحالتين التاليتين والتي سنتحكم فيها بثنائي ضوئي من خلال الجهد المطبق على مدخل البوابة الأولى.
1- بفرض أن الجهد المطبق على مدخل البوابة الأولى5V (High level) كما هو موضح في الشكل . عندئذ فإن خرج البوابة الأولى على الرجل 16 هو Low level) 0V). تبعا لذلك سيضيئ الثنائي الضوئي حيث عملت بوابة دائرة ULN2003 على تأمين مصب للتيار إلى الأرضي .
2- بفرض أن الجهد المطبق على مدخل البوابة الأولى Low level 0V كما هو موضح في الشكل . عندئذ فإن خرج البوابة الأولى على الرجل 16 هو ممانعة عالية high impedance. تبعا لذلك لن يضيء الثنائي الضوئي حيث لم يتم تأمين مصب للتيار.
الجهد المطبق على الرجل 1 (مدخل البوابة الأولى) هو ((Low 0V و بالتالي الخرج على الرجل 16 (مخرج البوابة الأولى) هو High Z أي كأنها رجل عائمة . الثنائي الضوئي لا يعمل لأنه لم يتم تأمين مصب للتيار.
لا يمكن استخدام دارة ULN2003 مع المحرك المستمر لكي يتحرك باتجاهين وذلك لأنها تسمح بمرور التيار باتجاه واحد فقط وبالتالي فهي مناسبة للمحركات الخطوية أحادية القطبية.
التحكم بالمحرك الخطوي أحادي القطبية وسرعته من خلال لوحة الأردوينو
يبين الشكل أدناه مخطط التوصيل العملي للوحة الأردوينو مع دارة القيادة ULN2003 والمحرك الخطوي أحادي القطبية سداسي الأسلاك. تم ربط المنافذ 0,1,2,3 مع مداخل بوابات دارة ULN2003، والمخارج مع أربعة أسلاك للمحرك. السلكان المشتركان تم وصلهما إلى التغذية +9V . تم وصل الرجل 8 لدارة ULN2003 مع الأرضي، والرجل 9 إلى التغذية +9V وذلك للتخلص من الحقل الكهربائي المغناطيسي العودي. عند تطبيق +5V (1 منطقى) على المنافذ 0,1,2,3 سيكون خرج البوابات 0V مما يسمح بمرور تيار في ملفات المحرك، أما عند تطبيق 0V (0 منطقى) على المنافذ 0,1,2,3 سيكون خرج البوابات ممانعة عالية ولن يمر تيار في الملفات. يتم اختيار إحدى طرق تنشيط الملفات المذكورة سابقا (ملف واحد، خطوة كاملة، نصف خطوة) وبرمجة لوحة الأردوينو تبعل لذلك .
يتم التحكم بجهة دوران المحرك (مع أو عكس عقارب الساعة) من خلال ترتيب تنشيط الملفات الواحد تلو الآخر، ويتم التحكم بسرعة المحرك من خلال تغيير التأخير الزمني ما بين كل مرحلة من مراحل الدورة.
يبين الشكل أدناه مخطط التوصيل العملي للوحة الأردوينو مع لوحة L298N والمحرك الخطوي أحادي القطبية. تم ربط المنافذ 0,1,2,3 مع أرجل الدخل المنطقية للوحة (IN1,IN2,IN3,IN4) والمخارج (OUT1,OUT2,OUT3,OUT4) مع أربعة أسلاك للمحرك .
السلكان المشتركان للمحرك تم وصلهما إلى التغذية +9V تم المحافظة على الوصلة jumper) 7)، والوصلة jumper) 12) بحيث يتم تفعيل جميع المخارج. تم تزويد اللوحة بمنبع تغذية +9V على الرجل 4 والذي من خلاله يتم تغذية المحرك. تم المحافظة على الوصلة jumper) 3)، وهذا يعني أنه سيتم تفعيل منظم الجهد الداخلي للوحة +5V وبالتالي لا يوجد حاجة لتغذيتها بجهد +5V . إذا تم نز ع هذه الوصلة لابد من تأمين تغذية +5V على الرجل 6.
المرجع : كتاب الاردوينو من البداية حتى الاحتراف ، د.م/ حسين وفائى
تتميز المحركات الخطوية بأنها تتحرك على شكل خطوات متقطعة حيث يدور المحور بزاوية محددة مع كل نبضة كهربائية يتلقاها أحد ملفات المحرك من دون أية آلية تغذية عكسية feedback كما في محرك السيرفو، وهذا ما يجعل المحرك الخطوي أبسط وأقل تكلفة. تتغير زاوية دوران المحور تبعا لبنية المحرك الداخلية ولكنها محصورة عموما ما بين °0.9 حتى °90. لذلك تستخدم المحركات الخطوية في التطبيقات التي تتطلب دقة في الحركة مثل طابعات 3D ، والبلوتر plotter، ومحركات الأقراص الصلبة والليزرية، والماسح الضوئي scanner، وآلات CNC والروبوتات.
يتألف المحرك الخطوي من جزأين رئيسيين هما: العضو الدوار rotor، والجزء الثابت stator. العضوالدوار عبارة عن مغناطيس دائم، أما الجزء الثابت فيتألف من عدة ملفات تعمل كمغناطيس كهربائي عندما يمر بها تيار كهربائي. تسبب ملفات المغناطيس الكهربائي إلى أن ينحاز الجزء الدوار عندما يتم شحنها كهربائيا. يتم دفع العضوالدوار بالتناوب مع كل ملف يمر من خلاله تيار كهربائي.
يتغير جهد تغذية المحرك كثيرا تبعا لنوعه فقد يكون محصورا ضمن المجال 3V وحتى 10V . ويتغير أيضا التيار المستهلك فى المحرك عموما حسب المقاومة الخاصة بملفات المحرك .
يمكن إجمال مزايا المحرك الخطوي بما يلي :
• يقدم المحرك الخطوي دقة في تحديد الموقع حيث تصل دقة المحرك الخطوي الجيد إلى 3-5% وهذا الخطأ ليس تراكمي من خطوة إلى الأخرى.
• المحرك الخطوي رخيص التكلفة وسهل الاستخدام.
• المحرك الخطوي له عمر استخدام طويل جدا.
• يحافظ المحرك الخطوي على مكانه عندما لا يتم تطبيق نبضات كهربائية .
• لا يتأذى المحرك الخطوي بزيادة التحميل overloading، ويتوقف عن العمل فقط.
• تمتاز المحركات الخطوية بـعزم torque مرتفع عند السرعات المنخفضة.
العيوب :
• يحدث اهتزاز الرنين Resonance إذا لم يتم التحكم بشكل صحيح.
• عزم منخفض عند السرعات العالية.
• من الصعوبة أن يعمل بسرعات عالية.
• فاعلية (كفاءة) منخفضة Low Efficiency: تستهلك استطاعة أكثر مما تقدمه، لذلك تميل للعمل مع وجود حرارة.
يمكن تصنيف المحركات الخطوية إلى:
• محركات خطوية أحادية القطبية Unipolar.
• محركات خطوية ثنائية القطبية Bipolar.
سنتكلم في الفقرات التالية عن المحركات الخطوية التي تتحرك بـخطوة 90 درجة للتبسيط، مع العلم أن المحركات الأخرى لن تختلف عنها كثيرا وخصوصا أثناء قيادتها بلوحة الاردوينو .
المحرك الخطوى أحادى القطبية Unipolar Stepper Motor
يمر التيار في ملفات المحرك الخطوي أحادي القطبية باتجاه واحد لهذا تم تسميته بهذا الاسم. يتميز بأنه بسيط جدا، ومن مساوئه أن عزمه أقل لأنه لا يمكن تنشيط أكثر من نصف الملفات بنفس الوقت. يخرج من المحرك خمسة أو ستة أسلاك أو ثمانية أسلاك. في المحرك خماسي الأسلاك ترتبط الملفات بأحد أطرافها معا ويخرج منها سلك مشترك، والأسلاك الأربعة المتبقية لأطراف الملفات الأخرى. في المحرك سداسي الأسلاك يتشارك ملفان بأطرافهما بسلك مشترك، والملفان الآخران يتشاركان بسلك مشترك، والأسلاك الأربعة المتبقية لأطراف الملفات الأربعة الأخرى. عند وصل السلكين المشتركين معا سنحصل على محرك خماسي الأسلاك . في المحرك ثماني الأسلاك تكون الملفات مستقلة وكل سلكين في الخرج يمثلان ملف من الملفات الأربعة. يوضح الشكل محركات خطوية أحادية القطبية بأربعة ملفات خماسية وسداسية وثمانية الأسلاك.
يتم تنشيط الملفات الأربعة بطرق مختلفة هي :
• إثارة ملف واحد Wave drive or Single-Coil Excitation .
• خطوة كاملة Full step drive .
• نصف خطوة Half stepping .
• خطوة دقيقة Micro-stepping .
طريقة إثارة ملف واحد:
في هذه الطريقة يتم تطبيق جهد على ملف واحد (تنشيط ملف واحد) في كل مرة. نادرا ما تستخدم هذه الطريقة لأنها تقدم أقل من نصف عزم الدوران الاسمي للمحرك، بالتالي فإن حمولة المحرك لا يمكن أن تكون كبيرة. عموما تستخدم هذه الطريقة لحفظ الطاقة. يتم إتمام دورة كاملة على 4 مراحل. يبين الشكل كيفية عمل هذه الطريقة، والقيم المطلوب تطبيقها على الملفات الأربعة في كل مرحلة.
طريقة تحريك بخطوة كاملة:
هذه الطريقة الأكثر استخداما . يتم في هذه الطريقة تطبيق جهد على ملفين (أي تنشيط ملفين) في كل مرة، وهو ما يؤدي إلى الحصول على عزم اسمي كامل (%100) للمحرك. يتم إتمام دورة كاملة على 4 مراحل. يبين الشكل كيفية عمل هذه الطريقة، والقيم المطلوب تطبيقها على الملفات الأربعة في كل مرحلة.
طريقة تحريك بنصف خطوة:
تسمح هذه الطريقة بالحصول على دقة موقع مضاعفة من دون أي تغيير في التركيبية المادية للمحرك، حيث يتحرك المحرك بمقدار نصف خطوة بالمقارنة مع الطريقتين السابقتين. يتم إتمام دورة كاملة على 8 مراحل. يبين الشكل كيفية عمل هذه الطريقة، والقيم المطلوب تطبيقها على الملفات الأربعة في كل مرحلة.
طريقة Microstepping:
لا يتم في هذه الطريقة تغذية الملفات بنبضات وإنما بإشارة تشبه إشارة sin. بهذا الإسلوب يتم الانتقال من خطوة إلى الأخرى بشكل أنعم، وهذا ما يجعل المحرك الخطوي مناسبا للتطبيقات ذات الدقة العالية مثل أنظمة CNC. يدور المحرك الخطوي في هذه الطريقة بشكل مستمر تقريبا مثل محركات DC البسيطة.
يستجر المحرك الخطوي - كما في محركات التيار المستمر- تيارا لا بأس به لا تستطيع لوحة الاردوينو تأمينه لهذا لابد من استخدام دائرة عزل ما بين المتحكم و المحرك تؤمن له هذا التيار. هناك طرق عديدة يمكن بها تنفيذ دائرة العزل: ترانزستورات أو دائرات متكاملة مثل L293 أو UL2003.
سنستخدم دائرة ULN2003 التي تمتاز برخصها مقارنة مع L293.
الدائرة المتكاملة ULN2003
تتكون الدائرة المتكاملة ULN2003 من سبع بوابات التي تتصف بأنها تعمل كمصب للتيار فقط. القيمة العظمى للتيار 500 mA . يوضح الشكل بنية الدائرة ULN2003 وتوز يع أرجلها:
تعمل الأرجل من 1 و حتى 7 كمداخل لبوابات الدائرة، والأرجل من 10 وحتى 16 كمخارج للبوابات. الرجل رقم 8 يتم وصلها إلى الأرضي المشترك. الرجل 9 تتصل مع مهابط ثنائيات، من الممكن عدم وصل هذه الرجل ، أو قد يتم وصلها مع تغذية المحرك كما سنرى لاحقا. يوضح الجدول كيفية عمل البوابة.
لإيضاح عمل بوابة دارة ULN2003 لندرس الحالتين التاليتين والتي سنتحكم فيها بثنائي ضوئي من خلال الجهد المطبق على مدخل البوابة الأولى.
1- بفرض أن الجهد المطبق على مدخل البوابة الأولى5V (High level) كما هو موضح في الشكل . عندئذ فإن خرج البوابة الأولى على الرجل 16 هو Low level) 0V). تبعا لذلك سيضيئ الثنائي الضوئي حيث عملت بوابة دائرة ULN2003 على تأمين مصب للتيار إلى الأرضي .
2- بفرض أن الجهد المطبق على مدخل البوابة الأولى Low level 0V كما هو موضح في الشكل . عندئذ فإن خرج البوابة الأولى على الرجل 16 هو ممانعة عالية high impedance. تبعا لذلك لن يضيء الثنائي الضوئي حيث لم يتم تأمين مصب للتيار.
الجهد المطبق على الرجل 1 (مدخل البوابة الأولى) هو ((Low 0V و بالتالي الخرج على الرجل 16 (مخرج البوابة الأولى) هو High Z أي كأنها رجل عائمة . الثنائي الضوئي لا يعمل لأنه لم يتم تأمين مصب للتيار.
لا يمكن استخدام دارة ULN2003 مع المحرك المستمر لكي يتحرك باتجاهين وذلك لأنها تسمح بمرور التيار باتجاه واحد فقط وبالتالي فهي مناسبة للمحركات الخطوية أحادية القطبية.
التحكم بالمحرك الخطوي أحادي القطبية وسرعته من خلال لوحة الأردوينو
يبين الشكل أدناه مخطط التوصيل العملي للوحة الأردوينو مع دارة القيادة ULN2003 والمحرك الخطوي أحادي القطبية سداسي الأسلاك. تم ربط المنافذ 0,1,2,3 مع مداخل بوابات دارة ULN2003، والمخارج مع أربعة أسلاك للمحرك. السلكان المشتركان تم وصلهما إلى التغذية +9V . تم وصل الرجل 8 لدارة ULN2003 مع الأرضي، والرجل 9 إلى التغذية +9V وذلك للتخلص من الحقل الكهربائي المغناطيسي العودي. عند تطبيق +5V (1 منطقى) على المنافذ 0,1,2,3 سيكون خرج البوابات 0V مما يسمح بمرور تيار في ملفات المحرك، أما عند تطبيق 0V (0 منطقى) على المنافذ 0,1,2,3 سيكون خرج البوابات ممانعة عالية ولن يمر تيار في الملفات. يتم اختيار إحدى طرق تنشيط الملفات المذكورة سابقا (ملف واحد، خطوة كاملة، نصف خطوة) وبرمجة لوحة الأردوينو تبعل لذلك .
يتم التحكم بجهة دوران المحرك (مع أو عكس عقارب الساعة) من خلال ترتيب تنشيط الملفات الواحد تلو الآخر، ويتم التحكم بسرعة المحرك من خلال تغيير التأخير الزمني ما بين كل مرحلة من مراحل الدورة.
يبين الشكل أدناه مخطط التوصيل العملي للوحة الأردوينو مع لوحة L298N والمحرك الخطوي أحادي القطبية. تم ربط المنافذ 0,1,2,3 مع أرجل الدخل المنطقية للوحة (IN1,IN2,IN3,IN4) والمخارج (OUT1,OUT2,OUT3,OUT4) مع أربعة أسلاك للمحرك .
السلكان المشتركان للمحرك تم وصلهما إلى التغذية +9V تم المحافظة على الوصلة jumper) 7)، والوصلة jumper) 12) بحيث يتم تفعيل جميع المخارج. تم تزويد اللوحة بمنبع تغذية +9V على الرجل 4 والذي من خلاله يتم تغذية المحرك. تم المحافظة على الوصلة jumper) 3)، وهذا يعني أنه سيتم تفعيل منظم الجهد الداخلي للوحة +5V وبالتالي لا يوجد حاجة لتغذيتها بجهد +5V . إذا تم نز ع هذه الوصلة لابد من تأمين تغذية +5V على الرجل 6.
المحركات الخطوية Stepper Motors
المحركات الخطوية Stepper Motors
المرجع : كتاب الاردوينو من البداية حتى الاحتراف ، د.م/ حسين وفائى
تتميز المحركات الخطوية بأنها تتحرك على شكل خطوات متقطعة حيث يدور المحور بزاوية محددة مع كل نبضة كهربائية يتلقاها أحد ملفات المحرك من دون أية آلية تغذية عكسية feedback كما في محرك السيرفو، وهذا ما يجعل المحرك الخطوي أبسط وأقل تكلفة. تتغير زاوية دوران المحور تبعا لبنية المحرك الداخلية ولكنها محصورة عموما ما بين °0.9 حتى °90. لذلك تستخدم المحركات الخطوية في التطبيقات التي تتطلب دقة في الحركة مثل طابعات 3D ، والبلوتر plotter، ومحركات الأقراص الصلبة والليزرية، والماسح الضوئي scanner، وآلات CNC والروبوتات.
يتألف المحرك الخطوي من جزأين رئيسيين هما: العضو الدوار rotor، والجزء الثابت stator. العضوالدوار عبارة عن مغناطيس دائم، أما الجزء الثابت فيتألف من عدة ملفات تعمل كمغناطيس كهربائي عندما يمر بها تيار كهربائي. تسبب ملفات المغناطيس الكهربائي إلى أن ينحاز الجزء الدوار عندما يتم شحنها كهربائيا. يتم دفع العضوالدوار بالتناوب مع كل ملف يمر من خلاله تيار كهربائي.
يتغير جهد تغذية المحرك كثيرا تبعا لنوعه فقد يكون محصورا ضمن المجال 3V وحتى 10V . ويتغير أيضا التيار المستهلك فى المحرك عموما حسب المقاومة الخاصة بملفات المحرك .
يمكن إجمال مزايا المحرك الخطوي بما يلي :
• يقدم المحرك الخطوي دقة في تحديد الموقع حيث تصل دقة المحرك الخطوي الجيد إلى 3-5% وهذا الخطأ ليس تراكمي من خطوة إلى الأخرى.
• المحرك الخطوي رخيص التكلفة وسهل الاستخدام.
• المحرك الخطوي له عمر استخدام طويل جدا.
• يحافظ المحرك الخطوي على مكانه عندما لا يتم تطبيق نبضات كهربائية .
• لا يتأذى المحرك الخطوي بزيادة التحميل overloading، ويتوقف عن العمل فقط.
• تمتاز المحركات الخطوية بـعزم torque مرتفع عند السرعات المنخفضة.
العيوب :
• يحدث اهتزاز الرنين Resonance إذا لم يتم التحكم بشكل صحيح.
• عزم منخفض عند السرعات العالية.
• من الصعوبة أن يعمل بسرعات عالية.
• فاعلية (كفاءة) منخفضة Low Efficiency: تستهلك استطاعة أكثر مما تقدمه، لذلك تميل للعمل مع وجود حرارة.
يمكن تصنيف المحركات الخطوية إلى:
• محركات خطوية أحادية القطبية Unipolar.
• محركات خطوية ثنائية القطبية Bipolar.
سنتكلم في الفقرات التالية عن المحركات الخطوية التي تتحرك بـخطوة 90 درجة للتبسيط، مع العلم أن المحركات الأخرى لن تختلف عنها كثيرا وخصوصا أثناء قيادتها بلوحة الاردوينو .
المحرك الخطوى أحادى القطبية Unipolar Stepper Motor
يمر التيار في ملفات المحرك الخطوي أحادي القطبية باتجاه واحد لهذا تم تسميته بهذا الاسم. يتميز بأنه بسيط جدا، ومن مساوئه أن عزمه أقل لأنه لا يمكن تنشيط أكثر من نصف الملفات بنفس الوقت. يخرج من المحرك خمسة أو ستة أسلاك أو ثمانية أسلاك. في المحرك خماسي الأسلاك ترتبط الملفات بأحد أطرافها معا ويخرج منها سلك مشترك، والأسلاك الأربعة المتبقية لأطراف الملفات الأخرى. في المحرك سداسي الأسلاك يتشارك ملفان بأطرافهما بسلك مشترك، والملفان الآخران يتشاركان بسلك مشترك، والأسلاك الأربعة المتبقية لأطراف الملفات الأربعة الأخرى. عند وصل السلكين المشتركين معا سنحصل على محرك خماسي الأسلاك . في المحرك ثماني الأسلاك تكون الملفات مستقلة وكل سلكين في الخرج يمثلان ملف من الملفات الأربعة. يوضح الشكل محركات خطوية أحادية القطبية بأربعة ملفات خماسية وسداسية وثمانية الأسلاك.
يتم تنشيط الملفات الأربعة بطرق مختلفة هي :
• إثارة ملف واحد Wave drive or Single-Coil Excitation .
• خطوة كاملة Full step drive .
• نصف خطوة Half stepping .
• خطوة دقيقة Micro-stepping .
طريقة إثارة ملف واحد:
في هذه الطريقة يتم تطبيق جهد على ملف واحد (تنشيط ملف واحد) في كل مرة. نادرا ما تستخدم هذه الطريقة لأنها تقدم أقل من نصف عزم الدوران الاسمي للمحرك، بالتالي فإن حمولة المحرك لا يمكن أن تكون كبيرة. عموما تستخدم هذه الطريقة لحفظ الطاقة. يتم إتمام دورة كاملة على 4 مراحل. يبين الشكل كيفية عمل هذه الطريقة، والقيم المطلوب تطبيقها على الملفات الأربعة في كل مرحلة.
طريقة تحريك بخطوة كاملة:
هذه الطريقة الأكثر استخداما . يتم في هذه الطريقة تطبيق جهد على ملفين (أي تنشيط ملفين) في كل مرة، وهو ما يؤدي إلى الحصول على عزم اسمي كامل (%100) للمحرك. يتم إتمام دورة كاملة على 4 مراحل. يبين الشكل كيفية عمل هذه الطريقة، والقيم المطلوب تطبيقها على الملفات الأربعة في كل مرحلة.
طريقة تحريك بنصف خطوة:
تسمح هذه الطريقة بالحصول على دقة موقع مضاعفة من دون أي تغيير في التركيبية المادية للمحرك، حيث يتحرك المحرك بمقدار نصف خطوة بالمقارنة مع الطريقتين السابقتين. يتم إتمام دورة كاملة على 8 مراحل. يبين الشكل كيفية عمل هذه الطريقة، والقيم المطلوب تطبيقها على الملفات الأربعة في كل مرحلة.
طريقة Microstepping:
لا يتم في هذه الطريقة تغذية الملفات بنبضات وإنما بإشارة تشبه إشارة sin. بهذا الإسلوب يتم الانتقال من خطوة إلى الأخرى بشكل أنعم، وهذا ما يجعل المحرك الخطوي مناسبا للتطبيقات ذات الدقة العالية مثل أنظمة CNC. يدور المحرك الخطوي في هذه الطريقة بشكل مستمر تقريبا مثل محركات DC البسيطة.
يستجر المحرك الخطوي - كما في محركات التيار المستمر- تيارا لا بأس به لا تستطيع لوحة الاردوينو تأمينه لهذا لابد من استخدام دائرة عزل ما بين المتحكم و المحرك تؤمن له هذا التيار. هناك طرق عديدة يمكن بها تنفيذ دائرة العزل: ترانزستورات أو دائرات متكاملة مثل L293 أو UL2003.
سنستخدم دائرة ULN2003 التي تمتاز برخصها مقارنة مع L293.
الدائرة المتكاملة ULN2003
تتكون الدائرة المتكاملة ULN2003 من سبع بوابات التي تتصف بأنها تعمل كمصب للتيار فقط. القيمة العظمى للتيار 500 mA . يوضح الشكل بنية الدائرة ULN2003 وتوز يع أرجلها:
تعمل الأرجل من 1 و حتى 7 كمداخل لبوابات الدائرة، والأرجل من 10 وحتى 16 كمخارج للبوابات. الرجل رقم 8 يتم وصلها إلى الأرضي المشترك. الرجل 9 تتصل مع مهابط ثنائيات، من الممكن عدم وصل هذه الرجل ، أو قد يتم وصلها مع تغذية المحرك كما سنرى لاحقا. يوضح الجدول كيفية عمل البوابة.
لإيضاح عمل بوابة دارة ULN2003 لندرس الحالتين التاليتين والتي سنتحكم فيها بثنائي ضوئي من خلال الجهد المطبق على مدخل البوابة الأولى.
1- بفرض أن الجهد المطبق على مدخل البوابة الأولى5V (High level) كما هو موضح في الشكل . عندئذ فإن خرج البوابة الأولى على الرجل 16 هو Low level) 0V). تبعا لذلك سيضيئ الثنائي الضوئي حيث عملت بوابة دائرة ULN2003 على تأمين مصب للتيار إلى الأرضي .
2- بفرض أن الجهد المطبق على مدخل البوابة الأولى Low level 0V كما هو موضح في الشكل . عندئذ فإن خرج البوابة الأولى على الرجل 16 هو ممانعة عالية high impedance. تبعا لذلك لن يضيء الثنائي الضوئي حيث لم يتم تأمين مصب للتيار.
الجهد المطبق على الرجل 1 (مدخل البوابة الأولى) هو ((Low 0V و بالتالي الخرج على الرجل 16 (مخرج البوابة الأولى) هو High Z أي كأنها رجل عائمة . الثنائي الضوئي لا يعمل لأنه لم يتم تأمين مصب للتيار.
لا يمكن استخدام دارة ULN2003 مع المحرك المستمر لكي يتحرك باتجاهين وذلك لأنها تسمح بمرور التيار باتجاه واحد فقط وبالتالي فهي مناسبة للمحركات الخطوية أحادية القطبية.
التحكم بالمحرك الخطوي أحادي القطبية وسرعته من خلال لوحة الأردوينو
يبين الشكل أدناه مخطط التوصيل العملي للوحة الأردوينو مع دارة القيادة ULN2003 والمحرك الخطوي أحادي القطبية سداسي الأسلاك. تم ربط المنافذ 0,1,2,3 مع مداخل بوابات دارة ULN2003، والمخارج مع أربعة أسلاك للمحرك. السلكان المشتركان تم وصلهما إلى التغذية +9V . تم وصل الرجل 8 لدارة ULN2003 مع الأرضي، والرجل 9 إلى التغذية +9V وذلك للتخلص من الحقل الكهربائي المغناطيسي العودي. عند تطبيق +5V (1 منطقى) على المنافذ 0,1,2,3 سيكون خرج البوابات 0V مما يسمح بمرور تيار في ملفات المحرك، أما عند تطبيق 0V (0 منطقى) على المنافذ 0,1,2,3 سيكون خرج البوابات ممانعة عالية ولن يمر تيار في الملفات. يتم اختيار إحدى طرق تنشيط الملفات المذكورة سابقا (ملف واحد، خطوة كاملة، نصف خطوة) وبرمجة لوحة الأردوينو تبعل لذلك .
يتم التحكم بجهة دوران المحرك (مع أو عكس عقارب الساعة) من خلال ترتيب تنشيط الملفات الواحد تلو الآخر، ويتم التحكم بسرعة المحرك من خلال تغيير التأخير الزمني ما بين كل مرحلة من مراحل الدورة.
يبين الشكل أدناه مخطط التوصيل العملي للوحة الأردوينو مع لوحة L298N والمحرك الخطوي أحادي القطبية. تم ربط المنافذ 0,1,2,3 مع أرجل الدخل المنطقية للوحة (IN1,IN2,IN3,IN4) والمخارج (OUT1,OUT2,OUT3,OUT4) مع أربعة أسلاك للمحرك .
السلكان المشتركان للمحرك تم وصلهما إلى التغذية +9V تم المحافظة على الوصلة jumper) 7)، والوصلة jumper) 12) بحيث يتم تفعيل جميع المخارج. تم تزويد اللوحة بمنبع تغذية +9V على الرجل 4 والذي من خلاله يتم تغذية المحرك. تم المحافظة على الوصلة jumper) 3)، وهذا يعني أنه سيتم تفعيل منظم الجهد الداخلي للوحة +5V وبالتالي لا يوجد حاجة لتغذيتها بجهد +5V . إذا تم نز ع هذه الوصلة لابد من تأمين تغذية +5V على الرجل 6.
المرجع : كتاب الاردوينو من البداية حتى الاحتراف ، د.م/ حسين وفائى
تتميز المحركات الخطوية بأنها تتحرك على شكل خطوات متقطعة حيث يدور المحور بزاوية محددة مع كل نبضة كهربائية يتلقاها أحد ملفات المحرك من دون أية آلية تغذية عكسية feedback كما في محرك السيرفو، وهذا ما يجعل المحرك الخطوي أبسط وأقل تكلفة. تتغير زاوية دوران المحور تبعا لبنية المحرك الداخلية ولكنها محصورة عموما ما بين °0.9 حتى °90. لذلك تستخدم المحركات الخطوية في التطبيقات التي تتطلب دقة في الحركة مثل طابعات 3D ، والبلوتر plotter، ومحركات الأقراص الصلبة والليزرية، والماسح الضوئي scanner، وآلات CNC والروبوتات.
يتألف المحرك الخطوي من جزأين رئيسيين هما: العضو الدوار rotor، والجزء الثابت stator. العضوالدوار عبارة عن مغناطيس دائم، أما الجزء الثابت فيتألف من عدة ملفات تعمل كمغناطيس كهربائي عندما يمر بها تيار كهربائي. تسبب ملفات المغناطيس الكهربائي إلى أن ينحاز الجزء الدوار عندما يتم شحنها كهربائيا. يتم دفع العضوالدوار بالتناوب مع كل ملف يمر من خلاله تيار كهربائي.
يتغير جهد تغذية المحرك كثيرا تبعا لنوعه فقد يكون محصورا ضمن المجال 3V وحتى 10V . ويتغير أيضا التيار المستهلك فى المحرك عموما حسب المقاومة الخاصة بملفات المحرك .
يمكن إجمال مزايا المحرك الخطوي بما يلي :
• يقدم المحرك الخطوي دقة في تحديد الموقع حيث تصل دقة المحرك الخطوي الجيد إلى 3-5% وهذا الخطأ ليس تراكمي من خطوة إلى الأخرى.
• المحرك الخطوي رخيص التكلفة وسهل الاستخدام.
• المحرك الخطوي له عمر استخدام طويل جدا.
• يحافظ المحرك الخطوي على مكانه عندما لا يتم تطبيق نبضات كهربائية .
• لا يتأذى المحرك الخطوي بزيادة التحميل overloading، ويتوقف عن العمل فقط.
• تمتاز المحركات الخطوية بـعزم torque مرتفع عند السرعات المنخفضة.
العيوب :
• يحدث اهتزاز الرنين Resonance إذا لم يتم التحكم بشكل صحيح.
• عزم منخفض عند السرعات العالية.
• من الصعوبة أن يعمل بسرعات عالية.
• فاعلية (كفاءة) منخفضة Low Efficiency: تستهلك استطاعة أكثر مما تقدمه، لذلك تميل للعمل مع وجود حرارة.
يمكن تصنيف المحركات الخطوية إلى:
• محركات خطوية أحادية القطبية Unipolar.
• محركات خطوية ثنائية القطبية Bipolar.
سنتكلم في الفقرات التالية عن المحركات الخطوية التي تتحرك بـخطوة 90 درجة للتبسيط، مع العلم أن المحركات الأخرى لن تختلف عنها كثيرا وخصوصا أثناء قيادتها بلوحة الاردوينو .
المحرك الخطوى أحادى القطبية Unipolar Stepper Motor
يمر التيار في ملفات المحرك الخطوي أحادي القطبية باتجاه واحد لهذا تم تسميته بهذا الاسم. يتميز بأنه بسيط جدا، ومن مساوئه أن عزمه أقل لأنه لا يمكن تنشيط أكثر من نصف الملفات بنفس الوقت. يخرج من المحرك خمسة أو ستة أسلاك أو ثمانية أسلاك. في المحرك خماسي الأسلاك ترتبط الملفات بأحد أطرافها معا ويخرج منها سلك مشترك، والأسلاك الأربعة المتبقية لأطراف الملفات الأخرى. في المحرك سداسي الأسلاك يتشارك ملفان بأطرافهما بسلك مشترك، والملفان الآخران يتشاركان بسلك مشترك، والأسلاك الأربعة المتبقية لأطراف الملفات الأربعة الأخرى. عند وصل السلكين المشتركين معا سنحصل على محرك خماسي الأسلاك . في المحرك ثماني الأسلاك تكون الملفات مستقلة وكل سلكين في الخرج يمثلان ملف من الملفات الأربعة. يوضح الشكل محركات خطوية أحادية القطبية بأربعة ملفات خماسية وسداسية وثمانية الأسلاك.
يتم تنشيط الملفات الأربعة بطرق مختلفة هي :
• إثارة ملف واحد Wave drive or Single-Coil Excitation .
• خطوة كاملة Full step drive .
• نصف خطوة Half stepping .
• خطوة دقيقة Micro-stepping .
طريقة إثارة ملف واحد:
في هذه الطريقة يتم تطبيق جهد على ملف واحد (تنشيط ملف واحد) في كل مرة. نادرا ما تستخدم هذه الطريقة لأنها تقدم أقل من نصف عزم الدوران الاسمي للمحرك، بالتالي فإن حمولة المحرك لا يمكن أن تكون كبيرة. عموما تستخدم هذه الطريقة لحفظ الطاقة. يتم إتمام دورة كاملة على 4 مراحل. يبين الشكل كيفية عمل هذه الطريقة، والقيم المطلوب تطبيقها على الملفات الأربعة في كل مرحلة.
طريقة تحريك بخطوة كاملة:
هذه الطريقة الأكثر استخداما . يتم في هذه الطريقة تطبيق جهد على ملفين (أي تنشيط ملفين) في كل مرة، وهو ما يؤدي إلى الحصول على عزم اسمي كامل (%100) للمحرك. يتم إتمام دورة كاملة على 4 مراحل. يبين الشكل كيفية عمل هذه الطريقة، والقيم المطلوب تطبيقها على الملفات الأربعة في كل مرحلة.
طريقة تحريك بنصف خطوة:
تسمح هذه الطريقة بالحصول على دقة موقع مضاعفة من دون أي تغيير في التركيبية المادية للمحرك، حيث يتحرك المحرك بمقدار نصف خطوة بالمقارنة مع الطريقتين السابقتين. يتم إتمام دورة كاملة على 8 مراحل. يبين الشكل كيفية عمل هذه الطريقة، والقيم المطلوب تطبيقها على الملفات الأربعة في كل مرحلة.
طريقة Microstepping:
لا يتم في هذه الطريقة تغذية الملفات بنبضات وإنما بإشارة تشبه إشارة sin. بهذا الإسلوب يتم الانتقال من خطوة إلى الأخرى بشكل أنعم، وهذا ما يجعل المحرك الخطوي مناسبا للتطبيقات ذات الدقة العالية مثل أنظمة CNC. يدور المحرك الخطوي في هذه الطريقة بشكل مستمر تقريبا مثل محركات DC البسيطة.
يستجر المحرك الخطوي - كما في محركات التيار المستمر- تيارا لا بأس به لا تستطيع لوحة الاردوينو تأمينه لهذا لابد من استخدام دائرة عزل ما بين المتحكم و المحرك تؤمن له هذا التيار. هناك طرق عديدة يمكن بها تنفيذ دائرة العزل: ترانزستورات أو دائرات متكاملة مثل L293 أو UL2003.
سنستخدم دائرة ULN2003 التي تمتاز برخصها مقارنة مع L293.
الدائرة المتكاملة ULN2003
تتكون الدائرة المتكاملة ULN2003 من سبع بوابات التي تتصف بأنها تعمل كمصب للتيار فقط. القيمة العظمى للتيار 500 mA . يوضح الشكل بنية الدائرة ULN2003 وتوز يع أرجلها:
تعمل الأرجل من 1 و حتى 7 كمداخل لبوابات الدائرة، والأرجل من 10 وحتى 16 كمخارج للبوابات. الرجل رقم 8 يتم وصلها إلى الأرضي المشترك. الرجل 9 تتصل مع مهابط ثنائيات، من الممكن عدم وصل هذه الرجل ، أو قد يتم وصلها مع تغذية المحرك كما سنرى لاحقا. يوضح الجدول كيفية عمل البوابة.
لإيضاح عمل بوابة دارة ULN2003 لندرس الحالتين التاليتين والتي سنتحكم فيها بثنائي ضوئي من خلال الجهد المطبق على مدخل البوابة الأولى.
1- بفرض أن الجهد المطبق على مدخل البوابة الأولى5V (High level) كما هو موضح في الشكل . عندئذ فإن خرج البوابة الأولى على الرجل 16 هو Low level) 0V). تبعا لذلك سيضيئ الثنائي الضوئي حيث عملت بوابة دائرة ULN2003 على تأمين مصب للتيار إلى الأرضي .
2- بفرض أن الجهد المطبق على مدخل البوابة الأولى Low level 0V كما هو موضح في الشكل . عندئذ فإن خرج البوابة الأولى على الرجل 16 هو ممانعة عالية high impedance. تبعا لذلك لن يضيء الثنائي الضوئي حيث لم يتم تأمين مصب للتيار.
الجهد المطبق على الرجل 1 (مدخل البوابة الأولى) هو ((Low 0V و بالتالي الخرج على الرجل 16 (مخرج البوابة الأولى) هو High Z أي كأنها رجل عائمة . الثنائي الضوئي لا يعمل لأنه لم يتم تأمين مصب للتيار.
لا يمكن استخدام دارة ULN2003 مع المحرك المستمر لكي يتحرك باتجاهين وذلك لأنها تسمح بمرور التيار باتجاه واحد فقط وبالتالي فهي مناسبة للمحركات الخطوية أحادية القطبية.
التحكم بالمحرك الخطوي أحادي القطبية وسرعته من خلال لوحة الأردوينو
يبين الشكل أدناه مخطط التوصيل العملي للوحة الأردوينو مع دارة القيادة ULN2003 والمحرك الخطوي أحادي القطبية سداسي الأسلاك. تم ربط المنافذ 0,1,2,3 مع مداخل بوابات دارة ULN2003، والمخارج مع أربعة أسلاك للمحرك. السلكان المشتركان تم وصلهما إلى التغذية +9V . تم وصل الرجل 8 لدارة ULN2003 مع الأرضي، والرجل 9 إلى التغذية +9V وذلك للتخلص من الحقل الكهربائي المغناطيسي العودي. عند تطبيق +5V (1 منطقى) على المنافذ 0,1,2,3 سيكون خرج البوابات 0V مما يسمح بمرور تيار في ملفات المحرك، أما عند تطبيق 0V (0 منطقى) على المنافذ 0,1,2,3 سيكون خرج البوابات ممانعة عالية ولن يمر تيار في الملفات. يتم اختيار إحدى طرق تنشيط الملفات المذكورة سابقا (ملف واحد، خطوة كاملة، نصف خطوة) وبرمجة لوحة الأردوينو تبعل لذلك .
يتم التحكم بجهة دوران المحرك (مع أو عكس عقارب الساعة) من خلال ترتيب تنشيط الملفات الواحد تلو الآخر، ويتم التحكم بسرعة المحرك من خلال تغيير التأخير الزمني ما بين كل مرحلة من مراحل الدورة.
يبين الشكل أدناه مخطط التوصيل العملي للوحة الأردوينو مع لوحة L298N والمحرك الخطوي أحادي القطبية. تم ربط المنافذ 0,1,2,3 مع أرجل الدخل المنطقية للوحة (IN1,IN2,IN3,IN4) والمخارج (OUT1,OUT2,OUT3,OUT4) مع أربعة أسلاك للمحرك .
السلكان المشتركان للمحرك تم وصلهما إلى التغذية +9V تم المحافظة على الوصلة jumper) 7)، والوصلة jumper) 12) بحيث يتم تفعيل جميع المخارج. تم تزويد اللوحة بمنبع تغذية +9V على الرجل 4 والذي من خلاله يتم تغذية المحرك. تم المحافظة على الوصلة jumper) 3)، وهذا يعني أنه سيتم تفعيل منظم الجهد الداخلي للوحة +5V وبالتالي لا يوجد حاجة لتغذيتها بجهد +5V . إذا تم نز ع هذه الوصلة لابد من تأمين تغذية +5V على الرجل 6.
رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects
المحرك الخطوى ثنائى القطبية Bipolar Stepper Motor
في هذا النمط من المحركات الخطوية يرتبط ملفان داخليا مع بعضهما بشكل تسلسلي، ويرتبط الملفان الآخران أيضا مع بعضهما بشكل تسلسلي كما هو موضح في الشكل أدناه . تبعا لهذا الوصل ستكون البنية الداخلية للمحرك الخطوي ثنائي القطبية عبارة عن ملفين. تمثل أطراف الملفين الأسلاك الأربعة في الخرج.
يتم تنشيط الملفات الأربعة لقيادة المحرك الخطوي ثنائي القطبية بنفس طريقة المحرك أحادي القطبية المذكور سابقا:
• إثارة ملف واحد Wave drive or Single-Coil Excitation .
• خطوة كاملة Full step drive .
• تصف خطوة Half stepping .
• خطوة دقيقة Micro-stepping .
طريقة إثارة ملف واحد:
في كل مرة يتم تطبيق جهد على ملف واحد، وبقية الملفات يطبق عليها 0V . عزم الدوران أقل من بقية الطرق، بالتالي فإن حمولة المحرك لا يمكن أن تكون كبيرة. يتم إتمام دورة كاملة على 4 مراحل. يبين الشكل كيفية عمل هذه الطريقة، والقيم المطلوب تطبيقها على الملفات الأربعة في كل مرحلة.
طريقة تحريك بخطوة كاملة:
في كل مرة يتم تطبيق جهد على ملفين، والملفان الآخران يطبق عليهما 0V . عزم الدوران أعلى من الطريقة السابقة. يتم إتمام دورة كاملة على 4 مراحل. يبين الشكل كيفية عمل هذه الطريقة، والقيم المطلوب تطبيقها على الملفات الأربعة في كل مرحلة.
طريقة تحريك بنصف خطوة:
تسمح هذه الطريقة بالحصول على دقة موقع مضاعفة من دون أي تغيير في التركيبية المادية للمحرك، حيث يتحرك المحرك بمقدار نصف خطوة بالمقارنة مع الطريقتين السابقتين. يتم إتمام دورة كاملة على 8 مراحل. يبين الشكل كيفية عمل هذه
الطريقة، والقيم المطلوب تطبيقها على الملفات الأربعة في كل مرحلة.
طريقة Microstepping:
لا يتم في هذه الطريقة تغذية الملفات بنبضات وإنما بإشارة تشبه إشارة sin. بهذا الإسلوب يتم الانتقال من خطوة إلى الأخرى بشكل أنعم، وهذا ما يجعل المحرك الخطوي مناسب للتطبيقات ذات الدقة العالية .
في هذا النمط من المحركات الخطوية يرتبط ملفان داخليا مع بعضهما بشكل تسلسلي، ويرتبط الملفان الآخران أيضا مع بعضهما بشكل تسلسلي كما هو موضح في الشكل أدناه . تبعا لهذا الوصل ستكون البنية الداخلية للمحرك الخطوي ثنائي القطبية عبارة عن ملفين. تمثل أطراف الملفين الأسلاك الأربعة في الخرج.
يتم تنشيط الملفات الأربعة لقيادة المحرك الخطوي ثنائي القطبية بنفس طريقة المحرك أحادي القطبية المذكور سابقا:
• إثارة ملف واحد Wave drive or Single-Coil Excitation .
• خطوة كاملة Full step drive .
• تصف خطوة Half stepping .
• خطوة دقيقة Micro-stepping .
طريقة إثارة ملف واحد:
في كل مرة يتم تطبيق جهد على ملف واحد، وبقية الملفات يطبق عليها 0V . عزم الدوران أقل من بقية الطرق، بالتالي فإن حمولة المحرك لا يمكن أن تكون كبيرة. يتم إتمام دورة كاملة على 4 مراحل. يبين الشكل كيفية عمل هذه الطريقة، والقيم المطلوب تطبيقها على الملفات الأربعة في كل مرحلة.
طريقة تحريك بخطوة كاملة:
في كل مرة يتم تطبيق جهد على ملفين، والملفان الآخران يطبق عليهما 0V . عزم الدوران أعلى من الطريقة السابقة. يتم إتمام دورة كاملة على 4 مراحل. يبين الشكل كيفية عمل هذه الطريقة، والقيم المطلوب تطبيقها على الملفات الأربعة في كل مرحلة.
طريقة تحريك بنصف خطوة:
تسمح هذه الطريقة بالحصول على دقة موقع مضاعفة من دون أي تغيير في التركيبية المادية للمحرك، حيث يتحرك المحرك بمقدار نصف خطوة بالمقارنة مع الطريقتين السابقتين. يتم إتمام دورة كاملة على 8 مراحل. يبين الشكل كيفية عمل هذه
الطريقة، والقيم المطلوب تطبيقها على الملفات الأربعة في كل مرحلة.
طريقة Microstepping:
لا يتم في هذه الطريقة تغذية الملفات بنبضات وإنما بإشارة تشبه إشارة sin. بهذا الإسلوب يتم الانتقال من خطوة إلى الأخرى بشكل أنعم، وهذا ما يجعل المحرك الخطوي مناسب للتطبيقات ذات الدقة العالية .
رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects
التحكم بالمحرك الخطوي ثنائي القطبية وسرعته من خلال لوحة الأردوينو :
لا بد من استخدام دائرة عزل ما بين لوحة الأردوينو والمحرك ثنائي القطبية لتأمين التيار المطلوب. لا يمكن استخدام الدائرة المتكاملة ULN2003 مع المحرك ثنائي القطبية لأنها تعمل كمصب للتيار فقط (أي تسمح بمرور التيار باتجاه واحد)، في حين الدائرة المتكاملة L293 والدائرة المتكاملة L298N ستفي بالغرض المطلوب منها .
يبين الشكل أدناه الدائرة الكهربية للوحة الأردوينو مع الدائرة المتكاملة L293 والمحرك الخطوي ثنائي القطبية. تم ربط المنافذ 0,1,2,3 مع مداخل بوابات الدائرة L293، والمخارج مع أربعة أسلاك للمحرك.
البرنامج :
يتم اختيار إحدى طرق تنشيط الملفات المذكورة سابقا (ملف واحد، خطوة كاملة، نصف خطوة) وبرمجة لوحة الأردوينو تبعا لذلك . يتم التحكم بجهة دوران المحرك (مع أو عكس عقارب الساعة) من خالل ترتيب تنشيط الملفات الواحد تلو الآخر، ويتم التحكم بسرعة المحرك من خلال تغيير التأخير الزمني ما بين كل مرحلة من مراحل الدورة. تم كتابة الكود البرمجي الخاص بطريقة التحريك بخطوة كاملة، مع إمكانية اختيار جهة الدوران وسرعة المحرك. يصلح هذا الكود مع كل من الدائرة المتكاملة L293، واللوحة L298N .
لا بد من استخدام دائرة عزل ما بين لوحة الأردوينو والمحرك ثنائي القطبية لتأمين التيار المطلوب. لا يمكن استخدام الدائرة المتكاملة ULN2003 مع المحرك ثنائي القطبية لأنها تعمل كمصب للتيار فقط (أي تسمح بمرور التيار باتجاه واحد)، في حين الدائرة المتكاملة L293 والدائرة المتكاملة L298N ستفي بالغرض المطلوب منها .
يبين الشكل أدناه الدائرة الكهربية للوحة الأردوينو مع الدائرة المتكاملة L293 والمحرك الخطوي ثنائي القطبية. تم ربط المنافذ 0,1,2,3 مع مداخل بوابات الدائرة L293، والمخارج مع أربعة أسلاك للمحرك.
البرنامج :
يتم اختيار إحدى طرق تنشيط الملفات المذكورة سابقا (ملف واحد، خطوة كاملة، نصف خطوة) وبرمجة لوحة الأردوينو تبعا لذلك . يتم التحكم بجهة دوران المحرك (مع أو عكس عقارب الساعة) من خالل ترتيب تنشيط الملفات الواحد تلو الآخر، ويتم التحكم بسرعة المحرك من خلال تغيير التأخير الزمني ما بين كل مرحلة من مراحل الدورة. تم كتابة الكود البرمجي الخاص بطريقة التحريك بخطوة كاملة، مع إمكانية اختيار جهة الدوران وسرعة المحرك. يصلح هذا الكود مع كل من الدائرة المتكاملة L293، واللوحة L298N .
- الكود:
void setup() {
byte i;
for (i = 0; i <= 7; i++)
{
pinMode(i, OUTPUT);
}
}
void loop() {
move_motor('L', 250); // move left, speed
move_motor('R', 250); // move right, speed
move_motor('L', 500); // move left, speed
move_motor('R', 500); // move right, speed
}
void move_motor(char Direction, int Speed)
{
if (Direction == 'L')
{ PORTA(B00000101);
delay(Speed);
PORTA(B00000110);
delay(Speed);
PORTA(B00001010); delay(Speed);
PORTA(B00001001);
delay(Speed);
}
if (Direction == 'R')
{ PORTA(B00000101);
delay(Speed);
PORTA(B00001001);
delay(Speed);
PORTA(B00001010);
delay(Speed);
PORTA(B00000110);
delay(Speed);
}
}
void PORTA(byte value)
{
byte i;
for (i = 0; i <= 7; i++)
{
digitalWrite(i, bitRead(value, i));
}
}
رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects
مكتبة محرك الخطوة Stepper Library :
تسمح لك هذه المكتبة بالتحكم في محركات الخطوة أحادية القطب أو ثنائية القطب. لاستخدامها ، سوف تحتاج إلى محرك خطوة ، والأجهزة (الهاردوير) المناسبة للتحكم فيه .
لاستخدام هذه المكتبة يجب فى البداية ضم ملف الرأس :
دوال المكتبة Functions :
1- الدالة
الوصف : Description
تخلق (تنشىء) هذه الدالة مثيلًا جديدًا لفئة Stepper التي تمثل محرك خطوة معينًا متصل بلوحة Arduino. تستخدم هذه الدالة في الجزء العلوي من البرنامج ، أعلى setup() , loop() . يعتمد عدد البارامترات على كيفية توصيل محرك الخطوة - إما باستخدام طرفين أو أربعة أطراف من لوحة Arduino.
البارامترات : Parameters
• البارامتر steps : عدد الخطوات steps فى الدورة الواحدة للمحرك . إذا أعطى عدد الدرجات لكل خطوة ، اقسم 360 على هذا العدد للحصول على عدد الخطوات فى الدورة الواحدة steps (مثال : 360/3.6 = 100 steps ) . هذا البارامتر متغير من نوع int .
• البارامترات pin1, pin2 : طرفان متصلان بالمحرك ، نوع int .
• البارامترات pin3, pin4 : اختيارى ، الطرفان الأخران المتصلان بالمحرك ، إذا كان متصل إلى أربعة أطراف ، نوع int .
العائد : Returns
مثيل جديد من فئة محرك الخطوة Stepper .
مثال :
2- الدالة
الوصف : Description
تحديد سرعة المحرك بالدورات لكل دقيقة (RPMs) . هذه الدالة لا تجعل المحرك يدور ، فقط تحديد السرعة التى سوف يكون عليها عندما تستدعى الدالة step() .
البارامترات : Parameters
البارامتر rpms : السرعة التى يجب أن يدور بها المحرك بالدورات فى الدقيقة – عدد موجب ، نوع long .
العائد :
لا شىء .
3- الدالة
الوصف : Description
تدير المحرك عددًا معينًا من الخطوات ، بسرعة يحددها أحدث إستدعاء للدالة setSpeed() . هذه الدالة تحجب blocking . أي أنها ستنتظر حتى ينتهي المحرك من التحرك لتمرير التحكم إلى السطر التالي في البرنامج . على سبيل المثال ، إذا قمت بتعيين السرعة ، على سبيل المثال ، 1 RPM واستدعيت الدالة step(100) على محرك 100 خطوة ، فإن هذه الدالة تستغرق دقيقة كاملة للتشغيل. للتحكم بشكل أفضل ، حافظ على السرعة عالية وخذ فقط بضع خطوات مع كل استدعاء للدالة step() .
البارامترات : Parameters
البارامتر steps : عدد الخطوات التى يدورها المحرك ، موجبة للدوران فى اتجاه معين ، وسالبة للدوران فى الاتجاه الآخر ، نوع int .
العائد :
لا شىء .
تسمح لك هذه المكتبة بالتحكم في محركات الخطوة أحادية القطب أو ثنائية القطب. لاستخدامها ، سوف تحتاج إلى محرك خطوة ، والأجهزة (الهاردوير) المناسبة للتحكم فيه .
لاستخدام هذه المكتبة يجب فى البداية ضم ملف الرأس :
- الكود:
#include <Stepper.h>
دوال المكتبة Functions :
- الكود:
Stepper(steps, pin1, pin2)
Stepper(steps, pin1, pin2, pin3, pin4)
setSpeed(rpm)
step(steps)
1- الدالة
- الكود:
Stepper(steps, pin1, pin2)
Stepper(steps, pin1, pin2, pin3, pin4)
الوصف : Description
تخلق (تنشىء) هذه الدالة مثيلًا جديدًا لفئة Stepper التي تمثل محرك خطوة معينًا متصل بلوحة Arduino. تستخدم هذه الدالة في الجزء العلوي من البرنامج ، أعلى setup() , loop() . يعتمد عدد البارامترات على كيفية توصيل محرك الخطوة - إما باستخدام طرفين أو أربعة أطراف من لوحة Arduino.
البارامترات : Parameters
• البارامتر steps : عدد الخطوات steps فى الدورة الواحدة للمحرك . إذا أعطى عدد الدرجات لكل خطوة ، اقسم 360 على هذا العدد للحصول على عدد الخطوات فى الدورة الواحدة steps (مثال : 360/3.6 = 100 steps ) . هذا البارامتر متغير من نوع int .
• البارامترات pin1, pin2 : طرفان متصلان بالمحرك ، نوع int .
• البارامترات pin3, pin4 : اختيارى ، الطرفان الأخران المتصلان بالمحرك ، إذا كان متصل إلى أربعة أطراف ، نوع int .
العائد : Returns
مثيل جديد من فئة محرك الخطوة Stepper .
مثال :
- الكود:
Stepper myStepper = Stepper(100, 5, 6);
2- الدالة
- الكود:
Stepper: setSpeed(rpms)
الوصف : Description
تحديد سرعة المحرك بالدورات لكل دقيقة (RPMs) . هذه الدالة لا تجعل المحرك يدور ، فقط تحديد السرعة التى سوف يكون عليها عندما تستدعى الدالة step() .
البارامترات : Parameters
البارامتر rpms : السرعة التى يجب أن يدور بها المحرك بالدورات فى الدقيقة – عدد موجب ، نوع long .
العائد :
لا شىء .
3- الدالة
- الكود:
Stepper: step(steps)
الوصف : Description
تدير المحرك عددًا معينًا من الخطوات ، بسرعة يحددها أحدث إستدعاء للدالة setSpeed() . هذه الدالة تحجب blocking . أي أنها ستنتظر حتى ينتهي المحرك من التحرك لتمرير التحكم إلى السطر التالي في البرنامج . على سبيل المثال ، إذا قمت بتعيين السرعة ، على سبيل المثال ، 1 RPM واستدعيت الدالة step(100) على محرك 100 خطوة ، فإن هذه الدالة تستغرق دقيقة كاملة للتشغيل. للتحكم بشكل أفضل ، حافظ على السرعة عالية وخذ فقط بضع خطوات مع كل استدعاء للدالة step() .
البارامترات : Parameters
البارامتر steps : عدد الخطوات التى يدورها المحرك ، موجبة للدوران فى اتجاه معين ، وسالبة للدوران فى الاتجاه الآخر ، نوع int .
العائد :
لا شىء .
رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects
مثال : تطبيق على المكتبة : التأرجح 60 – ثانية
سنقوم بإنشاء جهاز وهمى لبيان الوقت يكون محصورًا إلى الأبد في حلقة مدتها 60 ثانية. سوف يتحرك محرك الخطوة في قوس كامل 360 درجة في حوالي دقيقة. في نهاية قوسه ، سيغير الاتجاه ويدور في الاتجاه الآخر. نظرًا لأن محرك الخطوة يتحرك بخطوات 1.8 درجة ، فليس من الممكن تمامًا الحصول على الزمن بدقة هنا ، لكنه قريب بدرجة كافية. لهذا السبب ، يجب أن يتحرك محرك الخطوة في كل ثانية 3.33 خطوة (360 /1.8=200 step/rev , 200/60=3.33step/sec) ، وهو ما لا يستطيع القيام به. لذا ، فإننا نجعل التأخير بين الخطوات 909 ميلي ثانية بدلاً من واحد ثانية . نظرًا لكيفية تصميم الدائرتين المختلفتين الموضحتين في الأشكال ، يتحكم البرنامج في أي من نوعى المحركات.
من خلال هذا الكود البسيط ، والذي يعمل على دوران محرك الخطوة ذهابًا وإيابًا ، دعنا نستكشف دوال المكتبة Stepper بتعمق أكبر.
• الفئة Stepper :
لإنشاء مثيل جديد لمكتبة Stepper ، نستخدم واحدًا من بناء الجملة التالية :
يعتمد بناء الجملة الذي نستخدمه على ما إذا كنا نستخدم 2 طرف أو أربعة أطراف للتحكم في برامج تشغيل محرك الخطوة . لجعل التوصيلات الخاصة بنا أسهل قليلاً ويعمل الكود على كلا المشغلين drivers ، اخترنا استخدام أربعة أطراف - أسهل في التوصيل على حساب (بتكلفة) زوج من الأطراف الرقمية. في هذا المثال ، أنشأنا مثيل Stepper التالي:
المثيل يسمى stepper على الرغم من أننا يمكن أن نستخدم أي شيء تقريبا للاسم. البارامتر الأول هو عدد الخطوات التي يمكن للمحرك القيام بها في دورة واحدة كاملة. بالنسبة لمحركنا ، فإن خطوته بقيمة 1.8 درجة ، مما يعني أنه سيستغرق 200 خطوة لإكمال دورة واحدة (360/1.8=200) . في الكود السابق ، أعلنا أن عدد خطوات محركنا كمتغير ثابت steps والذى سنستخدمه لاحقًا في الكود. البارامترات الأربعة التالية ، pins1-4 ، هي أرقام الأطراف المتصلة بالمشغل . راجع الدائرة الكهربية لمعرفة التوصيل .
• الدالة setSpeed() :
بعد إنشاء المثيل ، نحتاج إلى ضبط set سرعة دوران المحرك ا. يحتوي بناء جملة هذه الدالة على بارامتر واحد فقط ، كما يلي:
يتم ضبط سرعة المحرك على شكل دورات في الدقيقة. تحدد هذه القيمة مدى سرعة انتقال المحرك من خطوة إلى أخرى وستختلف بشكل طبيعي لكل محرك خطوة . قد يؤدي تعيين هذه القيمة بقيمة عالية جدًا للمحرك إلى تخطي الخطوات أو التشغيل المتقطع. اختر سرعة مناسبة لتطبيقك .
تذكر أن الدالة setSpeed() لا تحرك المحرك فعليًا - إنها تحدد سرعة المحرك فقط عندما يتم استدعاء دالتنا التالية.
• الدالة step() :
إن الدالة step() هي ما تجعل المحرك يتحرك في الواقع . بناء الجملة بسيط ، ولكن هناك بعض الأشياء التي نحتاج إلى وضعها في الاعتبار.
البارامتر الوحيد الذى يجب تمريره إلى هذه الدالة هو عدد الخطوات التي نريد تحريك محرك الخطوة بها. على سبيل المثال ، مع محرك بخطوة 1.8 درجة ، حركة الخطوة الواحدة تساوي 1.8 درجة . سيؤدي تعيين عدد الخطوات إلى 50 إلى دوران المحرك 90 درجة في اتجاه عقارب الساعة على محرك 200 خطوة (50*1.8=90) ، أو ربع دورة ، فى حين أن (-50) سوف يدير المحرك 9- درجة عكس اتجاه عقارب الساعة. كما ترى ، فإن العدد الصحيح الموجب سيخلق حركة في اتجاه معين بينما القيمة السالبة ترسله في الاتجاه المعاكس.
على عكس شيء مشابه للدالة analogWrite() ، التي تقوم بتعيينها ونسيانها ، فإن الدالة step() ستمنع Arduino من فعل أي شيء آخر حتى تكمل حركتها بالكامل. هذا ليس كبيرًا في القيمة إذا قمنا بتدوير المحرك بزيادات صغيرة في كل مرة نستدعى الدالة step() ، لكنها تتزايد بسرعة. كمثال عملي ، إذا قمنا بتعيين السرعة RPM على 10 RPM ، فإن محركنا ذو 200 خطوة سيستغرق 6 ثوان لإكمال 200 خطوة. بمعنى آخر ، إذا استخدمنا العبارة stepper.step(200) فسيكون هناك 6 ثوانٍ لن نتمكن من قراءة المدخلات أو التواصل مع الأجهزة الأخرى أو أي شيء آخر.
بدلاً من ذلك ، قد يكون من الأفضل إكمال التدوير الكبير بعبارة حلقة مثل جزء الكود التالي:
في هذا المثال ، نقوم بزيادة محرك الخطوة 200 مرة بزيادات خطوة واحدة لإكمال دورة واحدة. بدلاً من استدعاء بحركة واحدة من 200 خطوة نستخدم حلقة for ، ستأخذ كل خطوة فردية 30 مللي ثانية فقط وفيما بين كل خطوة ، يمكننا ، على سبيل المثال ، التحقق من حالة طرف دخل رقمي والخروج من الحلقة باستخدام عبارة break إذا تم استيفاء شرط.
مثال لبرنامج آخر :
يوضح هذا البرنامج طريقة تعيين (تحويل) map القيم من جهاز استشعار تناظري إلى حركة محرك خطوة . تعد المقاومة المتغيرة potentiometer ذو المقبض الكبير خيارًا جيدًا ، أو ربما الأفضل من ذلك ، هو مقياس التسارع accelerometer الذي يتحكم في حركة المحرك من خلال إمالة محاوره ، على الرغم من أن أي مدخلات تناظرية ستعمل أيضًا. باستخدام الدالة map() ، يمكننا أخذ قراءة تماثلية وتعيينها map على إجمالي عدد الخطوات للإشارة إلى مستوى المدخلات التناظرية - قراءة كاملة بالقيمة 1024 سوف تدير المحرك دورة كاملة.
سنقوم بإنشاء جهاز وهمى لبيان الوقت يكون محصورًا إلى الأبد في حلقة مدتها 60 ثانية. سوف يتحرك محرك الخطوة في قوس كامل 360 درجة في حوالي دقيقة. في نهاية قوسه ، سيغير الاتجاه ويدور في الاتجاه الآخر. نظرًا لأن محرك الخطوة يتحرك بخطوات 1.8 درجة ، فليس من الممكن تمامًا الحصول على الزمن بدقة هنا ، لكنه قريب بدرجة كافية. لهذا السبب ، يجب أن يتحرك محرك الخطوة في كل ثانية 3.33 خطوة (360 /1.8=200 step/rev , 200/60=3.33step/sec) ، وهو ما لا يستطيع القيام به. لذا ، فإننا نجعل التأخير بين الخطوات 909 ميلي ثانية بدلاً من واحد ثانية . نظرًا لكيفية تصميم الدائرتين المختلفتين الموضحتين في الأشكال ، يتحكم البرنامج في أي من نوعى المحركات.
- الكود:
#include <Stepper.h>
const int steps = 200;
Stepper stepper(steps, 8, 9, 10, 11);
int stepDirection = 3;
int counter = 0;
void setup() {
stepper.setSpeed(30);
}
void loop() {
stepper.step(stepDirection);
delay(909);
counter+=3;
if (counter > steps) {
counter = 0;
if (stepDirection == 3) stepDirection = -3;
else stepDirection = 3;
}
}
من خلال هذا الكود البسيط ، والذي يعمل على دوران محرك الخطوة ذهابًا وإيابًا ، دعنا نستكشف دوال المكتبة Stepper بتعمق أكبر.
• الفئة Stepper :
لإنشاء مثيل جديد لمكتبة Stepper ، نستخدم واحدًا من بناء الجملة التالية :
- الكود:
Stepper name(steps, pin 1, pin 2)
Stepper name(steps, pin1, pin 2, pin 3, pin4)
يعتمد بناء الجملة الذي نستخدمه على ما إذا كنا نستخدم 2 طرف أو أربعة أطراف للتحكم في برامج تشغيل محرك الخطوة . لجعل التوصيلات الخاصة بنا أسهل قليلاً ويعمل الكود على كلا المشغلين drivers ، اخترنا استخدام أربعة أطراف - أسهل في التوصيل على حساب (بتكلفة) زوج من الأطراف الرقمية. في هذا المثال ، أنشأنا مثيل Stepper التالي:
- الكود:
Stepper stepper(steps, 8, 9, 10, 11);
المثيل يسمى stepper على الرغم من أننا يمكن أن نستخدم أي شيء تقريبا للاسم. البارامتر الأول هو عدد الخطوات التي يمكن للمحرك القيام بها في دورة واحدة كاملة. بالنسبة لمحركنا ، فإن خطوته بقيمة 1.8 درجة ، مما يعني أنه سيستغرق 200 خطوة لإكمال دورة واحدة (360/1.8=200) . في الكود السابق ، أعلنا أن عدد خطوات محركنا كمتغير ثابت steps والذى سنستخدمه لاحقًا في الكود. البارامترات الأربعة التالية ، pins1-4 ، هي أرقام الأطراف المتصلة بالمشغل . راجع الدائرة الكهربية لمعرفة التوصيل .
• الدالة setSpeed() :
بعد إنشاء المثيل ، نحتاج إلى ضبط set سرعة دوران المحرك ا. يحتوي بناء جملة هذه الدالة على بارامتر واحد فقط ، كما يلي:
- الكود:
name.setSpeed(rpm)
يتم ضبط سرعة المحرك على شكل دورات في الدقيقة. تحدد هذه القيمة مدى سرعة انتقال المحرك من خطوة إلى أخرى وستختلف بشكل طبيعي لكل محرك خطوة . قد يؤدي تعيين هذه القيمة بقيمة عالية جدًا للمحرك إلى تخطي الخطوات أو التشغيل المتقطع. اختر سرعة مناسبة لتطبيقك .
تذكر أن الدالة setSpeed() لا تحرك المحرك فعليًا - إنها تحدد سرعة المحرك فقط عندما يتم استدعاء دالتنا التالية.
• الدالة step() :
إن الدالة step() هي ما تجعل المحرك يتحرك في الواقع . بناء الجملة بسيط ، ولكن هناك بعض الأشياء التي نحتاج إلى وضعها في الاعتبار.
- الكود:
name.step(steps)
البارامتر الوحيد الذى يجب تمريره إلى هذه الدالة هو عدد الخطوات التي نريد تحريك محرك الخطوة بها. على سبيل المثال ، مع محرك بخطوة 1.8 درجة ، حركة الخطوة الواحدة تساوي 1.8 درجة . سيؤدي تعيين عدد الخطوات إلى 50 إلى دوران المحرك 90 درجة في اتجاه عقارب الساعة على محرك 200 خطوة (50*1.8=90) ، أو ربع دورة ، فى حين أن (-50) سوف يدير المحرك 9- درجة عكس اتجاه عقارب الساعة. كما ترى ، فإن العدد الصحيح الموجب سيخلق حركة في اتجاه معين بينما القيمة السالبة ترسله في الاتجاه المعاكس.
على عكس شيء مشابه للدالة analogWrite() ، التي تقوم بتعيينها ونسيانها ، فإن الدالة step() ستمنع Arduino من فعل أي شيء آخر حتى تكمل حركتها بالكامل. هذا ليس كبيرًا في القيمة إذا قمنا بتدوير المحرك بزيادات صغيرة في كل مرة نستدعى الدالة step() ، لكنها تتزايد بسرعة. كمثال عملي ، إذا قمنا بتعيين السرعة RPM على 10 RPM ، فإن محركنا ذو 200 خطوة سيستغرق 6 ثوان لإكمال 200 خطوة. بمعنى آخر ، إذا استخدمنا العبارة stepper.step(200) فسيكون هناك 6 ثوانٍ لن نتمكن من قراءة المدخلات أو التواصل مع الأجهزة الأخرى أو أي شيء آخر.
بدلاً من ذلك ، قد يكون من الأفضل إكمال التدوير الكبير بعبارة حلقة مثل جزء الكود التالي:
- الكود:
for (int i=0; i<200; i++) {
stepper.step(1);
if (digitalRead(2) == HIGH) break;
}
في هذا المثال ، نقوم بزيادة محرك الخطوة 200 مرة بزيادات خطوة واحدة لإكمال دورة واحدة. بدلاً من استدعاء بحركة واحدة من 200 خطوة نستخدم حلقة for ، ستأخذ كل خطوة فردية 30 مللي ثانية فقط وفيما بين كل خطوة ، يمكننا ، على سبيل المثال ، التحقق من حالة طرف دخل رقمي والخروج من الحلقة باستخدام عبارة break إذا تم استيفاء شرط.
مثال لبرنامج آخر :
يوضح هذا البرنامج طريقة تعيين (تحويل) map القيم من جهاز استشعار تناظري إلى حركة محرك خطوة . تعد المقاومة المتغيرة potentiometer ذو المقبض الكبير خيارًا جيدًا ، أو ربما الأفضل من ذلك ، هو مقياس التسارع accelerometer الذي يتحكم في حركة المحرك من خلال إمالة محاوره ، على الرغم من أن أي مدخلات تناظرية ستعمل أيضًا. باستخدام الدالة map() ، يمكننا أخذ قراءة تماثلية وتعيينها map على إجمالي عدد الخطوات للإشارة إلى مستوى المدخلات التناظرية - قراءة كاملة بالقيمة 1024 سوف تدير المحرك دورة كاملة.
- الكود:
#include <Stepper.h>
const int steps = 200;
Stepper stepper(steps, 8, 9, 10, 11);
int previous, val;
void setup() {
stepper.setSpeed(30);
}
void loop() {
val = map(analogRead(0), 0, 1024, 0, steps);
stepper.step(val - previous);
previous = val;
delay(20);
}
رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects
الأمثلة الموجودة ضمن بيئة تطوير الاردوينو :
مثال رقم 1 : محرك الخطوة يتتبع دوران مقاومة متغيرة (أو حساس آخر) على الدخل التناظرى “0” :
البرنامج :
شرح البرنامج :
1- فى البداية يجب تضمين ملف الرأس للمكتبة Stepper بالصيغة :
2- ثم تحديد (تعريف) عدد الخطوات STEPS فى كل دورة للمحرك الخاص بك (من خصائص المحرك) :
3- بعد ذلك يتم إنشاء مثيل للفئة Stepper وليكن بالمسمى stepper مع تعيين البارامترات الخاصة به ( عدد الخطوات فى الدورة STEPS ، والأطراف المتصلة بدائرة تشغيل محرك الخطوة 8,9,10,11 ) للدالة :
4- تعريف متغير القيمة السابقة لعدد الخطوات steps المطلوبة (من الدخل التناظرى) ، نوع int ، مع تعيينه بصفر:
5- فى الدالة setup يتم تحديد سرعة دوران المحرك بالقيم 30 لفة كل دقيقة (التى سوف يدور بها عند إعطائه أمر الخطوات ) ، باستخدام الدالة :
6- فى الدالة loop يتم :
أ- الحصول على قراءة جهد الدخل التناظرى (قيمة الحساس) :
ب- ثم إعطاء الأمر بالحركة ( الخطوة step) بقيمة التغير فى قيمة الحساس :
ت- تذكر القيمة السابقة للحساس
مثال رقم 2 : التحكم فى محرح الخطوة – دورة واحدة :
• هذا البرنامج يقوم بتشغيل محرح خطوة أحادى القطبية أو ثنائى القطبية .
• المحرك متصل بالأطراف الرقمية 8-11 للاردوينو .
• المحرك يجب أن يدور دورة واحدة فى اتجاه معين ، ثم يدور دورة واحدة فى الاتجاه الآخر .
مثال رقم 3 : التحكم فى محرك الخطوة – خطوة واحدة فى كل مرة .
• هذا البرنامج يقوم بتشغيل محرح خطوة أحادى القطبية أو ثنائى القطبية .
• المحرك متصل بالأطراف الرقمية 8-11 للاردوينو .
• المحرك سوف يخطو "خطوة" واحدة فى كل مرة ، ببطىء شديد . يمكنك استخدام ذلك لاختبار التوصيل الصحيح لأسلاك المحرك بالأطراف المناسبة . إذا كان التوصيل صحيح فإن جميع الخطوات يجب أن تكون فى نفس الاتجاه .
• يستخدم هذا البرنامج أيضا لعد عدد الخطوات لكل دورة للمحرك ، إذا لم تكن تعرفه . ثم بعد ذلك أدخل هذا العدد فى مثال الدورة الواحدة السابق للتحقق من حصولك على العدد الصحيح .
مثال رقم 4 : التحكم فى محرك الخطوة : التحكم فى السرعة :
• هذا البرنامج يقوم بتشغيل محرك الخطوة أحادى القطبية أو ثنائى القطبية .
• المحرك متصل بالأطراف 8-11 للاردوينو .
• توجد مقاومة متغيرة متصلة بالدخل التناظرى رقم “0” .
• المحرك سوف يدور فى اتجاه عقارب الساعة . كلما ارتفع قيمة المقاومة المتغيرة ، كلما أسرعت سرعة المحرك . لأن الدالة setSpeed() تحدد التأخير بين الخطوات ، قد تلاحظ أن المحرك أقل إستجابة للتغيرات فى قيمة الحساس عند السرعات المنخفضة .
مثال عملى : محرك الخطوة 28BYJ-48 مع الدائرة المتكاملة ULN2003
المحرك 28BYJ-48 هو محرك خطوى ذو 5 أسلاك أحادي القطبية والذى يتحرك 32 خطوة لكل دورة داخليًا ولكن لديه نظام تروس يحرك العمود بمعامل 64. والنتيجة هي محرك يدور بسرعة 2048 خطوة لكل دورة (32 * 64) . تجدر الإشارة إلى أن بعض هذه المحركات قد يكون لديها نظام تروس مختلف ، لذلك قد لا يكون عدد الخطوات لكل دوران للمحرك هو نفسه. هذا المحرك يعمل على 5 فولت.
يتم تغليف المحرك عادةً بلوحة تشغيل (قيادة) صغيرة تعتمد على الدائرة المتكاملة المكونة من مصفوفة ترانزستور دارلينجتون ULN2003. تحتوي اللوحة على موصل يتناسب بشكل مثالي مع أسلاك المحرك بحيث يكون سهل الاستخدام للغاية. هناك أيضا وصلات لأربعة مداخل رقمية بجهد 5 فولت ، وكذلك وصلة للتغذية .
فيما يتعلق بمصدر الإمداد بالقدرة ، هناك شيء مهم للغاية تجدر الإشارة إليه وهو أنه يجب ألا تستخدم أبدًا 5 فولت من لوحة Arduino لتشغيل هذا المحرك (أو أي محرك آخر) بصرف النظر عن مدى إغرائه. على الرغم من أن 28BYJ-48 لا يسحب الكثير من التيار ، إلا أنه سيحدث "ضوضاء" “noise” كهربائية على خطوط الإمداد بالقدرة وقد يؤدي ذلك إلى تلف Arduino. دائما استخدام مصادر قدرة منفصلة لتشغيل محركات الخطوة لخاص بك .
سنقوم بتوصيل المحرك والمشغل والاردوينو على النحو التالي:
الآن بعد أن وصلنا إلى كل شيء ، سنحتاج إلى برمجة الاردوينو . فيما يلي البرنامج الذي سنستخدمه للقيام بذلك:
في هذا البرنامج ، نستخدم المكتبة Stepper التي تأتي ضمن بيئة تطوير الاردوينو . تهتم هذه المكتبة بتسلسل النبضات التي سنرسلها إلى محرك الخطوة ويمكن استخدامها مع مجموعة واسعة من المحركات ، أحادية القطب وثنائية القطب.
تتميز محركات الخطوة 28BYJ-48 بأن لها تروس داخلية مما يقلل من سرعة دوران عمود الخرج بمعامل 64 (البعض يختلف ). لذلك نحدد (نعرف) ثلاثة ثوابت للتعامل مع دوران المحرك:
• STEPS_PER_REV وهو عدد الخطوات التي يتخذها المحرك الفعلي لكل دورة. تم تعيينا بالقيمة 32.
• GEAR_RED وهو مقدار تقليل (تخفيض) التروس. تم وضعها بالقيمة 64 ولكن قد تحتاج إلى ضبطها إذا كان المحرك مختلفًا .
• STEPS_PER_OUT_REV وهو الخرج النهائي لعمود المحرك بعد تخفيض التروس. وهو حاصل ضرب الرقمين أعلاه.
في حال كنت تتساءل عن سبب استخدام النوع float بدلاً من integer للثوابت أعلاه ، فذلك لأن تخفيض التروس في بعض الأحيان يصل عدد مثل 63.5. إذا كنت تستخدم 64 ، يمكنك استخدام الأعداد الصحيحة integers .
سيتم استخدام المتغير "StepsRequired" لتحديد (لتعريف) عدد الخطوات التي نريد أن يدور بها محركنا.
محرك الخطوة أحادى القطبية 28BYJ-48 له تسلسل خطوة كما يلي: 1-3-2-4 سيتم استخدام هذه المعلومات لقيادة المحرك عن طريق إنشاء مثيل للفئة Stepper يسمى "steppermotor" مع تسلسل الأطراف 8,10, 9, 11 . تأكد تحقيق ذلك أو أن المحرك لن يعمل بشكل صحيح.
لا يوجد شيء لتعيينه في الدالة setup لأن فئة المكتبة Stepper تقوم بالفعل بتعيين أطراف الدخل / الخرج الأربعة كمخارج .
في الدالة loop لدينا ثلاثة عروض توضيحية ، لك الحرية لإضافة أكبر عدد تريده أو لتغيير الموجود .
التشغيل الأول يخطو المحرك أربع خطوات ببطء شديد. من المثير للاهتمام ملاحظة الليدات في UNL2003 أثناء تشغيلها.
التشغيل الثانى يدور المحرك في اتجاه عقارب الساعة نصف دوره ببطء شديد. والتشغيل النهائى يعود المحرك نصف دورة بسرعة أكبر بكثير. يمكنك تجربة البارامتر "setSpeed" لتحديد السرعة القصوى لمحركك.
مثال رقم 1 : محرك الخطوة يتتبع دوران مقاومة متغيرة (أو حساس آخر) على الدخل التناظرى “0” :
البرنامج :
- الكود:
/*
* MotorKnob
*
* A stepper motor follows the turns of a potentiometer
* (or other sensor) on analog input 0.
*
* http://www.arduino.cc/en/Reference/Stepper
* This example code is in the public domain.
*/
#include <Stepper.h>
// change this to the number of steps on your motor
#define STEPS 100
// create an instance of the stepper class, specifying
// the number of steps of the motor and the pins it's
// attached to
Stepper stepper(STEPS, 8, 9, 10, 11);
// the previous reading from the analog input
int previous = 0;
void setup() {
// set the speed of the motor to 30 RPMs
stepper.setSpeed(30);
}
void loop() {
// get the sensor value
int val = analogRead(0);
// move a number of steps equal to the change in the
// sensor reading
stepper.step(val - previous);
// remember the previous value of the sensor
previous = val;
}
شرح البرنامج :
1- فى البداية يجب تضمين ملف الرأس للمكتبة Stepper بالصيغة :
- الكود:
#include <Stepper.h>
2- ثم تحديد (تعريف) عدد الخطوات STEPS فى كل دورة للمحرك الخاص بك (من خصائص المحرك) :
- الكود:
// change this to the number of steps on your motor
#define STEPS 100
3- بعد ذلك يتم إنشاء مثيل للفئة Stepper وليكن بالمسمى stepper مع تعيين البارامترات الخاصة به ( عدد الخطوات فى الدورة STEPS ، والأطراف المتصلة بدائرة تشغيل محرك الخطوة 8,9,10,11 ) للدالة :
- الكود:
// create an instance of the stepper class, specifying
// the number of steps of the motor and the pins it's
// attached to
Stepper stepper(STEPS, 8, 9, 10, 11);
4- تعريف متغير القيمة السابقة لعدد الخطوات steps المطلوبة (من الدخل التناظرى) ، نوع int ، مع تعيينه بصفر:
- الكود:
// the previous reading from the analog input
int previous = 0;
5- فى الدالة setup يتم تحديد سرعة دوران المحرك بالقيم 30 لفة كل دقيقة (التى سوف يدور بها عند إعطائه أمر الخطوات ) ، باستخدام الدالة :
- الكود:
// set the speed of the motor to 30 RPMs
stepper.setSpeed(30);
6- فى الدالة loop يتم :
أ- الحصول على قراءة جهد الدخل التناظرى (قيمة الحساس) :
- الكود:
// get the sensor value
int val = analogRead(0);
- الكود:
// move a number of steps equal to the change in the sensor reading
stepper.step(val - previous);
ت- تذكر القيمة السابقة للحساس
- الكود:
// remember the previous value of the sensor
previous = val;
مثال رقم 2 : التحكم فى محرح الخطوة – دورة واحدة :
• هذا البرنامج يقوم بتشغيل محرح خطوة أحادى القطبية أو ثنائى القطبية .
• المحرك متصل بالأطراف الرقمية 8-11 للاردوينو .
• المحرك يجب أن يدور دورة واحدة فى اتجاه معين ، ثم يدور دورة واحدة فى الاتجاه الآخر .
- الكود:
/*
Stepper Motor Control - one revolution
This program drives a unipolar or bipolar stepper motor.
The motor is attached to digital pins 8 - 11 of the Arduino.
The motor should revolve one revolution in one direction, then
one revolution in the other direction.
*/
#include <Stepper.h>
const int stepsPerRevolution = 200; // change this to fit the number of steps per revolution
// for your motor
// initialize the stepper library on pins 8 through 11:
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);
void setup() {
// set the speed at 60 rpm:
myStepper.setSpeed(60);
}
void loop() {
// step one revolution in one direction:
myStepper.step(stepsPerRevolution);
delay(500);
// step one revolution in the other direction:
myStepper.step(-stepsPerRevolution);
delay(500);
}
مثال رقم 3 : التحكم فى محرك الخطوة – خطوة واحدة فى كل مرة .
• هذا البرنامج يقوم بتشغيل محرح خطوة أحادى القطبية أو ثنائى القطبية .
• المحرك متصل بالأطراف الرقمية 8-11 للاردوينو .
• المحرك سوف يخطو "خطوة" واحدة فى كل مرة ، ببطىء شديد . يمكنك استخدام ذلك لاختبار التوصيل الصحيح لأسلاك المحرك بالأطراف المناسبة . إذا كان التوصيل صحيح فإن جميع الخطوات يجب أن تكون فى نفس الاتجاه .
• يستخدم هذا البرنامج أيضا لعد عدد الخطوات لكل دورة للمحرك ، إذا لم تكن تعرفه . ثم بعد ذلك أدخل هذا العدد فى مثال الدورة الواحدة السابق للتحقق من حصولك على العدد الصحيح .
- الكود:
/*
Stepper Motor Control - one step at a time
This program drives a unipolar or bipolar stepper motor.
The motor is attached to digital pins 8 - 11 of the Arduino.
The motor will step one step at a time, very slowly. You can use this to
test that you've got the four wires of your stepper wired to the correct
pins. If wired correctly, all steps should be in the same direction.
Use this also to count the number of steps per revolution of your motor,
if you don't know it. Then plug that number into the oneRevolution
example to see if you got it right.
*/
#include <Stepper.h>
const int stepsPerRevolution = 200; // change this to fit the number of steps per revolution
// for your motor
// initialize the stepper library on pins 8 through 11:
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);
int stepCount = 0; // number of steps the motor has taken
void setup() {
}
void loop() {
// step one step:
myStepper.step(1);
stepCount++;
delay(500);
}
مثال رقم 4 : التحكم فى محرك الخطوة : التحكم فى السرعة :
• هذا البرنامج يقوم بتشغيل محرك الخطوة أحادى القطبية أو ثنائى القطبية .
• المحرك متصل بالأطراف 8-11 للاردوينو .
• توجد مقاومة متغيرة متصلة بالدخل التناظرى رقم “0” .
• المحرك سوف يدور فى اتجاه عقارب الساعة . كلما ارتفع قيمة المقاومة المتغيرة ، كلما أسرعت سرعة المحرك . لأن الدالة setSpeed() تحدد التأخير بين الخطوات ، قد تلاحظ أن المحرك أقل إستجابة للتغيرات فى قيمة الحساس عند السرعات المنخفضة .
- الكود:
/*
Stepper Motor Control - speed control
This program drives a unipolar or bipolar stepper motor.
The motor is attached to digital pins 8 - 11 of the Arduino.
A potentiometer is connected to analog input 0.
The motor will rotate in a clockwise direction. The higher the potentiometer value,
the faster the motor speed. Because setSpeed() sets the delay between steps,
you may notice the motor is less responsive to changes in the sensor value at
low speeds.
*/
#include <Stepper.h>
const int stepsPerRevolution = 200; // change this to fit the number of steps per revolution
// for your motor
// initialize the stepper library on pins 8 through 11:
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);
int stepCount = 0; // number of steps the motor has taken
void setup() {
// nothing to do inside the setup
}
void loop() {
// read the sensor value:
int sensorReading = analogRead(A0);
// map it to a range from 0 to 100:
int motorSpeed = map(sensorReading, 0, 1023, 0, 100);
// set the motor speed:
if (motorSpeed > 0) {
myStepper.setSpeed(motorSpeed);
// step 1/100 of a revolution:
myStepper.step(stepsPerRevolution / 100);
}
}
مثال عملى : محرك الخطوة 28BYJ-48 مع الدائرة المتكاملة ULN2003
المحرك 28BYJ-48 هو محرك خطوى ذو 5 أسلاك أحادي القطبية والذى يتحرك 32 خطوة لكل دورة داخليًا ولكن لديه نظام تروس يحرك العمود بمعامل 64. والنتيجة هي محرك يدور بسرعة 2048 خطوة لكل دورة (32 * 64) . تجدر الإشارة إلى أن بعض هذه المحركات قد يكون لديها نظام تروس مختلف ، لذلك قد لا يكون عدد الخطوات لكل دوران للمحرك هو نفسه. هذا المحرك يعمل على 5 فولت.
يتم تغليف المحرك عادةً بلوحة تشغيل (قيادة) صغيرة تعتمد على الدائرة المتكاملة المكونة من مصفوفة ترانزستور دارلينجتون ULN2003. تحتوي اللوحة على موصل يتناسب بشكل مثالي مع أسلاك المحرك بحيث يكون سهل الاستخدام للغاية. هناك أيضا وصلات لأربعة مداخل رقمية بجهد 5 فولت ، وكذلك وصلة للتغذية .
فيما يتعلق بمصدر الإمداد بالقدرة ، هناك شيء مهم للغاية تجدر الإشارة إليه وهو أنه يجب ألا تستخدم أبدًا 5 فولت من لوحة Arduino لتشغيل هذا المحرك (أو أي محرك آخر) بصرف النظر عن مدى إغرائه. على الرغم من أن 28BYJ-48 لا يسحب الكثير من التيار ، إلا أنه سيحدث "ضوضاء" “noise” كهربائية على خطوط الإمداد بالقدرة وقد يؤدي ذلك إلى تلف Arduino. دائما استخدام مصادر قدرة منفصلة لتشغيل محركات الخطوة لخاص بك .
سنقوم بتوصيل المحرك والمشغل والاردوينو على النحو التالي:
الآن بعد أن وصلنا إلى كل شيء ، سنحتاج إلى برمجة الاردوينو . فيما يلي البرنامج الذي سنستخدمه للقيام بذلك:
- الكود:
/*
Demonstrates 28BYJ-48 Unipolar Stepper with ULN2003 Driver
Uses Arduino Stepper Library
*/
//Include the Arduino Stepper Library
#include <Stepper.h>
// Define Constants
// Number of steps per internal motor revolution
const float STEPS_PER_REV = 32;
// Amount of Gear Reduction
const float GEAR_RED = 64;
// Number of steps per geared output rotation
const float STEPS_PER_OUT_REV = STEPS_PER_REV * GEAR_RED;
// Define Variables
// Number of Steps Required
int StepsRequired;
// Create Instance of Stepper Class
// Specify Pins used for motor coils
// The pins used are 8,9,10,11
// Connected to ULN2003 Motor Driver In1, In2, In3, In4
// Pins entered in sequence 1-3-2-4 for proper step sequencing
Stepper steppermotor(STEPS_PER_REV, 8, 10, 9, 11);
void setup()
{
// Nothing (Stepper Library sets pins as outputs)
}
void loop()
{
// Slow - 4-step CW sequence to observe lights on driver board
steppermotor.setSpeed(1);
StepsRequired = 4;
steppermotor.step(StepsRequired);
delay(2000);
// Rotate CW 1/2 turn slowly
StepsRequired = STEPS_PER_OUT_REV / 2;
steppermotor.setSpeed(100);
steppermotor.step(StepsRequired);
delay(1000);
// Rotate CCW 1/2 turn quickly
StepsRequired = - STEPS_PER_OUT_REV / 2;
steppermotor.setSpeed(700);
steppermotor.step(StepsRequired);
delay(2000);
}
في هذا البرنامج ، نستخدم المكتبة Stepper التي تأتي ضمن بيئة تطوير الاردوينو . تهتم هذه المكتبة بتسلسل النبضات التي سنرسلها إلى محرك الخطوة ويمكن استخدامها مع مجموعة واسعة من المحركات ، أحادية القطب وثنائية القطب.
تتميز محركات الخطوة 28BYJ-48 بأن لها تروس داخلية مما يقلل من سرعة دوران عمود الخرج بمعامل 64 (البعض يختلف ). لذلك نحدد (نعرف) ثلاثة ثوابت للتعامل مع دوران المحرك:
• STEPS_PER_REV وهو عدد الخطوات التي يتخذها المحرك الفعلي لكل دورة. تم تعيينا بالقيمة 32.
• GEAR_RED وهو مقدار تقليل (تخفيض) التروس. تم وضعها بالقيمة 64 ولكن قد تحتاج إلى ضبطها إذا كان المحرك مختلفًا .
• STEPS_PER_OUT_REV وهو الخرج النهائي لعمود المحرك بعد تخفيض التروس. وهو حاصل ضرب الرقمين أعلاه.
في حال كنت تتساءل عن سبب استخدام النوع float بدلاً من integer للثوابت أعلاه ، فذلك لأن تخفيض التروس في بعض الأحيان يصل عدد مثل 63.5. إذا كنت تستخدم 64 ، يمكنك استخدام الأعداد الصحيحة integers .
سيتم استخدام المتغير "StepsRequired" لتحديد (لتعريف) عدد الخطوات التي نريد أن يدور بها محركنا.
محرك الخطوة أحادى القطبية 28BYJ-48 له تسلسل خطوة كما يلي: 1-3-2-4 سيتم استخدام هذه المعلومات لقيادة المحرك عن طريق إنشاء مثيل للفئة Stepper يسمى "steppermotor" مع تسلسل الأطراف 8,10, 9, 11 . تأكد تحقيق ذلك أو أن المحرك لن يعمل بشكل صحيح.
لا يوجد شيء لتعيينه في الدالة setup لأن فئة المكتبة Stepper تقوم بالفعل بتعيين أطراف الدخل / الخرج الأربعة كمخارج .
في الدالة loop لدينا ثلاثة عروض توضيحية ، لك الحرية لإضافة أكبر عدد تريده أو لتغيير الموجود .
التشغيل الأول يخطو المحرك أربع خطوات ببطء شديد. من المثير للاهتمام ملاحظة الليدات في UNL2003 أثناء تشغيلها.
التشغيل الثانى يدور المحرك في اتجاه عقارب الساعة نصف دوره ببطء شديد. والتشغيل النهائى يعود المحرك نصف دورة بسرعة أكبر بكثير. يمكنك تجربة البارامتر "setSpeed" لتحديد السرعة القصوى لمحركك.
محرك التيار المستمر بدون الفرش Brushless DC Motor(BLDC) والوحدة الإلكترونية للتحكم فى
محرك التيار المستمر بدون الفرش Brushless DC Motor(BLDC) والوحدة الإلكترونية للتحكم فى السرعة ESC والاردوينو .
https://howtomechatronics.com/how-it-works/how-brushless-motor-and-esc-work/
يتكون محرك BLDC من جزأين رئيسيين ، الجزء (العضو) الثابت stator والجزء (العضو) الدوار rotor . في الرسم التوضيحي أدناه ، العضو الدوار مكون من مغناطيسًا دائمًا permanent magnet به أقطاب ، بينما يتكون العضو الثابت من ملفات coils مرتبة كما هو موضح في الصورة أدناه.
نعلم جميعًا أنه إذا مررنا تيار كهربى خلال ملف ، فسيولد حقل مغناطيسي magnetic field وستعتمد خطوط المجال المغناطيسي أو القطبين على اتجاه التيار .
لذلك إذا طبقنا (مررنا) التيار المناسب ، فإن الملف سيولد مجال مغناطيسي يجذب المغناطيس الدائم للعضو الدوار . الآن إذا قمنا بتنشيط كل ملف واحد تلو الآخر ، فإن العضوالدوار سيظل يدور بسبب تفاعل القوة بين المغناطيس الدائم والمغناطيس الكهربائي.
من أجل زيادة كفاءة المحرك ، يمكننا لف اثنين من الملفات المعكوسة باعتبارها ملف واحد بالطريقة التي تولد أقطاب معاكسة لأقطاب العضو الدوار ، وبالتالي سنحصل على قوة جذب مزدوجة.
باستخدام هذا التكوين ، يمكننا إنشاء ستة أقطاب على العضو الثابت فقط بثلاثة ملفات أو طور phase . يمكننا زيادة الكفاءة أكثر عن طريق تنشيط اثنين من الملفات في نفس الوقت. وبهذه الطريقة ، ملف سوف يجذب attract والملف الآخر ينفر repel العضو الدوار .
من أجل أن يصنع العضو الدوار دورة كاملة 360 درجة ، فإنه يحتاج إلى ست خطوات أو فترات intervals.
إذا ألقينا نظرة على الشكل الموجي للتيار ، يمكننا أن نلاحظ أنه في فترة interval يوجد طور (مرحلة) phase ذات تيار موجب ، وطور ذات تيار سالب ، ويتم إيقاف off الطور (المرحلة) الثالث. هذا يعطي فكرة أنه يمكننا ربط نقاط النهاية الحرة لكل مرحلة من المراحل الثلاث معًا وبالتالي يمكننا مشاركة التيار بينهما أو استخدام تيار واحد لتنشيط المرحلتين في نفس الوقت.
إليكم مثال. إذا قمنا بسحب pull up المرحلة A عاليا High ، أو وصلناها بجهد DC موجب ، مع نوع من المبدلات switch ، على سبيل المثال MOSFET ، وعلى الجانب الآخر ، قم بتوصيل المرحلة B بالأرضى ، عندئذ سوف يتدفق التيار من الجهد VCC ، عبر المرحلة A ، إلى النقطة المحايدة ثم المرحلة B ، إلى الأرضى. لذلك ، بمرور تيار واحد فقط ، أنشأنا الأقطاب الأربعة المختلفة التي تسبب تحريك العضو الدوار.
من خلال هذا التكوين ، يكون لدينا في الواقع اتصال نجمة star connection لأطوار المحرك ، حيث تكون النقطة المحايدة متصلة داخليًا وتخرج الأطراف الثلاثة الأخرى من المراحل من المحرك ، ولهذا السبب يخرج من المحرك بدون فرش ثلاثة أسلاك.
لذلك ، من أجل جعل العضو الدوار يصنع دورة كاملة ، نحتاج فقط إلى تنشيط 2 موسفيت MOSFETS الصحيحين في كل فترة زمنية من 6 فترات ، وهذا ما يدور حوله عمل وحدة متحكم السرعة إلكترونيا ESC بالفعل.
كيف تعمل ESC (وحدة متحكم السرعة إلكترونيا)
تتحكم (ESC) أو وحدة التحكم في السرعة إلكترونيا في حركة أو سرعة المحرك بدون فرش عن طريق تنشيط الموسفتات MOSFETs المناسبة لإنشاء المجال المغناطيسي الدوار بحيث يدور المحرك. كلما زاد التردد frequency أو كلما أسرع ESC من خلال الفواصل الزمنية الست ، كلما زادت سرعة المحرك.
ومع ذلك ، هنا يأتي سؤال مهم ، وهو كيف نعرف متى يتم تنشيط هذه المرحلة phase . الجواب هو أننا بحاجة إلى معرفة موضع العضو الدوار ، وهناك طريقتان شائعتان تستخدمان لتحديد موضع العضوالدوار.
الطريقة الأولى الشائعة هي استخدام حساسات "تأثير هول" Hall-effect المدمجة في العضو الثابت ، ومرتبة على قدم المساواة بين 120 أو 60 درجة عن بعضها البعض.
عندما تدور المغناطيسات الدائمة للعضو الدور ، تستشعر مستشعرات تأثير هول المجال المغناطيسي وتولد منطقًا "مرتفعًا" “high” لقطب مغنطيسي معين أو منطق "منخفض" “low” للقطب المقابل (العكسى) . وفقًا لهذه المعلومات ، يعرف ESC متى يتم تنشيط تتابع التبديل commutation التالى أو الفترة الزمنية interval.
الطريقة الثانية الشائعة المستخدمة لتحديد موضع العضو الدوار هي من خلال استشعار القوة الدافعة الكهربائية الخلفية (العكسية) back EMF . تحدث EMF الخلفية نتيجة للعملية المعاكسة تماما لتوليد مجال مغناطيسي أو عندما يمر مجال مغناطيسي متحرك أو متغير عبر ملف ، فإنه يُحدث induces تيارًا في الملف.
لذلك ، عندما يمر الحقل المغناطيسي المتحرك للعضو الدوار عبر الملف الحر ، أو الملف غير النشط ، فإنه سيؤدي إلى تدفق تيار في الملف ونتيجة لذلك سيحدث انخفاض في الجهد في هذا الملف. يلتقط ESC انخفاض الجهد هذا عند حدوثه وبناءً عليه ، فإنه يتوقع أو يحسب متى يجب أن يحدث الفاصل الزمني interval التالي.
هذا هو مبدأ العمل الأساسي لمحركات التيار المستمر بدون فرش و(ESCs) وهو نفس الشيء حتى لو قمنا بزيادة عدد أقطاب كل من العضو الدوار والعضو الثابت. سيظل لدينا محرك ثلاثي المراحل (الأطوار) phase ، فقط عدد الفواصل الزمنية سيزيد من أجل إكمال دورة كاملة.
هنا يمكننا أن نذكر أيضًا أن محركات BLDC يمكن أن تكون من النوع inrunners أو النوع outrunners . يمتلك المحرك inrunner مغناطيسًا دائمًا داخل المغناطيسات الكهربائية ، والعكس بالعكس ، يمتلك المحرك outrunner المغناطيس الدائم خارج المغناطيس الكهربائي. مرة أخرى ، وهم يستخدمون نفس مبدأ العمل ولكل منهم نقاط القوة أو الضعف الخاصة به.
المحرك بدون فرش من نوع outrunner brushless motor مزود بالمغناطيس الدائم خارج المغناطيس الكهربائي.المحور الخارجي الذي يحمل المغناطيس الدائم يحتوي على عمود الخرج (الدوران) المتصل في المنتصف.
outrunner brushless motor
https://howtomechatronics.com/how-it-works/how-brushless-motor-and-esc-work/
يتكون محرك BLDC من جزأين رئيسيين ، الجزء (العضو) الثابت stator والجزء (العضو) الدوار rotor . في الرسم التوضيحي أدناه ، العضو الدوار مكون من مغناطيسًا دائمًا permanent magnet به أقطاب ، بينما يتكون العضو الثابت من ملفات coils مرتبة كما هو موضح في الصورة أدناه.
نعلم جميعًا أنه إذا مررنا تيار كهربى خلال ملف ، فسيولد حقل مغناطيسي magnetic field وستعتمد خطوط المجال المغناطيسي أو القطبين على اتجاه التيار .
لذلك إذا طبقنا (مررنا) التيار المناسب ، فإن الملف سيولد مجال مغناطيسي يجذب المغناطيس الدائم للعضو الدوار . الآن إذا قمنا بتنشيط كل ملف واحد تلو الآخر ، فإن العضوالدوار سيظل يدور بسبب تفاعل القوة بين المغناطيس الدائم والمغناطيس الكهربائي.
من أجل زيادة كفاءة المحرك ، يمكننا لف اثنين من الملفات المعكوسة باعتبارها ملف واحد بالطريقة التي تولد أقطاب معاكسة لأقطاب العضو الدوار ، وبالتالي سنحصل على قوة جذب مزدوجة.
باستخدام هذا التكوين ، يمكننا إنشاء ستة أقطاب على العضو الثابت فقط بثلاثة ملفات أو طور phase . يمكننا زيادة الكفاءة أكثر عن طريق تنشيط اثنين من الملفات في نفس الوقت. وبهذه الطريقة ، ملف سوف يجذب attract والملف الآخر ينفر repel العضو الدوار .
من أجل أن يصنع العضو الدوار دورة كاملة 360 درجة ، فإنه يحتاج إلى ست خطوات أو فترات intervals.
إذا ألقينا نظرة على الشكل الموجي للتيار ، يمكننا أن نلاحظ أنه في فترة interval يوجد طور (مرحلة) phase ذات تيار موجب ، وطور ذات تيار سالب ، ويتم إيقاف off الطور (المرحلة) الثالث. هذا يعطي فكرة أنه يمكننا ربط نقاط النهاية الحرة لكل مرحلة من المراحل الثلاث معًا وبالتالي يمكننا مشاركة التيار بينهما أو استخدام تيار واحد لتنشيط المرحلتين في نفس الوقت.
إليكم مثال. إذا قمنا بسحب pull up المرحلة A عاليا High ، أو وصلناها بجهد DC موجب ، مع نوع من المبدلات switch ، على سبيل المثال MOSFET ، وعلى الجانب الآخر ، قم بتوصيل المرحلة B بالأرضى ، عندئذ سوف يتدفق التيار من الجهد VCC ، عبر المرحلة A ، إلى النقطة المحايدة ثم المرحلة B ، إلى الأرضى. لذلك ، بمرور تيار واحد فقط ، أنشأنا الأقطاب الأربعة المختلفة التي تسبب تحريك العضو الدوار.
من خلال هذا التكوين ، يكون لدينا في الواقع اتصال نجمة star connection لأطوار المحرك ، حيث تكون النقطة المحايدة متصلة داخليًا وتخرج الأطراف الثلاثة الأخرى من المراحل من المحرك ، ولهذا السبب يخرج من المحرك بدون فرش ثلاثة أسلاك.
لذلك ، من أجل جعل العضو الدوار يصنع دورة كاملة ، نحتاج فقط إلى تنشيط 2 موسفيت MOSFETS الصحيحين في كل فترة زمنية من 6 فترات ، وهذا ما يدور حوله عمل وحدة متحكم السرعة إلكترونيا ESC بالفعل.
كيف تعمل ESC (وحدة متحكم السرعة إلكترونيا)
تتحكم (ESC) أو وحدة التحكم في السرعة إلكترونيا في حركة أو سرعة المحرك بدون فرش عن طريق تنشيط الموسفتات MOSFETs المناسبة لإنشاء المجال المغناطيسي الدوار بحيث يدور المحرك. كلما زاد التردد frequency أو كلما أسرع ESC من خلال الفواصل الزمنية الست ، كلما زادت سرعة المحرك.
ومع ذلك ، هنا يأتي سؤال مهم ، وهو كيف نعرف متى يتم تنشيط هذه المرحلة phase . الجواب هو أننا بحاجة إلى معرفة موضع العضو الدوار ، وهناك طريقتان شائعتان تستخدمان لتحديد موضع العضوالدوار.
الطريقة الأولى الشائعة هي استخدام حساسات "تأثير هول" Hall-effect المدمجة في العضو الثابت ، ومرتبة على قدم المساواة بين 120 أو 60 درجة عن بعضها البعض.
عندما تدور المغناطيسات الدائمة للعضو الدور ، تستشعر مستشعرات تأثير هول المجال المغناطيسي وتولد منطقًا "مرتفعًا" “high” لقطب مغنطيسي معين أو منطق "منخفض" “low” للقطب المقابل (العكسى) . وفقًا لهذه المعلومات ، يعرف ESC متى يتم تنشيط تتابع التبديل commutation التالى أو الفترة الزمنية interval.
الطريقة الثانية الشائعة المستخدمة لتحديد موضع العضو الدوار هي من خلال استشعار القوة الدافعة الكهربائية الخلفية (العكسية) back EMF . تحدث EMF الخلفية نتيجة للعملية المعاكسة تماما لتوليد مجال مغناطيسي أو عندما يمر مجال مغناطيسي متحرك أو متغير عبر ملف ، فإنه يُحدث induces تيارًا في الملف.
لذلك ، عندما يمر الحقل المغناطيسي المتحرك للعضو الدوار عبر الملف الحر ، أو الملف غير النشط ، فإنه سيؤدي إلى تدفق تيار في الملف ونتيجة لذلك سيحدث انخفاض في الجهد في هذا الملف. يلتقط ESC انخفاض الجهد هذا عند حدوثه وبناءً عليه ، فإنه يتوقع أو يحسب متى يجب أن يحدث الفاصل الزمني interval التالي.
هذا هو مبدأ العمل الأساسي لمحركات التيار المستمر بدون فرش و(ESCs) وهو نفس الشيء حتى لو قمنا بزيادة عدد أقطاب كل من العضو الدوار والعضو الثابت. سيظل لدينا محرك ثلاثي المراحل (الأطوار) phase ، فقط عدد الفواصل الزمنية سيزيد من أجل إكمال دورة كاملة.
هنا يمكننا أن نذكر أيضًا أن محركات BLDC يمكن أن تكون من النوع inrunners أو النوع outrunners . يمتلك المحرك inrunner مغناطيسًا دائمًا داخل المغناطيسات الكهربائية ، والعكس بالعكس ، يمتلك المحرك outrunner المغناطيس الدائم خارج المغناطيس الكهربائي. مرة أخرى ، وهم يستخدمون نفس مبدأ العمل ولكل منهم نقاط القوة أو الضعف الخاصة به.
المحرك بدون فرش من نوع outrunner brushless motor مزود بالمغناطيس الدائم خارج المغناطيس الكهربائي.المحور الخارجي الذي يحمل المغناطيس الدائم يحتوي على عمود الخرج (الدوران) المتصل في المنتصف.
outrunner brushless motor
رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects
كيفية التحكم فى محرك التيار المستمر بدون الفرش باستخدام الاردوينو :
سوف نتعلم كيفية التحكم في محرك بدون فرش باستخدام Arduino و ESC .
محرك BLDC المستخدم بالمواصفات التالية: له معدل KV rating بالقيمة “1000” ، ويمكن تشغيله باستخدام بطارية 2S أو 3S أو 4S نوع LiPo(lithium polymer battery) ويتطلب 30A ESC . يحدد (يعرف) معدل KV لمحرك بدون فرش السرعة RPM للمحرك لكل فولت بدون تحميل.
في هذه الحالة ، يعني 1000KV ، على سبيل المثال ، أنه إذا قمنا لتغذية المحرك ببطارية 2S LiPo التي يبلغ جهدها 7.4 فولت ، يمكن للمحرك أن يحقق أقصى سرعة RPM تبلغ 7.4 أضعاف 1000 ، أو 7400 دورة في الدقيقة.
تتميز المحركات التي لا تستخدم فرشًا بأنها متعطشة للقدرة ، والطريقة الأكثر شيوعًا لتشغيلها هي استخدام بطاريات LiPo. يشير الرقم "S" لبطارية LiPo إلى عدد الخلايا الموجودة في البطارية ، ولكل خلية جهد كهربي قدره 3.7 فولت.
في هذا المثال ، نستخدم بطارية 3S LiPo التي تحتوي على 3 خلايا أى 11.1 فولت. لذلك ، نتوقع أن يصل المحرك إلى الحد الأقصى لعدد الدورات في الدقيقة بقيمة 11100.
أخيرًا ، الوحدة 30A ESC التي سنستخدمها في هذا المثال وتطابق متطلبات المحرك. على جانب ، يوجد لدى ESC ثلاثة أسلاك تتحكم في المراحل الثلاثة للمحرك وعلى الجانب الآخر يوجد سلكان ، VCC و GND ، لتوفير القدرة .
هناك أيضًا مجموعة أخرى من ثلاثة أسلاك تخرج من ESC وهي خط الإشارة ، +5V ، والأرضى. تسمى هذه الميزة لوحدة ESC "دائرة حزف أو تعويض البطارية " Battery Eliminator Circuit وكما يوحي الاسم ، فهي تلغي الحاجة إلى بطارية منفصلة للميكروكونترولر . ومن ثم ، توفر ESC +5V منظم يمكن استخدامه لتشغيل Arduino .
يمكننا أن نلاحظ هنا أن هذا الاتصال هو في الواقع نفس الاتصال الذي نراه مع محركات السيرفو.
إن التحكم في محرك بدون فرش باستخدام ESC و Arduino بسيط مثل التحكم في محرك السيرفو باستخدام Arduino. تستخدم ESCs نفس نوع إشارة التحكم مثل السيرفو وهى إشارة 50Hz PWM القياسية.
لذلك ، باستخدام Arduino ، علينا فقط توليد إشارة 50Hz PWM واعتمادًا على عرض النبضات أو مدة الحالة المرتفعة التي يجب أن تتراوح من واحد ميلي إلى 2 ميلي ثانية ، فإن ESC سوف يقود المحرك من الحد الأدنى إلى أقصى سرعة RPM .
الدائرة الكهربية :
بالإضافة إلى ESC ، سنستخدم مقاومة متغيرة potentiometer بسيط للتحكم في سرعة المحرك.
البرنامج :
البرنامج حقيقة بسيط ، فقط بضع سطور من الكود :
الوصف:
نحن بحاجة إلى تعريف مكتبة Servo ، لأنه مع مكتبة servo يمكننا بسهولة توليد إشارة 50Hz PWM ، وإلا فإن إشارات PWM التي يولدها Arduino تكون عند ترددات مختلفة. ثم نحتاج إلى إنشاء كائن servo وليكن ESC وتعريف متغير لتخزين الدخل التناظرى من المقاومة المتغيرة . في قسم الإعداد setup ، نستخدم الدالة attach() ، لنعرّف أي طرف Arduino هو الطرف الموصل لإشارة التحكم الخاصة بالوحدة ESC ، كما نحدد (نعرف) الحد الأدنى والحد الأقصى لعرض نبضات إشارة PWM بالميكروثانية.
في قسم الحلقة loop ، فى البداية نقرأ البوتونشميتر ، ونقوم بتعيين map قيمته من 0 إلى 1023 إلى القيمة من 0 إلى 180. ثم باستخدام الدالة write() نرسل الإشارة إلى ESC ، أو نولد إشارة 50Hz PWM . تتوافق القيم من 0 إلى 180 مع القيم من 1000 إلى 2000 ميكروثانية المحددة في قسم الإعداد.
لذلك ، إذا قمنا بتحميل هذا الكود إلى Arduino ، ثم قمنا بتشغيل كل شيء باستخدام البطارية ، فيمكننا التحكم في سرعة المحرك بدون فرش من الصفر إلى الحد الأقصى باستخدام البوتنشميتر .
سوف نتعلم كيفية التحكم في محرك بدون فرش باستخدام Arduino و ESC .
محرك BLDC المستخدم بالمواصفات التالية: له معدل KV rating بالقيمة “1000” ، ويمكن تشغيله باستخدام بطارية 2S أو 3S أو 4S نوع LiPo(lithium polymer battery) ويتطلب 30A ESC . يحدد (يعرف) معدل KV لمحرك بدون فرش السرعة RPM للمحرك لكل فولت بدون تحميل.
في هذه الحالة ، يعني 1000KV ، على سبيل المثال ، أنه إذا قمنا لتغذية المحرك ببطارية 2S LiPo التي يبلغ جهدها 7.4 فولت ، يمكن للمحرك أن يحقق أقصى سرعة RPM تبلغ 7.4 أضعاف 1000 ، أو 7400 دورة في الدقيقة.
تتميز المحركات التي لا تستخدم فرشًا بأنها متعطشة للقدرة ، والطريقة الأكثر شيوعًا لتشغيلها هي استخدام بطاريات LiPo. يشير الرقم "S" لبطارية LiPo إلى عدد الخلايا الموجودة في البطارية ، ولكل خلية جهد كهربي قدره 3.7 فولت.
في هذا المثال ، نستخدم بطارية 3S LiPo التي تحتوي على 3 خلايا أى 11.1 فولت. لذلك ، نتوقع أن يصل المحرك إلى الحد الأقصى لعدد الدورات في الدقيقة بقيمة 11100.
أخيرًا ، الوحدة 30A ESC التي سنستخدمها في هذا المثال وتطابق متطلبات المحرك. على جانب ، يوجد لدى ESC ثلاثة أسلاك تتحكم في المراحل الثلاثة للمحرك وعلى الجانب الآخر يوجد سلكان ، VCC و GND ، لتوفير القدرة .
هناك أيضًا مجموعة أخرى من ثلاثة أسلاك تخرج من ESC وهي خط الإشارة ، +5V ، والأرضى. تسمى هذه الميزة لوحدة ESC "دائرة حزف أو تعويض البطارية " Battery Eliminator Circuit وكما يوحي الاسم ، فهي تلغي الحاجة إلى بطارية منفصلة للميكروكونترولر . ومن ثم ، توفر ESC +5V منظم يمكن استخدامه لتشغيل Arduino .
يمكننا أن نلاحظ هنا أن هذا الاتصال هو في الواقع نفس الاتصال الذي نراه مع محركات السيرفو.
إن التحكم في محرك بدون فرش باستخدام ESC و Arduino بسيط مثل التحكم في محرك السيرفو باستخدام Arduino. تستخدم ESCs نفس نوع إشارة التحكم مثل السيرفو وهى إشارة 50Hz PWM القياسية.
لذلك ، باستخدام Arduino ، علينا فقط توليد إشارة 50Hz PWM واعتمادًا على عرض النبضات أو مدة الحالة المرتفعة التي يجب أن تتراوح من واحد ميلي إلى 2 ميلي ثانية ، فإن ESC سوف يقود المحرك من الحد الأدنى إلى أقصى سرعة RPM .
الدائرة الكهربية :
بالإضافة إلى ESC ، سنستخدم مقاومة متغيرة potentiometer بسيط للتحكم في سرعة المحرك.
البرنامج :
البرنامج حقيقة بسيط ، فقط بضع سطور من الكود :
- الكود:
/*
Arduino Brushless Motor Control
by Dejan, https://howtomechatronics.com
*/
#include <Servo.h>
Servo ESC; // create servo object to control the ESC
int potValue; // value from the analog pin
void setup() {
// Attach the ESC on pin 9
ESC.attach(9,1000,2000); // (pin, min pulse width, max pulse width in microseconds)
}
void loop() {
potValue = analogRead(A0); // reads the value of the potentiometer (value between 0 and 1023)
potValue = map(potValue, 0, 1023, 0, 180); // scale it to use it with the servo library (value between 0 and 180)
ESC.write(potValue); // Send the signal to the ESC
}
الوصف:
نحن بحاجة إلى تعريف مكتبة Servo ، لأنه مع مكتبة servo يمكننا بسهولة توليد إشارة 50Hz PWM ، وإلا فإن إشارات PWM التي يولدها Arduino تكون عند ترددات مختلفة. ثم نحتاج إلى إنشاء كائن servo وليكن ESC وتعريف متغير لتخزين الدخل التناظرى من المقاومة المتغيرة . في قسم الإعداد setup ، نستخدم الدالة attach() ، لنعرّف أي طرف Arduino هو الطرف الموصل لإشارة التحكم الخاصة بالوحدة ESC ، كما نحدد (نعرف) الحد الأدنى والحد الأقصى لعرض نبضات إشارة PWM بالميكروثانية.
في قسم الحلقة loop ، فى البداية نقرأ البوتونشميتر ، ونقوم بتعيين map قيمته من 0 إلى 1023 إلى القيمة من 0 إلى 180. ثم باستخدام الدالة write() نرسل الإشارة إلى ESC ، أو نولد إشارة 50Hz PWM . تتوافق القيم من 0 إلى 180 مع القيم من 1000 إلى 2000 ميكروثانية المحددة في قسم الإعداد.
لذلك ، إذا قمنا بتحميل هذا الكود إلى Arduino ، ثم قمنا بتشغيل كل شيء باستخدام البطارية ، فيمكننا التحكم في سرعة المحرك بدون فرش من الصفر إلى الحد الأقصى باستخدام البوتنشميتر .
الليد ماتريكس LED Matrix 8X8 ومشغل الليدات MAX7219 Driver والاردوينو وArduino وتحريك
الليد ماتريكس LED Matrix 8X8 ومشغل الليدات MAX7219 Driver والاردوينو وArduino وتحريك النصوص
الجزء الأول : الأجهزة (الهاردوير) :
في هذا التدريب ، ستتعلم كيفية استخدام وحدة (موديول) مصفوفة ليدات (ليد ماتريكس) 8 × 8 مع الدائرة المتكاملة MAX7219 . في النهاية ، ستتمكن من عرض أي شكل shape أو نص text على مصفوفة ليدات واحدة أو أكثر بسهولة بشكل ثابت fixed أو متحرك scrolled ، باستخدام 3 أطراف رقمية فقط من الاردوينو.
ما هى مصفوفة الليدات (الليد ماتريكس) Dot LED Matrix ؟
هى عبارة عن مصفوفة من الليدات التي يمكنك عرض أرقام وحروف وأشكال معينة عليها. تعرف مصفوفات الليدات بعدد الصفوف rows والأعمدة Columns النوع الأكثر شيوعًا من مصفوفة اللليدات هو النوع 8 × 8 ، والذي يوفر 64 ليد في 8 صفوف و 8 أعمدة.
للتحكم في مصفوفة ليدات 8 × 8 ببساطة ، يجب عليك توصيل كل صف وكل عمود بطرف رقمي ، مما يعني أنك تحتاج إلى 16 طرفا رقميًا! وهى ليست طريقة مناسبة.
للتحكم في مصفوفة الليدات بطريقة مناسبة ، توجد وحدات (موديولات) قائمة على الدوائر المتكاملة MAX72xx والتي تحتاج إلى توصيل 3 أطراف رقمية (علاوة على طرفى مصدر القدرة +5V , GND ) بدلاً من 16 طرف. يمكنك أيضًا توصيل عدة مصفوفات ليدات (حتى مع بعضها البعض دون الحاجة إلى أي طرف إضافي بعمل تتابع (تتالى) cascading لها .
الدائرة المتكاملة MAX7219 :
دعونا نلقي نظرة فاحصة على المشغل MAX7219 driver . يمكن لهذه الدائرة المتكاملة تشغيل 64 ليد فرديًا باستخدام 3 أسلاك فقط للتوصيل مع Arduino ، والأكثر من ذلك أننا نستطيع عمل سلسلة من المشغلات ومصفوفات الليدات المتعددة باستخدام نفس الأسلاك الثلاثة فقط .
كيفية توصيل (ربط) موديول الليد ماتريكس مع الأردوينو :
لتوصيل موديول الليد ماتريكس مع Arduino ، ما عليك سوى توصيل طرفى القدرة Vcc و GND بالطرفين 5V و GND فى Arduino ، ويمكن توصيل الأطراف DIN (دخل البيانات) و CS (أختيار الشريحة) و CLK (الساعة) الخاصة بموديول مصفوفة الليدات بأي أطراف رقمية من arduino كما هو موضح بالشكل أدناه .
يتم تشغيل 64 ليد بواسطة 16 طرف خرج من MAX7219 . السؤال الآن هو كيف يكون ذلك ممكنا، حسنًا ، يصل الحد الأقصى لعدد الليدات التى تضىء فعليا في نفس الوقت إلى ثمانية. يتم ترتيب الليدات في مجموعة 8 × 8 من الصفوف rows والأعمدة columns . لذلك ينشط (يفعل) MAX7219 كل عمود لفترة قصيرة جدًا من الوقت وفي نفس الوقت يقوم أيضًا بتشغيل كل صف. لذلك من خلال التبديل السريع بين الأعمدة والصفوف ، لن تلاحظ العين البشرية سوى ضوء مستمر.
لاحظ كيف يتم ترتيب أطراف مصفوفة الليد ماتريكس الشائعة 8 × 8 داخليًا ، لذلك إذا كنت تقوم ببناء مصفوفة ليدات ، فيجب أن تضع ذلك فى اعتبارك . لاحظ أيضًا أن اللوحة الشائعة للدائرة المتكاملة MAX7219 تأتي بمقاومة بين طرف 5V والطرف 18 للدائرة المتكاملة Iset . يتم استخدام المقاومة لتحديد السطوع أو مرور التيار إلى الليدات .
يحتوي MAX7219 على واجهة تسلسلية SPI بأربعة أسلاك - الساعة clock ، البيانات data ، اختيار الرقاقة chip select والأرض ground - مما يجعل التوصيل مع المتحكم بسيطًا للغاية.
التحكم فى سطوع (شدة إضاءة) ليدات الشاشة مع MAX7219 :
هناك طريقتان للتحكم في سطوع الشاشة.
• عبر مقاومة تحديد التيار (Rset) .
• برمجيا باستخدام سجل التحكم الداخلى .
ملاحظة: لا يوجد أي متطلبات لإضافة مقاومات تحديد التيار لكل عمود حيث يتم التحكم في شدة خرج الليد بواسطة إشارة PWM ، بمعنى أنه يتم تشغيل الليد لفترة زمنية أقصر لتعتيمها - ويتم التحكم في هذا الزمن بواسطة سجل داخلى .
مقاومة التحكم فى السطوع :
لا يمكنك استخدام أحدهما دون الأخرى ، حيث يتعين عليك استخدام مقاومة لضبط الحد الأقصى للشدة. يجب أن يكون الحد الأدنى لقيمة المقاومة هو 9.53k لسطوع 40mA لعمر 7219 الأقصى باستخدام ليدات حمراء - انظر الجدول أدناه ).
يعتمد ضبط التيار أيضًا على هبوط (انخفاض) الجهد الأمامي في الليدات التي تستخدمها ؛ كل لون ليد مختلف له انخفاض مختلف للجهد الأمامي - انظر الجدول:
فيما يلي هبوط الجهد الأمامى (عند تيار ثابت ~15mA ) لبعض الليدات :
التحكم فى سجل السطوع :
الطريقة الثانية للتحكم في السطوع هي أكثر فائدة لأنها تحت سيطرة البرنامج. يعين السجل 0xXA المستوى باستخدام 4 بتات البيانات الأدنى ، أي أن هناك 15 مستوى من مستويات السطوع مع كون 15 هي الأكثر سطوعًا.
توصيل اثنين أو أكثر من المشغلات MAX7219 :
يسمح الشكل أدناه بتمرير scrolling النص من اليسار إلى اليمين (لا يبدو أنه من المناسب ربطهم بهذه الطريقة - لكن هذه هي الطريقة التي يسمح بها الكود للتمرير الصحيح). الوصلات الموجودة أعلى اللوحة مماثلة لتلك الموجودة في الجزء السفلي ، باستثناء أن الطرف الأوسط هو Dout (أسود). الأربعة خطوط الأخرى متصلة مباشرة بنظيرها .
ملاحظة: لإضافة المزيد من شاشات التمرير ، أضفها إلى اليسار وقم بتغيير المتغير maxDisplays ليطابق عدد الوحدات .
يتم توصيل VCC و GND من الوحدة إلى الأطراف 5V و GND من Arduino وتوصيل الأطراف الثلاثة الأخرى ، DIN و CLK و CS إلى أي طرف رقمي من لوحة Arduino. إذا كنا نريد توصيل أكثر من وحدة ، فقط يتم توصيل أطراف الخرج بأطراف الدخل للوحدة الجديدة. في الواقع هذه الأطراف متشابهة فيما عدا أن الطرف DOUT في اللوحة السابقة يتصل بطرف DIN الخاص باللوحة الجديدة.
الدائرة الكهربية ببرنامج بروتيس :
الآن دعنا نوصل وحدة ليد ماتريكس 8 × 8 والمشغل 7219 بلوحة Arduino. إليك مخطط الدائرة الكهربية :
الجزء الأول : الأجهزة (الهاردوير) :
في هذا التدريب ، ستتعلم كيفية استخدام وحدة (موديول) مصفوفة ليدات (ليد ماتريكس) 8 × 8 مع الدائرة المتكاملة MAX7219 . في النهاية ، ستتمكن من عرض أي شكل shape أو نص text على مصفوفة ليدات واحدة أو أكثر بسهولة بشكل ثابت fixed أو متحرك scrolled ، باستخدام 3 أطراف رقمية فقط من الاردوينو.
ما هى مصفوفة الليدات (الليد ماتريكس) Dot LED Matrix ؟
هى عبارة عن مصفوفة من الليدات التي يمكنك عرض أرقام وحروف وأشكال معينة عليها. تعرف مصفوفات الليدات بعدد الصفوف rows والأعمدة Columns النوع الأكثر شيوعًا من مصفوفة اللليدات هو النوع 8 × 8 ، والذي يوفر 64 ليد في 8 صفوف و 8 أعمدة.
للتحكم في مصفوفة ليدات 8 × 8 ببساطة ، يجب عليك توصيل كل صف وكل عمود بطرف رقمي ، مما يعني أنك تحتاج إلى 16 طرفا رقميًا! وهى ليست طريقة مناسبة.
للتحكم في مصفوفة الليدات بطريقة مناسبة ، توجد وحدات (موديولات) قائمة على الدوائر المتكاملة MAX72xx والتي تحتاج إلى توصيل 3 أطراف رقمية (علاوة على طرفى مصدر القدرة +5V , GND ) بدلاً من 16 طرف. يمكنك أيضًا توصيل عدة مصفوفات ليدات (حتى مع بعضها البعض دون الحاجة إلى أي طرف إضافي بعمل تتابع (تتالى) cascading لها .
الدائرة المتكاملة MAX7219 :
دعونا نلقي نظرة فاحصة على المشغل MAX7219 driver . يمكن لهذه الدائرة المتكاملة تشغيل 64 ليد فرديًا باستخدام 3 أسلاك فقط للتوصيل مع Arduino ، والأكثر من ذلك أننا نستطيع عمل سلسلة من المشغلات ومصفوفات الليدات المتعددة باستخدام نفس الأسلاك الثلاثة فقط .
كيفية توصيل (ربط) موديول الليد ماتريكس مع الأردوينو :
لتوصيل موديول الليد ماتريكس مع Arduino ، ما عليك سوى توصيل طرفى القدرة Vcc و GND بالطرفين 5V و GND فى Arduino ، ويمكن توصيل الأطراف DIN (دخل البيانات) و CS (أختيار الشريحة) و CLK (الساعة) الخاصة بموديول مصفوفة الليدات بأي أطراف رقمية من arduino كما هو موضح بالشكل أدناه .
يتم تشغيل 64 ليد بواسطة 16 طرف خرج من MAX7219 . السؤال الآن هو كيف يكون ذلك ممكنا، حسنًا ، يصل الحد الأقصى لعدد الليدات التى تضىء فعليا في نفس الوقت إلى ثمانية. يتم ترتيب الليدات في مجموعة 8 × 8 من الصفوف rows والأعمدة columns . لذلك ينشط (يفعل) MAX7219 كل عمود لفترة قصيرة جدًا من الوقت وفي نفس الوقت يقوم أيضًا بتشغيل كل صف. لذلك من خلال التبديل السريع بين الأعمدة والصفوف ، لن تلاحظ العين البشرية سوى ضوء مستمر.
لاحظ كيف يتم ترتيب أطراف مصفوفة الليد ماتريكس الشائعة 8 × 8 داخليًا ، لذلك إذا كنت تقوم ببناء مصفوفة ليدات ، فيجب أن تضع ذلك فى اعتبارك . لاحظ أيضًا أن اللوحة الشائعة للدائرة المتكاملة MAX7219 تأتي بمقاومة بين طرف 5V والطرف 18 للدائرة المتكاملة Iset . يتم استخدام المقاومة لتحديد السطوع أو مرور التيار إلى الليدات .
يحتوي MAX7219 على واجهة تسلسلية SPI بأربعة أسلاك - الساعة clock ، البيانات data ، اختيار الرقاقة chip select والأرض ground - مما يجعل التوصيل مع المتحكم بسيطًا للغاية.
التحكم فى سطوع (شدة إضاءة) ليدات الشاشة مع MAX7219 :
هناك طريقتان للتحكم في سطوع الشاشة.
• عبر مقاومة تحديد التيار (Rset) .
• برمجيا باستخدام سجل التحكم الداخلى .
ملاحظة: لا يوجد أي متطلبات لإضافة مقاومات تحديد التيار لكل عمود حيث يتم التحكم في شدة خرج الليد بواسطة إشارة PWM ، بمعنى أنه يتم تشغيل الليد لفترة زمنية أقصر لتعتيمها - ويتم التحكم في هذا الزمن بواسطة سجل داخلى .
مقاومة التحكم فى السطوع :
لا يمكنك استخدام أحدهما دون الأخرى ، حيث يتعين عليك استخدام مقاومة لضبط الحد الأقصى للشدة. يجب أن يكون الحد الأدنى لقيمة المقاومة هو 9.53k لسطوع 40mA لعمر 7219 الأقصى باستخدام ليدات حمراء - انظر الجدول أدناه ).
يعتمد ضبط التيار أيضًا على هبوط (انخفاض) الجهد الأمامي في الليدات التي تستخدمها ؛ كل لون ليد مختلف له انخفاض مختلف للجهد الأمامي - انظر الجدول:
فيما يلي هبوط الجهد الأمامى (عند تيار ثابت ~15mA ) لبعض الليدات :
التحكم فى سجل السطوع :
الطريقة الثانية للتحكم في السطوع هي أكثر فائدة لأنها تحت سيطرة البرنامج. يعين السجل 0xXA المستوى باستخدام 4 بتات البيانات الأدنى ، أي أن هناك 15 مستوى من مستويات السطوع مع كون 15 هي الأكثر سطوعًا.
توصيل اثنين أو أكثر من المشغلات MAX7219 :
يسمح الشكل أدناه بتمرير scrolling النص من اليسار إلى اليمين (لا يبدو أنه من المناسب ربطهم بهذه الطريقة - لكن هذه هي الطريقة التي يسمح بها الكود للتمرير الصحيح). الوصلات الموجودة أعلى اللوحة مماثلة لتلك الموجودة في الجزء السفلي ، باستثناء أن الطرف الأوسط هو Dout (أسود). الأربعة خطوط الأخرى متصلة مباشرة بنظيرها .
ملاحظة: لإضافة المزيد من شاشات التمرير ، أضفها إلى اليسار وقم بتغيير المتغير maxDisplays ليطابق عدد الوحدات .
يتم توصيل VCC و GND من الوحدة إلى الأطراف 5V و GND من Arduino وتوصيل الأطراف الثلاثة الأخرى ، DIN و CLK و CS إلى أي طرف رقمي من لوحة Arduino. إذا كنا نريد توصيل أكثر من وحدة ، فقط يتم توصيل أطراف الخرج بأطراف الدخل للوحدة الجديدة. في الواقع هذه الأطراف متشابهة فيما عدا أن الطرف DOUT في اللوحة السابقة يتصل بطرف DIN الخاص باللوحة الجديدة.
الدائرة الكهربية ببرنامج بروتيس :
الآن دعنا نوصل وحدة ليد ماتريكس 8 × 8 والمشغل 7219 بلوحة Arduino. إليك مخطط الدائرة الكهربية :
رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects
ثانيا البرمجيات Software :
هناك العديد من المكتبات للتعامل مصفوفة الليدات والمشغل MAX7219 و Arduino. تعد المكتبات Ledcontrol و MaxMatrix من أكثر المكتبات شيوعًا ، ولكل منهما نفس البنية ، سوف نستخدم المكتبة MaxMatrix .
دوال المكتبة MaxMatrix :
بعد تثبيت المكتبة MaxMatrix فى بيئة تطوير الاردوينو ، فى البداية ، يجب تضمينها فى البرنامج بالصيغة :
1- إنشاء كائن الفئة Create MaxMatrix Object
ويتم قبل الدالة setup :
الوسيط الأول DIN هو طرف دخل البيانات ، والوسيط الثانى هو طرف اختيار الشريحة CS ، والوسيط الثالث هو طرف الساعة CLK ، والوسيط الرابع هو عدد الموديولات المستخدمة maxInUse. يجب تعريف هذه الوسائط قبل إنشاء الكائن .
2- بدء تهيئة كائن الليد ماتريكس ويتم داخل الدالة setup :
m.Init();
3- ضبط (تحديد) شدة إضاءة (سطوع) intensity الليدات ( من 0 إلى 15 ) ، ويتم داخل الدالة setup :
الوسيط valueهو قيمة السطوع الجديد ، ويكون فى المدى من 0 إلى 15 .
مثال :
4- تشغيل on أو تحديث updated ليد محدد فى الإحداثى (x,y) ، أو (col,row)
حيث col هو ترتيب index عامود column الليد المراد تحديثه ، ويكون فى المدى من 0 إلى 79 .
و row هو ترتيب صف الليد المراد تحديثه ، ويكون فى المدى من 0 إلى 7 .
و value هى القيمة الجديدة لليد ، مشفرة كقيمة منطقية (HIGH / LOW) .
5- تشغيل أو تحديث عامود محدد (مجموعة ليدات فى العامود) :
حيث col هو ترتيب العامود المراد تحديثه ، فى المدى من 0 إلى 79 .
و value هى القيم الجديدة لليدات ، مشفرة كبايت unsigned byte .
6- تحديث "نفس العامود" لجميع الليد ماتريكس :
حيث col هى ترتيب العامود المراد تحديثه ، فى المدى من 0 إلى 7 .
و value هى القيم الجديدة لليدات ، مشفرة كبايت unsigned byte .
7- كتابة كائن Write a sprite : لعرض حرف معين بداية من نقطة البداية (x,y) :
حيث “x” هى ترتيب index عامود الكائن sprite المراد عرضه ، فى المدى من 0 إلى 79 .
و “y” هو ترتيب صف الكائن المراد عرضه ، فى المدى من 0 إلى 7 .
و sprite هو إشارة إلى مصفوفة بايت byte array ، مشفرة بمحتويات الكائن .
تنسيق formate الكائن sprite يكون كالتالي :
• sprite0: هو عدد أعمدة الكائن ، يجب أن يكون أكبر من أو يساوى 1 .
• sprite1 : هو عدد صفوف الكائن ، يجب أن يكون أكبر من أو يساوى 1 .
• sprite- n : هو محتويات الكائن ، مشفرة على أساس العامود بالبايتات unsigned bytes . كل عنصر مصفوفة يمثل عامود واحد من الكائن .
الكود المبين أدناه يعرض كائن الحرف “A” على الليد ماتريكس
8- دالة مسح الشاشة :
عملها واضح من اسمها .
9- دوال إزاحة (تحريك) Shift الليد ماتريكس :
تعمل هذه الدوال الأربع على زحزحة shift قيم المصفوفة matrix في أحد الاتجاهات ، افتراضيًا ، يتم ملء صف / عمود دخل الإزاحة shift-in بصفر (إطفاء LED). لتدوير rotate قيم LED (على سبيل المثال ، يتم تعبئة صف / عمود دخل الإزاحة shift-in بقيم خرج الإزاحة) ، يمكنك ضبط علم الاستدارة rotate flag على صواب true m.shiftLeft(true); يمكنك أيضًا دخل الإزاحة بقيمة خارج المصفوفة matrix ، وذلك عن طريق أولاً تحميل القيم في المخزن المؤقت buffer (خارج مساحة المصفوفة التي استخدمتها) واستدعاء الدالة shiftLeft. هذا يكون مفيد لإنشاء رسالة التمرير والرسوم المتحركة.
يوضح الكود أدناه كيفية تمرير scroll الحرف 'A' في الليد ماتريكس (يفترض استخدام MAX7219 واحدة ):
مثال توضيحى :
هناك العديد من المكتبات للتعامل مصفوفة الليدات والمشغل MAX7219 و Arduino. تعد المكتبات Ledcontrol و MaxMatrix من أكثر المكتبات شيوعًا ، ولكل منهما نفس البنية ، سوف نستخدم المكتبة MaxMatrix .
دوال المكتبة MaxMatrix :
بعد تثبيت المكتبة MaxMatrix فى بيئة تطوير الاردوينو ، فى البداية ، يجب تضمينها فى البرنامج بالصيغة :
- الكود:
#include <MaxMatrix.h>
1- إنشاء كائن الفئة Create MaxMatrix Object
ويتم قبل الدالة setup :
- الكود:
int DIN = 7;
int CLK = 6;
int CS = 5;
int maxInUse = 1;
MaxMatrix m(DIN, CS, clock, maxInUse); // maxInUse is the numbers of MAX7219 used.
الوسيط الأول DIN هو طرف دخل البيانات ، والوسيط الثانى هو طرف اختيار الشريحة CS ، والوسيط الثالث هو طرف الساعة CLK ، والوسيط الرابع هو عدد الموديولات المستخدمة maxInUse. يجب تعريف هذه الوسائط قبل إنشاء الكائن .
2- بدء تهيئة كائن الليد ماتريكس ويتم داخل الدالة setup :
m.Init();
3- ضبط (تحديد) شدة إضاءة (سطوع) intensity الليدات ( من 0 إلى 15 ) ، ويتم داخل الدالة setup :
- الكود:
m.setIntensity(value) ;// value is the new intensity value, ranges from 0 to 15.
الوسيط valueهو قيمة السطوع الجديد ، ويكون فى المدى من 0 إلى 15 .
مثال :
- الكود:
void setup() {
m.init();
m.setIntensity(8);
}
4- تشغيل on أو تحديث updated ليد محدد فى الإحداثى (x,y) ، أو (col,row)
- الكود:
m.setDot(col, row, value) ;
حيث col هو ترتيب index عامود column الليد المراد تحديثه ، ويكون فى المدى من 0 إلى 79 .
و row هو ترتيب صف الليد المراد تحديثه ، ويكون فى المدى من 0 إلى 7 .
و value هى القيمة الجديدة لليد ، مشفرة كقيمة منطقية (HIGH / LOW) .
5- تشغيل أو تحديث عامود محدد (مجموعة ليدات فى العامود) :
- الكود:
m.setColumn(col, value);
حيث col هو ترتيب العامود المراد تحديثه ، فى المدى من 0 إلى 79 .
و value هى القيم الجديدة لليدات ، مشفرة كبايت unsigned byte .
6- تحديث "نفس العامود" لجميع الليد ماتريكس :
- الكود:
m.setColumnAll(col, value);
حيث col هى ترتيب العامود المراد تحديثه ، فى المدى من 0 إلى 7 .
و value هى القيم الجديدة لليدات ، مشفرة كبايت unsigned byte .
7- كتابة كائن Write a sprite : لعرض حرف معين بداية من نقطة البداية (x,y) :
- الكود:
m.writeSprite(x, y, sprite) ;
حيث “x” هى ترتيب index عامود الكائن sprite المراد عرضه ، فى المدى من 0 إلى 79 .
و “y” هو ترتيب صف الكائن المراد عرضه ، فى المدى من 0 إلى 7 .
و sprite هو إشارة إلى مصفوفة بايت byte array ، مشفرة بمحتويات الكائن .
تنسيق formate الكائن sprite يكون كالتالي :
• sprite0: هو عدد أعمدة الكائن ، يجب أن يكون أكبر من أو يساوى 1 .
• sprite1 : هو عدد صفوف الكائن ، يجب أن يكون أكبر من أو يساوى 1 .
• sprite- n : هو محتويات الكائن ، مشفرة على أساس العامود بالبايتات unsigned bytes . كل عنصر مصفوفة يمثل عامود واحد من الكائن .
الكود المبين أدناه يعرض كائن الحرف “A” على الليد ماتريكس
- الكود:
// CH_A stores the sprite 'A'
byte CH_A[] = {4, 8, B1111110, B0010001, B0010001, B1111110 };
m.writeSprite(0, 0, sprite);
ملاحظة :
byte CH_A[] = {4, 8,
B1111110,
B0010001,
B0010001,
B1111110 };
8- دالة مسح الشاشة :
- الكود:
clear()
عملها واضح من اسمها .
9- دوال إزاحة (تحريك) Shift الليد ماتريكس :
- الكود:
m.shiftLeft(rotate = false, fill_zero = true);
m.shiftRight(rotate = false, fill_zero = true);
m.shiftUp(rotate = false, fill_zero = true);
m.shiftDown(rotate = false, fill_zero = true);
تعمل هذه الدوال الأربع على زحزحة shift قيم المصفوفة matrix في أحد الاتجاهات ، افتراضيًا ، يتم ملء صف / عمود دخل الإزاحة shift-in بصفر (إطفاء LED). لتدوير rotate قيم LED (على سبيل المثال ، يتم تعبئة صف / عمود دخل الإزاحة shift-in بقيم خرج الإزاحة) ، يمكنك ضبط علم الاستدارة rotate flag على صواب true m.shiftLeft(true); يمكنك أيضًا دخل الإزاحة بقيمة خارج المصفوفة matrix ، وذلك عن طريق أولاً تحميل القيم في المخزن المؤقت buffer (خارج مساحة المصفوفة التي استخدمتها) واستدعاء الدالة shiftLeft. هذا يكون مفيد لإنشاء رسالة التمرير والرسوم المتحركة.
يوضح الكود أدناه كيفية تمرير scroll الحرف 'A' في الليد ماتريكس (يفترض استخدام MAX7219 واحدة ):
- الكود:
byte CH_A[] = {4, 8, B1111110, B0010001, B0010001, B1111110 };
m.writeSprite(8, 0, sprite); // write sprite OUTSIDE the LED matrix ,x = col. =8
for (int i=0; i<CH_A[0]; i++) { m.shiftLeft(false, false); delay(100); } // CH_A[0] = 4
مثال توضيحى :
- الكود:
/*
8x8 Dot Matrix w/ MAX7219
*/
#include <MaxMatrix.h>
int DIN = 7;
int CLK = 6;
int CS = 5;
int maxInUse = 1;
MaxMatrix m(DIN, CS, CLK, maxInUse);
void setup() {
m.init();
m.setIntensity(8);
}
void loop() {
m.setDot(0, 7, true);//col 1 , row 8 , on
delay(1000);
m.setDot(7, 0, true);// col 8 , row 1 , on
delay(1000);
m.setColumn(3, B11110000); // 3 means col 4 , rows 1 to 4 off and rows 5 to 8 on
delay(1000);
m.setColumn(4, B00001111); // 4 means col 5 , rows 1 to 4 on and rows 5 to 8 off
delay(1000);
m.clear();
delay(1000);
}
رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects
كود MAX7219 Arduino الأساسى :
بمجرد توصيل الوحدات ، نكون على استعداد لإلقاء نظرة على كود Arduino . في المثال الأول ، سوف نستخدم مكتبة MaxMatrix التي يمكن تنزيلها من الموقع GitHub .
الدائرة الكهربية :
البرنامج :
الوصف:
فى البداية ، نحن بحاجة إلى تضمين المكتبة MaxMatrix.h ، وتحديد (تعريف) الأطراف التي تتصل بها الوحدة (الموديول) ، وتعيين عدد الوحدات التي نستخدمها وتعريف كائن object للفئة MaxMatrix.
لعرض الأحرف ، نحتاج إلى تعريفها في مصفوفة أحرف char أو البايتات ، وهنا لدينا العديد من الأمثلة. يمكننا أن نلاحظ كيف تشكل البتات bits الأحرف التي هي في الواقع أصفار وأحاد . في هذه الحالة ، يتم تدويرها بزاوية 90 درجة ، لكن مثال المكتبة يقترح استخدامها بهذه الطريقة بحيث يكون من الأسهل لاحقًا تنفيذ وظيفة shiftLeft المخصصة لتمرير نص .
في قسم الإعداد setup ، نحتاج فقط إلى تهيئة initialize الوحدة وتعيين سطوع الليدات .
في قسم الحلقة loop باستخدام الدالة setDot() يمكننا تحديد أي ليد يضىء بشكل فردى عند موضع (x,y) أو ( col,row) وباستخدام الدالة clear() يمكننا مسح (نظافة) الشاشة.
لعرض الأحرف المعرّفة مسبقًا ، نستخدم الدالة writeSprite() ، والوسيطان الأولين هما الموضع x و y للزاوية اليسرى العليا للحرف. في النهاية باستخدام الدالة shiftLeft() يتم تحريك أو زحزحة أو تمرير الحرف إلى اليسار.
بمجرد توصيل الوحدات ، نكون على استعداد لإلقاء نظرة على كود Arduino . في المثال الأول ، سوف نستخدم مكتبة MaxMatrix التي يمكن تنزيلها من الموقع GitHub .
الدائرة الكهربية :
البرنامج :
- الكود:
/*
8x8 LED Matrix MAX7219 Example 01
by Dejan Nedelkovski, www.HowToMechatronics.com
Based on the following library:
GitHub | riyas-org/max7219 https://github.com/riyas-org/max7219
*/
#include <MaxMatrix.h>
int DIN = 7; // DIN pin of MAX7219 module
int CLK = 6; // CLK pin of MAX7219 module
int CS = 5; // CS pin of MAX7219 module
int maxInUse = 1;
MaxMatrix m(DIN, CS, CLK, maxInUse);
char A[] = {4, 8,
B01111110,
B00010001,
B00010001,
B01111110,
};
char B[] = {4, 8,
B01111111,
B01001001,
B01001001,
B00110110,
};
char smile01[] = {8, 8,
B00111100,
B01000010,
B10010101,
B10100001,
B10100001,
B10010101,
B01000010,
B00111100
};
char smile02[] = {8, 8,
B00111100,
B01000010,
B10010101,
B10010001,
B10010001,
B10010101,
B01000010,
B00111100
};
char smile03[] = {8, 8,
B00111100,
B01000010,
B10100101,
B10010001,
B10010001,
B10100101,
B01000010,
B00111100
};
void setup() {
m.init(); // MAX7219 initialization
m.setIntensity(8); // initial led matrix intensity, 0-15
}
void loop() {
// Seting the LEDs On or Off at x,y or column , row position
m.setDot(6,2,true); //LED (C7, R3) ON
delay(1000);
m.setDot(6,3,true);//LED (C7, R4) ON
delay(1000);
m.clear(); // Clears the display
for (int i=0; i<8; i++){
m.setDot(i,i,true); // Light LEDs (C1,R1),(C2,R2) ….(C8,R8) “Diagonal”
delay(300);
}
m.clear();
// Displaying the character at x,y (upper left corner of the character)
m.writeSprite(2, 0, A);
delay(1000);
m.writeSprite(2, 0, B);
delay(1000);
m.writeSprite(0, 0, smile01);
delay(1000);
m.writeSprite(0, 0, smile02);
delay(1000);
m.writeSprite(0, 0, smile03);
delay(1000);
for (int i=0; i<8; i++){
m.shiftLeft(false,false);
delay(300);
}
m.clear();
}
الوصف:
فى البداية ، نحن بحاجة إلى تضمين المكتبة MaxMatrix.h ، وتحديد (تعريف) الأطراف التي تتصل بها الوحدة (الموديول) ، وتعيين عدد الوحدات التي نستخدمها وتعريف كائن object للفئة MaxMatrix.
- الكود:
#include <MaxMatrix.h>
int DIN = 7; // DIN pin of MAX7219 module
int CLK = 6; // CLK pin of MAX7219 module
int CS = 5; // CS pin of MAX7219 module
int maxInUse = 1;
MaxMatrix m(DIN, CS, CLK, maxInUse);
لعرض الأحرف ، نحتاج إلى تعريفها في مصفوفة أحرف char أو البايتات ، وهنا لدينا العديد من الأمثلة. يمكننا أن نلاحظ كيف تشكل البتات bits الأحرف التي هي في الواقع أصفار وأحاد . في هذه الحالة ، يتم تدويرها بزاوية 90 درجة ، لكن مثال المكتبة يقترح استخدامها بهذه الطريقة بحيث يكون من الأسهل لاحقًا تنفيذ وظيفة shiftLeft المخصصة لتمرير نص .
في قسم الإعداد setup ، نحتاج فقط إلى تهيئة initialize الوحدة وتعيين سطوع الليدات .
- الكود:
void setup() {
m.init(); // MAX7219 initialization
m.setIntensity(8); // initial led matrix intensity, 0-15
}
في قسم الحلقة loop باستخدام الدالة setDot() يمكننا تحديد أي ليد يضىء بشكل فردى عند موضع (x,y) أو ( col,row) وباستخدام الدالة clear() يمكننا مسح (نظافة) الشاشة.
- الكود:
// Seting the LEDs On or Off at x,y or column , row position
m.setDot(6,2,true);
delay(1000);
m.setDot(6,3,true);
delay(1000);
m.clear(); // Clears the display
for (int i=0; i<8; i++){
m.setDot(i,i,true);
delay(300);
}
m.clear();
لعرض الأحرف المعرّفة مسبقًا ، نستخدم الدالة writeSprite() ، والوسيطان الأولين هما الموضع x و y للزاوية اليسرى العليا للحرف. في النهاية باستخدام الدالة shiftLeft() يتم تحريك أو زحزحة أو تمرير الحرف إلى اليسار.
- الكود:
// Displaying the character at x,y (upper left corner of the character)
m.writeSprite(2, 0, A);
delay(1000);
m.writeSprite(2, 0, B);
delay(1000);
m.writeSprite(0, 0, smile01);
delay(1000);
m.writeSprite(0, 0, smile02);
delay(1000);
m.writeSprite(0, 0, smile03);
delay(1000);
for (int i=0; i<8; i++){
m.shiftLeft(false,false);
delay(300);
}
m.clear();
رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects
برنامج تحريك (تمرير) النصوص scrolling text باستخدام 8×8 LED Matrix و Arduino :
الدائرة الكهربية :
بعد ذلك دعونا نلقي نظرة على مثال لتمرير نص ولنرى ما هو مختلف. فيما يلى الكود ووصفه.
الوصف :
• يتعين علينا هنا تضمين مكتبة إضافية وهى avr/pgmspace والتى تحتوى على PROGMEM وهو "معدّل متغير" variable modifier ويستخدم لتخزين البيانات في ذاكرة الفلاش بدلاً من SRAM. عندما يكون لدينا قاعدة بيانات كبيرة من المتغيرات الثابتة ، كما هو الحال في هذه الحالة التي تعرف الأحرف letters , characters ، فمن الأفضل تخزينها في ذاكرة الفلاش لأنها أكبر بكثير ، 32 كيلو بايت ، مقارنة بذاكرة SRAM ، 2 كيلو بايت .
الكلمة المفتاحية PROGMEM هى معدل متغير ، ويجب أن تستخدم فقط مع أنواع البيانات المعرفة فى الملف pgmspace.h ، وهى تخبر المترجم " بوضع هذه المعلومات فى ذاكرة البرنامج الفلاش " بدلا من وضعها فى ذاكرة RAM ، حيث مكانها العادى .
استخدام PROGMEM هو أيضًا إجراء من خطوتين . بعد وضع البيانات في ذاكرة الفلاش ، يتطلب الأمر طرقًا خاصة (دوال ) ، محددة أيضًا في المكتبة pgmspace.h ، لقراءة البيانات من ذاكرة البرنامج مرة أخرى إلى الذاكرة RAM ، حتى نتمكن من القيام بشيء مفيد بها.
• بجانب مصفوفة الأحرف ، يتم تحدد (تعريف) نص التمرير :
• وفي قسم الحلقة loop ، الدالة المعرفة بمعرفة المستخدم printStringWithShift ، تقوم بطباعة نص التمرير على مصفوفة الليدات مع تعريف سرعة التمرير بالمللي ثانية بالوسيط الثانى .
• أول شيء تقوم به هذه الدالة هو أنها تستخرج الأحرف من السلسلة النصية ، ثم تعرض هذه الأحرف المتحركة على مصفوفة الليدات بمساعدة دالة طباعة حرف مع الإزاحة printCharWithShift .
أساسيات الكود بسيطة للغاية. يتم تعريف المعلومات من أجل MAX7219 لعرض حرف.
لكل حرف يتم استخدام 7 بايت. في الوقت الحالي ، لا يهم ما يعنيه. يشير PROGMEM إلى أن البيانات يتم تخزينها في ذاكرة البرنامج بحيث لا تتخلص (تهلك) من ذاكرة الوصول العشوائي RAM.
يمكنك إلقاء نظرة على الموقع http://www.asciitable.com/ ومحاولة إستنتاج علاقة في تسلسل الأحرف.
• الأحرف 32 الأولى (0..31, 0x00..0x1F) من كود أسكى غير قابلة للطباعة. تقوم الدالة printCharWithShift() بالتحقق من ذلك if ولا تفعل أي شيء (تتم العودة return على الفور) في حالة اكتشاف أحد هذه الأحرف. عدا ذلك else ، يتم ُطرح 32 من قيمة الحرف (على سبيل المثال ، يمثل الحرف L بالقيمة 76 ويتم طرح 32 منه (النتيجة 44). الآن عد إلى المصفوفة CH وابدأ في العد ؛ "الصف الأول" هو 0 ، عد إلى 44. ماذا تجد؟
• تقوم الدالة الآن بإنشاء نسخة (باستخدام memcpy_P) من البايتات السبعة التي تعثر عليها في مصفوفة البايت الصغيرة المسماة المخزن المؤقت buffer ؛ الدالة memcpy_P هى إصدار خاص من الدالة memcpy تقوم بالنسخ من ذاكرة البرنامج PROGMEM بدلاً من ذاكرة (RAM) العادية .
الوسيط الأول هو "الهدف" dest وهو المكان الذى يتم النسخ إليه فى ذاكرة RAM ، وهو هنا المصفوفة buffer ، والوسيط الثانى هو "المصدر" src وهو المكان الذى يتم النسخ منه فى ذاكرة البرنامج ، وهو هنا CH + 7 * c ، والوسيط الثالث هو "حجم" size النسخ ، وهو هنا 7 بايت .
• باستخدام الدالة writeSprite() ، تتم كتابة البيانات إلى MAX7219.
تقوم الدالة printStringWithShift() بالمرور ، بعمل تكرار loop ، عبر النص الذي مررته كوسيط (مؤشر إلى مصفوفة الأحرف ، *s ) ولكل حرف في النص تستدعي الدالة printCharWithShift() . عن طريق زيادة المؤشر pointer ، فإنه سيتم تمرير الحرف التالي.
كما تعلم ، فإن السلاسل النصية (C-strings) تنتهى بالحرف nul '\ 0' ( قيمة كود أسكى بصفر “0” ). ستتوقف الدالة عن استدعاء الدالة printCharWithShift() بمجرد اكتشاف أن المؤشر s يشير إلى الحرف nul .
الدائرة الكهربية :
بعد ذلك دعونا نلقي نظرة على مثال لتمرير نص ولنرى ما هو مختلف. فيما يلى الكود ووصفه.
- الكود:
/*
8x8 LED Matrix MAX7219 Scrolling Text Example
Based on the following library:
GitHub | riyas-org/max7219 https://github.com/riyas-org/max7219
*/
#include <MaxMatrix.h>
#include <avr/pgmspace.h>
PROGMEM const unsigned char CH[] = {
3, 8, B00000000, B00000000, B00000000, B00000000, B00000000, // space
1, 8, B01011111, B00000000, B00000000, B00000000, B00000000, // !
3, 8, B00000011, B00000000, B00000011, B00000000, B00000000, // "
5, 8, B00010100, B00111110, B00010100, B00111110, B00010100, // #
4, 8, B00100100, B01101010, B00101011, B00010010, B00000000, // $
5, 8, B01100011, B00010011, B00001000, B01100100, B01100011, // %
5, 8, B00110110, B01001001, B01010110, B00100000, B01010000, // &
1, 8, B00000011, B00000000, B00000000, B00000000, B00000000, // '
3, 8, B00011100, B00100010, B01000001, B00000000, B00000000, // (
3, 8, B01000001, B00100010, B00011100, B00000000, B00000000, // )
5, 8, B00101000, B00011000, B00001110, B00011000, B00101000, // *
5, 8, B00001000, B00001000, B00111110, B00001000, B00001000, // +
2, 8, B10110000, B01110000, B00000000, B00000000, B00000000, // ,
4, 8, B00001000, B00001000, B00001000, B00001000, B00000000, // -
2, 8, B01100000, B01100000, B00000000, B00000000, B00000000, // .
4, 8, B01100000, B00011000, B00000110, B00000001, B00000000, // /
4, 8, B00111110, B01000001, B01000001, B00111110, B00000000, // 0
3, 8, B01000010, B01111111, B01000000, B00000000, B00000000, // 1
4, 8, B01100010, B01010001, B01001001, B01000110, B00000000, // 2
4, 8, B00100010, B01000001, B01001001, B00110110, B00000000, // 3
4, 8, B00011000, B00010100, B00010010, B01111111, B00000000, // 4
4, 8, B00100111, B01000101, B01000101, B00111001, B00000000, // 5
4, 8, B00111110, B01001001, B01001001, B00110000, B00000000, // 6
4, 8, B01100001, B00010001, B00001001, B00000111, B00000000, // 7
4, 8, B00110110, B01001001, B01001001, B00110110, B00000000, // 8
4, 8, B00000110, B01001001, B01001001, B00111110, B00000000, // 9
2, 8, B01010000, B00000000, B00000000, B00000000, B00000000, // :
2, 8, B10000000, B01010000, B00000000, B00000000, B00000000, // ;
3, 8, B00010000, B00101000, B01000100, B00000000, B00000000, // <
3, 8, B00010100, B00010100, B00010100, B00000000, B00000000, // =
3, 8, B01000100, B00101000, B00010000, B00000000, B00000000, // >
4, 8, B00000010, B01011001, B00001001, B00000110, B00000000, // ?
5, 8, B00111110, B01001001, B01010101, B01011101, B00001110, // @
4, 8, B01111110, B00010001, B00010001, B01111110, B00000000, // A
4, 8, B01111111, B01001001, B01001001, B00110110, B00000000, // B
4, 8, B00111110, B01000001, B01000001, B00100010, B00000000, // C
4, 8, B01111111, B01000001, B01000001, B00111110, B00000000, // D
4, 8, B01111111, B01001001, B01001001, B01000001, B00000000, // E
4, 8, B01111111, B00001001, B00001001, B00000001, B00000000, // F
4, 8, B00111110, B01000001, B01001001, B01111010, B00000000, // G
4, 8, B01111111, B00001000, B00001000, B01111111, B00000000, // H
3, 8, B01000001, B01111111, B01000001, B00000000, B00000000, // I
4, 8, B00110000, B01000000, B01000001, B00111111, B00000000, // J
4, 8, B01111111, B00001000, B00010100, B01100011, B00000000, // K
4, 8, B01111111, B01000000, B01000000, B01000000, B00000000, // L
5, 8, B01111111, B00000010, B00001100, B00000010, B01111111, // M
5, 8, B01111111, B00000100, B00001000, B00010000, B01111111, // N
4, 8, B00111110, B01000001, B01000001, B00111110, B00000000, // O
4, 8, B01111111, B00001001, B00001001, B00000110, B00000000, // P
4, 8, B00111110, B01000001, B01000001, B10111110, B00000000, // Q
4, 8, B01111111, B00001001, B00001001, B01110110, B00000000, // R
4, 8, B01000110, B01001001, B01001001, B00110010, B00000000, // S
5, 8, B00000001, B00000001, B01111111, B00000001, B00000001, // T
4, 8, B00111111, B01000000, B01000000, B00111111, B00000000, // U
5, 8, B00001111, B00110000, B01000000, B00110000, B00001111, // V
5, 8, B00111111, B01000000, B00111000, B01000000, B00111111, // W
5, 8, B01100011, B00010100, B00001000, B00010100, B01100011, // X
5, 8, B00000111, B00001000, B01110000, B00001000, B00000111, // Y
4, 8, B01100001, B01010001, B01001001, B01000111, B00000000, // Z
2, 8, B01111111, B01000001, B00000000, B00000000, B00000000, // [
4, 8, B00000001, B00000110, B00011000, B01100000, B00000000, // \ backslash
2, 8, B01000001, B01111111, B00000000, B00000000, B00000000, // ]
3, 8, B00000010, B00000001, B00000010, B00000000, B00000000, // hat
4, 8, B01000000, B01000000, B01000000, B01000000, B00000000, // _
2, 8, B00000001, B00000010, B00000000, B00000000, B00000000, // `
4, 8, B00100000, B01010100, B01010100, B01111000, B00000000, // a
4, 8, B01111111, B01000100, B01000100, B00111000, B00000000, // b
4, 8, B00111000, B01000100, B01000100, B00101000, B00000000, // c
4, 8, B00111000, B01000100, B01000100, B01111111, B00000000, // d
4, 8, B00111000, B01010100, B01010100, B00011000, B00000000, // e
3, 8, B00000100, B01111110, B00000101, B00000000, B00000000, // f
4, 8, B10011000, B10100100, B10100100, B01111000, B00000000, // g
4, 8, B01111111, B00000100, B00000100, B01111000, B00000000, // h
3, 8, B01000100, B01111101, B01000000, B00000000, B00000000, // i
4, 8, B01000000, B10000000, B10000100, B01111101, B00000000, // j
4, 8, B01111111, B00010000, B00101000, B01000100, B00000000, // k
3, 8, B01000001, B01111111, B01000000, B00000000, B00000000, // l
5, 8, B01111100, B00000100, B01111100, B00000100, B01111000, // m
4, 8, B01111100, B00000100, B00000100, B01111000, B00000000, // n
4, 8, B00111000, B01000100, B01000100, B00111000, B00000000, // o
4, 8, B11111100, B00100100, B00100100, B00011000, B00000000, // p
4, 8, B00011000, B00100100, B00100100, B11111100, B00000000, // q
4, 8, B01111100, B00001000, B00000100, B00000100, B00000000, // r
4, 8, B01001000, B01010100, B01010100, B00100100, B00000000, // s
3, 8, B00000100, B00111111, B01000100, B00000000, B00000000, // t
4, 8, B00111100, B01000000, B01000000, B01111100, B00000000, // u
5, 8, B00011100, B00100000, B01000000, B00100000, B00011100, // v
5, 8, B00111100, B01000000, B00111100, B01000000, B00111100, // w
5, 8, B01000100, B00101000, B00010000, B00101000, B01000100, // x
4, 8, B10011100, B10100000, B10100000, B01111100, B00000000, // y
3, 8, B01100100, B01010100, B01001100, B00000000, B00000000, // z
3, 8, B00001000, B00110110, B01000001, B00000000, B00000000, // {
1, 8, B01111111, B00000000, B00000000, B00000000, B00000000, // |
3, 8, B01000001, B00110110, B00001000, B00000000, B00000000, // }
4, 8, B00001000, B00000100, B00001000, B00000100, B00000000, // ~
};
int DIN = 7; // DIN pin of MAX7219 module
int CLK = 6; // CLK pin of MAX7219 module
int CS = 5; // CS pin of MAX7219 module
int maxInUse = 2;
MaxMatrix m(DIN, CS, CLK, maxInUse);
byte buffer[10];
char text[]= "LED Matrix , MAX7219 & Arduino "; // Scrolling text
void setup() {
m.init(); // module initialize
m.setIntensity(15); // dot matix intensity 0-15
}
void loop() {
printStringWithShift(text, 100); // (text, scrolling speed)
}
// Display the extracted characters with scrolling
void printCharWithShift(char c, int shift_speed) {
if (c < 32) return;
c -= 32;
memcpy_P(buffer, CH + 7 * c, 7);
m.writeSprite(32, 0, buffer);
m.setColumn(32 + buffer[0], 0);
for (int i = 0; i < buffer[0] + 1; i++)
{
delay(shift_speed);
m.shiftLeft(false, false);
}
}
// Extract the characters from the text string
void printStringWithShift(char* s, int shift_speed) {
while (*s != 0) {
printCharWithShift(*s, shift_speed);
s++;
}
}
الوصف :
• يتعين علينا هنا تضمين مكتبة إضافية وهى avr/pgmspace والتى تحتوى على PROGMEM وهو "معدّل متغير" variable modifier ويستخدم لتخزين البيانات في ذاكرة الفلاش بدلاً من SRAM. عندما يكون لدينا قاعدة بيانات كبيرة من المتغيرات الثابتة ، كما هو الحال في هذه الحالة التي تعرف الأحرف letters , characters ، فمن الأفضل تخزينها في ذاكرة الفلاش لأنها أكبر بكثير ، 32 كيلو بايت ، مقارنة بذاكرة SRAM ، 2 كيلو بايت .
- الكود:
#include <avr/pgmspace.h>
PROGMEM const unsigned char CH[] = {
3, 8, B00000000, B00000000, B00000000, B00000000, B00000000, // space
………………..
……………......
الكلمة المفتاحية PROGMEM هى معدل متغير ، ويجب أن تستخدم فقط مع أنواع البيانات المعرفة فى الملف pgmspace.h ، وهى تخبر المترجم " بوضع هذه المعلومات فى ذاكرة البرنامج الفلاش " بدلا من وضعها فى ذاكرة RAM ، حيث مكانها العادى .
استخدام PROGMEM هو أيضًا إجراء من خطوتين . بعد وضع البيانات في ذاكرة الفلاش ، يتطلب الأمر طرقًا خاصة (دوال ) ، محددة أيضًا في المكتبة pgmspace.h ، لقراءة البيانات من ذاكرة البرنامج مرة أخرى إلى الذاكرة RAM ، حتى نتمكن من القيام بشيء مفيد بها.
• بجانب مصفوفة الأحرف ، يتم تحدد (تعريف) نص التمرير :
- الكود:
char text[]= " LED Matrix , MAX7219 & Arduino "; // Scrolling text
• وفي قسم الحلقة loop ، الدالة المعرفة بمعرفة المستخدم printStringWithShift ، تقوم بطباعة نص التمرير على مصفوفة الليدات مع تعريف سرعة التمرير بالمللي ثانية بالوسيط الثانى .
- الكود:
void loop() {
printStringWithShift(text, 100); // (text, scrolling speed)
}
// Extract the characters from the text string
void printStringWithShift(char* s, int shift_speed) {
while (*s != 0) {
printCharWithShift(*s, shift_speed);
s++;
}
}
• أول شيء تقوم به هذه الدالة هو أنها تستخرج الأحرف من السلسلة النصية ، ثم تعرض هذه الأحرف المتحركة على مصفوفة الليدات بمساعدة دالة طباعة حرف مع الإزاحة printCharWithShift .
- الكود:
// Display the extracted characters with scrolling
void printCharWithShift(char c, int shift_speed) {
if (c < 32) return;
c -= 32; // Character index
memcpy_P(buffer, CH + 7 * c, 7); // Get a copy of character bytes , store in buffer
m.writeSprite(32, 0, buffer); // Display char in buffer at x=32 , y=0
m.setColumn(32 + buffer[0], 0);// Update column 32 + buffer[0] with 0
for (int i = 0; i < buffer[0] + 1; i++)
{
delay(shift_speed);
m.shiftLeft(false, false);//Shift char
}
}
أساسيات الكود بسيطة للغاية. يتم تعريف المعلومات من أجل MAX7219 لعرض حرف.
لكل حرف يتم استخدام 7 بايت. في الوقت الحالي ، لا يهم ما يعنيه. يشير PROGMEM إلى أن البيانات يتم تخزينها في ذاكرة البرنامج بحيث لا تتخلص (تهلك) من ذاكرة الوصول العشوائي RAM.
يمكنك إلقاء نظرة على الموقع http://www.asciitable.com/ ومحاولة إستنتاج علاقة في تسلسل الأحرف.
• الأحرف 32 الأولى (0..31, 0x00..0x1F) من كود أسكى غير قابلة للطباعة. تقوم الدالة printCharWithShift() بالتحقق من ذلك if ولا تفعل أي شيء (تتم العودة return على الفور) في حالة اكتشاف أحد هذه الأحرف. عدا ذلك else ، يتم ُطرح 32 من قيمة الحرف (على سبيل المثال ، يمثل الحرف L بالقيمة 76 ويتم طرح 32 منه (النتيجة 44). الآن عد إلى المصفوفة CH وابدأ في العد ؛ "الصف الأول" هو 0 ، عد إلى 44. ماذا تجد؟
- الكود:
if (c < 32) return;
c -= 32;
• تقوم الدالة الآن بإنشاء نسخة (باستخدام memcpy_P) من البايتات السبعة التي تعثر عليها في مصفوفة البايت الصغيرة المسماة المخزن المؤقت buffer ؛ الدالة memcpy_P هى إصدار خاص من الدالة memcpy تقوم بالنسخ من ذاكرة البرنامج PROGMEM بدلاً من ذاكرة (RAM) العادية .
- الكود:
memcpy_P(buffer, CH + 7 * c, 7); // Get a copy of character bytes , store in buffer
الوسيط الأول هو "الهدف" dest وهو المكان الذى يتم النسخ إليه فى ذاكرة RAM ، وهو هنا المصفوفة buffer ، والوسيط الثانى هو "المصدر" src وهو المكان الذى يتم النسخ منه فى ذاكرة البرنامج ، وهو هنا CH + 7 * c ، والوسيط الثالث هو "حجم" size النسخ ، وهو هنا 7 بايت .
• باستخدام الدالة writeSprite() ، تتم كتابة البيانات إلى MAX7219.
تقوم الدالة printStringWithShift() بالمرور ، بعمل تكرار loop ، عبر النص الذي مررته كوسيط (مؤشر إلى مصفوفة الأحرف ، *s ) ولكل حرف في النص تستدعي الدالة printCharWithShift() . عن طريق زيادة المؤشر pointer ، فإنه سيتم تمرير الحرف التالي.
كما تعلم ، فإن السلاسل النصية (C-strings) تنتهى بالحرف nul '\ 0' ( قيمة كود أسكى بصفر “0” ). ستتوقف الدالة عن استدعاء الدالة printCharWithShift() بمجرد اكتشاف أن المؤشر s يشير إلى الحرف nul .
رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects
مثال :
- الكود:
#include "MaxMatrix.h"
#include "avr/pgmspace.h"
PROGMEM const unsigned char CH[] = {
3, 8, B00000000, B00000000, B00000000, B00000000, B00000000, // space
1, 8, B01011111, B00000000, B00000000, B00000000, B00000000, // !
3, 8, B00000011, B00000000, B00000011, B00000000, B00000000, // "
5, 8, B00010100, B00111110, B00010100, B00111110, B00010100, // #
4, 8, B00100100, B01101010, B00101011, B00010010, B00000000, // $
5, 8, B01100011, B00010011, B00001000, B01100100, B01100011, // %
5, 8, B00110110, B01001001, B01010110, B00100000, B01010000, // &
1, 8, B00000011, B00000000, B00000000, B00000000, B00000000, // '
3, 8, B00011100, B00100010, B01000001, B00000000, B00000000, // (
3, 8, B01000001, B00100010, B00011100, B00000000, B00000000, // )
5, 8, B00101000, B00011000, B00001110, B00011000, B00101000, // *
5, 8, B00001000, B00001000, B00111110, B00001000, B00001000, // +
2, 8, B10110000, B01110000, B00000000, B00000000, B00000000, // ,
4, 8, B00001000, B00001000, B00001000, B00001000, B00000000, // -
2, 8, B01100000, B01100000, B00000000, B00000000, B00000000, // .
4, 8, B01100000, B00011000, B00000110, B00000001, B00000000, // /
4, 8, B00111110, B01000001, B01000001, B00111110, B00000000, // 0
3, 8, B01000010, B01111111, B01000000, B00000000, B00000000, // 1
4, 8, B01100010, B01010001, B01001001, B01000110, B00000000, // 2
4, 8, B00100010, B01000001, B01001001, B00110110, B00000000, // 3
4, 8, B00011000, B00010100, B00010010, B01111111, B00000000, // 4
4, 8, B00100111, B01000101, B01000101, B00111001, B00000000, // 5
4, 8, B00111110, B01001001, B01001001, B00110000, B00000000, // 6
4, 8, B01100001, B00010001, B00001001, B00000111, B00000000, // 7
4, 8, B00110110, B01001001, B01001001, B00110110, B00000000, // 8
4, 8, B00000110, B01001001, B01001001, B00111110, B00000000, // 9
2, 8, B01010000, B00000000, B00000000, B00000000, B00000000, // :
2, 8, B10000000, B01010000, B00000000, B00000000, B00000000, // ;
3, 8, B00010000, B00101000, B01000100, B00000000, B00000000, // <
3, 8, B00010100, B00010100, B00010100, B00000000, B00000000, // =
3, 8, B01000100, B00101000, B00010000, B00000000, B00000000, // >
4, 8, B00000010, B01011001, B00001001, B00000110, B00000000, // ?
5, 8, B00111110, B01001001, B01010101, B01011101, B00001110, // @
4, 8, B01111110, B00010001, B00010001, B01111110, B00000000, // A
4, 8, B01111111, B01001001, B01001001, B00110110, B00000000, // B
4, 8, B00111110, B01000001, B01000001, B00100010, B00000000, // C
4, 8, B01111111, B01000001, B01000001, B00111110, B00000000, // D
4, 8, B01111111, B01001001, B01001001, B01000001, B00000000, // E
4, 8, B01111111, B00001001, B00001001, B00000001, B00000000, // F
4, 8, B00111110, B01000001, B01001001, B01111010, B00000000, // G
4, 8, B01111111, B00001000, B00001000, B01111111, B00000000, // H
3, 8, B01000001, B01111111, B01000001, B00000000, B00000000, // I
4, 8, B00110000, B01000000, B01000001, B00111111, B00000000, // J
4, 8, B01111111, B00001000, B00010100, B01100011, B00000000, // K
4, 8, B01111111, B01000000, B01000000, B01000000, B00000000, // L
5, 8, B01111111, B00000010, B00001100, B00000010, B01111111, // M
5, 8, B01111111, B00000100, B00001000, B00010000, B01111111, // N
4, 8, B00111110, B01000001, B01000001, B00111110, B00000000, // O
4, 8, B01111111, B00001001, B00001001, B00000110, B00000000, // P
4, 8, B00111110, B01000001, B01000001, B10111110, B00000000, // Q
4, 8, B01111111, B00001001, B00001001, B01110110, B00000000, // R
4, 8, B01000110, B01001001, B01001001, B00110010, B00000000, // S
5, 8, B00000001, B00000001, B01111111, B00000001, B00000001, // T
4, 8, B00111111, B01000000, B01000000, B00111111, B00000000, // U
5, 8, B00001111, B00110000, B01000000, B00110000, B00001111, // V
5, 8, B00111111, B01000000, B00111000, B01000000, B00111111, // W
5, 8, B01100011, B00010100, B00001000, B00010100, B01100011, // X
5, 8, B00000111, B00001000, B01110000, B00001000, B00000111, // Y
4, 8, B01100001, B01010001, B01001001, B01000111, B00000000, // Z
2, 8, B01111111, B01000001, B00000000, B00000000, B00000000, // [
4, 8, B00000001, B00000110, B00011000, B01100000, B00000000, // \ backslash
2, 8, B01000001, B01111111, B00000000, B00000000, B00000000, // ]
3, 8, B00000010, B00000001, B00000010, B00000000, B00000000, // hat
4, 8, B01000000, B01000000, B01000000, B01000000, B00000000, // _
2, 8, B00000001, B00000010, B00000000, B00000000, B00000000, // `
4, 8, B00100000, B01010100, B01010100, B01111000, B00000000, // a
4, 8, B01111111, B01000100, B01000100, B00111000, B00000000, // b
4, 8, B00111000, B01000100, B01000100, B00101000, B00000000, // c
4, 8, B00111000, B01000100, B01000100, B01111111, B00000000, // d
4, 8, B00111000, B01010100, B01010100, B00011000, B00000000, // e
3, 8, B00000100, B01111110, B00000101, B00000000, B00000000, // f
4, 8, B10011000, B10100100, B10100100, B01111000, B00000000, // g
4, 8, B01111111, B00000100, B00000100, B01111000, B00000000, // h
3, 8, B01000100, B01111101, B01000000, B00000000, B00000000, // i
4, 8, B01000000, B10000000, B10000100, B01111101, B00000000, // j
4, 8, B01111111, B00010000, B00101000, B01000100, B00000000, // k
3, 8, B01000001, B01111111, B01000000, B00000000, B00000000, // l
5, 8, B01111100, B00000100, B01111100, B00000100, B01111000, // m
4, 8, B01111100, B00000100, B00000100, B01111000, B00000000, // n
4, 8, B00111000, B01000100, B01000100, B00111000, B00000000, // o
4, 8, B11111100, B00100100, B00100100, B00011000, B00000000, // p
4, 8, B00011000, B00100100, B00100100, B11111100, B00000000, // q
4, 8, B01111100, B00001000, B00000100, B00000100, B00000000, // r
4, 8, B01001000, B01010100, B01010100, B00100100, B00000000, // s
3, 8, B00000100, B00111111, B01000100, B00000000, B00000000, // t
4, 8, B00111100, B01000000, B01000000, B01111100, B00000000, // u
5, 8, B00011100, B00100000, B01000000, B00100000, B00011100, // v
5, 8, B00111100, B01000000, B00111100, B01000000, B00111100, // w
5, 8, B01000100, B00101000, B00010000, B00101000, B01000100, // x
4, 8, B10011100, B10100000, B10100000, B01111100, B00000000, // y
3, 8, B01100100, B01010100, B01001100, B00000000, B00000000, // z
3, 8, B00001000, B00110110, B01000001, B00000000, B00000000, // {
1, 8, B01111111, B00000000, B00000000, B00000000, B00000000, // |
3, 8, B01000001, B00110110, B00001000, B00000000, B00000000, // }
4, 8, B00001000, B00000100, B00001000, B00000100, B00000000, // ~
};
int data = 7; // DIN pin of MAX7219 module
int load = 5; // CS pin of MAX7219 module
int clock = 6; // CLK pin of MAX7219 module
int maxInUse = 2; //how many MAX7219 are connected
MaxMatrix m(data, load, clock, maxInUse); // define Library
byte buffer[10];
char string1[] = " Arduino LED Matrix Tutorial "; // Scrolling Text
void setup(){
m.init(); // module MAX7219
m.setIntensity(5); // LED Intensity 0-15
}
void loop(){
byte c;
delay(100);
m.shiftLeft(false, true);
printStringWithShift(string1, 100); // Send scrolling Text
}
// Put extracted character on Display
void printCharWithShift(char c, int shift_speed){
if (c < 32) return;
c -= 32;
memcpy_P(buffer, CH + 7*c, 7);
m.writeSprite(maxInUse*8, 0, buffer);
m.setColumn(maxInUse*8 + buffer[0], 0);
for (int i = 0; i < buffer[0]+1; i++)
{
delay(shift_speed);
m.shiftLeft(false, false);
}
}
// Extract characters from Scrolling text
void printStringWithShift(char* s, int shift_speed){
while (*s != 0){
printCharWithShift(*s, shift_speed);
s++;
}
}
رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects
مثال مع إدخال سلسلة النص من خلال الاتصال التسلسلى :
النتائج :
- الكود:
/*
Interactive scrolling led sign for Arduino and MAX7219 8x8 LED Display
This is the code I use to control the MAX7219 8x8 LED modules from my
Chinese "Geekcreit"-brand Arduino clone.
The first module is connected to the Uno like this:
Module: VCC -> Uno: 5V
Module: GND -> Uno: GND
Module: DIN -> Uno: D8
Module: CS -> Uno: D9
Module: CLK -> Uno: D10
Additional modules are connected like this:
Module 2: VCC -> Module 1: VCC
Module 2: GND -> Module 1: GND
Module 2: DIN -> Module 1: DIN
Module 2: CS -> Module 1: CS
Module 2: CLK -> Module 1: CLK
See the blog post at https://oneguyoneblog.com/2016/10/20/max7219-arduino-ticker-8x8-led-modules/
*/
#include <MaxMatrix.h>
#include <avr/pgmspace.h>
PROGMEM const unsigned char CH[] = {
3, 8, B00000000, B00000000, B00000000, B00000000, B00000000, // space
1, 8, B01011111, B00000000, B00000000, B00000000, B00000000, // !
3, 8, B00000011, B00000000, B00000011, B00000000, B00000000, // "
5, 8, B00010100, B00111110, B00010100, B00111110, B00010100, // #
4, 8, B00100100, B01101010, B00101011, B00010010, B00000000, // $
5, 8, B01100011, B00010011, B00001000, B01100100, B01100011, // %
5, 8, B00110110, B01001001, B01010110, B00100000, B01010000, // &
1, 8, B00000011, B00000000, B00000000, B00000000, B00000000, // '
3, 8, B00011100, B00100010, B01000001, B00000000, B00000000, // (
3, 8, B01000001, B00100010, B00011100, B00000000, B00000000, // )
5, 8, B00101000, B00011000, B00001110, B00011000, B00101000, // *
5, 8, B00001000, B00001000, B00111110, B00001000, B00001000, // +
2, 8, B10110000, B01110000, B00000000, B00000000, B00000000, // ,
4, 8, B00001000, B00001000, B00001000, B00001000, B00000000, // -
2, 8, B01100000, B01100000, B00000000, B00000000, B00000000, // .
4, 8, B01100000, B00011000, B00000110, B00000001, B00000000, // /
4, 8, B00111110, B01000001, B01000001, B00111110, B00000000, // 0
3, 8, B01000010, B01111111, B01000000, B00000000, B00000000, // 1
4, 8, B01100010, B01010001, B01001001, B01000110, B00000000, // 2
4, 8, B00100010, B01000001, B01001001, B00110110, B00000000, // 3
4, 8, B00011000, B00010100, B00010010, B01111111, B00000000, // 4
4, 8, B00100111, B01000101, B01000101, B00111001, B00000000, // 5
4, 8, B00111110, B01001001, B01001001, B00110000, B00000000, // 6
4, 8, B01100001, B00010001, B00001001, B00000111, B00000000, // 7
4, 8, B00110110, B01001001, B01001001, B00110110, B00000000, // 8
4, 8, B00000110, B01001001, B01001001, B00111110, B00000000, // 9
2, 8, B01010000, B00000000, B00000000, B00000000, B00000000, // :
2, 8, B10000000, B01010000, B00000000, B00000000, B00000000, // ;
3, 8, B00010000, B00101000, B01000100, B00000000, B00000000, // <
3, 8, B00010100, B00010100, B00010100, B00000000, B00000000, // =
3, 8, B01000100, B00101000, B00010000, B00000000, B00000000, // >
4, 8, B00000010, B01011001, B00001001, B00000110, B00000000, // ?
5, 8, B00111110, B01001001, B01010101, B01011101, B00001110, // @
4, 8, B01111110, B00010001, B00010001, B01111110, B00000000, // A
4, 8, B01111111, B01001001, B01001001, B00110110, B00000000, // B
4, 8, B00111110, B01000001, B01000001, B00100010, B00000000, // C
4, 8, B01111111, B01000001, B01000001, B00111110, B00000000, // D
4, 8, B01111111, B01001001, B01001001, B01000001, B00000000, // E
4, 8, B01111111, B00001001, B00001001, B00000001, B00000000, // F
4, 8, B00111110, B01000001, B01001001, B01111010, B00000000, // G
4, 8, B01111111, B00001000, B00001000, B01111111, B00000000, // H
3, 8, B01000001, B01111111, B01000001, B00000000, B00000000, // I
4, 8, B00110000, B01000000, B01000001, B00111111, B00000000, // J
4, 8, B01111111, B00001000, B00010100, B01100011, B00000000, // K
4, 8, B01111111, B01000000, B01000000, B01000000, B00000000, // L
5, 8, B01111111, B00000010, B00001100, B00000010, B01111111, // M
5, 8, B01111111, B00000100, B00001000, B00010000, B01111111, // N
4, 8, B00111110, B01000001, B01000001, B00111110, B00000000, // O
4, 8, B01111111, B00001001, B00001001, B00000110, B00000000, // P
4, 8, B00111110, B01000001, B01000001, B10111110, B00000000, // Q
4, 8, B01111111, B00001001, B00001001, B01110110, B00000000, // R
4, 8, B01000110, B01001001, B01001001, B00110010, B00000000, // S
5, 8, B00000001, B00000001, B01111111, B00000001, B00000001, // T
4, 8, B00111111, B01000000, B01000000, B00111111, B00000000, // U
5, 8, B00001111, B00110000, B01000000, B00110000, B00001111, // V
5, 8, B00111111, B01000000, B00111000, B01000000, B00111111, // W
5, 8, B01100011, B00010100, B00001000, B00010100, B01100011, // X
5, 8, B00000111, B00001000, B01110000, B00001000, B00000111, // Y
4, 8, B01100001, B01010001, B01001001, B01000111, B00000000, // Z
2, 8, B01111111, B01000001, B00000000, B00000000, B00000000, // [
4, 8, B00000001, B00000110, B00011000, B01100000, B00000000, // \ backslash
2, 8, B01000001, B01111111, B00000000, B00000000, B00000000, // ]
3, 8, B00000010, B00000001, B00000010, B00000000, B00000000, // hat
4, 8, B01000000, B01000000, B01000000, B01000000, B00000000, // _
2, 8, B00000001, B00000010, B00000000, B00000000, B00000000, // `
4, 8, B00100000, B01010100, B01010100, B01111000, B00000000, // a
4, 8, B01111111, B01000100, B01000100, B00111000, B00000000, // b
4, 8, B00111000, B01000100, B01000100, B00101000, B00000000, // c
4, 8, B00111000, B01000100, B01000100, B01111111, B00000000, // d
4, 8, B00111000, B01010100, B01010100, B00011000, B00000000, // e
3, 8, B00000100, B01111110, B00000101, B00000000, B00000000, // f
4, 8, B10011000, B10100100, B10100100, B01111000, B00000000, // g
4, 8, B01111111, B00000100, B00000100, B01111000, B00000000, // h
3, 8, B01000100, B01111101, B01000000, B00000000, B00000000, // i
4, 8, B01000000, B10000000, B10000100, B01111101, B00000000, // j
4, 8, B01111111, B00010000, B00101000, B01000100, B00000000, // k
3, 8, B01000001, B01111111, B01000000, B00000000, B00000000, // l
5, 8, B01111100, B00000100, B01111100, B00000100, B01111000, // m
4, 8, B01111100, B00000100, B00000100, B01111000, B00000000, // n
4, 8, B00111000, B01000100, B01000100, B00111000, B00000000, // o
4, 8, B11111100, B00100100, B00100100, B00011000, B00000000, // p
4, 8, B00011000, B00100100, B00100100, B11111100, B00000000, // q
4, 8, B01111100, B00001000, B00000100, B00000100, B00000000, // r
4, 8, B01001000, B01010100, B01010100, B00100100, B00000000, // s
3, 8, B00000100, B00111111, B01000100, B00000000, B00000000, // t
4, 8, B00111100, B01000000, B01000000, B01111100, B00000000, // u
5, 8, B00011100, B00100000, B01000000, B00100000, B00011100, // v
5, 8, B00111100, B01000000, B00111100, B01000000, B00111100, // w
5, 8, B01000100, B00101000, B00010000, B00101000, B01000100, // x
4, 8, B10011100, B10100000, B10100000, B01111100, B00000000, // y
3, 8, B01100100, B01010100, B01001100, B00000000, B00000000, // z
3, 8, B00001000, B00110110, B01000001, B00000000, B00000000, // {
1, 8, B01111111, B00000000, B00000000, B00000000, B00000000, // |
3, 8, B01000001, B00110110, B00001000, B00000000, B00000000, // }
4, 8, B00001000, B00000100, B00001000, B00000100, B00000000, // ~
};
int data = 8; // DIN pin of MAX7219 displays
int load = 9; // CS pin of MAX7219 displays
int clock = 10; // CLK pin of MAX7219 displays
int scrollSpeed = 35; // speed of scrolling text, lower is faster
int maxInUse = 3; //Number of MAX7219 displays
MaxMatrix m(data, load, clock, maxInUse); // define Library
byte buffer[10];
char inData[64] = "MAX7219 8x8 LED Matrix "; // The string (max 64 bytes)
char inChar; // Where to store the character read
byte index = 0; // Index into array; where to store the character
void setup(){
m.init(); // init display
m.setIntensity(7); // LED light intensity from 0 (dimmest) to 15
Serial.begin(9600); // init serial connection
}
void loop(){
// Get input from serial connection
index=0;
while(Serial.available() > 0) // Don't read unless there is data
{
if(index < 63) // One less than the size of the array
{
inChar = Serial.read(); // Read a character
Serial.write(inChar);
inData[index] = inChar; // Store it
index++; // Increment where to write next
inData[index] = '\0'; // Null terminate the string
}
}
byte c;
delay(100);
m.shiftLeft(false, true);
printStringWithShift(inData, scrollSpeed); // Send scrolling Text
clearLCD(maxInUse, scrollSpeed);
}
// Put extracted character on Display
void printCharWithShift(char c, int shift_speed){
if (c < 32) return;
c -= 32;
memcpy_P(buffer, CH + 7*c, 7);
m.writeSprite(maxInUse*8, 0, buffer);
m.setColumn(maxInUse*8 + buffer[0], 0);
for (int i=0; i<buffer[0]+1; i++)
{
delay(shift_speed);
m.shiftLeft(false, false);
}
}
// Extract characters from Scrolling text
void printStringWithShift(char* s, int shift_speed){
while (*s != 0){
printCharWithShift(*s, shift_speed);
s++;
}
}
// Add trailing space to clear the display
void clearLCD(int maxInUse, int shift_speed){
for (int i=0; i<maxInUse*8; i++)
{
m.setColumn((maxInUse*8), 0);
delay(shift_speed);
m.shiftLeft(false, false);
}
}
النتائج :
التحكم فى السفن سيجمنت والمشغل MAX7219 بواسطة الاردوينو مع المكتبة LedControl :
التحكم فى السفن سيجمنت والمشغل MAX7219 بواسطة الاردوينو مع المكتبة LedControl :
سوف نستحدم الوحدة (الموديول) المكون من الدائرة المتكاملة MAX7219 مع شاشة عرض سفن سيجمنت مكونة من حتى ثمانى أرقام digits والمبينة أدناه . يمكن توصيل حتى ثمانى وحدات على التتالى cascade .
هناك مكتبة مطلوبة ليتم تضمينها للعمل مع هذه الوحدة وتسمى LedControl ، يتم تحميلها من الرابط أدناه وثبيتها فى بيئة تطوير الاردوينو .
https://github.com/wayoda/LedControl
التوصيل :
المديول به 5 أطراف للتوصيل وهى سهلة التوصيل . يتوفر الموديول مع خيار للتتالي cascading مع المزيد من الموديولات من نوعه ، وبالتالي تشكيل شاشة أكبر. لنفكر فقط في وحدة واحدة للبساطة.
يتم إجراء الاتصالات على النحو التالي :
سوف نستحدم الوحدة (الموديول) المكون من الدائرة المتكاملة MAX7219 مع شاشة عرض سفن سيجمنت مكونة من حتى ثمانى أرقام digits والمبينة أدناه . يمكن توصيل حتى ثمانى وحدات على التتالى cascade .
هناك مكتبة مطلوبة ليتم تضمينها للعمل مع هذه الوحدة وتسمى LedControl ، يتم تحميلها من الرابط أدناه وثبيتها فى بيئة تطوير الاردوينو .
https://github.com/wayoda/LedControl
التوصيل :
المديول به 5 أطراف للتوصيل وهى سهلة التوصيل . يتوفر الموديول مع خيار للتتالي cascading مع المزيد من الموديولات من نوعه ، وبالتالي تشكيل شاشة أكبر. لنفكر فقط في وحدة واحدة للبساطة.
يتم إجراء الاتصالات على النحو التالي :
VCC- 5v of arduino
GND- gnd of arduino
Din- pin 12
CS(Load)-pin 10
Clk-pin 11
Dout is connected to the Din of the next module.
GND- gnd of arduino
Din- pin 12
CS(Load)-pin 10
Clk-pin 11
Dout is connected to the Din of the next module.
رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects
البرمجة :
مثال المكتبة :
البرنامج :
الوصف :
1- فى بداية البرنامج (الاسكيتش) يجب تضمين ملف رأس المكتبة :
ثم يتم تحديد أطراف الاتصال بين الوحدة والاردوينو ، ومن ثم يتم إنشاء كائن من فئة المكتبة :
الدوال المستخدمة :
الدالة :
• تؤدي هذه الدالة (تسمى دالة المنشىء) إلى إنشاء كائن من فئة LEDControl (اسم الكائن هنا ، new_disp ؛ يمكن استخدام أي اسم صالح آخر ) وهى تتخاطب مع MAX7219 الموجودة على وحدة (موديول) العرض المكون من السفن سيجمنت .
• dataPine هو طرف Arduino الذي يتصل بطرف دخل البيانات DIN بالوحدة (الموديول) . وهو طرف الاردوينو حيث يتم نقل (إزاحة) البيانات للخارج .
• clkPin هو طرف Arduino الذي يتصل بالطرف CLK على الوحدة . وهو طرف الساعة clock .
• csPin هو طرف Arduino المتصل بالطرف CS / Load على الوحدة. هذا الطرف لتحديد (اختيار) الجهاز عندما يتم إرسال البيانات.
• Devices تحدد الحد الأقصى لعدد الأجهزة التي يمكن التحكم فيها. يمكن أن يتراوح ما بين 1 إلى 8. وهو عدد الأجهزة المتصلة في تتالي cascade .
• الجهاز المتصل مباشرةً بالأطراف المحددة يكون له العنوان address 0 . الجهاز الموجود بجواره المتتالي مباشرةً يكون له العنوان 1. الجهاز الثامن (الجهاز الأخير في اتصال التسلسل) يكون له العنوان 7.
الدالة :
• تستخدم هذه الدالة لتوفير الطاقة.
• إذا كانت الحالة status صواب true ، ينتقل الجهاز المقابل للعنوان addr إلى وضع إيقاف التشغيل. إذا كانت الحالة status خطأ false ، فإن الجهاز يعمل بشكل طبيعي.
الدالة :
• تستخدم هذه الدالة لضبط سطوع الشاشة التي عنوانها addr.
• يمكن أن تتراوح الشدة بين 1 و 15. 1 كحد أدنى و 15 كحد أقصى.
الدالة :
• تستخدم هذه الدالة لعرض رقم number ، المشار إليه بالبارامتر (value) ، على الشاشة بالعنوان addr . يتم عرض الرقم في الموضع (الأحاد units ، العشرات tens ، وما إلى ذلك) المذكورة بواسطة البارامتر digit (يمكن أن تكون من 0 إلى 7) . البارامتر dp يحدد الفاصلة العشرية. إذا كان dp خطأ false ، فستكون النقطة العشرية معطلة.
الدالة :
• تستخدم هذه الدالة لعرض حرف character ، المشار إليه بالبارامتر (value) على الشاشة بالعنوان addr . يتم عرض الحرف في الموضع (الأحاد units ، العشرات tens ، وما إلى ذلك) المذكورة بواسطة البارامتر digit (يمكن أن تكون من 0 إلى 7). يحدد البارامتر dp الفاصلة العشرية. إذا كان dp خطأ ً false ، فستكون النقطة العشرية معطلة.
• يمكن فقط عرض بعض الحروف .
2- دائما ما ننتظر قليلا ما بين تحديث الشاشة :
3- نأتى إلى دالة الإعداد setup . فى البداية ، ونظرا لأن MAX72XX يبدأ العمل فى وضع "توفير القدرة" ، فعلينا إيقاظه ، وضبط شدة إضاءة الشاشة ، ومسح الشاشة للتهيئة للعمل :
طباعة الأرقام Printing numbers
الاستخدام الأكثر شيوعًا لشاشات العرض السفن سيجمنت هو إظهار الأرقام numbers . الدالة الأولى التي ننظر إليها setDigit تأخذ وسيط نوع البايت وتطبع الرقم المقابل في العمود المحدد. يعمل نطاق القيم الصالحة من 0..15 . تتم طباعة جميع القيم بين 0..9 كأرقام digits ، ويتم طباعة القيم بين 10..15 كمكافئها السداسي عشر.
سيتم ببساطة تجاهل أي قيمة أخرى ، مما يعني أنه لن تتم طباعة أي شيء. لن يتم إفراغ blanked العمود الموجود على الشاشة ، بل سيحتفظ ببساطة بقيمته الصالحة الأخيرة. يمكن تشغيل الفاصلة العشرية في العمود أو إيقاف تشغيله باستخدام وسيط إضافى .
فيما يلي مثال صغير يطبع قيمة نوع int هى (-999..999) على شاشة مكونة من 4 أرقام digits .
فيما يلى النموذج الأولي prototype للدالة :
يجب أن يكون الوسيط digit فى النطاق 0..7 لأن MAX72XX يمكنه أن يقود ما يصل إلى ثمانية شاشات عرض سفن سيجمنت . الفهرس index يبدأ من 0 كالمعتاد.
طباعة الأحرف Printing characters
هناك مجموعة محدودة من الأحرف التى يمكن عرضها على شاشة السفن سيجمنت . الاستخدام الشائع سيكون الحرف '-' للقيم السالبة والحروف الستة 'A'..'F' للقيم السداسية.
الدالة setChar(addr,digit,value,dp) - تقبل قيمة value من نوع char للنطاق الكامل لتكويد أسكى ASCII ذات 7 بت. نظرًا لأن الأنماط التي يمكن التعرف عليها محدودة ، أشهر الأحرف المحددة (المعرفة) هي حرف الفراغ <space> . ولكن هناك عدد قليل من الأحرف التي لها معنى على شاشة السفن سيجمنت . فيما يلي مجموعة الأحرف القابلة للطباعة:
من أجل راحتك ، تم أيضًا إعادة تعريف الأحرف السداسية عشرية بقيم الأحرف 0x00...0x0F . إذا كنت ترغب في مزج الأرقام digits والحروف characters على الشاشة ، يمكنك ببساطة أن تأخذ نفس وسيط البايت التي كنت ستستخدمها للدالة setDigit() وستطبع القيمة السداسية العشرية.
النموذج الأولي للدالة هو نفسه تقريبا لعرض الأرقام digits .
يمكن رسم أي حرف آخر باستخدام الدالة setRow() . على سبيل المثال ، إذا كنت تريد عرض شيء يشبه الحرف الصغير 't' :
4- عودة إلى برنامج مثال المكتبة : إنشاء دالة لعرض حروف الكلمة "Arduino" حرف تلو الآخر على خانة الرقم digit 0 من الوحدة :
5- إنشاء دالة لتمرير جميع الأعداد السداسية عشر والأحرف على الشاشة ، سوف تحتاج لأربعة أرقام digits على الأقل وإلا لن يكون العرض بالشكل الجيد .
6- أخيرا ، فى الدالة loop يتم استدعاء الدالتين للتنفيذ :
النتائج :
مثال المكتبة :
البرنامج :
- الكود:
//We always have to include the library
#include "LedControl.h"
/*
Now we need a LedControl to work with.
***** These pin numbers will probably not work with your hardware *****
pin 12 is connected to the DataIn
pin 11 is connected to the CLK
pin 10 is connected to LOAD
We have only a single MAX72XX.
*/
LedControl lc=LedControl(12,11,10,1);
/* we always wait a bit between updates of the display */
unsigned long delaytime=250;
void setup() {
/*
The MAX72XX is in power-saving mode on startup,
we have to do a wakeup call
*/
lc.shutdown(0,false);
/* Set the brightness to a medium values */
lc.setIntensity(0,8);
/* and clear the display */
lc.clearDisplay(0);
}
/*
This method will display the characters for the
word "Arduino" one after the other on digit 0.
*/
void writeArduinoOn7Segment() {
lc.setChar(0,0,'a',false);
delay(delaytime);
lc.setRow(0,0,0x05);// r
delay(delaytime);
lc.setChar(0,0,'d',false);
delay(delaytime);
lc.setRow(0,0,0x1c);//u
delay(delaytime);
lc.setRow(0,0,B00010000);//i
delay(delaytime);
lc.setRow(0,0,0x15);//n
delay(delaytime);
lc.setRow(0,0,0x1D);//o
delay(delaytime);
lc.clearDisplay(0);
delay(delaytime);
}
/*
This method will scroll all the hexa-decimal
numbers and letters on the display. You will need at least
four 7-Segment digits. otherwise it won't really look that good.
*/
void scrollDigits() {
for(int i=0;i<13;i++) {
lc.setDigit(0,3,i,false);
lc.setDigit(0,2,i+1,false);
lc.setDigit(0,1,i+2,false);
lc.setDigit(0,0,i+3,false);
delay(delaytime);
}
lc.clearDisplay(0);
delay(delaytime);
}
void loop() {
writeArduinoOn7Segment();
scrollDigits();
}
الوصف :
1- فى بداية البرنامج (الاسكيتش) يجب تضمين ملف رأس المكتبة :
- الكود:
//We always have to include the library
#include "LedControl.h"
ثم يتم تحديد أطراف الاتصال بين الوحدة والاردوينو ، ومن ثم يتم إنشاء كائن من فئة المكتبة :
- الكود:
/*
Now we need a LedControl to work with.
***** These pin numbers will probably not work with your hardware *****
pin 12 is connected to the DataIn
pin 11 is connected to the CLK
pin 10 is connected to LOAD
We have only a single MAX72XX.
*/
LedControl lc=LedControl(12,11,10,1);
الدوال المستخدمة :
الدالة :
- الكود:
LedControl new_disp = LedControl(dataPin, clkPin, csPin, Devices)
• تؤدي هذه الدالة (تسمى دالة المنشىء) إلى إنشاء كائن من فئة LEDControl (اسم الكائن هنا ، new_disp ؛ يمكن استخدام أي اسم صالح آخر ) وهى تتخاطب مع MAX7219 الموجودة على وحدة (موديول) العرض المكون من السفن سيجمنت .
• dataPine هو طرف Arduino الذي يتصل بطرف دخل البيانات DIN بالوحدة (الموديول) . وهو طرف الاردوينو حيث يتم نقل (إزاحة) البيانات للخارج .
• clkPin هو طرف Arduino الذي يتصل بالطرف CLK على الوحدة . وهو طرف الساعة clock .
• csPin هو طرف Arduino المتصل بالطرف CS / Load على الوحدة. هذا الطرف لتحديد (اختيار) الجهاز عندما يتم إرسال البيانات.
• Devices تحدد الحد الأقصى لعدد الأجهزة التي يمكن التحكم فيها. يمكن أن يتراوح ما بين 1 إلى 8. وهو عدد الأجهزة المتصلة في تتالي cascade .
• الجهاز المتصل مباشرةً بالأطراف المحددة يكون له العنوان address 0 . الجهاز الموجود بجواره المتتالي مباشرةً يكون له العنوان 1. الجهاز الثامن (الجهاز الأخير في اتصال التسلسل) يكون له العنوان 7.
الدالة :
- الكود:
new_disp.shutdown(addr, status)
• تستخدم هذه الدالة لتوفير الطاقة.
• إذا كانت الحالة status صواب true ، ينتقل الجهاز المقابل للعنوان addr إلى وضع إيقاف التشغيل. إذا كانت الحالة status خطأ false ، فإن الجهاز يعمل بشكل طبيعي.
الدالة :
- الكود:
new_disp.setIntensity(addr, intensity)
• تستخدم هذه الدالة لضبط سطوع الشاشة التي عنوانها addr.
• يمكن أن تتراوح الشدة بين 1 و 15. 1 كحد أدنى و 15 كحد أقصى.
الدالة :
- الكود:
new_disp.setDigit(addr, digit, value, dp)
• تستخدم هذه الدالة لعرض رقم number ، المشار إليه بالبارامتر (value) ، على الشاشة بالعنوان addr . يتم عرض الرقم في الموضع (الأحاد units ، العشرات tens ، وما إلى ذلك) المذكورة بواسطة البارامتر digit (يمكن أن تكون من 0 إلى 7) . البارامتر dp يحدد الفاصلة العشرية. إذا كان dp خطأ false ، فستكون النقطة العشرية معطلة.
الدالة :
- الكود:
new_disp.setChar(addr, digit, value, dp)
• تستخدم هذه الدالة لعرض حرف character ، المشار إليه بالبارامتر (value) على الشاشة بالعنوان addr . يتم عرض الحرف في الموضع (الأحاد units ، العشرات tens ، وما إلى ذلك) المذكورة بواسطة البارامتر digit (يمكن أن تكون من 0 إلى 7). يحدد البارامتر dp الفاصلة العشرية. إذا كان dp خطأ ً false ، فستكون النقطة العشرية معطلة.
• يمكن فقط عرض بعض الحروف .
2- دائما ما ننتظر قليلا ما بين تحديث الشاشة :
- الكود:
/* we always wait a bit between updates of the display */
unsigned long delaytime=250;
3- نأتى إلى دالة الإعداد setup . فى البداية ، ونظرا لأن MAX72XX يبدأ العمل فى وضع "توفير القدرة" ، فعلينا إيقاظه ، وضبط شدة إضاءة الشاشة ، ومسح الشاشة للتهيئة للعمل :
- الكود:
void setup() {
/*
The MAX72XX is in power-saving mode on startup,
we have to do a wakeup call
*/
lc.shutdown(0,false);
/* Set the brightness to a medium values */
lc.setIntensity(0,8);
/* and clear the display */
lc.clearDisplay(0);
}
طباعة الأرقام Printing numbers
الاستخدام الأكثر شيوعًا لشاشات العرض السفن سيجمنت هو إظهار الأرقام numbers . الدالة الأولى التي ننظر إليها setDigit تأخذ وسيط نوع البايت وتطبع الرقم المقابل في العمود المحدد. يعمل نطاق القيم الصالحة من 0..15 . تتم طباعة جميع القيم بين 0..9 كأرقام digits ، ويتم طباعة القيم بين 10..15 كمكافئها السداسي عشر.
سيتم ببساطة تجاهل أي قيمة أخرى ، مما يعني أنه لن تتم طباعة أي شيء. لن يتم إفراغ blanked العمود الموجود على الشاشة ، بل سيحتفظ ببساطة بقيمته الصالحة الأخيرة. يمكن تشغيل الفاصلة العشرية في العمود أو إيقاف تشغيله باستخدام وسيط إضافى .
فيما يلي مثال صغير يطبع قيمة نوع int هى (-999..999) على شاشة مكونة من 4 أرقام digits .
- الكود:
void printNumber(int v) {
int ones;
int tens;
int hundreds;
boolean negative;
if(v < -999 || v > 999)
return;
if(v<0) {
negative=true;
v=v*-1;
}
ones=v%10;
v=v/10;
tens=v%10;
v=v/10;
hundreds=v;
if(negative) {
//print character '-' in the leftmost column
lc.setChar(0,3,'-',false);
}
else {
//print a blank in the sign column
lc.setChar(0,3,' ',false);
}
//Now print the number digit by digit
lc.setDigit(0,2,(byte)hundreds,false);
lc.setDigit(0,1,(byte)tens,false);
lc.setDigit(0,0,(byte)ones,false);
}
فيما يلى النموذج الأولي prototype للدالة :
- الكود:
/*
* Display a (hexadecimal) digit on a 7-Segment Display
* Params:
* addr address of the display
* digit the position of the digit on the display (0..7)
* value the value to be displayed. (0x00..0x0F)
* dp sets the decimal point.
*/
void setDigit(int addr, int digit, byte value, boolean dp);
يجب أن يكون الوسيط digit فى النطاق 0..7 لأن MAX72XX يمكنه أن يقود ما يصل إلى ثمانية شاشات عرض سفن سيجمنت . الفهرس index يبدأ من 0 كالمعتاد.
طباعة الأحرف Printing characters
هناك مجموعة محدودة من الأحرف التى يمكن عرضها على شاشة السفن سيجمنت . الاستخدام الشائع سيكون الحرف '-' للقيم السالبة والحروف الستة 'A'..'F' للقيم السداسية.
الدالة setChar(addr,digit,value,dp) - تقبل قيمة value من نوع char للنطاق الكامل لتكويد أسكى ASCII ذات 7 بت. نظرًا لأن الأنماط التي يمكن التعرف عليها محدودة ، أشهر الأحرف المحددة (المعرفة) هي حرف الفراغ <space> . ولكن هناك عدد قليل من الأحرف التي لها معنى على شاشة السفن سيجمنت . فيما يلي مجموعة الأحرف القابلة للطباعة:
• 0 1 2 3 4 5 6 7 8 9
• A a (prints upper case)
• B b (prints lower case)
• C c (prints lower case)
• D d (prints lower case)
• E e (prints upper case)
• F f (prints upper case)
• H h (prints upper case)
• L l (prints upper case)
• P p (prints upper case)
• - (the minus sign)
• ., (lights up the decimal-point)
• _ (the underscore)
• <SPACE> (the blank or space char)
• A a (prints upper case)
• B b (prints lower case)
• C c (prints lower case)
• D d (prints lower case)
• E e (prints upper case)
• F f (prints upper case)
• H h (prints upper case)
• L l (prints upper case)
• P p (prints upper case)
• - (the minus sign)
• ., (lights up the decimal-point)
• _ (the underscore)
• <SPACE> (the blank or space char)
من أجل راحتك ، تم أيضًا إعادة تعريف الأحرف السداسية عشرية بقيم الأحرف 0x00...0x0F . إذا كنت ترغب في مزج الأرقام digits والحروف characters على الشاشة ، يمكنك ببساطة أن تأخذ نفس وسيط البايت التي كنت ستستخدمها للدالة setDigit() وستطبع القيمة السداسية العشرية.
النموذج الأولي للدالة هو نفسه تقريبا لعرض الأرقام digits .
- الكود:
/*
* Display a character on a 7-Segment display.
* There are only a few characters that make sense here :
* '0','1','2','3','4','5','6','7','8','9','0',
* 'A','b','c','d','E','F','H','L','P',
* '.','-','_',' '
* Params:
* addr address of the display
* digit the position of the character on the display (0..7)
* value the character to be displayed.
* dp sets the decimal point.
*/
void setChar(int addr, int digit, char value, boolean dp);
يمكن رسم أي حرف آخر باستخدام الدالة setRow() . على سبيل المثال ، إذا كنت تريد عرض شيء يشبه الحرف الصغير 't' :
4- عودة إلى برنامج مثال المكتبة : إنشاء دالة لعرض حروف الكلمة "Arduino" حرف تلو الآخر على خانة الرقم digit 0 من الوحدة :
- الكود:
/*
This method will display the characters for the
word "Arduino" one after the other on digit 0.
*/
void writeArduinoOn7Segment() {
lc.setChar(0,0,'a',false);
delay(delaytime);
lc.setRow(0,0,0x05);// r
delay(delaytime);
lc.setChar(0,0,'d',false);
delay(delaytime);
lc.setRow(0,0,0x1c);//u
delay(delaytime);
lc.setRow(0,0,B00010000);//i
delay(delaytime);
lc.setRow(0,0,0x15);//n
delay(delaytime);
lc.setRow(0,0,0x1D);//o
delay(delaytime);
lc.clearDisplay(0);
delay(delaytime);
}
5- إنشاء دالة لتمرير جميع الأعداد السداسية عشر والأحرف على الشاشة ، سوف تحتاج لأربعة أرقام digits على الأقل وإلا لن يكون العرض بالشكل الجيد .
- الكود:
/*
This method will scroll all the hexa-decimal
numbers and letters on the display. You will need at least
four 7-Segment digits. otherwise it won't really look that good.
*/
void scrollDigits() {
for(int i=0;i<13;i++) {
lc.setDigit(0,3,i,false);
lc.setDigit(0,2,i+1,false);
lc.setDigit(0,1,i+2,false);
lc.setDigit(0,0,i+3,false);
delay(delaytime);
}
lc.clearDisplay(0);
delay(delaytime);
}
6- أخيرا ، فى الدالة loop يتم استدعاء الدالتين للتنفيذ :
- الكود:
void loop() {
writeArduinoOn7Segment();
scrollDigits();
}
النتائج :
رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects
تدريب :
النتائج :
- الكود:
//We always have to include the library
#include "LedControl.h"
/*
Now we need a LedControl to work with.
***** These pin numbers will probably not work with your hardware *****
pin 12 is connected to the DataIn
pin 11 is connected to the CLK
pin 10 is connected to LOAD
We have only a single MAX72XX.
*/
LedControl lc=LedControl(12,11,10,1);
/* we always wait a bit between updates of the display */
unsigned long delaytime=500;
void setup() {
/* The MAX72XX is in power-saving mode on startup, we have to do a wakeup call */
lc.shutdown(0,false);
/* Set the brightness to a medium values */
lc.setIntensity(0,8);
/* and clear the display */
lc.clearDisplay(0);
}
void hello(){
lc.setChar(0,0,'H',false);
lc.setChar(0,1,'E',false);
lc.setChar(0,2,'L',false);
lc.setChar(0,3,'L',false);
lc.setChar(0,4,'0',false);
lc.setChar(0,5,'.',false);
lc.setChar(0,6,'.',false);
lc.setChar(0,7,'.',false);
delay(delaytime+1000);
lc.clearDisplay(0);
delay(delaytime);
lc.setDigit(0,0,1,false);
delay(delaytime);
lc.setDigit(0,1,2,false);
delay(delaytime);
lc.setDigit(0,2,3,false);
delay(delaytime);
lc.setDigit(0,3,4,false);
delay(delaytime);
lc.setDigit(0,4,5,false);
delay(delaytime);
lc.setDigit(0,5,6,false);
delay(delaytime);
lc.setDigit(0,6,7,false);
delay(delaytime);
lc.setDigit(0,7,8,false);
delay(1500);
lc.clearDisplay(0);
delay(delaytime);
}
void loop() {
hello();
}
النتائج :
رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects
تدريب : قراءة مدخل تناظرى والعرض على السفن سيجمنت والمشغل MAX7219 :
النتيجة :
تعديل البرنامج لقياس درجة الحرارة باستخدام الحساس LM35 :
النتيجة :
تعديل البرنامج بحيث لا تظهر الأصفار على الشمال :
النتيجة :
- الكود:
#include "LedControl.h"
LedControl lc=LedControl(12,11,10,1);
void setup() {
Serial.begin(9600);
lc.shutdown(0,false);
lc.setIntensity(0,8);
lc.clearDisplay(0);
}
void loop() {
int adc = analogRead(A0);
lc.setDigit(0,0,adc/1000,false);//thousands : 1023/1000 = 1
lc.setDigit(0,1,(adc/100)%10,false);// hundreds : (1023/100) %10 = (10)%10 = 0
lc.setDigit(0,2,(adc/10)%10,false);// tens : (1023/10) %10 = (102) %10 = 2
lc.setDigit(0,3,adc%10,false);// ones : 1023%10 = 3
Serial.println(adc);
delay(100);
}
النتيجة :
تعديل البرنامج لقياس درجة الحرارة باستخدام الحساس LM35 :
- الكود:
#include "LedControl.h"
LedControl lc=LedControl(12,11,10,1);
void setup() {
Serial.begin(9600);
lc.shutdown(0,false);
lc.setIntensity(0,8);
lc.clearDisplay(0);
}
void loop() {
int adc = analogRead(A0);
adc = adc* 0.489; // transfer factor
lc.setDigit(0,0,adc/100,false);//digit 0 , hundred , 150/100 = 1
lc.setDigit(0,1,(adc/10)%10,false);// digit 1 , ten , 150 /10 =15 %10 =5
lc.setDigit(0,2, adc%10,false);// digit 2 , one , 150 %10 =0
http://lc.setDigit(0,3,adc%10,false);// digit 3
lc.setRow(0,3,0x4E);//Addr 0 , Position 3 ,Value “C”
Serial.println(adc);
delay(100);
}
النتيجة :
تعديل البرنامج بحيث لا تظهر الأصفار على الشمال :
- الكود:
#include "LedControl.h"
LedControl lc=LedControl(12,11,10,1);
void setup() {
Serial.begin(9600);
lc.shutdown(0,false);
lc.setIntensity(0,8);
lc.clearDisplay(0);
}
void loop() {
int adc = analogRead(A0);//Reading
int temp = adc* 0.489; // Change reading to temperature (0-150 degrees)
int hundred = temp /100;// digit 0
int ten = (temp /10)%10;// digit 1
int one = temp %10;// digit 2
if(temp <100)
lc.setChar(0,0,' ',false); // Print space char in digit 0
else
lc.setDigit(0,0, hundred,false);//Print hundred digit
if(temp <10)
lc.setChar(0,1,' ',false); // Print space char in digit 1
else
lc.setDigit(0,1, ten,false);//Print ten digit
lc.setDigit(0,2, one,false);// digit 2 , Print one digit
lc.setRow(0,3,0x4E);// digit 3 , Addr 0 , Position 3 ,Value “C” , print ‘C’
Serial.println(temp);
delay(100);
}
النتيجة :
صفحة 3 من اصل 4 • 1, 2, 3, 4
مواضيع مماثلة
» الأردوينو Arduino للمبتدئين
» الميكروكونترولر PIC والبرمجة بلغة C ومشاريع متقدمة مع المترجم مبكروسى برو
» الناقل 2IC وساعة التوقيت الحقيقى DS1307 ومشاريع الساعات الرقمية :
» 30 LED Projects
» SD-Card-Projects-Using-the-PIC-Microcontroller
» الميكروكونترولر PIC والبرمجة بلغة C ومشاريع متقدمة مع المترجم مبكروسى برو
» الناقل 2IC وساعة التوقيت الحقيقى DS1307 ومشاريع الساعات الرقمية :
» 30 LED Projects
» SD-Card-Projects-Using-the-PIC-Microcontroller
منتديات الهندسة الكهربية والإلكترونية والميكاترونكس والكومبيوتر :: البرمجة بلغة ++C مع ++Microsoft Visual C :: منتدى الاردوينو Arduino
صفحة 3 من اصل 4
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى