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

   

الصورة الرمزية مسلم11
مسلم11
:: عضو ذهبي ::
تاريخ التسجيل: Jun 2009
الدولة: بلاد الشام
المشاركات: 3,679
نشاط [ مسلم11 ]
قوة السمعة:
قديم 23-12-2019, 09:10 PM المشاركة 57   
افتراضي



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


التعديل الأخير تم بواسطة : مسلم11 بتاريخ 23-12-2019 الساعة 09:17 PM
اعلانات

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 24-12-2019, 11:08 PM المشاركة 58   
افتراضي


[B]الاردوينو وموديول سفن سيجمنت مكون من أربع وحدات عرض ومسجلات الإزاحة 74HC595 :

وحدة العرض مكونة من أربعة أرقام digit . توفر هذه الوحدة شاشة مثالية للبيانات الرقمية أو السداسية عشرية. يمكن عرض الأرقام من 0 إلى 9 بما في ذلك العلامة العشرية ، والحروف من A إلى F. يمكن أيضًا التحكم في كل شريحة على حدة إذا كنت ترغب في ذلك.
يحتوي الموديول على أربعة سجلات إزاحة 74HC595 – واحد لكل تحكم فى رقم.

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





البرنامج :

كود:
// Demonstration Arduino sketch for four digit, seven segment display with enclosure
// https://pmdway.com/collections/7-segment-numeric-leds/products/four-digit-seven-segment-display-module-and-enclosure

int latchPin = 13;   // connect to LCK pin
int clockPin = 12;   // connect to CLK pin
int dataPin = 11;    // connect to SDI pin

int LED_SEG_TAB[]={
  0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0x01,0xee,0x3e,0x1a,0x7a,0x9e,0x8e,0x01,0x00};
//0     1    2     3    4    5    6    7    8    9   dp   .    a    b    c    d    e    f   off
//a,b,c,d,e,f,g,dp >> for LSBFIRST >> dp>>Q7, g>>Q6, >>…a>>Q0

void setup() 
{
  //set pins to output so you can control the shift register
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}


void displayNumber(int value, boolean leadingZero)
// break down "value" into digits and store in a,b,c,d  
{
  int a,b,c,d;
  a = value / 1000;//Digit1 or thousands
  value = value % 1000;
  b = value / 100;//Didit2 or hundreds
  value = value % 100;
  c = value / 10; // Digit3 or tens
  value = value % 10;
  d = value;//Digit4 or ones

  if (leadingZero==false) // removing leading zeros
  {
    if (a==0 && b>0)                  
{
      	a = 18;
    	} 
    if (a==0 && b==0 && c>0)          
{
     	 a = 18; 
      	b = 18;
    	}
    if (a==0 && b==0 && c==0)         
{
      	a = 18; 
      	b = 18; 
      	c = 18;
    	}
    if (a==0 && b==0 && c==0 && d==0) 
{
      	a = 18; 
      	b = 18; 
      	c = 18; 
      	d = 18;
    	}
  }

  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[d]);  
  shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[c]);  
  shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB);  
  shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[a]);  
  digitalWrite(latchPin, HIGH);
}

void allOff() // turns off all segments
{
  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, LSBFIRST, 0);  
  shiftOut(dataPin, clockPin, LSBFIRST, 0);  
  shiftOut(dataPin, clockPin, LSBFIRST, 0);  
  shiftOut(dataPin, clockPin, LSBFIRST, 0);  
  digitalWrite(latchPin, HIGH);
}

void loop() 
{
  for (int z=900; z<=1100; z++)
  {
    displayNumber(z, false);
    delay(10);
  }
  delay(1000);

  for (int z=120; z>=0; --z)
  {
    displayNumber(z, true);
    delay(10);
  }
  delay(1000);

  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[14]);  
  shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[13]);  
  shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[12]);  
  shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[11]);  
  digitalWrite(latchPin, HIGH);
  delay(1000); 

  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[16]);  
  shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[15]);  
  shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[14]);  
  shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[13]);  
  digitalWrite(latchPin, HIGH);
  delay(1000);

  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[0]);  
  shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[1]);  
  shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[2]);  
  shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[3]+1);  
  digitalWrite(latchPin, HIGH);
  delay(1000);
  
  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[7]);  
  shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[6]+1);  
  shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[5]);  
  shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[4]);  
  digitalWrite(latchPin, HIGH);
  delay(1000);
} 



طريقة العمل :
• فى البداية ، نعرف أطراف الخرج الرقمية المستخدمة في المزلاج latch والساعة clock والبيانات data فى السطور :

كود:
int latchPin = 13;   // connect to LCK pin
int clockPin = 12;   // connect to CLK pin
int dataPin = 11;    // connect to SDI pin

• ثم ننشىء مصفوفة تحتوي على قيم والتى يتم إرسالها إلى سجلات الإزاحة في الموديول لعرض الأرقام والحروف الممكنة. على سبيل المثال ، العنصر الأول – 0xfc – سوف يفعل الشرائح لعرض الرقم “0” ، والعنصر 0x7a للحرف C ، وهلم جرا.
• كما أنشأنا دالة ، بمعرفة المستخدم ، والتى تستخدم لإرسال العدد ككل whole number بين “0” و “9999” إلى الشاشة . للقيام بذلك ، ببساطة استخدم الدالة بالصيغة :

كود:
 void displayNumber(value, true/false);

حيث value هي العدد number المطلوب عرضه (أو المتغير الذي يحتوي على العدد ) – والبارامتر الثانى هو true أو false . يتحكم هذا البارامتر فيما إذا كان لديك صفر بادئة leading zero معروضة (أصفار على الشمال) – true تعنى نعم وجود أصفار على اليسار ، و false تعنى عدم وجود أصفار على اليسار ا.
على سبيل المثال ، لعرض "0123" ، ستستخدم:

كود:
displayNumber(123, true);

والنتيجة :




أو لعرض 500” استخدم :

كود:
displayNumber(500, false);

وتكون النتيجة :



لإيقاف تشغيل جميع الأرقام ، تحتاج إلى إرسال أصفار إلى كل بت في سجل الإزاحة ، ويتم ذلك عن طريق الدالة الآتية :

كود:
allOff();

ماذا عن العلامة العشرية؟
لتشغيل العلامة العشرية لرقم معين ، أضف 1 إلى القيمة التي يتم إرسالها إلى رقم معين. على سبيل المثال ، لعرض 87.65 ، تستخدم:

كود:
 digitalWrite(latchPin, LOW);
 shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[5]);
 shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[6]);
 shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[7]+1); // added one for decimal point
 shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[8]);
 digitalWrite(latchPin, HIGH);

والنتيجة تكون :




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



وتتوافق مخارج كل مسجل إزاحة مع ترتيب الشرائح من اليسار إلى اليمين. لذلك المخارج 0~7 تطابق A~G ثم الفاصلة العشرية.
على سبيل المثال ، لإنشاء الرقم سبعة بعلامة عشرية ، تحتاج إلى تشغيل الشرائح A, B, C , DP والتي تتوافق مع مخرجات مسجل الإزاحة 0،1،2،8.
وبالتالي فإن البايت المراد إرساله إلى سجل الإزاحة سيكون 0b11100001(أو 225 بالأرقام العشرية أو or 0xE1 بالسداسي عشري).
في كل مرة تريد فيها تغيير العرض ، تحتاج إلى إعادة رسم re-draw الأرقام الأربعة (أو أكثر إذا تستخدم أكثر من موديول متصلة) - بحيث يتم إرسال أربعة بايت من البيانات لكل تغيير العرض. تتم معالجة (عنونة) addressed الأرقام من اليمين إلى اليسار ، لذا فإن إرسال البايت الأول مخصص للرقم الأخير - والبايت الأخير مخصص للرقم الأول.
هناك ثلاث مراحل لتحديث الشاشة.
• وضع Set خط ساعة المزلاج latch على الحالة المنخفضة low .
• إزاحة للخارج Shift out أربعة بايت من البيانات من المتحكم الخاص بك .
• وضع خط ساعة المزلاج هلى الحالة المرتفعة high .
على سبيل المثال ، باستخدام الكود:

كود:
   digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, LSBFIRST, 0b10000000); // digit 4
  shiftOut(dataPin, clockPin, LSBFIRST, 0b01000000); // digit 3
  shiftOut(dataPin, clockPin, LSBFIRST, 0b00100000); // digit 2
  shiftOut(dataPin, clockPin, LSBFIRST, 0b00010001); // digit 1
  digitalWrite(latchPin, HIGH);

تكون النتيجة :



لاحظ كيف تتطابق البايتات الثنائية مع خريطة الأرقام وموضعها. على سبيل المثال ، كان البايت الأول مرسل للرقم الرابع ، وتم تشغيل الشريحة A. وهذا كل ما في الأمر - عرض أنيق وبسيط.

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

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 29-12-2019, 08:50 PM المشاركة 59   
افتراضي الاردوينو والمحركات : DC motor ، Brushless DC Motor ، Servo Motor ، Stepper Motor


الاردوينو والمحركات : 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



الآن إذا كان المفتاح في الشكل مغلقًا بشكل مستمر على مدار فترة زمنية ، فسيتم تشغيل ON المحرك بشكل مستمر خلال ذلك الوقت. إذا تم إغلاق المفتاح لمدة 8 مللي ثانية وفتح لمدة 2 مللي ثانية على مدار دورة 10 مللي ثانية ، فسيكون المحرك في وضع التشغيل فقط خلال 8 مللي ثانية. الآن ، الجهد المتوسط خلال فترة 10 مللي ثانية يساوى

كود:
 Turn ON time/ (Turn ON time + Turn OFF time)

وهذا ما يسمى دورة التشغيل duty cycle وهو 80% (8/ (8+2)) ، وبالتالي فإن متوسط جهد الخرج سيكون 80% من جهد البطارية. الآن ، لا يمكن للعين البشرية رؤية أن المحرك يعمل لمدة 8 مللي ثانية ، ثم لا يعمل لمدة 2 مللي ثانية ، لذلك سيبدو أن المحرك يدور بسرعة 80% .
في الحالة الثانية ، يتم إغلاق المفتاح لمدة 5 مللي ثانية ويفتح لمدة 5 مللي ثانية على مدار فترة 10 مللي ثانية ، وبالتالي فإن متوسط جهد الخرج سيكون 50% من جهد البطارية. إذا كان الجهد الكهربي للبطارية هو 5 فولت ودورة التشغيل 50% ، فإن متوسط الجهد الكهربي الطرفي سيكون 2.5 فولت.
في الحالة الثالثة ، تكون دورة التشغيل 20% ومتوسط الجهد الطرفي 20% من جهد البطارية.

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



البرنامج :


كود:
int pwmPin = 12; // assigns pin 12 to variable pwm
int pot = A0; // assigns analog input A0 to variable pot
int c1 = 0;   // declares variable c1
int c2 = 0;   // declares variable c2

void setup()  // setup loop
{
  pinMode(pwmPin, OUTPUT); 
  pinMode(pot, INPUT);  
}
void loop()
{
  c2= analogRead(pot); 
  c1= 1024-c2;         // subtracts c2 from 1000 ans saves the result in c1
  digitalWrite(pwmPin, HIGH); //ON
  delayMicroseconds(c1);//ON Time   
  digitalWrite(pwmPin, LOW); //OFF 
  delayMicroseconds(c2);  //OFF Time
}

شرح البرنامج :
في الكود أعلاه ، يتم تهيئة المتغير c1 و c2 وتعيين الطرف التناظري A0 لخرج المقاومة المتغيرة و الطرف 12 لخرج PWM .

كود:
 int pwmPin = 12;
int pot = A0;
int c1 = 0;  
int c2 = 0;

فى الدالة setup ، يتم تحديد الطرف A0 كدخل ، والطرف 12 كخرج :

كود:
void setup()  {
  pinMode(pwmPin, OUTPUT); // declares pin 12 as output
  pinMode(pot, INPUT);  // declares pin A0 as input
}

الآن ، في الدالة loop ، نقرأ القيمة التناظرية (من A0) باستخدام analogRead(pot) ، ونحفظها في المتغير c2. ثم ، نطرح قيمة c2 من 1024 ونحفظ النتيجة في c1. ثم نجعل الطرف 12 الخاص بخرج PWM بالحالة المرتفعة HIGH ثم بعد تأخير بالقيمة c1 نجعل هذا الطرف LOW. مرة أخرى ، بعد تأخير بالقيمة c2 تستمر الحلقة.
سبب طرح قيمة التناظرية من 1024 ، هو أن المحول من تناظرى لرقمى فى الاردوينو بدقة 10 بت (وبالتالي فإن قيم الأعداد الصحيحة 0 - 2^10 = 1024 قيمة ). هذا يعني أنه سيتم توزيع جهود الدخل بين 0 و 5 فولت إلى قيم أعداد صحيحة بين 0 و 1024 . لذلك إذا ضربنا anlogValue فى (5/1024) ، نحصل على القيمة الرقمية لجهد الدخل .

كود:
void loop()
{
  c2= analogRead(pot);
  c1= 1024-c2;           
  digitalWrite(pwmPin, HIGH); // sets pin 12 HIGH
  delayMicroseconds(c1);   // waits for c1 uS (high time)
  digitalWrite(pwmPin, LOW);  // sets pin 12 LOW
  delayMicroseconds(c2);   // waits for c2 uS (low time)
}

شرح العمل:
في هذه الدائرة ، للتحكم في سرعة محرك التيار المستمر ، نستخدم مقاومة متغيرة 100 كيلو أوم لتغيير دورة التشغيل duty cycle لإشارة PWM. يتم توصيل المقاومة المتغيرة إلى طرف الدخل التناظرى A0 للاردوينو أونو ويتصل المحرك DC بالطرف 12 من الاردوينو (وهو طرف خرج PWM). عمل البرنامج بسيط للغاية ، لأنه يقرأ الجهد من الطرف التناظرى A0. الجهد التناظرى يتغير باستخدام المقاومة المتغيرة . بعد القيام ببعض الحسابات اللازمة ، يتم ضبط دورة التشغيل وفقًا لذلك.
على سبيل المثال ، إذا قمنا بإدخال جهد يناظر القيمة 256 إلى المدخل التناظرى ، فسيكون وقت التشغيل المرتفع HIGH time 768ms (1024-256) وسيكون وقت الفصل المنخفض LOW time مللي ثانية. لذلك ، فهذا يعني ببساطة أن دورة العمل هي 75% . لا تستطيع أعيننا رؤية مثل هذا التذبذب عالي التردد ويبدو أن المحرك يعمل ON باستمرار بقيمة 75% من السرعة. هكذا يمكننا التحكم في السرعة باستخدام المقاومة المتغيرة .


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 29-12-2019, 09:05 PM المشاركة 60   
افتراضي


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

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




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



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



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



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

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



فى البداية ، نحتاج إلى اختيار طرف إخراج PWM من ستة أطراف ، بعد ذلك نحتاج إلى تعيين هذا الطرف كخرج .
بعد ذلك ، نحتاج إلى تمكين خاصية PWM في الاردوينو أونو عن طريق استدعاء الدالة “analogWrite(pin, value)” . حيث يمثل "pin" رقم الطرف حيث نحتاج إلى إخراج PWM ، ولقد وضعناه على أنه "3". لذلك على الطرف PIN3 نحصل على خرج PWM.
القيمة value هي دورة التشغيل ON duty cycle ، وهى بين 0 (off دائمًا) و 255 (on دائمًا). نحن بصدد زيادة increment هذا العدد وخفضه decrement عن طريق الضغط على زر.
لدى الاردوينو أونو حد أقصى للدقة resolution هو "8" ، لا يمكنك أن تذهب أبعد من هنا ومن ثم تكون القيم 0-255 . ومع ذلك ، يمكنك تقليل دقة PWM باستخدام الأمر “analogWriteResolution()” ، عن طريق إدخال قيمة من 4-8 في الأقواس ، يمكننا تغيير قيمتها من أربعة بت PWM إلى ثمانية بت PWM.
المفتاح SW1 لتغيير اتجاه دوران محرك التيار المستمر .


البرنامج :

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


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 29-12-2019, 09:14 PM المشاركة 61   
افتراضي


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

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



هناك ثلاثة أطراف دخل لكل محرك ، هى Input1 (IN1), Input2 (IN2), Enable1 (EN1) للمحرك Motor1 و Input3, Input4, and Enable2 للمحرك Motor2.
نظرًا لأننا سنتحكم في محرك واحد فقط في هذا التدريب ، فسوف نوصل بين Arduino و IN1 (الطرف 5) و IN2 (الطرف 7) و Enable1 (الطرف6) من الدائرة المتكاملة L298. تعتبر الاطراف 5 و 7 مداخل رقمية ، أي تشغيل ON أو إيقاف OFF ، بينما يحتاج الطرف 6 إلى إشارة معدلة بعرض النبضة (PWM) للتحكم في سرعة المحرك.
يوضح الجدول التالي اتجاه دوران المحرك وفقًا للقيم الرقمية لكل من IN1 و IN2.




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

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




البرنامج :

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


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 01-01-2020, 11:14 PM المشاركة 62   
افتراضي محركات السيرفو Servo Motors


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


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



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






1- محرك تيار مستمر DC motor .
2- عامود الخرج output shaft (ذرا ع محرك السرفو).
3- سلسلة من التروس gears التي تصل محرك DC بعامود الخرج. الهدف منها تقليل سرعة محرك DC لتصبح مناسبة.
4- نظام تحكم الكتروني بمكان المقبض ذو تغذية عكسية مغلقة، ويتكون مما يلي:
أ‌- مقاومة متغيرة potentiometer: تتصل مع عامود الخرج أو في مكان ما من سلسلة التروس، تعطى جهدا متناسيا مع موضع العامود .
ب‌- مبدل (محول) converter نبضات تعديل عرض النبضة PWM إلى جهد.
ت‌- مقارن comparator: يعمل على مقارنة الجهد الناتج عن المقاومة المتغيرة مع الجهد الناتج عن المبدل.

كيف يعمل محرك السيرفو :
1- يطبق على المحرك إشارة تحكم على شكل إشارة تعديل عرض النبضة pulse width modulation ((PWM والتي ترددها 50 Hz (أي تتكرر الإشارة كل 1/50 = 20ms ) . عرض هذه النبضات هو الذي سيتحكم بزاوية الدوران كما سنرى.
2- يتم تحويل هذه النبضات إلى جهد مكافئ عن طريق مبدل PWM. كلما كان عرض هذه النبضات أكبر كلما كان الجهد الناتج أكبر.
3- تقدم المقاومة المتغيرة جهدا يتناسب مع مكان عامود الخرج .
4- يعمل المقارن على مقارنة الجهد الناتج عن المبدل والجهد الناتج عن المقاومة المتغيرة. الاختلاف ما بين الإشارتين يعرف بإشارة الخطأ error signal، والتي يتم تضخيمها، وتستخدم لقيادة محرك التيار المستمر DC.
5- يتحرك محرك DC، وعامود الخرج، وبالتالي الجهد الناتج عن المقاومة المتغيرة بحيث تؤدي العملية إلى إنقاص أو حذف إشارة الخطأ.
6- عندما يتم حذف إشارة الخطأ يكون عامود الخرج قد وصل إلى المكان أو الزاوية المطلوبة، ويتوقف محرك DC تبعا لذلك .
7- عند تغيير عرض نبضات PWM، سيتغير الجهد الناتج عن مبدل PWM وتنتج إشارة خطأ، ليتحرك المحرك وعامود الخرج إلى زاوية أخرى مطلوبة، ويتوقف عندها.
يبين الشكل أدناه العناصر الداخلية لمحرك السيرفو.





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

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









الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 01-01-2020, 11:26 PM المشاركة 63   
افتراضي


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



الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 01-01-2020, 11:40 PM المشاركة 64   
افتراضي


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

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

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





البرنامج :

كود:
#include <Servo.h>
Servo myservo; // create servo object to control a servo
int angle = 0; // variable to store the servo position
void setup()
{
myservo.attach(9); // attaches the servo on pin 10 to the servo object
}
void loop()
{
for(angle = 0; angle < 180; angle += 1) // goes from 0 degrees to 180 degrees
{ // in steps of 1 degree
myservo.write(angle); // tell servo to go to position in variable 'angle'
delay(20); // waits 20ms between servo commands
}

for(angle = 180; angle >= 1; angle -= 1) // goes from 180 degrees to 0 degrees
{
myservo.write(angle); // tell servo to go to position in variable ' angle '
delay(20); // waits 20ms between servo commands
}
}

فى هذا المثال يتأرجح sweep عامود السيرفو بين 0 و 180 درجة. قد تحتاج إلى إخبار المكتبة بضبط الحد الأدنى والحد الأقصى للمواقع بحيث تحصل على نطاق الحركة الذي تريده. سيؤدي استدعاء الدالة Servo.attach باستخدام الوسائط الاختيارية للحد الأدنى والحد الأقصى من المواضع إلى ضبط الحركة:

كود:
myservo.attach(9,1000,2000 ); // use pin 9, set min to 1000us, max to 2000us

نظرًا لأن محركات السيرفو النموذجية تستجيب للنبضات المقاسة بالميكروثانية وليس بالدرجات ، فإن الوسائط التالية لرقم الطرف تُبلغ مكتبة Servo بعدد الثواني التي يجب استخدامها عند طلب 0 درجة أو 180 درجة.
فيما يلي وسائط الدالة servo.attach(pin, min, max) :
• الطرف pin : رقم الطرف المتصل به محرك السيرفو .
• الحد الأدنى (اختيارى) min (optional) : عرض النبضة بالميكرو ثانية المقابلة للزاوية الأدنى (0 درجة) على السيرفو (القيمة الافتراضية 544) .
• الحد الأقصى (اختيارى) max (optional) : عرض النبضة بالميكرو ثانية المقابلة للزاوية الأقصى (180 درجة) على السيرفو (القيمة الافتراضية 2,400) .

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

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







البرنامج :

كود:
#include <Servo.h>
Servo myservo; // create servo object to control a servo
int potpin = 0; // analog pin used to connect the potentiometer
int val; // variable to read the value from the analog pin
void setup()
{
myservo.attach(9); // attaches the servo on pin 9 to the servo object
}
void loop()
{
val = analogRead(potpin); // reads the value of the potentiometer
val = map(val, 0, 1023, 0, 179); // scale it to use it with the servo
myservo.write(val); // sets position to the scaled value
delay(15); // waits for the servo to get there
}


مثال رقم 3 :
التحكم في محركات السرفو باستخدام الاردوينو والازرار الضاغطة
في هذا التدريب ، سنتحكم في محرك السيرفو بواسطة ARDUINO UNO. يتم استخدام محركات السيرفو حيث تكون هناك حاجة لحركة أو وضع position عمود دوران بدقة . هذه المحركات ليست للتطبيقات عالية السرعة ، بل لتطبيقات السرعة المنخفضة ، وعزم الدوران المتوسط والوضع الدقيق . يتم استخدام هذه المحركات في آليات أذرع الربوت ، ومتحكمات الطيران وأنظمة التحكم.

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




في الاردوينو لدينا مكتبة معرفة مسبقًا ، والتي ستقوم بتعيين الترددات ونسب العمل وفقًا لذلك بمجرد استدعاء ملف الرأس أو تضمينه. في الاردوينو ، يتعين علينا ببساطة تحديد وضع السيرفو التي تحتاج إليه ويتم ضبط PWM تلقائيًا بواسطة الاردوينو .
الأشياء التي يتعين علينا القيام بها للحصول على وضع (موضع) position دقيق للسيرفو هي:

كود:
#include <Servo.h>
Servo servo;
servo.attach(servo_signal_pin_attached_to);
servo.write(needed_position_ angle);

نحتاج أولاً إلى تعيين تردد إشارة PWM ولهذا يجب أن نستدعى ملف الرأس “#include <Servo.h>” ، بضم ذلك الملف في البرنامج ، يتم ضبط التردد تلقائيًا وسنستخدم بعض الشروط الخاصة ، والتي تمكن المستخدم من إدخال الموضع المطلوب مباشرة دون أي صعوبة .
نحتاج الآن إلى تعريف اسم كائن من الفئة Servo وليكن “Servo servo” ، هنا servo هو الاسم الذي تم اختياره ، لذلك أثناء الكتابة من أجل الموضع ، سنستخدم هذا الاسم ، وهذه الميزة تكون مفيدة عندما يكون لدينا العديد من محركات السيرفو للتحكم فيها.
الآن نقوم بإخبار الاردوينو بمكان توصيل طرف إشارة السيرفو أو حيث نحتاج إلى إنشاء إشارة PWM. للقيام بذلك ، لدينا الدالة “servo.attach(3);” ، وهنا نبلغ الاردوينو أننا وصلنا طرف إشارة السيرفو بالطرف 3.
كل ما تبقى هو تعيين الموضع position ، سنقوم بتعيين موضع السيرفو باستخدام الدالة “servo.write(30);” ، بهذا الأمر ، يتحرك محور السيرفو 30 درجة. بعد ذلك كلما احتجنا إلى تغيير موضع السيرفو ، نحتاج إلى استدعاء الدالة ”servo.write(needed_position_ angle);” . في هذه الدائرة سيكون لدينا زران يزيد أحدهما من وضعية السيرفو والآخر لتقليل موضع السيرفو .

البرنامج :

كود:
 
int i=0;//initializing a integer for incrementing and decrementing duty ratio.
#include <Servo.h>// header file for controlling servo
Servo servo;//defining the name usage as servo itself

void setup()
{
 pinMode(3, OUTPUT);   // sets the pin3 as output
 pinMode(0, INPUT);// sets the pin0 as input
 pinMode(1, INPUT);// sets the pin1 as input

servo.attach(3);
}
 
void loop()
{
 servo.write(i);//set servo potion ‘i’ degrees
               
 if (digitalRead(0)==LOW)
  {
      if (i<180)
        {
          i++;//if pin0 is pressed and degrees is less than 180
          delay(30);
         }
    }
 if (digitalRead(1)==LOW)
   {
     if (i>0)
      {
        i--;// if pin1 is pressed and degrees is greater than 0
        delay(30);
       }
    }
}



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