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

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects

صفحة 3 من اصل 4 الصفحة السابقة  1, 2, 3, 4  الصفحة التالية

اذهب الى الأسفل

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 Empty رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects

مُساهمة من طرف Admin الأحد ديسمبر 29, 2019 5:46 pm

الاردوينو والمحركات : DC motor ، Brushless DC Motor ، Servo Motor ، Stepper Motor
التحكم فى سرعة محرك تيار مستمر 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

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 014F27D8297F44A5BA471210922C6935

الآن إذا كان المفتاح في الشكل مغلقًا بشكل مستمر على مدار فترة زمنية ، فسيتم تشغيل 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% من جهد البطارية.

الدائرة الكهربية :

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 B22C0EB90EFA4DC294E2CD768C70C50D

البرنامج :


الكود:
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% من السرعة. هكذا يمكننا التحكم في السرعة باستخدام المقاومة المتغيرة .

Admin
Admin

عدد المساهمات : 1194
تاريخ التسجيل : 28/01/2014

https://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 Empty رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects

مُساهمة من طرف Admin الأحد ديسمبر 29, 2019 6:02 pm

التحكم فى سرعة واتجاه محرك التيار المستمر باستخدام الدائرة المتكاملة L293D واستخدام PWM مع الاردوينو :

قبل المضي قدمًا ، نحتاج إلى مناقشة دائرة القنطرة H-BRIDGE. هذه الدائرة لها وظيفتان أساسيتان ، الأولى هى التشغيل والتحكم فى سرعة محرك التيار المستمر من إشارات التحكم ذات القدرة المنخفضة ، والآخرى هى تغيير اتجاه دوران محرك التيار المستمر.

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 B7ABCEDEFFE447598FDA5FB1A1BF202E


نعلم جميعًا أنه بالنسبة لمحرك DC ، لتغيير اتجاه الدوران ، نحتاج إلى تغيير قطبية جهد تغذية المحرك . لذلك لتغيير القطبية نستخدم القنطرة H-bridge . الآن في الشكل أعلاه لدينا أربع مفاتيح .

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 81A608052D2C40949BAA68B207306B17

كما هو مبين في الشكل ، لدوران المحرك يتم إغلاق المفاتيح A1 و A2. لذلك ، يمر التيار عبر المحرك من اليسار إلى اليمين ، كما هو موضح في الجزء الايسر من الشكل . الآن اعتبر أن المحرك يدور في اتجاه عقارب الساعة clockwise . الآن إذا تم فتح المفاتيح A1 و A2 ، ويتم إغلاق المفاتيح B1 و B2. يمر التيار عبر المحرك من اليمين إلى اليسار كما هو موضح في الجزء الأيمن من الشكل . اتجاه مرور التيار عكس إتجاه مروره فى الحالة الأولى وبالتالي نرى جهد معكوس عند طرف المحرك بالنسبة للحالة الأولى ، وبالتالي فإن المحرك يدور بعكس عقارب الساعة anti clock wise . هذه هي الطريقة التي تعمل بها القتطرة H-BRIDGE. ومع ذلك ، يمكن تشغيل محركات القدرة المنخفضة بواسطة الدائرة المتكاملة
H-BRIDGE IC L293D .
الدائرة المتكاملة L293D هى H-BRIDGE مصممة لتشغيل محركات التيار المستمر منخفضة القدرة كما فى الشكل أدناه تتكون هذا الدائرة المتكاملة من قنطرتين ، وبالتالي يمكنها تشغيل محركين DC. لذلك يمكن استخدامها لتشغيل محركات الروبوت من إشارات المتحكم الدقيق .

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 9161C243926E45F180DD785528B7FF44

كما ذكرنا ، هذه الدائرة المتكاملة لديها القدرة على تغيير اتجاه دوران محرك التيار المستمر . يتم تحقيق ذلك من خلال التحكم في مستويات الجهد على INPUT1 و INPUT2.

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 E0379BD1D4D14378A89CF4D4D00A71FF

لذلك ، كما هو موضح في الشكل أعلاه ، للدوران في اتجاه عقارب الساعة يجب أن يكون 2A مرتفعًا ويجب أن يكون 1A منخفضًا. وبالمثل بالنسبة لعقارب الساعة 1A يجب أن يكون مرتفعا و 2 A يجب أن تكون منخفضا .

الدائرة الكهربية :

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 46FD176EB63F456C9DC173FDAA4517D5

فى البداية ، نحتاج إلى اختيار طرف إخراج 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);
                                }
                }
}
 

Admin
Admin

عدد المساهمات : 1194
تاريخ التسجيل : 28/01/2014

https://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 Empty رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects

مُساهمة من طرف Admin الأحد ديسمبر 29, 2019 6:11 pm

التحكم فى سرعة واتجاه محرك التيار المستمر DC motor باستخدام الدائرة المتكاملة L298 والاردوينو :

عن طريق توصيل الدائرة المتكاملة (القتطرة) L298 إلى الاردوينو ، يمكنك التحكم في محرك التيار المستمر DC.
محرك التيار المستمر ، هو أكثر أنواع المحركات شيوعًا. محركات التيار المستمر لها عادة طرفان ، طرف موجب والآخر سالب . إذا قمت بتوصيل هذين الطرفين مباشرة بالبطارية ، فسيتم دوران المحرك. إذا قمت بتبديل الطرفين ، فسيتم دوران المحرك في الاتجاه المعاكس.
للتحكم في اتجاه دوران محرك DC ، دون تغيير طريقة توصيل الأطراف ، يمكنك استخدام دائرة تسمى H-Bridge. هذه القنطرة عبارة عن دائرة إلكترونية يمكنها قيادة المحرك في كلا الاتجاهين. تُستخدم قنطرة H في العديد من التطبيقات المختلفة ، أحد أكثرها شيوعًا هو التحكم في المحركات في الروبوتات. يطلق عليها قتطرة (جسر) H-لأنها تستخدم أربعة ترانزستورات متصلة بطريقة تشبه "H" .
يمكنك استخدام الترانزستورات المنفصلة لإنشاء هذه الدائرة ، ولكن في هذا التدريب ، سنستخدم الدائرة المتكاملة L298. يمكن للدائرة المتكاملة L298 التحكم في سرعة واتجاه محركات التيار المستمر DC motors ومحركات الخطوة stepper motors ويمكنها التحكم في محركين في وقت واحد. معدل تيارها هو2Aلكل محرك. عند هذه التيارات ، سوف تحتاج إلى استخدام مصارف الحرارة heat sinks .
الشكل أدناه يبين توزيع أطراف الدائرة المتكاملة L298 :

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 E4194BF1BE5D440C8AA548B003858FF5

هناك ثلاثة أطراف دخل لكل محرك ، هى 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.

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 2A66063BEA0D4B4C83C08030EBB2A0F5


يتم توصيل الطرف IN1 من L298 إلى الطرف 8 من Arduino بينما يتم توصيل الطرف IN2 إلى الطرف 9 . هذه الأطراف الرقمية من Arduino تتحكم في اتجاه المحرك. ويتم توصيل الطرف EN A من الدائرة المتكاملة إلى الطرف PWM pin 3 من Arduino. هذا الطرف سوف يتحكم في سرعة المحرك.
لتعيين قيم أطراف الاردوينو 8 و 9 ، سوف نستخدم الدالة digitalWrite() ، ولتعيين قيمة الطرف 3 ، سوف نستخدم الدالة analogWrite() .

الدائرة الكهربية :

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 1670636284B246EB8A74D6F22D1D7EDC


البرنامج :

الكود:

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 ثوانٍ.

Admin
Admin

عدد المساهمات : 1194
تاريخ التسجيل : 28/01/2014

https://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 Empty محرك السيرفو Servo Motor

مُساهمة من طرف Admin الأربعاء يناير 01, 2020 8:10 pm

محركات السيرفو Servo Motors
التحكم فى الموضع باستخدام محرك السيرفو والاردوينو :


محرك السيرفو (المؤازر) عبارة عن محرك تيار مستمر DC يتم التحكم بزاوية دورانه بدقة من خلال نظام تحكم بحلقة
تغذية عكسية مغلقة نموذجية. يدور محرك السيرفو فقط بقدر ما نريد ومن ثم يتوقف وينتظر الإشارة التالية بشكل يخالف محرك التيار المستمر DC التقليدي الذي يبدأ بالدوران عندما يتم تطبيق تغذية عليه ويستمر بالدوران حتى تتوقف التغذية عليه، بالتالي لا يمكننا التحكم بزاوية دورانه إلى مكان محدد. يوضح الشكل أدناه يبين نموذج لمحرك سيرفو.

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 B77A9767436748539B20FAF292CDB32E

لمحرك السيرفو ثلاث أسلاك : اثنان لتزويده بالطاقة (ground، Vcc)، والسلك الثالث يتم من خلاله تطبيق إشارة التحكم (نبضات PWM). في العادة لون سلك Vcc أحمر، ولون سلك الأرضي ground أسود أو بني، أما لون سلك إشارة التحكم أصفر أو أبيض أو برتقالي.
يتكون محرك السيرفو من الأجزاء التالية ، كما هو موضح في الشكل أدناه :

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 59F20F584FB545E39AAE6C00918BCE79

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 3C7494F0B97D49DDA6299B856A445D05


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 وتنتج إشارة خطأ، ليتحرك المحرك وعامود الخرج إلى زاوية أخرى مطلوبة، ويتوقف عندها.
يبين الشكل أدناه العناصر الداخلية لمحرك السيرفو.

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 826D28BF8CA944C0A9AD46174D3B1D8E

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 96559BC3F900422DB0FFE39F0AEB9EE6

معظم محركات السيرفو تدور ضمن 180º، وبعض منها ضمن 360º. يتم التحكم بالزاوية الدقيقة من خلال عرض نبضات PWM ذات التردد 50Hz كما تم ذكره. تعتمد العلاقة ما بين عرض النبضة والزاوية على الشركات المصنعة للمحركات ولكن المبدأ الأساسي هو نفسه في كل محرك.

مثال عرض النبضات وزاوية الدوران: يوضح الشكل أدناه مثالا على العلاقة ما بين عرض النبضات وزاوية الدورات
• من أجل عرض نبضة مقداره 1ms تكون زاوية المحرك 0° .
• من أجل عرض نبضة مقداره 1.5ms تكون زاوية المحرك 90° .
• من أجل عرض نبضة مقداره 2ms تكون زاوية المحرك 180° .
يتحرك محرك السيرفو ما بين 0 و180 درجة، ولا يتحرك في دوران مستمر كما في محرك DC التقليدي.

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 4476EE2B56B84ACE92A51202B102BE4E


تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 CFF1E1BA9F4A499A891103011B6C9322



Admin
Admin

عدد المساهمات : 1194
تاريخ التسجيل : 28/01/2014

https://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 Empty رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects

مُساهمة من طرف Admin الأربعاء يناير 01, 2020 8:23 pm

المكتبة 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.

لاستخدام هذه المكتبة يجب ضم الملف :

الكود:
 #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]

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 .


Admin
Admin

عدد المساهمات : 1194
تاريخ التسجيل : 28/01/2014

https://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 Empty رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects

مُساهمة من طرف Admin الأربعاء يناير 01, 2020 8:37 pm

أمثلة على التحكم فى الموضع باستخدام محرك السيرفو والأردوينو

مثال رقم 1 :
المطلوب :
التحكم في موضع عامود محرك سيرفو باستخدام زاوية محسوبة في البرنامج . على سبيل المثال ، تريد مستشعرًا على روبوت أن يتأرجح swing عبر قوس أو ينتقل إلى الموضع الذي تحدده.
الحل :
سوف نقوم باستخدم المكتبة Servo التى توزع مع بيئة تطوير الاردوينو . تتيح لك الإصدارات الحديثة من المكتبة توصيل إشارة السيرفو بأي طرف رقمي من Arduino.

الدائرة الكهربية :

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 03DABCB0FB33418BAADB945C04D0D88B

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 FCDD88FBF6534D12987B912422812091

البرنامج :

الكود:
#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 درجة .

الدائرة الكهربية :

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 103F66479FE348A6A845B9CC4247550C


تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 6F269DB699804A978ACD45528EA46B13


البرنامج :

الكود:
#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);
      }
    }
}
 

Admin
Admin

عدد المساهمات : 1194
تاريخ التسجيل : 28/01/2014

https://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 Empty المحركات الخطوية Stepper Motors

مُساهمة من طرف Admin الثلاثاء يناير 07, 2020 6:53 pm

المحركات الخطوية 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

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

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 F170A560599A42FEACBBF322F198E74B

يتم تنشيط الملفات الأربعة بطرق مختلفة هي :
• إثارة ملف واحد Wave drive or Single-Coil Excitation .
• خطوة كاملة Full step drive .
• نصف خطوة Half stepping .
• خطوة دقيقة Micro-stepping .

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

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 22C0BD9E6BF6439A9B5A9CBAD3AF90AF

طريقة تحريك بخطوة كاملة:
هذه الطريقة الأكثر استخداما . يتم في هذه الطريقة تطبيق جهد على ملفين (أي تنشيط ملفين) في كل مرة، وهو ما يؤدي إلى الحصول على عزم اسمي كامل (%100) للمحرك. يتم إتمام دورة كاملة على 4 مراحل. يبين الشكل كيفية عمل هذه الطريقة، والقيم المطلوب تطبيقها على الملفات الأربعة في كل مرحلة.

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 E5A04B4538B2461DA82717A4D24D2738

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

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 39AF19101D3F4D589C964988018C43FC

طريقة Microstepping:
لا يتم في هذه الطريقة تغذية الملفات بنبضات وإنما بإشارة تشبه إشارة sin. بهذا الإسلوب يتم الانتقال من خطوة إلى الأخرى بشكل أنعم، وهذا ما يجعل المحرك الخطوي مناسبا للتطبيقات ذات الدقة العالية مثل أنظمة CNC. يدور المحرك الخطوي في هذه الطريقة بشكل مستمر تقريبا مثل محركات DC البسيطة.

يستجر المحرك الخطوي - كما في محركات التيار المستمر- تيارا لا بأس به لا تستطيع لوحة الاردوينو تأمينه لهذا لابد من استخدام دائرة عزل ما بين المتحكم و المحرك تؤمن له هذا التيار. هناك طرق عديدة يمكن بها تنفيذ دائرة العزل: ترانزستورات أو دائرات متكاملة مثل L293 أو UL2003.
سنستخدم دائرة ULN2003 التي تمتاز برخصها مقارنة مع L293.

الدائرة المتكاملة ULN2003
تتكون الدائرة المتكاملة ULN2003 من سبع بوابات التي تتصف بأنها تعمل كمصب للتيار فقط. القيمة العظمى للتيار 500 mA . يوضح الشكل بنية الدائرة ULN2003 وتوز يع أرجلها:

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 D551E0383CDE47368F6ECA14FFBF5622

تعمل الأرجل من 1 و حتى 7 كمداخل لبوابات الدائرة، والأرجل من 10 وحتى 16 كمخارج للبوابات. الرجل رقم 8 يتم وصلها إلى الأرضي المشترك. الرجل 9 تتصل مع مهابط ثنائيات، من الممكن عدم وصل هذه الرجل ، أو قد يتم وصلها مع تغذية المحرك كما سنرى لاحقا. يوضح الجدول كيفية عمل البوابة.

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 6C669833D9814272A305B0BC3B43D669

لإيضاح عمل بوابة دارة ULN2003 لندرس الحالتين التاليتين والتي سنتحكم فيها بثنائي ضوئي من خلال الجهد المطبق على مدخل البوابة الأولى.
1- بفرض أن الجهد المطبق على مدخل البوابة الأولى5V (High level) كما هو موضح في الشكل . عندئذ فإن خرج البوابة الأولى على الرجل 16 هو Low level) 0V). تبعا لذلك سيضيئ الثنائي الضوئي حيث عملت بوابة دائرة ULN2003 على تأمين مصب للتيار إلى الأرضي .

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 05F238653F5D478D994DD57CFF904F67

2- بفرض أن الجهد المطبق على مدخل البوابة الأولى Low level 0V كما هو موضح في الشكل . عندئذ فإن خرج البوابة الأولى على الرجل 16 هو ممانعة عالية high impedance. تبعا لذلك لن يضيء الثنائي الضوئي حيث لم يتم تأمين مصب للتيار.

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 263448D5E22D4ADCA9565C16DBF1509C

الجهد المطبق على الرجل 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 سيكون خرج البوابات ممانعة عالية ولن يمر تيار في الملفات. يتم اختيار إحدى طرق تنشيط الملفات المذكورة سابقا (ملف واحد، خطوة كاملة، نصف خطوة) وبرمجة لوحة الأردوينو تبعل لذلك .
يتم التحكم بجهة دوران المحرك (مع أو عكس عقارب الساعة) من خلال ترتيب تنشيط الملفات الواحد تلو الآخر، ويتم التحكم بسرعة المحرك من خلال تغيير التأخير الزمني ما بين كل مرحلة من مراحل الدورة.

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 56898E73F887499CB6AACC7BBE147BED

يبين الشكل أدناه مخطط التوصيل العملي للوحة الأردوينو مع لوحة 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  - صفحة 3 83965E4DECC247A29419E3031C5D8265

Admin
Admin

عدد المساهمات : 1194
تاريخ التسجيل : 28/01/2014

https://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 Empty المحركات الخطوية Stepper Motors

مُساهمة من طرف Admin الثلاثاء يناير 07, 2020 6:53 pm

المحركات الخطوية 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

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

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 F170A560599A42FEACBBF322F198E74B

يتم تنشيط الملفات الأربعة بطرق مختلفة هي :
• إثارة ملف واحد Wave drive or Single-Coil Excitation .
• خطوة كاملة Full step drive .
• نصف خطوة Half stepping .
• خطوة دقيقة Micro-stepping .

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

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 22C0BD9E6BF6439A9B5A9CBAD3AF90AF

طريقة تحريك بخطوة كاملة:
هذه الطريقة الأكثر استخداما . يتم في هذه الطريقة تطبيق جهد على ملفين (أي تنشيط ملفين) في كل مرة، وهو ما يؤدي إلى الحصول على عزم اسمي كامل (%100) للمحرك. يتم إتمام دورة كاملة على 4 مراحل. يبين الشكل كيفية عمل هذه الطريقة، والقيم المطلوب تطبيقها على الملفات الأربعة في كل مرحلة.

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 E5A04B4538B2461DA82717A4D24D2738

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

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 39AF19101D3F4D589C964988018C43FC

طريقة Microstepping:
لا يتم في هذه الطريقة تغذية الملفات بنبضات وإنما بإشارة تشبه إشارة sin. بهذا الإسلوب يتم الانتقال من خطوة إلى الأخرى بشكل أنعم، وهذا ما يجعل المحرك الخطوي مناسبا للتطبيقات ذات الدقة العالية مثل أنظمة CNC. يدور المحرك الخطوي في هذه الطريقة بشكل مستمر تقريبا مثل محركات DC البسيطة.

يستجر المحرك الخطوي - كما في محركات التيار المستمر- تيارا لا بأس به لا تستطيع لوحة الاردوينو تأمينه لهذا لابد من استخدام دائرة عزل ما بين المتحكم و المحرك تؤمن له هذا التيار. هناك طرق عديدة يمكن بها تنفيذ دائرة العزل: ترانزستورات أو دائرات متكاملة مثل L293 أو UL2003.
سنستخدم دائرة ULN2003 التي تمتاز برخصها مقارنة مع L293.

الدائرة المتكاملة ULN2003
تتكون الدائرة المتكاملة ULN2003 من سبع بوابات التي تتصف بأنها تعمل كمصب للتيار فقط. القيمة العظمى للتيار 500 mA . يوضح الشكل بنية الدائرة ULN2003 وتوز يع أرجلها:

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 D551E0383CDE47368F6ECA14FFBF5622

تعمل الأرجل من 1 و حتى 7 كمداخل لبوابات الدائرة، والأرجل من 10 وحتى 16 كمخارج للبوابات. الرجل رقم 8 يتم وصلها إلى الأرضي المشترك. الرجل 9 تتصل مع مهابط ثنائيات، من الممكن عدم وصل هذه الرجل ، أو قد يتم وصلها مع تغذية المحرك كما سنرى لاحقا. يوضح الجدول كيفية عمل البوابة.

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 6C669833D9814272A305B0BC3B43D669

لإيضاح عمل بوابة دارة ULN2003 لندرس الحالتين التاليتين والتي سنتحكم فيها بثنائي ضوئي من خلال الجهد المطبق على مدخل البوابة الأولى.
1- بفرض أن الجهد المطبق على مدخل البوابة الأولى5V (High level) كما هو موضح في الشكل . عندئذ فإن خرج البوابة الأولى على الرجل 16 هو Low level) 0V). تبعا لذلك سيضيئ الثنائي الضوئي حيث عملت بوابة دائرة ULN2003 على تأمين مصب للتيار إلى الأرضي .

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 05F238653F5D478D994DD57CFF904F67

2- بفرض أن الجهد المطبق على مدخل البوابة الأولى Low level 0V كما هو موضح في الشكل . عندئذ فإن خرج البوابة الأولى على الرجل 16 هو ممانعة عالية high impedance. تبعا لذلك لن يضيء الثنائي الضوئي حيث لم يتم تأمين مصب للتيار.

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 263448D5E22D4ADCA9565C16DBF1509C

الجهد المطبق على الرجل 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 سيكون خرج البوابات ممانعة عالية ولن يمر تيار في الملفات. يتم اختيار إحدى طرق تنشيط الملفات المذكورة سابقا (ملف واحد، خطوة كاملة، نصف خطوة) وبرمجة لوحة الأردوينو تبعل لذلك .
يتم التحكم بجهة دوران المحرك (مع أو عكس عقارب الساعة) من خلال ترتيب تنشيط الملفات الواحد تلو الآخر، ويتم التحكم بسرعة المحرك من خلال تغيير التأخير الزمني ما بين كل مرحلة من مراحل الدورة.

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 56898E73F887499CB6AACC7BBE147BED

يبين الشكل أدناه مخطط التوصيل العملي للوحة الأردوينو مع لوحة 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  - صفحة 3 83965E4DECC247A29419E3031C5D8265

Admin
Admin

عدد المساهمات : 1194
تاريخ التسجيل : 28/01/2014

https://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 Empty رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects

مُساهمة من طرف Admin الثلاثاء يناير 07, 2020 8:12 pm

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

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 2BC51C6D60E049228C767838ABB347C8

يتم تنشيط الملفات الأربعة لقيادة المحرك الخطوي ثنائي القطبية بنفس طريقة المحرك أحادي القطبية المذكور سابقا:
• إثارة ملف واحد Wave drive or Single-Coil Excitation .
• خطوة كاملة Full step drive .
• تصف خطوة Half stepping .
• خطوة دقيقة Micro-stepping .

طريقة إثارة ملف واحد:
في كل مرة يتم تطبيق جهد على ملف واحد، وبقية الملفات يطبق عليها 0V . عزم الدوران أقل من بقية الطرق، بالتالي فإن حمولة المحرك لا يمكن أن تكون كبيرة. يتم إتمام دورة كاملة على 4 مراحل. يبين الشكل كيفية عمل هذه الطريقة، والقيم المطلوب تطبيقها على الملفات الأربعة في كل مرحلة.

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 3033557AE7BA4BB782ACD3D32DC9255E

طريقة تحريك بخطوة كاملة:
في كل مرة يتم تطبيق جهد على ملفين، والملفان الآخران يطبق عليهما 0V . عزم الدوران أعلى من الطريقة السابقة. يتم إتمام دورة كاملة على 4 مراحل. يبين الشكل كيفية عمل هذه الطريقة، والقيم المطلوب تطبيقها على الملفات الأربعة في كل مرحلة.

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 3B8FF991E0484EDFA72573454A4A2564

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

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 3BD3BCA14AFA4B20948D33182A8CF6D2

طريقة Microstepping:
لا يتم في هذه الطريقة تغذية الملفات بنبضات وإنما بإشارة تشبه إشارة sin. بهذا الإسلوب يتم الانتقال من خطوة إلى الأخرى بشكل أنعم، وهذا ما يجعل المحرك الخطوي مناسب للتطبيقات ذات الدقة العالية .

Admin
Admin

عدد المساهمات : 1194
تاريخ التسجيل : 28/01/2014

https://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 Empty رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects

مُساهمة من طرف Admin الثلاثاء يناير 07, 2020 8:18 pm

التحكم بالمحرك الخطوي ثنائي القطبية وسرعته من خلال لوحة الأردوينو :

لا بد من استخدام دائرة عزل ما بين لوحة الأردوينو والمحرك ثنائي القطبية لتأمين التيار المطلوب. لا يمكن استخدام الدائرة المتكاملة ULN2003 مع المحرك ثنائي القطبية لأنها تعمل كمصب للتيار فقط (أي تسمح بمرور التيار باتجاه واحد)، في حين الدائرة المتكاملة L293 والدائرة المتكاملة L298N ستفي بالغرض المطلوب منها .
يبين الشكل أدناه الدائرة الكهربية للوحة الأردوينو مع الدائرة المتكاملة L293 والمحرك الخطوي ثنائي القطبية. تم ربط المنافذ 0,1,2,3 مع مداخل بوابات الدائرة L293، والمخارج مع أربعة أسلاك للمحرك.

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 34C4B3AC603D41F59084BA3CF6C8F080

البرنامج :
يتم اختيار إحدى طرق تنشيط الملفات المذكورة سابقا (ملف واحد، خطوة كاملة، نصف خطوة) وبرمجة لوحة الأردوينو تبعا لذلك . يتم التحكم بجهة دوران المحرك (مع أو عكس عقارب الساعة) من خالل ترتيب تنشيط الملفات الواحد تلو الآخر، ويتم التحكم بسرعة المحرك من خلال تغيير التأخير الزمني ما بين كل مرحلة من مراحل الدورة. تم كتابة الكود البرمجي الخاص بطريقة التحريك بخطوة كاملة، مع إمكانية اختيار جهة الدوران وسرعة المحرك. يصلح هذا الكود مع كل من الدائرة المتكاملة 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));
 }
}
 

Admin
Admin

عدد المساهمات : 1194
تاريخ التسجيل : 28/01/2014

https://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 Empty رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects

مُساهمة من طرف Admin الثلاثاء يناير 07, 2020 8:27 pm

مكتبة محرك الخطوة Stepper Library :

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

الكود:
#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 .
العائد :
لا شىء .

Admin
Admin

عدد المساهمات : 1194
تاريخ التسجيل : 28/01/2014

https://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 Empty رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects

مُساهمة من طرف Admin الأربعاء يناير 08, 2020 9:55 am

مثال : تطبيق على المكتبة : التأرجح 60 – ثانية

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 F441C663C8D24AC49453DE45BEA1FA61

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 DF2FBD2985BA400D82DC1EF640FDD241

سنقوم بإنشاء جهاز وهمى لبيان الوقت يكون محصورًا إلى الأبد في حلقة مدتها 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);
}
 


Admin
Admin

عدد المساهمات : 1194
تاريخ التسجيل : 28/01/2014

https://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 Empty رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects

مُساهمة من طرف Admin الأربعاء يناير 08, 2020 11:02 am

الأمثلة الموجودة ضمن بيئة تطوير الاردوينو :

مثال رقم 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);
 
ب‌- ثم إعطاء الأمر بالحركة ( الخطوة step) بقيمة التغير فى قيمة الحساس :

الكود:
 // 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. دائما استخدام مصادر قدرة منفصلة لتشغيل محركات الخطوة لخاص بك .
سنقوم بتوصيل المحرك والمشغل والاردوينو على النحو التالي:

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 4E5E33CCFCA94BE2AF63FDE6151CEBA6


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

الكود:

/*
    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" لتحديد السرعة القصوى لمحركك.

Admin
Admin

عدد المساهمات : 1194
تاريخ التسجيل : 28/01/2014

https://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 Empty محرك التيار المستمر بدون الفرش Brushless DC Motor(BLDC) والوحدة الإلكترونية للتحكم فى

مُساهمة من طرف Admin الجمعة يناير 10, 2020 6:37 pm

محرك التيار المستمر بدون الفرش Brushless DC Motor(BLDC) والوحدة الإلكترونية للتحكم فى السرعة ESC والاردوينو .

https://howtomechatronics.com/how-it-works/how-brushless-motor-and-esc-work/

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 28260CE194064796A906B0B746CB02CF


يتكون محرك BLDC من جزأين رئيسيين ، الجزء (العضو) الثابت stator والجزء (العضو) الدوار rotor . في الرسم التوضيحي أدناه ، العضو الدوار مكون من مغناطيسًا دائمًا permanent magnet به أقطاب ، بينما يتكون العضو الثابت من ملفات coils مرتبة كما هو موضح في الصورة أدناه.

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 589EB02A0CD34019931E9417C736C485

نعلم جميعًا أنه إذا مررنا تيار كهربى خلال ملف ، فسيولد حقل مغناطيسي magnetic field وستعتمد خطوط المجال المغناطيسي أو القطبين على اتجاه التيار .

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 E58FAFB23AAA4540B39ECFD2CAB612CC

لذلك إذا طبقنا (مررنا) التيار المناسب ، فإن الملف سيولد مجال مغناطيسي يجذب المغناطيس الدائم للعضو الدوار . الآن إذا قمنا بتنشيط كل ملف واحد تلو الآخر ، فإن العضوالدوار سيظل يدور بسبب تفاعل القوة بين المغناطيس الدائم والمغناطيس الكهربائي.

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 D7DECACE38A5462996A86BE7FEF25813

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

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 7325799ED3424FA2903EED8E238212A9

باستخدام هذا التكوين ، يمكننا إنشاء ستة أقطاب على العضو الثابت فقط بثلاثة ملفات أو طور phase . يمكننا زيادة الكفاءة أكثر عن طريق تنشيط اثنين من الملفات في نفس الوقت. وبهذه الطريقة ، ملف سوف يجذب attract والملف الآخر ينفر repel العضو الدوار .

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 C8E0BFB9551C4A5A8FBD50398BE18988

من أجل أن يصنع العضو الدوار دورة كاملة 360 درجة ، فإنه يحتاج إلى ست خطوات أو فترات intervals.

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 898480D2F03E410B8938B655369923F3

إذا ألقينا نظرة على الشكل الموجي للتيار ، يمكننا أن نلاحظ أنه في فترة interval يوجد طور (مرحلة) phase ذات تيار موجب ، وطور ذات تيار سالب ، ويتم إيقاف off الطور (المرحلة) الثالث. هذا يعطي فكرة أنه يمكننا ربط نقاط النهاية الحرة لكل مرحلة من المراحل الثلاث معًا وبالتالي يمكننا مشاركة التيار بينهما أو استخدام تيار واحد لتنشيط المرحلتين في نفس الوقت.
إليكم مثال. إذا قمنا بسحب pull up المرحلة A عاليا High ، أو وصلناها بجهد DC موجب ، مع نوع من المبدلات switch ، على سبيل المثال MOSFET ، وعلى الجانب الآخر ، قم بتوصيل المرحلة B بالأرضى ، عندئذ سوف يتدفق التيار من الجهد VCC ، عبر المرحلة A ، إلى النقطة المحايدة ثم المرحلة B ، إلى الأرضى. لذلك ، بمرور تيار واحد فقط ، أنشأنا الأقطاب الأربعة المختلفة التي تسبب تحريك العضو الدوار.

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 D100DC41B15A41FE91AC812B0C822822

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

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 62967D52764E47F196604D6D6931E9BB

لذلك ، من أجل جعل العضو الدوار يصنع دورة كاملة ، نحتاج فقط إلى تنشيط 2 موسفيت MOSFETS الصحيحين في كل فترة زمنية من 6 فترات ، وهذا ما يدور حوله عمل وحدة متحكم السرعة إلكترونيا ESC بالفعل.

كيف تعمل ESC (وحدة متحكم السرعة إلكترونيا)

تتحكم (ESC) أو وحدة التحكم في السرعة إلكترونيا في حركة أو سرعة المحرك بدون فرش عن طريق تنشيط الموسفتات MOSFETs المناسبة لإنشاء المجال المغناطيسي الدوار بحيث يدور المحرك. كلما زاد التردد frequency أو كلما أسرع ESC من خلال الفواصل الزمنية الست ، كلما زادت سرعة المحرك.

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 866B251BA05744C6BD5BEC210376B09C

ومع ذلك ، هنا يأتي سؤال مهم ، وهو كيف نعرف متى يتم تنشيط هذه المرحلة phase . الجواب هو أننا بحاجة إلى معرفة موضع العضو الدوار ، وهناك طريقتان شائعتان تستخدمان لتحديد موضع العضوالدوار.
الطريقة الأولى الشائعة هي استخدام حساسات "تأثير هول" Hall-effect المدمجة في العضو الثابت ، ومرتبة على قدم المساواة بين 120 أو 60 درجة عن بعضها البعض.

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 F5123FFB714D442E858EEBF7A3C732DC

عندما تدور المغناطيسات الدائمة للعضو الدور ، تستشعر مستشعرات تأثير هول المجال المغناطيسي وتولد منطقًا "مرتفعًا" “high” لقطب مغنطيسي معين أو منطق "منخفض" “low” للقطب المقابل (العكسى) . وفقًا لهذه المعلومات ، يعرف ESC متى يتم تنشيط تتابع التبديل commutation التالى أو الفترة الزمنية interval.
الطريقة الثانية الشائعة المستخدمة لتحديد موضع العضو الدوار هي من خلال استشعار القوة الدافعة الكهربائية الخلفية (العكسية) back EMF . تحدث EMF الخلفية نتيجة للعملية المعاكسة تماما لتوليد مجال مغناطيسي أو عندما يمر مجال مغناطيسي متحرك أو متغير عبر ملف ، فإنه يُحدث induces تيارًا في الملف.

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 1C9DF45EA7B34A2F807B22285F2F88F2

لذلك ، عندما يمر الحقل المغناطيسي المتحرك للعضو الدوار عبر الملف الحر ، أو الملف غير النشط ، فإنه سيؤدي إلى تدفق تيار في الملف ونتيجة لذلك سيحدث انخفاض في الجهد في هذا الملف. يلتقط ESC انخفاض الجهد هذا عند حدوثه وبناءً عليه ، فإنه يتوقع أو يحسب متى يجب أن يحدث الفاصل الزمني interval التالي.
هذا هو مبدأ العمل الأساسي لمحركات التيار المستمر بدون فرش و(ESCs) وهو نفس الشيء حتى لو قمنا بزيادة عدد أقطاب كل من العضو الدوار والعضو الثابت. سيظل لدينا محرك ثلاثي المراحل (الأطوار) phase ، فقط عدد الفواصل الزمنية سيزيد من أجل إكمال دورة كاملة.

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 4AF3B5C543F84CA798BDEF9478C84C49

هنا يمكننا أن نذكر أيضًا أن محركات BLDC يمكن أن تكون من النوع inrunners أو النوع outrunners . يمتلك المحرك inrunner مغناطيسًا دائمًا داخل المغناطيسات الكهربائية ، والعكس بالعكس ، يمتلك المحرك outrunner المغناطيس الدائم خارج المغناطيس الكهربائي. مرة أخرى ، وهم يستخدمون نفس مبدأ العمل ولكل منهم نقاط القوة أو الضعف الخاصة به.

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 F19478F10F4545F4BD0DB7663380D06A

المحرك بدون فرش من نوع outrunner brushless motor مزود بالمغناطيس الدائم خارج المغناطيس الكهربائي.المحور الخارجي الذي يحمل المغناطيس الدائم يحتوي على عمود الخرج (الدوران) المتصل في المنتصف.

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 797048ED3CD9454790284661A7A7C337

outrunner brushless motor

Admin
Admin

عدد المساهمات : 1194
تاريخ التسجيل : 28/01/2014

https://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 Empty رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects

مُساهمة من طرف Admin الجمعة يناير 10, 2020 6:58 pm

كيفية التحكم فى محرك التيار المستمر بدون الفرش باستخدام الاردوينو :

سوف نتعلم كيفية التحكم في محرك بدون فرش باستخدام Arduino و ESC .
محرك BLDC المستخدم بالمواصفات التالية: له معدل KV rating بالقيمة “1000” ، ويمكن تشغيله باستخدام بطارية 2S أو 3S أو 4S نوع LiPo(lithium polymer battery) ويتطلب 30A ESC . يحدد (يعرف) معدل KV لمحرك بدون فرش السرعة RPM للمحرك لكل فولت بدون تحميل.

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 4C5FC0D02B1541B7BD609377E74AFC78

في هذه الحالة ، يعني 1000KV ، على سبيل المثال ، أنه إذا قمنا لتغذية المحرك ببطارية 2S LiPo التي يبلغ جهدها 7.4 فولت ، يمكن للمحرك أن يحقق أقصى سرعة RPM تبلغ 7.4 أضعاف 1000 ، أو 7400 دورة في الدقيقة.
تتميز المحركات التي لا تستخدم فرشًا بأنها متعطشة للقدرة ، والطريقة الأكثر شيوعًا لتشغيلها هي استخدام بطاريات LiPo. يشير الرقم "S" لبطارية LiPo إلى عدد الخلايا الموجودة في البطارية ، ولكل خلية جهد كهربي قدره 3.7 فولت.

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 A5ABB8D093FA47919A3462C3EB902D84

في هذا المثال ، نستخدم بطارية 3S LiPo التي تحتوي على 3 خلايا أى 11.1 فولت. لذلك ، نتوقع أن يصل المحرك إلى الحد الأقصى لعدد الدورات في الدقيقة بقيمة 11100.
أخيرًا ، الوحدة 30A ESC التي سنستخدمها في هذا المثال وتطابق متطلبات المحرك. على جانب ، يوجد لدى ESC ثلاثة أسلاك تتحكم في المراحل الثلاثة للمحرك وعلى الجانب الآخر يوجد سلكان ، VCC و GND ، لتوفير القدرة .

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 1994955CAB194F63B1EB97DC04430412


هناك أيضًا مجموعة أخرى من ثلاثة أسلاك تخرج من ESC وهي خط الإشارة ، +5V ، والأرضى. تسمى هذه الميزة لوحدة ESC "دائرة حزف أو تعويض البطارية " Battery Eliminator Circuit وكما يوحي الاسم ، فهي تلغي الحاجة إلى بطارية منفصلة للميكروكونترولر . ومن ثم ، توفر ESC +5V منظم يمكن استخدامه لتشغيل Arduino .
يمكننا أن نلاحظ هنا أن هذا الاتصال هو في الواقع نفس الاتصال الذي نراه مع محركات السيرفو.

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 20D930E55C344BD4ABFAC6CE87A37BCF

إن التحكم في محرك بدون فرش باستخدام ESC و Arduino بسيط مثل التحكم في محرك السيرفو باستخدام Arduino. تستخدم ESCs نفس نوع إشارة التحكم مثل السيرفو وهى إشارة 50Hz PWM القياسية.

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 0C79AAE6D2234240A9829463067D103D

لذلك ، باستخدام Arduino ، علينا فقط توليد إشارة 50Hz PWM واعتمادًا على عرض النبضات أو مدة الحالة المرتفعة التي يجب أن تتراوح من واحد ميلي إلى 2 ميلي ثانية ، فإن ESC سوف يقود المحرك من الحد الأدنى إلى أقصى سرعة RPM .

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 71570F61E816465BA0FD89111EA74B23

الدائرة الكهربية :
بالإضافة إلى ESC ، سنستخدم مقاومة متغيرة potentiometer بسيط للتحكم في سرعة المحرك.

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 0DFE822F116742CD874B16DF9685AA46

البرنامج :

البرنامج حقيقة بسيط ، فقط بضع سطور من الكود :

الكود:
/*
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 ، ثم قمنا بتشغيل كل شيء باستخدام البطارية ، فيمكننا التحكم في سرعة المحرك بدون فرش من الصفر إلى الحد الأقصى باستخدام البوتنشميتر .


تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 2AF3C74DB505498395F4D271F54913FA




Admin
Admin

عدد المساهمات : 1194
تاريخ التسجيل : 28/01/2014

https://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 Empty الليد ماتريكس LED Matrix 8X8 ومشغل الليدات MAX7219 Driver والاردوينو وArduino وتحريك

مُساهمة من طرف Admin الإثنين فبراير 03, 2020 6:14 pm

الليد ماتريكس LED Matrix 8X8 ومشغل الليدات MAX7219 Driver والاردوينو وArduino وتحريك النصوص

الجزء الأول : الأجهزة (الهاردوير) :
في هذا التدريب ، ستتعلم كيفية استخدام وحدة (موديول) مصفوفة ليدات (ليد ماتريكس) 8 × 8 مع الدائرة المتكاملة MAX7219 . في النهاية ، ستتمكن من عرض أي شكل shape أو نص text على مصفوفة ليدات واحدة أو أكثر بسهولة بشكل ثابت fixed أو متحرك scrolled ، باستخدام 3 أطراف رقمية فقط من الاردوينو.
ما هى مصفوفة الليدات (الليد ماتريكس) Dot LED Matrix ؟
هى عبارة عن مصفوفة من الليدات التي يمكنك عرض أرقام وحروف وأشكال معينة عليها. تعرف مصفوفات الليدات بعدد الصفوف rows والأعمدة Columns النوع الأكثر شيوعًا من مصفوفة اللليدات هو النوع 8 × 8 ، والذي يوفر 64 ليد في 8 صفوف و 8 أعمدة.

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 984CA99702DB4D8F80AF0D4BB5F7EE7E

للتحكم في مصفوفة ليدات 8 × 8 ببساطة ، يجب عليك توصيل كل صف وكل عمود بطرف رقمي ، مما يعني أنك تحتاج إلى 16 طرفا رقميًا! وهى ليست طريقة مناسبة.
للتحكم في مصفوفة الليدات بطريقة مناسبة ، توجد وحدات (موديولات) قائمة على الدوائر المتكاملة MAX72xx والتي تحتاج إلى توصيل 3 أطراف رقمية (علاوة على طرفى مصدر القدرة +5V , GND ) بدلاً من 16 طرف. يمكنك أيضًا توصيل عدة مصفوفات ليدات (حتى Cool مع بعضها البعض دون الحاجة إلى أي طرف إضافي بعمل تتابع (تتالى) cascading لها .

الدائرة المتكاملة MAX7219 :
دعونا نلقي نظرة فاحصة على المشغل MAX7219 driver . يمكن لهذه الدائرة المتكاملة تشغيل 64 ليد فرديًا باستخدام 3 أسلاك فقط للتوصيل مع Arduino ، والأكثر من ذلك أننا نستطيع عمل سلسلة من المشغلات ومصفوفات الليدات المتعددة باستخدام نفس الأسلاك الثلاثة فقط .

كيفية توصيل (ربط) موديول الليد ماتريكس مع الأردوينو :

لتوصيل موديول الليد ماتريكس مع Arduino ، ما عليك سوى توصيل طرفى القدرة Vcc و GND بالطرفين 5V و GND فى Arduino ، ويمكن توصيل الأطراف DIN (دخل البيانات) و CS (أختيار الشريحة) و CLK (الساعة) الخاصة بموديول مصفوفة الليدات بأي أطراف رقمية من arduino كما هو موضح بالشكل أدناه .

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 9B109CF6AD7E4001B1A1DAD56D5D7C6A

يتم تشغيل 64 ليد بواسطة 16 طرف خرج من MAX7219 . السؤال الآن هو كيف يكون ذلك ممكنا، حسنًا ، يصل الحد الأقصى لعدد الليدات التى تضىء فعليا في نفس الوقت إلى ثمانية. يتم ترتيب الليدات في مجموعة 8 × 8 من الصفوف rows والأعمدة columns . لذلك ينشط (يفعل) MAX7219 كل عمود لفترة قصيرة جدًا من الوقت وفي نفس الوقت يقوم أيضًا بتشغيل كل صف. لذلك من خلال التبديل السريع بين الأعمدة والصفوف ، لن تلاحظ العين البشرية سوى ضوء مستمر.

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 F438C0FF4B22488AA509E3706FE3DB2E

لاحظ كيف يتم ترتيب أطراف مصفوفة الليد ماتريكس الشائعة 8 × 8 داخليًا ، لذلك إذا كنت تقوم ببناء مصفوفة ليدات ، فيجب أن تضع ذلك فى اعتبارك . لاحظ أيضًا أن اللوحة الشائعة للدائرة المتكاملة MAX7219 تأتي بمقاومة بين طرف 5V والطرف 18 للدائرة المتكاملة Iset . يتم استخدام المقاومة لتحديد السطوع أو مرور التيار إلى الليدات .

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 FAA1AB5EE9624F5A945449256482BBC6

يحتوي MAX7219 على واجهة تسلسلية SPI بأربعة أسلاك - الساعة clock ، البيانات data ، اختيار الرقاقة chip select والأرض ground - مما يجعل التوصيل مع المتحكم بسيطًا للغاية.

التحكم فى سطوع (شدة إضاءة) ليدات الشاشة مع MAX7219 :
هناك طريقتان للتحكم في سطوع الشاشة.
• عبر مقاومة تحديد التيار (Rset) .
• برمجيا باستخدام سجل التحكم الداخلى .
ملاحظة: لا يوجد أي متطلبات لإضافة مقاومات تحديد التيار لكل عمود حيث يتم التحكم في شدة خرج الليد بواسطة إشارة PWM ، بمعنى أنه يتم تشغيل الليد لفترة زمنية أقصر لتعتيمها - ويتم التحكم في هذا الزمن بواسطة سجل داخلى .

مقاومة التحكم فى السطوع :
لا يمكنك استخدام أحدهما دون الأخرى ، حيث يتعين عليك استخدام مقاومة لضبط الحد الأقصى للشدة. يجب أن يكون الحد الأدنى لقيمة المقاومة هو 9.53k لسطوع 40mA لعمر 7219 الأقصى باستخدام ليدات حمراء - انظر الجدول أدناه ).
يعتمد ضبط التيار أيضًا على هبوط (انخفاض) الجهد الأمامي في الليدات التي تستخدمها ؛ كل لون ليد مختلف له انخفاض مختلف للجهد الأمامي - انظر الجدول:

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 71D2C63C24044C2F99111E5E6D27D7CA

فيما يلي هبوط الجهد الأمامى (عند تيار ثابت ~15mA ) لبعض الليدات :

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 27E1489CCB5E45DCBE72C7B159B54395

التحكم فى سجل السطوع :
الطريقة الثانية للتحكم في السطوع هي أكثر فائدة لأنها تحت سيطرة البرنامج. يعين السجل 0xXA المستوى باستخدام 4 بتات البيانات الأدنى ، أي أن هناك 15 مستوى من مستويات السطوع مع كون 15 هي الأكثر سطوعًا.

توصيل اثنين أو أكثر من المشغلات MAX7219 :

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 DB062F5386BE451FA352528631A885EF

يسمح الشكل أدناه بتمرير scrolling النص من اليسار إلى اليمين (لا يبدو أنه من المناسب ربطهم بهذه الطريقة - لكن هذه هي الطريقة التي يسمح بها الكود للتمرير الصحيح). الوصلات الموجودة أعلى اللوحة مماثلة لتلك الموجودة في الجزء السفلي ، باستثناء أن الطرف الأوسط هو Dout (أسود). الأربعة خطوط الأخرى متصلة مباشرة بنظيرها .
ملاحظة: لإضافة المزيد من شاشات التمرير ، أضفها إلى اليسار وقم بتغيير المتغير maxDisplays ليطابق عدد الوحدات .

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 F75E0FAE8B324B55B798480599697D86

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 F376DA297F2D45F991418DA499344C81



يتم توصيل VCC و GND من الوحدة إلى الأطراف 5V و GND من Arduino وتوصيل الأطراف الثلاثة الأخرى ، DIN و CLK و CS إلى أي طرف رقمي من لوحة Arduino. إذا كنا نريد توصيل أكثر من وحدة ، فقط يتم توصيل أطراف الخرج بأطراف الدخل للوحدة الجديدة. في الواقع هذه الأطراف متشابهة فيما عدا أن الطرف DOUT في اللوحة السابقة يتصل بطرف DIN الخاص باللوحة الجديدة.

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 0B9D47064A4A43A7846B63064A14FBC0


الدائرة الكهربية ببرنامج بروتيس :
الآن دعنا نوصل وحدة ليد ماتريكس 8 × 8 والمشغل 7219 بلوحة Arduino. إليك مخطط الدائرة الكهربية :

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 6C8135E48E6B4CBFB8C4EF1F6198745A



Admin
Admin

عدد المساهمات : 1194
تاريخ التسجيل : 28/01/2014

https://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 Empty رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects

مُساهمة من طرف Admin الإثنين فبراير 03, 2020 6:31 pm

ثانيا البرمجيات  Software  :

هناك العديد من المكتبات للتعامل مصفوفة الليدات والمشغل 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  - صفحة 3 D1A0D73842914A75A0B4AD2108CAE569


Admin
Admin

عدد المساهمات : 1194
تاريخ التسجيل : 28/01/2014

https://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 Empty رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects

مُساهمة من طرف Admin الإثنين فبراير 03, 2020 6:53 pm

كود MAX7219 Arduino الأساسى :

بمجرد توصيل الوحدات ، نكون على استعداد لإلقاء نظرة على كود Arduino . في المثال الأول ، سوف نستخدم مكتبة MaxMatrix التي يمكن تنزيلها من الموقع GitHub .

الدائرة الكهربية :

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 05CBF562F4A147B6A3E8B5C78C55C4C3


البرنامج :

الكود:
 /*
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 المخصصة لتمرير نص .

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 7791C53ABDD744418EBA3666B8388E8F

في قسم الإعداد 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();

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 CE2459D21CA9460780D947B33DDC02B3


لعرض الأحرف المعرّفة مسبقًا ، نستخدم الدالة 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  - صفحة 3 E7E2F657E2F846DEAB04C1E027EE86D7


تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 E68F324E256544828FE8B1AD5445657C






Admin
Admin

عدد المساهمات : 1194
تاريخ التسجيل : 28/01/2014

https://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 Empty رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects

مُساهمة من طرف Admin الإثنين فبراير 03, 2020 7:06 pm

برنامج تحريك (تمرير) النصوص scrolling text باستخدام 8×8 LED Matrix و Arduino :

الدائرة الكهربية :

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 F73AAA08223742BFA3C57EDF330EFEA1

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 3FAAC70CBC18417B891BC8D429D60F85

بعد ذلك دعونا نلقي نظرة على مثال لتمرير نص ولنرى ما هو مختلف. فيما يلى الكود ووصفه.

الكود:

/*
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.

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 40264DF01EA04A078736DE9F27C0B677

يمكنك إلقاء نظرة على الموقع 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 .

Admin
Admin

عدد المساهمات : 1194
تاريخ التسجيل : 28/01/2014

https://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 Empty رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects

مُساهمة من طرف Admin الإثنين فبراير 03, 2020 7:48 pm

مثال :

الكود:
#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++;
  }
}
 

Admin
Admin

عدد المساهمات : 1194
تاريخ التسجيل : 28/01/2014

https://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 Empty رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects

مُساهمة من طرف Admin الإثنين فبراير 03, 2020 7:57 pm

مثال مع إدخال سلسلة النص من خلال الاتصال التسلسلى :


الكود:

/*
 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);
  }
}

النتائج :


تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 5FD39AD63B2743BE9FF5EDB3A16380EB


تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 2D87958EF43E47339194866ED715E899

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 1CDE278119DE44EC9496EC24A4681B51


تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 06E7B347D8DF404AA80B9290C2EB4A1B



Admin
Admin

عدد المساهمات : 1194
تاريخ التسجيل : 28/01/2014

https://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 Empty التحكم فى السفن سيجمنت والمشغل MAX7219 بواسطة الاردوينو مع المكتبة LedControl :

مُساهمة من طرف Admin الإثنين فبراير 10, 2020 9:55 am

التحكم فى السفن سيجمنت والمشغل MAX7219 بواسطة الاردوينو مع المكتبة LedControl :

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 13660E854447441C992ADC89345A293D

سوف نستحدم الوحدة (الموديول) المكون من الدائرة المتكاملة 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.

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 9A38E88CAB4143BEA3482B2DCE607070



Admin
Admin

عدد المساهمات : 1194
تاريخ التسجيل : 28/01/2014

https://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 Empty رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects

مُساهمة من طرف Admin الإثنين فبراير 10, 2020 10:15 am

البرمجة :
مثال المكتبة :
البرنامج :



الكود:
//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)

من أجل راحتك ، تم أيضًا إعادة تعريف الأحرف السداسية عشرية بقيم الأحرف 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' :

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 29A871DDE7594EF78849C756CEBA4A96

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  - صفحة 3 23725FAEDAE0483A806428FEB44C1105


تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 DA3967F087E9480196B7920A91211F86



Admin
Admin

عدد المساهمات : 1194
تاريخ التسجيل : 28/01/2014

https://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 Empty رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects

مُساهمة من طرف Admin الإثنين فبراير 10, 2020 11:05 am

تدريب :

الكود:

//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  - صفحة 3 6AF022558B51454BA248148B5D293FED


Admin
Admin

عدد المساهمات : 1194
تاريخ التسجيل : 28/01/2014

https://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 Empty رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects

مُساهمة من طرف Admin الإثنين فبراير 10, 2020 11:15 am

تدريب : قراءة مدخل تناظرى والعرض على السفن سيجمنت والمشغل MAX7219 :

الكود:
 #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);
 
}

النتيجة :

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 3C480CC44D8647BDA22991D5CD1F839C


تعديل البرنامج لقياس درجة الحرارة باستخدام الحساس 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);
 
}


النتيجة :


تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 8956C4A796C94639876E2A8168312021

تعديل البرنامج بحيث لا تظهر الأصفار على الشمال :

الكود:
#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);
 
}

النتيجة :

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 4FE0DAF8F62D4F0BB0F315AC703BFD11

تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects  - صفحة 3 6F249D0D38BF4F2081BC2B68F52E737E


Admin
Admin

عدد المساهمات : 1194
تاريخ التسجيل : 28/01/2014

https://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

صفحة 3 من اصل 4 الصفحة السابقة  1, 2, 3, 4  الصفحة التالية

الرجوع الى أعلى الصفحة

- مواضيع مماثلة

 
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى