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

   

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



مثال3 : صيغة جديدة محسنة لزر الضغط :


كود:
 const int LED = 13; // the pin for the LED
const int BUTTON = 7; // the input pin where the  pushbutton is connected
int val = 0; // val will be used to store the state of the input pin
int old_val = 0; // this variable stores the previous value of "val"
int state = 0; // 0 = LED off and 1 = LED on

void setup() 
{
pinMode(LED, OUTPUT); // tell Arduino LED is an output
pinMode(BUTTON, INPUT); // and BUTTON is an input
}

void loop()
{
val = digitalRead(BUTTON); // read input value and store it
// check if there was a transition
if ((val == HIGH) && (old_val == LOW))
{
state = 1 - state;
}

old_val = val; // val is now old, let's store it
if (state == 1) 
{
digitalWrite(LED, HIGH); // turn LED ON
} 
else 
{
digitalWrite(LED, LOW);
}
}

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

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

اعلانات

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


مثال4 : صيغة أخرى محسنة لزر الضغط مع مع علاج بسيط للارتداد :


كود:
 const int LED = 13; // the pin for the LED
const int BUTTON = 7; // the input pin where the pushbutton is connected
int val = 0; // val will be used to store the state of the input pin
int old_val = 0; // this variable stores the previous value of "val"
int state = 0; // 0 = LED off and 1 = LED on

void setup() 
{
pinMode(LED, OUTPUT); // tell Arduino LED is an output
pinMode(BUTTON, INPUT); // and BUTTON is an input
}

void loop()
{
val = digitalRead(BUTTON); // read input value and store it
// check if there was a transition
if ((val == HIGH) && (old_val == LOW))
{
state = 1 - state; // same as state=!state;
delay(10);
}

old_val = val; // val is now old, let's store it

if (state == 1) 
{
digitalWrite(LED, HIGH); // turn LED ON
} 
else 
{
digitalWrite(LED, LOW);
}

}

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

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


مثال 5 : توصيل الزر الضاغط بطريقة "السحب لأعلى" PULL UP مع استخدام المقاومة الموجودة داخل بناء لوحة الأردوينو المخصصة لهذا الغرض .
الدائرة الكهربية :





البرنامج :
لنبدأ في كتابة البرنامج بالدالة setup () . عادة تتم إعلانات الأطراف داخل الدالة setup () . في هذه الحالة يجب أن نعلن أن الطرف 2 هو طرف إدخال وأن الطرف 3 هو طرف إخراج. ويمكن القيام بذلك عن طريق الأسطر التالية

كود:
pinMode(2,INPUT);
pinMode (3,OUTPUT);

لكن لدينا تغيير بسيط هنا ، لأن الطرف 2 يستخدم كدخل INPUT يجب ألا يترك عائمًا floating أبدًا. وهذا يعني أن طرف الإدخال يجب أن يكون متصلاً دائمًا بالجهد +5V أو بالأرض. في حالتنا ، سيتم توصيل الإدخال بالأرض فقط إذا ضغطنا على الزر وإذا لم نضغط على الزر ، فسيتم تركه عائمًا. لتجنب هذا نستخدم ما يسمى "مقاومة السحب لأعلى الداخلية" . توجد هذه المقاومة داخل الميكروكونترولر ATmega 328 ولا يمكنك رؤيتها. لاستخدام هذا المقاومة ، علينا فقط كتابة سطر فى البرنامج .
سيقوم هذا السطر بتوصيل الطرف 2 بالجهد +5V من خلال المقاومة مما يجعله عالياً high عند عدم الاتصال بالأرض. لذلك نغير الكلمة الأساسية INPUT إلى INPUT_PULLUP كما هو موضح أدناه

كود:
pinMode(2,INPUT_PULLUP);

الآن وقد انتهينا من الدالة setup () ، دعنا ننتقل إلى الدالة loop () . هنا يجب أن نتحقق مما إذا كان الطرف 2 قد تم تأريضه (LOW) وإذا كان (if) قد تم تأريضه ، فيجب أن نجعل الليد يتوهج من خلال جعل الطرف 3 عالي HIGH . إذا لم يتم تأريضه (بخلاف ذلك else ) ، فيجب علينا إيقاف تشغيل الليد بجعل الطرف 3 منخفضًا LOW . دعونا نضع هذه الكلمات في برنامج :

كود:
void setup() 
{
pinMode(2,INPUT_PULLUP);
pinMode (3,OUTPUT);
}
void loop() {
  // put your main code here, to run repeatedly:
  if (digitalRead(2) == LOW)
  {
    digitalWrite(3,HIGH);
  }
  else
  {
    digitalWrite(3,LOW);  
  }
}


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


مرجعية لغة الأردوينو :

دالة قراءة الدخل الرقمى :

كود:
digitalRead(pin)

• ماذا تفعل ؟ : تقرأ القيمة من الطرف المحدد ، هذه القيمة إما تكون HIGH أو LOW .
• البارامترات :
pin : رقم الطرف الرقمى الذى تريد قراءته .
• العائد :
إما HIGH أو LOW .

• مثال :

كود:
 int ledPin = 13; // LED connected to digital pin 13
int inPin = 7; // pushbutton connected to digital pin 7
int val = 0; // variable to store the read value

void setup()
{
pinMode(ledPin, OUTPUT); // sets the digital pin 13 as output
pinMode(inPin, INPUT); // sets the digital pin 7 as input
}

void loop()
{
val = digitalRead(inPin); // read the input pin
digitalWrite(ledPin, val); // sets the LED to the button's value
}

ملاحظة :
إذا لم يتم توصيل الطرف إلى أى شىء ، فإن الدالة digitalRead() يمكن أن تعيد إما HIGH أو LOW (وهذا يمكن أن يتغير عشوائيا) .

عبارة if :
If تختبر ما إذا كان قد تم الوصول إلى حالة(شرط) معينة ، مثل "الدخل أصبح أعلى من عدد معين" . تنسيق (صيغة) اختبار if كما يلى :


كود:
 if (someVariable > 50)
{
// do something here
}

يختبر البرنامج لمعرفة ما إذا كان المتغير someVariable "أكبر من 50" . إذا كان الأمر كذلك ، فإن البرنامج يتخذ إجراءً معينًا. بعبارة أخرى ، إذا كانت العبارة الموجودة بين القوسين صحيحة true ، فسيتم تشغيل العبارات الموجودة داخل الأقواس. إذا لم يكن كذلك ، يتخطى البرنامج هذا الجزء من الكود .
يمكن حذف الأقواس بعد عبارة if. إذا تم ذلك ، يصبح السطر التالي (المعرّف بواسطة الفاصلة المنقوطة) هو عبارة الشرط الوحيدة.

كود:
if (x > 120) digitalWrite(LEDpin, HIGH);

if (x > 120)
digitalWrite(LEDpin, HIGH);

if (x > 120) {digitalWrite(LEDpin, HIGH);} // all are correct



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

كود:
x == y (x is equal to y)
x != y (x is not equal to y)
x < y (x is less than y)
x > y (x is greater than y)
x <= y (x is less than or equal to y)
x >= y (x is greater than or equal to y)

تحذير:
احذر من استخدام علامة المساواة الفردية عن طريق الخطأ (على سبيل المثال if (x = 10) ) . علامة المساواة الفردية هي عامل تعيين (تخصيص) ، وتعيين x بالقيمة 10. بدلاً من ذلك ، استخدم علامة المساواة المزدوجة
(على سبيل المثال if (x == 10) ) ، وهو عامل مقارنة ، ويختبر ما إذا كانت x تساوي 10 أم لا. العبارة الأخيرة صحيحة true فقط إذا كانت x تساوي 10 ، ولكن العبارة السابقة ستكون صحيحة true دائمًا.
هذا لأن لغة C تقيم العبارة if (x=10) على النحو التالي: 10 تم تعيينها إلى x ، لذلك x الآن تحتوي على 10. ثم يقيم شرط if “10=10” ، والذي يتم تقييمه دائمًا إلى TRUE ، حيث يتم تقييم أي رقم غير صفري إلى صحيح TRUE . وبالتالي if (x=10) ، سيقيم دائمًا على أنه TRUE ، فليست هذه هي النتيجة المرجوة عند استخدام عبارة "if". بالإضافة إلى ذلك ، سيتم تعيين المتغير x على 10 ، وهو أيضًا ليس إجراءً مطلوبًا.

عبارة lf/else :
عبارة lf/else تسمح بتحكم أكبر في تدفق الكود من عبارة if الأساسية ، من خلال السماح بتجميع اختبارات متعددة معًا. على سبيل المثال ، يمكن اختبار دخل تناظرى واتخاذ إجراء إذا كان الدخل أقل من 500 ، واتخاذ إجراء آخر إذا كان الدخل 500 أو أكثر. فيما يلى شكل الكود :



كود:
if (pinFiveInput < 500)
{
// action A
}
else
{
// action B
}

يمكن أن تسبق else اختبار if آخر ، بحيث يمكن تشغيل اختبارات متعددة متبادلة في الوقت نفسه كما يلى :


كود:
if (pinFiveInput < 500)
{
// do Thing A
}
else if (pinFiveInput >= 1000)
{
// do Thing B
}
else
{
// do Thing C
}

يمكنك الحصول على عدد غير محدود من هذه الفروع. (هناك طريقة أخرى للتعبير عن الفروع والاختبارات المتبادلة هي عبارة switch case ) .
ملاحظة حول الكود : إذا كنت تستخدم if / else ، وتريد التأكد من اتخاذ بعض الإجراءات الافتراضية دائمًا ، فمن المستحسن إنهاء اختباراتك بعبارة else مضبوطة على السلوك الافتراضي المطلوب.

المتغيرات المنطقية (البولية) boolean variables :
المتغيرات المنطقية تحفظ أحد قيمتين ، true أو false .
مثال :

كود:
int LEDpin = 5; // LED on pin 5
int switchPin = 13; // momentary switch on 13, other side connected to ground
boolean running = false;

void setup()
{
pinMode(LEDpin, OUTPUT);
pinMode(switchPin, INPUT);
digitalWrite(switchPin, HIGH); // turn on pullup resistor
}

void loop()
{
if (digitalRead(switchPin) == LOW)
{ // switch is pressed – pullup keeps pin high normally
delay(100); // delay to debounce switch
running = !running; // toggle running variable
digitalWrite(LEDpin, running) // indicate via LED
}
}


العوامل المنطقية (البولية) Boolean Operators :
هذه العوامل يمكن أن تستخدم داخل شرط عبارة if .
• عامل AND المنطقى && (logical and) :
الشرط يكون صحيح true فقط إذا كان كلا المعاملين operands صحيح true ، على سبيل المثال :

كود:
if (digitalRead(2) == 1 && digitalRead(3) == 1) { // read two switches
// ...
}

مثال :

كود:
 if (a >= 10 && a <= 20){} // true if a is between 10 and 20


• عامل OR المنطقى || (logical or) :
الشرط يكون true إذا كان أى من المعاملين true ، على سبيل المثال العبارة :

كود:
 if (x > 0 || y > 0) {
// ...
}

تكون true إذا كان أى من x أو y أكبر من 0 .

• عامل النفى(المعكوس) المنطقى ! (not) :
الشرط يكون true إذا كان المعامل false ، على سبيل المثال العبارة :

كود:
if (!x) {
// ...
}

تكون true إذا كان x بالقيمة false (أى إذا كانت x بالقيمة 0 ) .
is true if x is false (i.e. if x equals 0).

تحذير :
يجب عدم الخلط بين هذه العوامل المنطقية والعوامل المنطقية المستخدمة مع البتات bitwise (حيث يستخدم العامل bitwise AND operator & و bitwise not ~ ) .


Hussain800
:: مهندس متميز ::
تاريخ التسجيل: Apr 2012
المشاركات: 635
نشاط [ Hussain800 ]
قوة السمعة:
قديم 17-11-2019, 12:21 AM المشاركة 13   
افتراضي


السلام عليكم ورحمة الله وبركاته
بارك الله فيك اخى عبدالعزيز على دروس الاردوينو المبسطة فى الشرح. حقيقا بارك الله فيك على التفصيل الدقيق .
لاادرى ادا كانت هده بداية لدورة اردوينو كاملة او هى دروس فقط.
اتمنى ان تكون دورة كاملة للاردوينو من البداية حتى المستوى العالى لان شرحك بسيط ويسهل المعلومة .
ايضا ادا كانت دروس فقط او دورة اتمنى واتمنى ان يتم شرح مسجل الازاحة 74HC595 وكيف يتم ربطهما على عدد من السفن سيجمنت وكيف تتم برمجتهم مع الاردوينو ..لان كتير من الدورات باللغة العربية يتجاهلون مسجل الازاحة وهو من اهم القطع لانه يوفر لك عدد كبير من البن او المخارج .. اتمنى شرح مفصل لهدا النوع بالدات من المسجلات.
والله الموفق


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


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

شكرا على المشاركة

إن شاء الله يكون لنا لقاء مع مسجل الإزاحة 74HC595

مع تمنياتى بدوام التوفيق


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 21-11-2019, 02:54 PM المشاركة 15   
افتراضي استخدام شاشة الكريستال السائل مع الاردوينو How to use a 16×2 character LCD with Ardui


استخدام شاشة الكريستال السائل مع الاردوينو How to use a 16×2 character LCD with Arduino



يتضمن هذا التدريب كل ما تحتاج لمعرفته حول التحكم في شاشة الأحرف LCD مع Arduino.تعد شاشات العرض هذه رائعة لعرض بيانات المستشعر sensor أو النص text كما أنها رخيصة إلى حد ما.
يغطي الجزء الأول من هذا التدريب أساسيات عرض النص والأرقام. في الجزء الثاني ، سوف نتناول المزيد من التفاصيل حول كيفية عرض الأحرف المخصصة custom characters وكيف يمكنك استخدام الدوال الأخرى في المكتبة LiquidCrystal بالاردوينو .

الأجهزة (الهاردوير) :
تتوفر شاشات LCD هذه بأحجام مختلفة (16 × 2 أى 1602 ، و 20 × 4 أى 2004 ، 16 × 1 ، إلخ) ، ولكنها تستخدم جميعها نفس رقاقة التحكم HD44780 من شركة هيتاشى Hitachi. هذا يعني أنه يمكنك بسهولة مبادلتهم. سوف تحتاج فقط إلى تغيير مواصفات الحجم في كود Arduino الخاص بك.

خصائص الشاشة 16×2 LCD :
• جهد التشغيل : 5V
• المتحكم : Hitachi HD44780 LCD controller
• دقة الشاشة : 2سطر X 16 حرف
• أبعاد الوحدة : 80 x 36 x 12 mm
• أبعاد منطقة الرؤية : 64.5 x 16.4 mm


أطراف الشاشة 16×2 LCD وتوصيلها مع الاردوينو :






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




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


البرمجة :
للتحكم في شاشة LCD ، سوف نستخدم مكتبة LiquidCrystal. تأتي هذه المكتبة مثبتة مسبقًا مع Arduino IDE. يمكنك العثور عليها بالانتقال إلى Sketch> Include Library> LiquidCrystal.
تحتوي مكتبة LiquidCrystal على العديد من الدوال المدمجة ، مما يجعل التحكم في شاشات الأحرف LCD فائق السهولة للغاية.
يوضح لك كود المثال أدناه كيفية عرض رسالة على شاشة LCD. بعد ذلك ، سنتعرف على كيف يعمل الكود وكيف يمكنك استخدام الدوال الأخرى لمكتبة LiquidCrystal.

كود:
/* Basic Arduino example code for displaying text on 16x2, 20x4 etc. character LCDs. */
// Include the library:
#include <LiquidCrystal.h>

// Create an LCD object. Parameters: (RS, E, D4, D5, D6, D7):
LiquidCrystal lcd = LiquidCrystal(2, 3, 4, 5, 6, 7);

void setup() {
  // Specify the LCD's number of columns and rows. Change to (20, 4) for a 20x4 LCD:
  lcd.begin(16, 2);
}

void loop() {
  // Set the cursor on the third column and the first row, counting starts at 0:
  lcd.setCursor(2, 0);

  // Print the string 'Hello World!':
  lcd.print("Hello World!");

  // Set the cursor on the third column and the second row:
  lcd.setCursor(2, 1);

  // Print the string 'LCD tutorial':
  lcd.print("LCD tutorial");
}

يجب أن تشاهد الإخراج التالي على شاشة LCD:





كيف يعمل الكود :
• فى البداية يتم تضمين المكتبة (ملف الرأس) LiquidCrystal.h ، الخطوة التالية هي إنشاء مثيل instance (كائن) جديد للفئة LiquidCrystal بالصيغة LiquidCrystal lcd . يتم ذلك باستخدام الدالة
LiquidCrystal(rs, enable, d4, d5, d6, d7) . كوسائط نستخدم أطراف الاردوينو التي وصلنا بها الشاشة . لاحظ أننا أطلقنا على الشاشة الاسم ‘lcd’ . يمكنك أن تعطيها اسمًا مختلفًا. ستحتاج إلى تغيير ‘lcd’ إلى الاسم الجديد في باقي البرنامج .

كود:
// Include the library:
#include <LiquidCrystal.h>

// Create an LCD object. Parameters: (RS, E, D4, D5, D6, D7):
LiquidCrystal lcd = LiquidCrystal(2, 3, 4, 5, 6, 7);

• في الدالة setup() يتم بدء تهيئة شاشة LCD بالدالة begin(cols,rows) . عند استخدام شاشة 20×4 LCD ، غيّر هذا السطر إلى lcd.begin(20,4); .

كود:
void setup() {
  // Specify the LCD's number of columns and rows. Change to (20, 4) for a 20x4 LCD:
  lcd.begin(16, 2);
}

• في الدالة loop() ، يتم ضبط المؤشر cursor على العمود الثالث والصف الأول من شاشة LCD باستخدام الدالة lcd.setCursor(2,0) . لاحظ أن العد يبدأ من 0 ، ويقوم الوسيط الأولى بتحديد العمود. إذا لم تحدد موضع المؤشر ، فسيتم طباعة النص في الموضع الافتراضي الابتدائى home وهو (0،0) إذا كانت الشاشة فارغة أو بعد (وراء) آخر حرف مطبوع.
• بعد ذلك ، تتم طباعة السلسلة النصية string ‘Hello World!’ باستخدام الدالة lcd.print("Hello World!") . لاحظ أنك تحتاج إلى وضع علامات اقتباس ("") حول النص. عندما تريد طباعة أرقام أو متغيرات ، لا ضرورة لعلامات الاقتباس .

كود:
void loop() {
  // Set the cursor on the third column and the first row, counting starts at 0:
  lcd.setCursor(2, 0);

  // Print the string 'Hello World!':
  lcd.print("Hello World!");

  // Set the cursor on the third column and the second row:
  lcd.setCursor(2, 1);

  // Print the string 'LCD tutorial':
  lcd.print("LCD tutorial");
}



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