تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects
منتديات الهندسة الكهربية والإلكترونية والميكاترونكس والكومبيوتر :: البرمجة بلغة ++C مع ++Microsoft Visual C :: منتدى الاردوينو Arduino
صفحة 2 من اصل 4
صفحة 2 من اصل 4 • 1, 2, 3, 4
رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects
جعل المحول ADC للاردوينو أكثر دقة لقراءة الجهد الصغير
أحيانا عندما ننجز مشروعًا ، يجب أن نستخدم مستشعرًا به جهد خرج صغير. الجهد الصغير يجعل الاردوينو أقل دقة لقراءة الإشارة. نحن نعلم أن الاردوينو UNO لديه "قدرة على تمييز" resolution التحويل ADC بقيمة 10 بت. هذا يعني أن اردوينو يمكنه قراءة الجهد 0-5V بعدد 0-1023 أى 1024 خطوة . لذلك ، 5000mv/1024 = 4,88Mv . لذا ، لا يمكن للاردوينو قياس تغير فى إشارة ADC إلا إذا زاد الجهد الكهربائي أو انخفض حوالي 5 مللي فولت. فماذا إذا كان خرج المستشعر أصغر من 5v ؟ هناك بعض الحلول لهذا ، أولاً يمكننا استخدام مكبر amplifer للمستشعر ، لذلك سيتضاعف خرج المستشعر ويصبح أكبر. ولدينا الحل الثاني ، وهذا أبسط. لا نحتاج إلى تكبير المستشعر ، ولكن بدلاً من ذلك سنقوم بنقصان (خفض) "مرجع الجهد " voltage reference .الجهد 5V هو مرجع الجهد.
arduino analog input
خفض مرجع الجهد للمحول ADC
الاردوينو UNO أو atmega328 لديه مرجع جهد داخلي بقيمة 1.1V . يمكننا استخدام هذاالجهد عن طريق تعيين مرجع جهد المحول ADC إلى "داخلى" INTERNAL. يمكننا ضبط المرجع التناظرى في الدالة setup .
المرجع الخارجي للمحول ADC
والسؤال التالي ، هل يمكننا استخدام مرجع تناظرى آخر لا يوفره الاردوينو؟ نعم يمكننا أن نفعل ذلك!. طالما كانت قيمة الجهد في المدى 0-5V . أكبر من 5 فولت ممنوع منعا باتا ، لأن جهد تشغيل الاردوينو هو 5 فولت. إذن كيف يمكننا أن نفعل ذلك؟
استخدم الكود أعلاه ، وضع الجهد على الطرف AREF. لا تنس استخدام الارضى المشترك للمرجع التناظرى .
arduino uno AREF pin
مثال
استخدام المستشعر LM35 لقراءة درجة الحرارة. من الداتا شيت ، نعلم أن هذا المستشعر سوف يعطي خرج 10mV لكل درجة مئوية °C . للمرجع التناظرى العادي (5V) ، يمكننا الحصول على دقة قراءة accuracy بنصف درجة مئوية.
بالنسبة للمرجع التناظرى العادى ، سيكون الكود:
النتيجة : كل وحدة تحويل ADC تكون نتيجة (5000/1023 = 4.89 mV) فى دخل الاردوينو أى حوالى نصف درجة مئوية عند دخل الحساس LM35 .
وإذا قمنا بتغيير المرجع التناظرى إلى 1.1V ، فيجب أن يتغير الكود إلى:
هذا سيعطينا نتيجة أكثر دقة لدرجة الحرارة عند القراءة بواسطة LM35. يمكن لاردوينو الآن قراءة تغيير بوحدة واحدة كل حوالى واحد ملى فولت في دخل المحول adc ومن ثم يمكننا الحصول على القدرة على التمييز resolution بحوالي 0.1 درجة مئوية .
أحيانا عندما ننجز مشروعًا ، يجب أن نستخدم مستشعرًا به جهد خرج صغير. الجهد الصغير يجعل الاردوينو أقل دقة لقراءة الإشارة. نحن نعلم أن الاردوينو UNO لديه "قدرة على تمييز" resolution التحويل ADC بقيمة 10 بت. هذا يعني أن اردوينو يمكنه قراءة الجهد 0-5V بعدد 0-1023 أى 1024 خطوة . لذلك ، 5000mv/1024 = 4,88Mv . لذا ، لا يمكن للاردوينو قياس تغير فى إشارة ADC إلا إذا زاد الجهد الكهربائي أو انخفض حوالي 5 مللي فولت. فماذا إذا كان خرج المستشعر أصغر من 5v ؟ هناك بعض الحلول لهذا ، أولاً يمكننا استخدام مكبر amplifer للمستشعر ، لذلك سيتضاعف خرج المستشعر ويصبح أكبر. ولدينا الحل الثاني ، وهذا أبسط. لا نحتاج إلى تكبير المستشعر ، ولكن بدلاً من ذلك سنقوم بنقصان (خفض) "مرجع الجهد " voltage reference .الجهد 5V هو مرجع الجهد.
arduino analog input
خفض مرجع الجهد للمحول ADC
الاردوينو UNO أو atmega328 لديه مرجع جهد داخلي بقيمة 1.1V . يمكننا استخدام هذاالجهد عن طريق تعيين مرجع جهد المحول ADC إلى "داخلى" INTERNAL. يمكننا ضبط المرجع التناظرى في الدالة setup .
- الكود:
void setup()
{
analogReference(INTERNAL);
}
المرجع الخارجي للمحول ADC
والسؤال التالي ، هل يمكننا استخدام مرجع تناظرى آخر لا يوفره الاردوينو؟ نعم يمكننا أن نفعل ذلك!. طالما كانت قيمة الجهد في المدى 0-5V . أكبر من 5 فولت ممنوع منعا باتا ، لأن جهد تشغيل الاردوينو هو 5 فولت. إذن كيف يمكننا أن نفعل ذلك؟
- الكود:
void setup()
{
analogReference(EXTERNAL);
}
استخدم الكود أعلاه ، وضع الجهد على الطرف AREF. لا تنس استخدام الارضى المشترك للمرجع التناظرى .
arduino uno AREF pin
مثال
استخدام المستشعر LM35 لقراءة درجة الحرارة. من الداتا شيت ، نعلم أن هذا المستشعر سوف يعطي خرج 10mV لكل درجة مئوية °C . للمرجع التناظرى العادي (5V) ، يمكننا الحصول على دقة قراءة accuracy بنصف درجة مئوية.
بالنسبة للمرجع التناظرى العادى ، سيكون الكود:
- الكود:
Temperature = (adc*5000/1023)/10;
النتيجة : كل وحدة تحويل ADC تكون نتيجة (5000/1023 = 4.89 mV) فى دخل الاردوينو أى حوالى نصف درجة مئوية عند دخل الحساس LM35 .
وإذا قمنا بتغيير المرجع التناظرى إلى 1.1V ، فيجب أن يتغير الكود إلى:
- الكود:
Temperature = (adc*1100/1023)/10;
هذا سيعطينا نتيجة أكثر دقة لدرجة الحرارة عند القراءة بواسطة LM35. يمكن لاردوينو الآن قراءة تغيير بوحدة واحدة كل حوالى واحد ملى فولت في دخل المحول adc ومن ثم يمكننا الحصول على القدرة على التمييز resolution بحوالي 0.1 درجة مئوية .
رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects
ربط الثرمستور Thermistor مع الاردوينو لقياس وعرض درجة الحرارة على شاشة LCD
استخدام الثرمستور هو وسيلة سهلة ورخيصة لاستشعار درجة الحرارة. ولقياس درجة الحرارة بدقة باستخدام الثرمستور ، ستكون هناك حاجة إلى متحكم دقيق (ميكروكونترولر) . لذلك نحن هنا نستخدم Arduino مع Thermistor لقراءة درجة الحرارة وشاشة LCD لعرض درجة الحرارة. إنه مفيد في العديد من المشروعات مثل محطة الطقس عن بعد والأتمتة المنزلية وحماية المعدات الصناعية والإلكترونية والتحكم فيها.
في هذا التدريب ، سنقوم بربط Thermistor مع Arduino وعرض درجة الحرارة على شاشة الكريستال السائل.
الدائرة الكهربية :
يوفر الثرمستور قيمة درجة الحرارة حسب التغير في المقاومة الكهربائية له . في هذه الدائرة ، يتم توصيل طرف تناظرى في Arduino مع الثرمستور ويمكن أن يوفر قيم التحويل ADC فقط ، لذلك لا يتم حساب المقاومة الكهربائية للثرمستور مباشرة. لذا فإن الدائرة مصممة لتكون مثل دائرة مقسم الجهد كما هو مبين في الشكل أعلاه ، من خلال ربط مقاومة معلومة بقيمة 10 كيلو أوم على التوالى مع ثرمستور بمعامل درجة حرارة سالب (تقل المقاومة بارتفاع درجة الحرارة) NTC. باستخدام مقسم الجهد هذا ، يمكننا الحصول على الجهد عبر الثرمستور وبهذا الجهد يمكننا استخلاص مقاومة الثرمستور في تلك اللحظة. وأخيراً يمكننا الحصول على قيمة درجة الحرارة من خلال وضع مقاومة الثرمستور في معادلة شتاين هارت Stein-Hart كما هو موضح أدناه.
الثرمستور Thermistor :
المكون الرئيسي في هذه الدائرة هو الثرمستور ، والذي يتم استخدامه للكشف عن ارتفاع درجة الحرارة. الثرمستور هو مقاومة حساسة لدرجة الحرارة ، تتغير مقاومته وفقًا لدرجة الحرارة. هناك نوعان من الثرمستور NTC (معامل درجة حرارة سالب) و PTC (معامل درجة حرارة موجب ) ، نحن نستخدم الثرمستور نوع NTC. الثرمستور NTC هو مقاومة تنخفض مقاومتها مع ارتفاع درجة الحرارة بينما PTC فهو مقاومة تزيد مقاومتها مع ارتفاع في درجة الحرارة.
حساب درجة الحرارة باستخدام الثرمستور :
نحن نعلم أنه من دائرة مقسم الجهد :
لذلك تكون قيمة Rt :
حيث Rt هى مقاومة الثرمستور وR هى المقاومة المعلومة 10k .
تستخدم هذه المعادلة لحساب مقاومة الثرمستور من نتيجة قيمة التحويل ADC (ولتكن Vo) . جهد خرج مقسم الجهد هو جهد الدخل التناظرى للاردوينو ومن ثم يكون :
ويكون :
حساب درجة الحرارة من مقاومة الثرمستور :
رياضيا لا يمكن حساب مقاومة الثرمستور إلا بمساعدة معادلة شتاين هارت التى تعطى درجات الحرارة T بوحدات الكلفن Kelvin .
حيث ، A ، B و C ثوابت ، Rt هي مقاومة الثرمستور و ln تمثل اللوغاريتم log .القيم الثابتة للثرمستور المستخدم في المشروع هي A = 1.009249522 × 10−3 ، B = 2.378405444 × 10−4 ، C = 2.019202697 × 10−7.
البرنامج :
لتنفيذ عملية حسابية ، نستخدم (نضم) ملف الرأس “#include <math.h>” وبالطبع ملف الرأس لوحدة LCD وهو “#include <LiquidCrystal.h>" .
استخدام الثرمستور هو وسيلة سهلة ورخيصة لاستشعار درجة الحرارة. ولقياس درجة الحرارة بدقة باستخدام الثرمستور ، ستكون هناك حاجة إلى متحكم دقيق (ميكروكونترولر) . لذلك نحن هنا نستخدم Arduino مع Thermistor لقراءة درجة الحرارة وشاشة LCD لعرض درجة الحرارة. إنه مفيد في العديد من المشروعات مثل محطة الطقس عن بعد والأتمتة المنزلية وحماية المعدات الصناعية والإلكترونية والتحكم فيها.
في هذا التدريب ، سنقوم بربط Thermistor مع Arduino وعرض درجة الحرارة على شاشة الكريستال السائل.
الدائرة الكهربية :
يوفر الثرمستور قيمة درجة الحرارة حسب التغير في المقاومة الكهربائية له . في هذه الدائرة ، يتم توصيل طرف تناظرى في Arduino مع الثرمستور ويمكن أن يوفر قيم التحويل ADC فقط ، لذلك لا يتم حساب المقاومة الكهربائية للثرمستور مباشرة. لذا فإن الدائرة مصممة لتكون مثل دائرة مقسم الجهد كما هو مبين في الشكل أعلاه ، من خلال ربط مقاومة معلومة بقيمة 10 كيلو أوم على التوالى مع ثرمستور بمعامل درجة حرارة سالب (تقل المقاومة بارتفاع درجة الحرارة) NTC. باستخدام مقسم الجهد هذا ، يمكننا الحصول على الجهد عبر الثرمستور وبهذا الجهد يمكننا استخلاص مقاومة الثرمستور في تلك اللحظة. وأخيراً يمكننا الحصول على قيمة درجة الحرارة من خلال وضع مقاومة الثرمستور في معادلة شتاين هارت Stein-Hart كما هو موضح أدناه.
الثرمستور Thermistor :
المكون الرئيسي في هذه الدائرة هو الثرمستور ، والذي يتم استخدامه للكشف عن ارتفاع درجة الحرارة. الثرمستور هو مقاومة حساسة لدرجة الحرارة ، تتغير مقاومته وفقًا لدرجة الحرارة. هناك نوعان من الثرمستور NTC (معامل درجة حرارة سالب) و PTC (معامل درجة حرارة موجب ) ، نحن نستخدم الثرمستور نوع NTC. الثرمستور NTC هو مقاومة تنخفض مقاومتها مع ارتفاع درجة الحرارة بينما PTC فهو مقاومة تزيد مقاومتها مع ارتفاع في درجة الحرارة.
حساب درجة الحرارة باستخدام الثرمستور :
نحن نعلم أنه من دائرة مقسم الجهد :
- الكود:
Vout=Vin* R/(R+Rt)
Vin/Vout =(R+Rt)/R=1+(Rt/R)
(Vin/Vout)-1 = Rt/R
لذلك تكون قيمة Rt :
- الكود:
Rt = R((Vin/Vout)-1)
حيث Rt هى مقاومة الثرمستور وR هى المقاومة المعلومة 10k .
تستخدم هذه المعادلة لحساب مقاومة الثرمستور من نتيجة قيمة التحويل ADC (ولتكن Vo) . جهد خرج مقسم الجهد هو جهد الدخل التناظرى للاردوينو ومن ثم يكون :
- الكود:
Vout = ADC Reading * (5/1024) = Vo * (5/1024)
ويكون :
- الكود:
Vin/Vout = 5/( Vo * (5/1024) = 1024/ Vo
- الكود:
Rt = R((Vin/Vout)-1)= R((1024/Vo)-1)
حساب درجة الحرارة من مقاومة الثرمستور :
رياضيا لا يمكن حساب مقاومة الثرمستور إلا بمساعدة معادلة شتاين هارت التى تعطى درجات الحرارة T بوحدات الكلفن Kelvin .
- الكود:
T = 1 / (A + Bln(Rt) + Cln (Rt)^3 )
حيث ، A ، B و C ثوابت ، Rt هي مقاومة الثرمستور و ln تمثل اللوغاريتم log .القيم الثابتة للثرمستور المستخدم في المشروع هي A = 1.009249522 × 10−3 ، B = 2.378405444 × 10−4 ، C = 2.019202697 × 10−7.
البرنامج :
لتنفيذ عملية حسابية ، نستخدم (نضم) ملف الرأس “#include <math.h>” وبالطبع ملف الرأس لوحدة LCD وهو “#include <LiquidCrystal.h>" .
- الكود:
#include <math.h>
#include "LiquidCrystal.h"
LiquidCrystal lcd(12,11,5,4,3,2);
float A = 1.009249522e-03, B = 2.378405444e-04, C = 2.019202697e-07;
float T,logRt,Tf,Tc;
int Vo;
void setup(){
lcd.begin(16,2);
lcd.clear();
}
void loop()
{
lcd.setCursor(0,0);
lcd.print("Temp:");
Vo=analogRead(A0);
logRt = log(10000.0*((1024.0/Vo-1)));
T = (1.0 / (A + B*logRt + C*logRt*logRt*logRt)); // We get the temperature value in Kelvin from this Stein-Hart equation
Tc = T - 273.15; // Convert Kelvin to Celcius
Tf = (Tc * 1.8) + 32.0; // Convert Kelvin to Fahrenheit
lcd.print((T));
lcd.print("k ");
lcd.setCursor(0,1);
lcd.print((Tc));
lcd.print(" C ;");
lcd.setCursor(9,1);
lcd.print((Tf));
lcd.print(" F");
delay(800);
}
رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects
تطبيق : التحكم فى الأجهزة المنزلية بناء على درجة الحرارة باستخدام اردوينو والثرمستور
لنفترض أنك تجلس في غرفة وتشعر بالبرد وتريد تشغيل السخان (الدفاية) heater تلقائيًا ، ثم إيقاف تشغيله بعد مرور بعض الوقت عندما ترتفع درجة حرارة الغرفة ، يساعدك هذا المشروع على التحكم في أجهزتك المنزلية تلقائيًا وفقًا لدرجة الحرارة. هنا استخدمنا الثرمستور لقراءة درجة الحرارة.
في هذا التدريب ، سنقوم بتوصيل جهاز منزلى مع ريلاى ونقوم بعمل نظام أتمتة منزلي للتحكم في درجة الحرارة باستخدام Arduino. كما يتم عرض درجة الحرارة وحالة الجهاز على شاشة LCD 16 * 2 المتصلة بالدائرة.
الدائرة الكهربية :
البرنامج :
لنفترض أنك تجلس في غرفة وتشعر بالبرد وتريد تشغيل السخان (الدفاية) heater تلقائيًا ، ثم إيقاف تشغيله بعد مرور بعض الوقت عندما ترتفع درجة حرارة الغرفة ، يساعدك هذا المشروع على التحكم في أجهزتك المنزلية تلقائيًا وفقًا لدرجة الحرارة. هنا استخدمنا الثرمستور لقراءة درجة الحرارة.
في هذا التدريب ، سنقوم بتوصيل جهاز منزلى مع ريلاى ونقوم بعمل نظام أتمتة منزلي للتحكم في درجة الحرارة باستخدام Arduino. كما يتم عرض درجة الحرارة وحالة الجهاز على شاشة LCD 16 * 2 المتصلة بالدائرة.
الدائرة الكهربية :
البرنامج :
- الكود:
#include <math.h>
#include "LiquidCrystal.h"
#define RELAY 8
LiquidCrystal lcd(12,11,5,4,3,2);
float A = 1.009249522e-03, B = 2.378405444e-04, C = 2.019202697e-07;
float T,logRt,Tc;
int Vo;
void setup() {
lcd.begin(16,2);
lcd.clear();
pinMode(RELAY, OUTPUT);
}
void loop() {
lcd.setCursor(0,0);
lcd.print("Temperature:");
Vo=analogRead(A0);
logRt = log(10000.0*((1024.0/Vo-1)));
T = (1.0 / (A + B*logRt + C*logRt*logRt*logRt)); // We get the temperature value in Kelvin from this Stein-Hart equation
Tc = T - 273.15; // Convert Kelvin to Celcius
lcd.print(int(Tc));
lcd.print("C ");
delay(500); // wait 0.5 seconds before sampling temperature again
if (Tc < 28)
{
digitalWrite(RELAY, HIGH);
lcd.setCursor(0,1);
lcd.print("Heater status:ON ");
delay(500);
}
else if (Tc > 28)
{
digitalWrite(RELAY, LOW);
lcd.setCursor(0,1);
lcd.print("Heater status:OFF");
delay(500);
}
}
ماهية تعديل عرض النبضة What is PWM: Pulse Width Modulation
ماهية تعديل عرض النبضة What is PWM: Pulse Width Modulation
العواكس(الإنفرتر) Inverters ، والمحولات (كونفرتر) Converters ، ودوائر مصادر القدرة بنظام التقطيع SMPS ، والمتحكمات في السرعة Speed controllers ، وغيرها .... شيء واحد مشترك في كل هذه الدوائر هو أنها تتكون من العديد من المفاتيح الإلكترونية بداخلها. هذه المفاتيح ليست إلا أجهزة قدرة إلكترونية مثل MOSFET و IGBT و TRIAC إلخ. من أجل التحكم في مفاتيح القدرة الإلكترونية هذه ، نستخدم عادةً ما يسمى إشارات PWM (تعديل عرض النبضة). بصرف النظر عن هذا ، تُستخدم إشارات PWM أيضًا في قيادة محركات السرفو وأيضًا للقيام بمهام بسيطة أخرى مثل التحكم في سطوع ليد LED.
في دروسنا السابقة تعرفنا على المحول من تناظرى لرقمى ADC ، ففي حين يستخدم ADC لقراءة الإشارات التناظرية عن طريق جهاز رقمي مثل الميكروكونترولر ، يمكن اعتبار تعديل عرض النبضة PWM على عكس ذلك تمامًا ، حيث يتم استخدام PWM لإنتاج إشارات تناظرية من جهاز رقمي مثل الميكروكونترولر . في هذا الدرس سوف نتعرف على ما هية تعديل عرض النبضة وعن إشارات PWM وبعض البارامترات المرتبطة بها ، حتى نكون واثقين في استخدامها في تصميماتنا.
ما هو تعديل عرض النبضة ؟ What is PWM (Pulse Width Modulation)?
كلمة PWM تعنى "تعديل عرض النبضة" Pulse Width Modulation ؛ سوف نعرف سبب هذه التسمية لاحقًا. لكن ، الآن لنفهم PWM كنوع من الإشارات التي يمكن أن تنتج من الدوائر المتكاملة الرقمية مثل الميكروكونترولر أو المؤقت 555 . الإشارة الناتجة مكونة من قطار من النبضات وهذه النبضات ستكون في شكل موجة مربعة. وهذا يعنى ، أنه في أي لحظة معينة من الوقت الموجة ستكون إما مرتفعة HIGH أو ستكون منخفضة LOW . لسهولة الفهم ، دعونا نعتبر إشارة 5V PWM ، في هذه الحالة ستكون إشارة PWM إما 5V (high) أو عند مستوى الأرض 0V (low) . تسمى المدة duration التي تظل فيها الإشارات مرتفعة "زمن التشغيل" “on time” وتسمى المدة التي تظل فيها الإشارة منخفضة بأنها "زمن الإيقاف " “off time” .
بالنسبة لإشارة PWM ، نحتاج إلى إلقاء نظرة على بارامترين مهمين مرتبطين بها ، الأول هو " دورة عمل PWM " PWM duty cycle والآخر هو " تردد PWM " PWM frequency .
دورة تشغيل (عمل - خدمة) تعديل عرض النبضة Duty cycle of the PWM
كما ذكرنا سابقًا ، تظل إشارة PWM قيد التشغيل ON لفترة زمنية معينة ، ثم تبقى قيد الإيقاف OFF لبقية الدورة أو الفترة (الزمن الدورى) period . وهو ما يجعل إشارة PWM هذه خاصة والأكثر فائدة هو أنه يمكننا تعيين (ضبط) المدة التي يجب أن تبقى عليها ON من خلال التحكم في دورة العمل لإشارة PWM.
تسمى النسبة المئوية للوقت الذي تبقى فيه إشارة PWM مرتفعة (زمن التشغيل ) HIGH (on time) بدورة العمل duty cycle . إذا كانت الإشارة في وضع التشغيل ON دائمًا ، فهي بدورة عمل بنسبة 100% وإذا كانت في وضع إيقاف التشغيل OFF دائمًا ، فهى بدورة عمل بنسبة 0% . صيغة حساب دورة العمل duty cycle موضحة أدناه.
الشكل التالى يمثل إشارة PWM بدورة عمل 50% . كما ترى ، الزمن الكلى للفترة period هو زمن التشغيل وزمن الإيقاف (on time + off time) ، وأن إشارة PWM تظل فى حالة عمل ON لمدة 50% فقط من الفترة الزمنية period .
من خلال التحكم في دورة التشغيل Duty cycle من 0% إلى 100% ، يمكننا التحكم في "زمن التشغيل " “on time” لإشارة PWM وبالتالي عرض الإشارة.زمن التشغيل on time يسمى "عرض النبضة" pulse width ، ونظرًا لأنه يمكننا تغيير أو تعديل modulate عرض النبضة ، من هنا جاء الاسم المميز "تعديل عرض النبضة" “Pulse width Modulation” .
تردد PWM Frequency of a PWM :
يحدد تردد إشارة PWM مدى سرعة إكمال PWM لفترة واحدة. الفترة الواحدة هي زمن التشغيل ON وزمن الإيقاف OFF بالكامل لإشارة PWM كما هو موضح في الشكل أعلاه. صيغة حساب التردد أدناه :
عادة ما تكون إشارات PWM الناتجة عن متحكم دقيق حوالي 500 هرتز ، وسيتم استخدام هذه الترددات العالية في أجهزة التبديل عالية السرعة مثل inverters أو converters . ولكن ليست كل التطبيقات تتطلب تردد عالي. على سبيل المثال ، للتحكم في محرك سيرفو ، نحتاج إلى إنتاج إشارات PWM بتردد 50 هرتز ، لذلك يمكن أيضًا التحكم في تردد إشارة PWM عن طريق البرنامج لجميع الميكروكنترولر.
بعض الأسئلة الشائعة حول PWM
ما هو الفرق بين دورة العمل Duty cycle وتردد Frequency إشارة PWM؟
غالبًا ما يتم الخلط بين دورة العمل وتردد إشارات PWM. كما نعلم ، فإن إشارة PWM هي عبارة عن موجة مربعة بزمن تشغيل ON وزمن توقف OFF محددين . يسمى مجموع هذان الزمنين بزمن الفترة الواحدة T (الزمن الدورى) time period . يسمى "معكوس زمن الفترة الواحدة (الزمن الدورى) بالتردد frequency . في حين أن مقدار الزمن الذي يجب أن تبقى فيه إشارة PWM فى حالة تشغيل ON في فترة زمنية واحدة بدورة العمل في PWM.
لتبسيط الأمر ، يتم تحديد مدى سرعة تشغيل إشارة PWM وإيقافها وفقًا لتردد إشارة PWM ، وفى هذه السرعة يتم تحديد مدة تشغيل إشارة PWM قيد التشغيل ON بواسطة دورة العمل لإشارة PWM.
كيفية تحويل إشارات PWM إلى جهد تناظرى ؟
بالنسبة للتطبيقات البسيطة مثل التحكم في سرعة محرك التيار المستمر أو ضبط سطوع ليد LED ، نحتاج إلى تحويل إشارات PWM إلى جهد تناظري. يمكن القيام بذلك بسهولة باستخدام مرشح RC ويستخدم بشكل شائع عندما تكون ميزة التحويل من رقمى إلى تناظرى DAC مطلوبة كما هو مبين فى الدائرة أدناه
في الرسم البياني الموضح أعلاه ، الإشارة الملونة الصفراء هي إشارة PWM وإشارة اللون الأزرق هي الجهد التناظرى الناتج . يمكن حساب قيمة المقاوم R1 والمكثف C1 بناءً على تردد إشارة PWM ولكن عادةً ما يتم استخدام المقاومة 5.7K أو 10K ويتم استخدام مكثف 0.1u أو 1u .
كيفية حساب الجهد الناتج من إشارة PWM؟
سيكون الجهد الناتج لإشارة PWM بعد تحويلها إلى تناظرى كالنسبة المئوية لدورة التشغيل. على سبيل المثال ، إذا كان جهد التشغيل 5V ، فستتوفر إشارة PWM أيضًا بالجهد 5V عندما تكون مرتفعة. في مثل هذه الحالة لدورة عمل 100% ، فإن الجهد الناتج سيكون 5V ولدورة عمل 50% سيكون 2.5V .
العواكس(الإنفرتر) Inverters ، والمحولات (كونفرتر) Converters ، ودوائر مصادر القدرة بنظام التقطيع SMPS ، والمتحكمات في السرعة Speed controllers ، وغيرها .... شيء واحد مشترك في كل هذه الدوائر هو أنها تتكون من العديد من المفاتيح الإلكترونية بداخلها. هذه المفاتيح ليست إلا أجهزة قدرة إلكترونية مثل MOSFET و IGBT و TRIAC إلخ. من أجل التحكم في مفاتيح القدرة الإلكترونية هذه ، نستخدم عادةً ما يسمى إشارات PWM (تعديل عرض النبضة). بصرف النظر عن هذا ، تُستخدم إشارات PWM أيضًا في قيادة محركات السرفو وأيضًا للقيام بمهام بسيطة أخرى مثل التحكم في سطوع ليد LED.
في دروسنا السابقة تعرفنا على المحول من تناظرى لرقمى ADC ، ففي حين يستخدم ADC لقراءة الإشارات التناظرية عن طريق جهاز رقمي مثل الميكروكونترولر ، يمكن اعتبار تعديل عرض النبضة PWM على عكس ذلك تمامًا ، حيث يتم استخدام PWM لإنتاج إشارات تناظرية من جهاز رقمي مثل الميكروكونترولر . في هذا الدرس سوف نتعرف على ما هية تعديل عرض النبضة وعن إشارات PWM وبعض البارامترات المرتبطة بها ، حتى نكون واثقين في استخدامها في تصميماتنا.
ما هو تعديل عرض النبضة ؟ What is PWM (Pulse Width Modulation)?
كلمة PWM تعنى "تعديل عرض النبضة" Pulse Width Modulation ؛ سوف نعرف سبب هذه التسمية لاحقًا. لكن ، الآن لنفهم PWM كنوع من الإشارات التي يمكن أن تنتج من الدوائر المتكاملة الرقمية مثل الميكروكونترولر أو المؤقت 555 . الإشارة الناتجة مكونة من قطار من النبضات وهذه النبضات ستكون في شكل موجة مربعة. وهذا يعنى ، أنه في أي لحظة معينة من الوقت الموجة ستكون إما مرتفعة HIGH أو ستكون منخفضة LOW . لسهولة الفهم ، دعونا نعتبر إشارة 5V PWM ، في هذه الحالة ستكون إشارة PWM إما 5V (high) أو عند مستوى الأرض 0V (low) . تسمى المدة duration التي تظل فيها الإشارات مرتفعة "زمن التشغيل" “on time” وتسمى المدة التي تظل فيها الإشارة منخفضة بأنها "زمن الإيقاف " “off time” .
بالنسبة لإشارة PWM ، نحتاج إلى إلقاء نظرة على بارامترين مهمين مرتبطين بها ، الأول هو " دورة عمل PWM " PWM duty cycle والآخر هو " تردد PWM " PWM frequency .
دورة تشغيل (عمل - خدمة) تعديل عرض النبضة Duty cycle of the PWM
كما ذكرنا سابقًا ، تظل إشارة PWM قيد التشغيل ON لفترة زمنية معينة ، ثم تبقى قيد الإيقاف OFF لبقية الدورة أو الفترة (الزمن الدورى) period . وهو ما يجعل إشارة PWM هذه خاصة والأكثر فائدة هو أنه يمكننا تعيين (ضبط) المدة التي يجب أن تبقى عليها ON من خلال التحكم في دورة العمل لإشارة PWM.
تسمى النسبة المئوية للوقت الذي تبقى فيه إشارة PWM مرتفعة (زمن التشغيل ) HIGH (on time) بدورة العمل duty cycle . إذا كانت الإشارة في وضع التشغيل ON دائمًا ، فهي بدورة عمل بنسبة 100% وإذا كانت في وضع إيقاف التشغيل OFF دائمًا ، فهى بدورة عمل بنسبة 0% . صيغة حساب دورة العمل duty cycle موضحة أدناه.
- الكود:
Duty Cycle =Turn ON time/ (Turn ON time + Turn OFF time)
الشكل التالى يمثل إشارة PWM بدورة عمل 50% . كما ترى ، الزمن الكلى للفترة period هو زمن التشغيل وزمن الإيقاف (on time + off time) ، وأن إشارة PWM تظل فى حالة عمل ON لمدة 50% فقط من الفترة الزمنية period .
من خلال التحكم في دورة التشغيل Duty cycle من 0% إلى 100% ، يمكننا التحكم في "زمن التشغيل " “on time” لإشارة PWM وبالتالي عرض الإشارة.زمن التشغيل on time يسمى "عرض النبضة" pulse width ، ونظرًا لأنه يمكننا تغيير أو تعديل modulate عرض النبضة ، من هنا جاء الاسم المميز "تعديل عرض النبضة" “Pulse width Modulation” .
تردد PWM Frequency of a PWM :
يحدد تردد إشارة PWM مدى سرعة إكمال PWM لفترة واحدة. الفترة الواحدة هي زمن التشغيل ON وزمن الإيقاف OFF بالكامل لإشارة PWM كما هو موضح في الشكل أعلاه. صيغة حساب التردد أدناه :
- الكود:
Frequency = 1/Time Period
Time Period = On time + Off time
عادة ما تكون إشارات PWM الناتجة عن متحكم دقيق حوالي 500 هرتز ، وسيتم استخدام هذه الترددات العالية في أجهزة التبديل عالية السرعة مثل inverters أو converters . ولكن ليست كل التطبيقات تتطلب تردد عالي. على سبيل المثال ، للتحكم في محرك سيرفو ، نحتاج إلى إنتاج إشارات PWM بتردد 50 هرتز ، لذلك يمكن أيضًا التحكم في تردد إشارة PWM عن طريق البرنامج لجميع الميكروكنترولر.
بعض الأسئلة الشائعة حول PWM
ما هو الفرق بين دورة العمل Duty cycle وتردد Frequency إشارة PWM؟
غالبًا ما يتم الخلط بين دورة العمل وتردد إشارات PWM. كما نعلم ، فإن إشارة PWM هي عبارة عن موجة مربعة بزمن تشغيل ON وزمن توقف OFF محددين . يسمى مجموع هذان الزمنين بزمن الفترة الواحدة T (الزمن الدورى) time period . يسمى "معكوس زمن الفترة الواحدة (الزمن الدورى) بالتردد frequency . في حين أن مقدار الزمن الذي يجب أن تبقى فيه إشارة PWM فى حالة تشغيل ON في فترة زمنية واحدة بدورة العمل في PWM.
لتبسيط الأمر ، يتم تحديد مدى سرعة تشغيل إشارة PWM وإيقافها وفقًا لتردد إشارة PWM ، وفى هذه السرعة يتم تحديد مدة تشغيل إشارة PWM قيد التشغيل ON بواسطة دورة العمل لإشارة PWM.
كيفية تحويل إشارات PWM إلى جهد تناظرى ؟
بالنسبة للتطبيقات البسيطة مثل التحكم في سرعة محرك التيار المستمر أو ضبط سطوع ليد LED ، نحتاج إلى تحويل إشارات PWM إلى جهد تناظري. يمكن القيام بذلك بسهولة باستخدام مرشح RC ويستخدم بشكل شائع عندما تكون ميزة التحويل من رقمى إلى تناظرى DAC مطلوبة كما هو مبين فى الدائرة أدناه
في الرسم البياني الموضح أعلاه ، الإشارة الملونة الصفراء هي إشارة PWM وإشارة اللون الأزرق هي الجهد التناظرى الناتج . يمكن حساب قيمة المقاوم R1 والمكثف C1 بناءً على تردد إشارة PWM ولكن عادةً ما يتم استخدام المقاومة 5.7K أو 10K ويتم استخدام مكثف 0.1u أو 1u .
كيفية حساب الجهد الناتج من إشارة PWM؟
سيكون الجهد الناتج لإشارة PWM بعد تحويلها إلى تناظرى كالنسبة المئوية لدورة التشغيل. على سبيل المثال ، إذا كان جهد التشغيل 5V ، فستتوفر إشارة PWM أيضًا بالجهد 5V عندما تكون مرتفعة. في مثل هذه الحالة لدورة عمل 100% ، فإن الجهد الناتج سيكون 5V ولدورة عمل 50% سيكون 2.5V .
- الكود:
Output Voltage = Duty cycle (%) * 5
رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects
الاردوينو وتعديل عرض النبضة Arduino and PWM
تحتوي بيئة التطوير المتكاملة Arduino IDE ضمنيا على الدالة “analogWrite()” يمكن استخدامها لتوليد إشارة PWM. سيكون تردد هذه الإشارة المولدة لمعظم الأطراف حوالي 490 هرتز ويمكننا إعطاء القيمة من 0-255 باستخدام هذه الدالة حيث :
تعني إشارة بدورة تشغيل 0% .
تعني إشارة بدورة تشغيل 50% .
تعني إشارة بدورة تشغيل 100% .
في Arduino Uno ، تكون أطراف PWM هي 3 و 5 و 6 و 9 و 10 و 11. ويكون تردد إشارة PWM على الأطراف 5 و 6 حوالي 980 هرتز وعلى الأطراف الأخرى سيكون 490 هرتز. أطراف PWM هي التي تحمل علامة ~.
الدالة analogWrite() :
الوصف :
تقوم بتوليد (تكتب - تنتج) قيمة تناظرية (موجة PWM) على طرف pin . يمكن استخدامها لإضاءة ليد LED بدرجات سطوع مختلفة أو قيادة محرك بسرعات مختلفة. بعد إستدعاء الدالة analogWrite() ، سيولد الطرف إشارة مستطيلة ثابتة بدورة العمل المحددة حتى الدعوة التالية للدالة analogWrite().
فى الاردوينو أونو أطراف PWM هى 3, 5, 6, 9, 10, 11 وتردد PWM هو 490 Hz ( التردد للأطراف 5,6 يكون 980 Hz ) .
لا تحتاج إلى إستدعاء الدالة pinMode() لتعيين الطرف كمخرج قبل استدعاء الدالة analogWrite() . لا علاقة للدالة analogWrite() بالأطراف التناظرية أو بالدالة analogRead .
الصيغة :
البارامترات :
البارامتر pin : طرف الاردوينو المطلوب الكتابة إليه . نوع البيانات المسموح بها int .
البارامتر value : دورة العمل duty cycle : بين 0 (always off) و255 (always on) . نوع البيانات المسموح بها int .
العائد :
لاشىء .
تحتوي بيئة التطوير المتكاملة Arduino IDE ضمنيا على الدالة “analogWrite()” يمكن استخدامها لتوليد إشارة PWM. سيكون تردد هذه الإشارة المولدة لمعظم الأطراف حوالي 490 هرتز ويمكننا إعطاء القيمة من 0-255 باستخدام هذه الدالة حيث :
- الكود:
analogWrite(0)
- الكود:
analogWrite(127)
- الكود:
analogWrite(255)
في Arduino Uno ، تكون أطراف PWM هي 3 و 5 و 6 و 9 و 10 و 11. ويكون تردد إشارة PWM على الأطراف 5 و 6 حوالي 980 هرتز وعلى الأطراف الأخرى سيكون 490 هرتز. أطراف PWM هي التي تحمل علامة ~.
الدالة analogWrite() :
الوصف :
تقوم بتوليد (تكتب - تنتج) قيمة تناظرية (موجة PWM) على طرف pin . يمكن استخدامها لإضاءة ليد LED بدرجات سطوع مختلفة أو قيادة محرك بسرعات مختلفة. بعد إستدعاء الدالة analogWrite() ، سيولد الطرف إشارة مستطيلة ثابتة بدورة العمل المحددة حتى الدعوة التالية للدالة analogWrite().
فى الاردوينو أونو أطراف PWM هى 3, 5, 6, 9, 10, 11 وتردد PWM هو 490 Hz ( التردد للأطراف 5,6 يكون 980 Hz ) .
لا تحتاج إلى إستدعاء الدالة pinMode() لتعيين الطرف كمخرج قبل استدعاء الدالة analogWrite() . لا علاقة للدالة analogWrite() بالأطراف التناظرية أو بالدالة analogRead .
الصيغة :
- الكود:
analogWrite(pin, value)
البارامتر pin : طرف الاردوينو المطلوب الكتابة إليه . نوع البيانات المسموح بها int .
البارامتر value : دورة العمل duty cycle : بين 0 (always off) و255 (always on) . نوع البيانات المسموح بها int .
العائد :
لاشىء .
رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects
التحكم فى الإضاءة بتعديل عرض النبضة Controlling Light with PWM
لقد تعرفت بالفعل على ما يكفي لبناء ليد تفاعلي (فى مثال وميض ليد) ، ولكن النتيجة حتى الآن مملة بعض الشيء ، لأن الضوء يعمل on أو لا يعمل off فقط. المصباح التفاعلي المتميز يحتاج إلى أن يكون قابل لإعتام الضوء dimmable . لحل هذه المشكلة ، يمكننا استخدام خدعة صغيرة تجعل الكثير من الأشياء ممكنة ، مثل التلفزيون أو السينما. وتسمى هذه الخدعة استمرار الرؤية Persistence of Vision ، أو POV .
كما أوضحنا سابقا ، إذا قمت بتقليل الأرقام في دالة التأخير حتى لا ترى وميض الليد ، فستلاحظ أن الليد يبدو أكثر قتامة (إعتام) من سطوعه العادي . إذا جربت هذا ، فستلاحظ أنه إذا جعلت تأخير التشغيل on مختلفًا عن تأخير الإيقاف off ، فيمكنك جعل الليد أكثر إشراقًا من خلال تركه on لفترة أطول ، ويمكنك جعله أكثر إعتاما بتركه off لفترة أطول. هذه التقنية تسمى تعديل عرض النبضة pulse-width modulation ، أو PWM ، لأنك تقوم بتغيير سطوع الليد من خلال تعديل (أو تغيير) عرض النبضة. يوضح الشكل أدناه كيف يعمل هذا. هذا يعمل لأن أعيننا لا تستطيع رؤية صور مميزة (مختلفة) إذا تغيرت بسرعة كبيرة.
تعمل هذه التقنية مع بعض الأجهزة بخلاف الليد . على سبيل المثال ، يمكنك تغيير سرعة المحرك بنفس الطريقة.
في هذه الحالة ، ليست أعيننا هي التي تسمح بحدوث ذلك ، بل المحرك نفسه ، لأنه لا يمكن أن يبدأ أو يتوقف عن الدوران على الفور.
يستغرق التسريع والإبطاء وقتًا صغيرًا. إذا قمنا بتغيير الإخراج (باستخدام الدالة digitalWrite() ) بشكل أسرع من استجابة المحرك ، فسينتهي الأمر بالدوران بسرعة متوسطة ، اعتمادًا على مقدار الوقت الذي يتم فيه تشغيله on ، وكم من الوقت تم إيقاف تشغيله off .
على الرغم من أن هذه الخدعة (الحيلة) مفيدة جدًا ، إلا أنك ربما شعرت أن التحكم في سطوع الليد عن طريق الوقت الضائع فى التأخير في الكود غير مريح إلى حد ما. والأسوأ من ذلك ، بمجرد رغبتك في قراءة مستشعر ، أو إرسال بيانات على المنفذ التسلسلي ، أو القيام بأي شيء آخر ، سيتغير سطوع الليد ، لأن أي سطور إضافية من التعليمات البرمجية التي تضيفها ستستغرق وقتًا للتنفيذ ، مما يؤدي إلى تغيير مقدار الوقت الذي يتم فيه تشغيل الليد on أو إيقاف تشغيل الليد off .
لحسن الحظ ، فإن المتحكم الدقيق (الميكروكونترولر) المستخدم من قبل Arduino يحتوي على قطعة من الأجهزة hardware التي يمكنها وميض الليدات بكفاءة عالية بينما البرنامج يقوم بشيء آخر. فى الأردوينو أونو Uno ، يتم تطبيق هذا الجهاز على الأطراف 3 و 5 و 6 و 9 و 10 و 11 ، وعلى Leonardo ، على الأطراف 3 و 5 و 6 و 9 و 10 و 11 و 13. التعليمة (الدالة) analogWrite() تستخدم للسيطرة على هذا الجهاز hardware .
على سبيل المثال ، ستؤدي كتابة analogWrite(9,50) إلى ضبط سطوع الليد المتصل بالطرف 9 إلى درجة باهتة (معتمة) تمامًا ، بينما تؤدي كتابة analogWrite(9,200) إلى ضبط سطوع الليد على السطوع التام.
تأخذ analogWrite() عددا يتراوح بين 0 و 255 ، حيث 255 يعني السطوع الكامل و 0 تعني الإيقاف off.
وجود عدد من أطراف PWM مفيد جدا. على سبيل المثال ، إذا كان لديك ليدات باللون الأحمر والأخضر والأزرق ، فيمكنك مزج إضاءتها وعمل إضاءة بأي لون.
الدائرة الكهربية :
البرنامج :
تلاشى (خفض-تغيير شدة) إضاءة ليد للداخل والخارج ، كما هو الحال في كمبيوتر Apple أثناء وضع "السكون " sleeping .
ربما يكون استخدام اردوينو شيء بسيط للغاية ، لكن يمكنك تعلم الكثير من هذا المثال. لقد علمت أن الدالة analogWrite() تغير سطوع الليد .
الجزء المهم الآخر هو حلقة for: فهى تكرر الدالة analogWrite() والدالة delay() مرارًا وتكرارًا ، في كل مرة تستخدم قيمة مختلفة للمتغير i على النحو التالي.
تبدأ الحلقة الأولى المتغير i بقيمة 0 ، وتزيده إلى 255 ، مما يؤدي إلى زيادة إضاءة الليد تدريجيا إلى درجة السطوع الكامل.
الحلقة الثانية تبدأ المتغير i بقيمة 255 ، وتنقصه إلى 0 ، مما يؤدي إلى نقصان إضاءة الليد تدريجيا إلى الإعتام (الإيقاف) التام.
بعد حلقة for الثانية ، يبدأ Arduino الدالة loop() مرة أخرى.
الدالة delay() هى فقط لإبطاء الأمور قليلاً حتى تتمكن من رؤية السطوع المتغير ؛ خلاف ذلك ، سوف يحدث بسرعة كبيرة.
برنامج أخر :
لقد تعرفت بالفعل على ما يكفي لبناء ليد تفاعلي (فى مثال وميض ليد) ، ولكن النتيجة حتى الآن مملة بعض الشيء ، لأن الضوء يعمل on أو لا يعمل off فقط. المصباح التفاعلي المتميز يحتاج إلى أن يكون قابل لإعتام الضوء dimmable . لحل هذه المشكلة ، يمكننا استخدام خدعة صغيرة تجعل الكثير من الأشياء ممكنة ، مثل التلفزيون أو السينما. وتسمى هذه الخدعة استمرار الرؤية Persistence of Vision ، أو POV .
كما أوضحنا سابقا ، إذا قمت بتقليل الأرقام في دالة التأخير حتى لا ترى وميض الليد ، فستلاحظ أن الليد يبدو أكثر قتامة (إعتام) من سطوعه العادي . إذا جربت هذا ، فستلاحظ أنه إذا جعلت تأخير التشغيل on مختلفًا عن تأخير الإيقاف off ، فيمكنك جعل الليد أكثر إشراقًا من خلال تركه on لفترة أطول ، ويمكنك جعله أكثر إعتاما بتركه off لفترة أطول. هذه التقنية تسمى تعديل عرض النبضة pulse-width modulation ، أو PWM ، لأنك تقوم بتغيير سطوع الليد من خلال تعديل (أو تغيير) عرض النبضة. يوضح الشكل أدناه كيف يعمل هذا. هذا يعمل لأن أعيننا لا تستطيع رؤية صور مميزة (مختلفة) إذا تغيرت بسرعة كبيرة.
تعمل هذه التقنية مع بعض الأجهزة بخلاف الليد . على سبيل المثال ، يمكنك تغيير سرعة المحرك بنفس الطريقة.
في هذه الحالة ، ليست أعيننا هي التي تسمح بحدوث ذلك ، بل المحرك نفسه ، لأنه لا يمكن أن يبدأ أو يتوقف عن الدوران على الفور.
يستغرق التسريع والإبطاء وقتًا صغيرًا. إذا قمنا بتغيير الإخراج (باستخدام الدالة digitalWrite() ) بشكل أسرع من استجابة المحرك ، فسينتهي الأمر بالدوران بسرعة متوسطة ، اعتمادًا على مقدار الوقت الذي يتم فيه تشغيله on ، وكم من الوقت تم إيقاف تشغيله off .
على الرغم من أن هذه الخدعة (الحيلة) مفيدة جدًا ، إلا أنك ربما شعرت أن التحكم في سطوع الليد عن طريق الوقت الضائع فى التأخير في الكود غير مريح إلى حد ما. والأسوأ من ذلك ، بمجرد رغبتك في قراءة مستشعر ، أو إرسال بيانات على المنفذ التسلسلي ، أو القيام بأي شيء آخر ، سيتغير سطوع الليد ، لأن أي سطور إضافية من التعليمات البرمجية التي تضيفها ستستغرق وقتًا للتنفيذ ، مما يؤدي إلى تغيير مقدار الوقت الذي يتم فيه تشغيل الليد on أو إيقاف تشغيل الليد off .
لحسن الحظ ، فإن المتحكم الدقيق (الميكروكونترولر) المستخدم من قبل Arduino يحتوي على قطعة من الأجهزة hardware التي يمكنها وميض الليدات بكفاءة عالية بينما البرنامج يقوم بشيء آخر. فى الأردوينو أونو Uno ، يتم تطبيق هذا الجهاز على الأطراف 3 و 5 و 6 و 9 و 10 و 11 ، وعلى Leonardo ، على الأطراف 3 و 5 و 6 و 9 و 10 و 11 و 13. التعليمة (الدالة) analogWrite() تستخدم للسيطرة على هذا الجهاز hardware .
على سبيل المثال ، ستؤدي كتابة analogWrite(9,50) إلى ضبط سطوع الليد المتصل بالطرف 9 إلى درجة باهتة (معتمة) تمامًا ، بينما تؤدي كتابة analogWrite(9,200) إلى ضبط سطوع الليد على السطوع التام.
تأخذ analogWrite() عددا يتراوح بين 0 و 255 ، حيث 255 يعني السطوع الكامل و 0 تعني الإيقاف off.
وجود عدد من أطراف PWM مفيد جدا. على سبيل المثال ، إذا كان لديك ليدات باللون الأحمر والأخضر والأزرق ، فيمكنك مزج إضاءتها وعمل إضاءة بأي لون.
الدائرة الكهربية :
البرنامج :
تلاشى (خفض-تغيير شدة) إضاءة ليد للداخل والخارج ، كما هو الحال في كمبيوتر Apple أثناء وضع "السكون " sleeping .
- الكود:
const int LED = 9; // the pin for the LED
int i = 0; // We'll use this to count up and down
void setup()
{
pinMode(LED, OUTPUT); // tell Arduino LED is an output
}
void loop()
{
for (i = 0; i < 255; i++)
{ // loop from 0 to 254 (fade in)
analogWrite(LED, i); // set the LED brightness
delay(10); // Wait 10ms because analogWrite
// is instantaneous and we would not see any change
}
for (i = 255; i > 0; i--)
{ // loop from 255 to 1 (fade out)
analogWrite(LED, i); // set the LED brightness
delay(10); // Wait 10ms
}
}
الجزء المهم الآخر هو حلقة for: فهى تكرر الدالة analogWrite() والدالة delay() مرارًا وتكرارًا ، في كل مرة تستخدم قيمة مختلفة للمتغير i على النحو التالي.
تبدأ الحلقة الأولى المتغير i بقيمة 0 ، وتزيده إلى 255 ، مما يؤدي إلى زيادة إضاءة الليد تدريجيا إلى درجة السطوع الكامل.
الحلقة الثانية تبدأ المتغير i بقيمة 255 ، وتنقصه إلى 0 ، مما يؤدي إلى نقصان إضاءة الليد تدريجيا إلى الإعتام (الإيقاف) التام.
بعد حلقة for الثانية ، يبدأ Arduino الدالة loop() مرة أخرى.
الدالة delay() هى فقط لإبطاء الأمور قليلاً حتى تتمكن من رؤية السطوع المتغير ؛ خلاف ذلك ، سوف يحدث بسرعة كبيرة.
برنامج أخر :
- الكود:
/*
Fading
This example shows how to fade an LED using the analogWrite() function.
The circuit:
- LED attached from digital pin 9 to ground.
*/
int ledPin = 9; // LED connected to digital pin 9
void setup() {
// nothing happens in setup
}
void loop() {
// fade in from min to max in increments of 5 points:
for (int fadeValue = 0 ; fadeValue <= 255; fadeValue += 5) {
// sets the value (range from 0 to 255):
analogWrite(ledPin, fadeValue);
// wait for 30 milliseconds to see the dimming effect
delay(30);
}
// fade out from max to min in increments of 5 points:
for (int fadeValue = 255 ; fadeValue >= 0; fadeValue -= 5) {
// sets the value (range from 0 to 255):
analogWrite(ledPin, fadeValue);
// wait for 30 milliseconds to see the dimming effect
delay(30);
}
}
رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects
التحكم اليدوى فى شدة إضاءة الليد :
الدائرة الكهربية :
البرنامج :
الدائرة الكهربية :
البرنامج :
- الكود:
int ledPin = 9; // LED connected to digital pin 9
int analogPin = 3; // potentiometer connected to analog pin 3
int val = 0; // variable to store the read value
void setup() {
pinMode(ledPin, OUTPUT); // sets the pin as output
}
void loop() {
val = analogRead(analogPin); // read the input pin
analogWrite(ledPin, val / 4); // analogRead values go from 0 to 1023, analogWrite values from 0 to 255
}
رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects
أردوينو وليد ديمر باستخدام PWM والتحكم عن طريق أزرار ضغط :
الغرض : الحصول على جهد متغير من جهد التشغيل الثابت 5V .
الدائرة الكهربية :
للحصول على خرج PWM على الطرف المناسب ، نحتاج العمل بالدالتين :
فى البداية ، نحتاج إلى اختيار طرف إخراج PWM من ستة أطراف ، بعد ذلك نحتاج إلى تعيين هذا الطرف كخرج (ليس ضروريا) .
بعد ذلك ، نحتاج إلى تمكين ميزة PWM في الاردوينو أونو عن طريق استدعاء الدالة “analogWrite(pin, value)” . حيث يمثل الرقم "pin" رقم الطرف حيث نحتاج إلى إخراج PWM ( سوف تستخدم الطرف “3” ) . لذلك من هذا الطرف نحصل على خرج . القيمة value هي دورة التشغيل ON duty cycle ، بين 0 (OFF دائمًا) و 255 (ON دائمًا). نحن بصدد زيادة هذا العدد وخفضه عن طريق الضغط على زر.
البرنامج :
الغرض : الحصول على جهد متغير من جهد التشغيل الثابت 5V .
الدائرة الكهربية :
للحصول على خرج PWM على الطرف المناسب ، نحتاج العمل بالدالتين :
- الكود:
pinMode(ledPin, OUTPUT);
analogWrite(pin, value);
بعد ذلك ، نحتاج إلى تمكين ميزة PWM في الاردوينو أونو عن طريق استدعاء الدالة “analogWrite(pin, value)” . حيث يمثل الرقم "pin" رقم الطرف حيث نحتاج إلى إخراج PWM ( سوف تستخدم الطرف “3” ) . لذلك من هذا الطرف نحصل على خرج . القيمة value هي دورة التشغيل ON duty cycle ، بين 0 (OFF دائمًا) و 255 (ON دائمًا). نحن بصدد زيادة هذا العدد وخفضه عن طريق الضغط على زر.
البرنامج :
- الكود:
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 input
pinMode(1, INPUT);// sets the pin1 as input
}
void loop()
{
analogWrite(3, i); // analogWrite values from 0 to 255
if (digitalRead(0)==LOW)
{
if (i<255)
{
i++;//if pin0 is pressed and the duty ratio value is less than 255
delay(30);
}
}
if (digitalRead(1)==LOW)
{
if (i>0)
{
i--;// if pin1 is pressed and the duty ratio value is greater than 0
delay(30);
}
}
}
رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects
مولد نغمة (بيانو)على أساس الاردوينو Arduino Based Tone Generator
الدائرة الكهربية :
البرنامج :
الدائرة الكهربية :
البرنامج :
- الكود:
void setup()
{
for (int i=0;i<8;i++)
{
pinMode(i, INPUT_PULLUP);//take pins0-7 as inputs with default high or pulled up pins.
}
pinMode(9,OUTPUT);//buzzer output at pin9
}
// the loop routine runs over and over again forever:
void loop()
{
if (digitalRead(0)==LOW)
{
analogWrite(9,25);//if button 1 is pressed PWM of duty ratio(25*100)/255 is given to buzzer
delay(100);
analogWrite(9,0);
}
if (digitalRead(1)==LOW)
{
analogWrite(9,50); //if button 2 is pressed PWM of duty ratio(50*100)/255 is given to buzzer
delay(100);
analogWrite(9,0);
}
if (digitalRead(2)==LOW)
{
analogWrite(9,75);// /if button 3 is pressed PWM of duty ratio(75*100)/255 is given to buzzer delay(100);
analogWrite(9,0);
}
if (digitalRead(3)==LOW)
{
analogWrite(9,100); //if button 4 is pressed PWM of duty ratio(100*100)/255 is given to buzzer
delay(100);
analogWrite(9,0);
}
if (digitalRead(4)==LOW)
{
analogWrite(9,125);
delay(100);
analogWrite(9,0);
}
if (digitalRead(5)==LOW)
{
analogWrite(9,150);
delay(100);
analogWrite(9,0);
}
if (digitalRead(6)==LOW)
{
analogWrite(9,175);
delay(100);
analogWrite(9,0);
}
if (digitalRead(7)==LOW)
{
analogWrite(9,200);
delay(100);
analogWrite(9,0);
}
}
مسجلات الإزاحة Shift Registers ومسجل الإزاحة 74HC595 والربط مع الأردوينو
مسجلات الإزاحة Shift Registers ومسجل الإزاحة 74HC595 والربط مع الأردوينو
مسجلات الإزاحة Shift Registers :
مقدمة :
ما هو مسجل الإزاحة What is Shift Register :
مسجلات الإزاحة هي دوائر منطقية متسلسلة (متتابعة) sequential logic circuits ، قادرة على تخزين ونقل البيانات. وهي مكونة من قلابات (فليب فلوب) Flip Flops والتي ترتبط (تتصل) بطريقة تجعل خرج فليب فلوب بمثابة دخل فليب فلوب آخر ، اعتمادًا على نوع مسجلات الإزاحة التي يتم إنشاؤها.
D-Flip Flop shift Register
مسجلات الإزاحة هي في الأساس نوع من السجلات register التي لديها القدرة على نقل transfer ("إزاحة " shift ) البيانات. السجلات عبارة عن أجهزة تخزين عامة يتم إنشاؤها عن طريق توصيل عدد معين من الفليب فلوب معًا في سلسلة ، كما أن كمية البيانات (عدد البتات) التي يمكن تخزينها بواسطة السجل تتناسب دائمًا مع عدد الفليب فلوب ، حيث إن كل فليب فلوب قادر على تخزين بت واحد فقط في كل مرة. عندما يتم توصيل فليب فلوب في السجل بطريقة تجعل خرج فليب فلوب ، يصبح دخل لآخر ، عندئذ يتم إنشاء مسجل الإزاحة.
D Flip-Flop
الفليب فلوب (القلاب) Flip Flops هي أجهزة لها عمل مشابهة لعمل المزلاج latch . يمكن أن يشار إليها على أنها هزاز ثنائى الاتزان bistable vibrator والذي يمكن أن ينتقل بين حالتين (0 أو 1) ويكون قادرًا على تخزين البيانات بالبت. تتم قراءة البيانات الجديدة في الفليب فلوب مع كل دورة ساعة والبيانات السابقة ترسل إلى الخرج . ومع ذلك ، يعتمد هذا على نوع القلاب FF ، حيث تختلف العلاقة بين المدخلات والمخرجات ودورة الساعة باختلاف القلاب . هناك أنواع مختلفة القلابات ، ولكن الأكثر شيوعًا في إنشاء مسجلات الإزاحة هي القلابات D (Delay)-flip flops .
عمل القلابات D flip flops والذى يجعلها مرغوبة جدًا لمسجلات الإزاحة ، هو أنه كلما كان هناك تغيير في ساعة القلاب D (إما حافة صاعدة أو هابطة ، اعتمادًا على مواصفات flip flop) ، تصبح البيانات في الخرج "Q" هي نفس البيانات الموجودة في الدخل "D". سيبقى الخرج "Q" من القلاب عند هذه القيمة حتى دورة الساعة التالية ، حيث سيتغير مرة أخرى إلى القيمة (مرتفعة High أو منخفضة low ، 1 أو 0) عند الدخل .
D Flip Flop Truth Table
أنواع مسجلات الإزاحة Types of Shift Registers
يتم تصنيف مسجلات الإزاحة إلى أنواع بشكل رئيسي حسب طريقة تشغيلها ، سواء كانت متسلسلة serial أو متوازية parallel .
هناك ستة (6) أنواع أساسية من مسجلات الإزاحة مدرجة أدناه على الرغم من إمكانية تقسيم بعضها إضافيا على أساس اتجاه تدفق البيانات إما إزاحة إلى اليمين أو إزاحة إلى اليسار.
1. مسجل إزاحة "دخل تسلسلى خرج تسلسلى " Serial in – Serial out Shift Register (SISO)
2. مسجل إزاحة "دخل تسلسلى خرج متوازى " Serial In – Parallel out shift Register (SIPO)
3. مسجل إزاحة "دخل متوازى خرج متوازى " Parallel in – Parallel out Shift Register (PIPO)
4. مسجل إزاحة "دخل متوازى خرج متسلسل " Parallel in – Serial out Shift Register (PISO)
5. مسجل إزاحة ثنائى الاتجاه Bidirectional Shift Registers
6. عدادات Counters
سوف يقتصر الحديث على النوع الثانى الذى يندرج تحته مسجل الإزاحة 74HC595 .
مسجل الإزاحة "دخل متسلسل خرج متوازى" Serial in – Parallel out Shift Register
يستخدم هذا النوع من مسجلات الإزاحة لتحويل البيانات من بيانات تسلسلية إلى بيانات متوازية . تأتي البيانات في صورة بت واحدة تلو الأخرى في كل دورة ساعة ويمكن إما أن يتم إزاحتها واستبدالها أو قراءتها في كل خرج . هذا يعني أنه عند قراءة البيانات ، تصبح كل قراءة بت متاحة في وقت واحد على خط الخرج الخاص بها (Q0 - Q3 لمسجل إزاحة 4 بت الموضح أدناه).
مسلسل مكون من 4 بتات - سجل التحويل الموازي للخارج موضح في الصورة أدناه.
Serial in – Parallel out Shift Register
يظهر أدناه جدول يوضح كيف يتم نقل (إزاحة) البيانات فى مسجل إزاحة "دخل متسلسل خرج متوازى" 4 بت ، مع بيانات الدخل 1001.
مثل جيد لمسجل إزاحة دخل متسلسل خرج متوازى ، مسجل الإزاحة 74HC164 ، وهو مسجل إزاحة 8 بت.
يتميز مسجل الإزاحة هذا بأن له مدخلين للبيانات التسلسلية (DSA و DSB) ، وثمانية مخارج بيانات متوازية (Q0 إلى Q7). يتم إدخال البيانات بشكل تسلسلي من خلال DSA أو DSB ويمكن استخدام أي من المدخلين كتمكين نشط فى الحالة المرتفعة active HIGH enable من أجل المدخل الآخر . يتم نقل (إزاحة) البيانات عند التحول من الحالة المنخفضة إلى الحالة المرتفعة LOW-to-HIGH على دخل نبضة الساعة clock (CP) . تطبيق الحالة المنخفضة LOW على مدخل الإعادة الرئيسي (MR) (الدائرة الصغيرة تعنى أنه فعال فى الحالة المنخفضة) يمسح السجل ويجبر جميع المخارج على الحالة المنخفضة LOW ، بشكل مستقل عن المدخلات الأخرى. وتشمل المدخلات الثنائيات المشبك. وهذا يتيح استخدام مقاومات الحد الحالية لواجهة المدخلات إلى الفولتية التي تتجاوز VCC.
74HC164 Functional Diagram
مسجلات الإزاحة Shift Registers :
مقدمة :
ما هو مسجل الإزاحة What is Shift Register :
مسجلات الإزاحة هي دوائر منطقية متسلسلة (متتابعة) sequential logic circuits ، قادرة على تخزين ونقل البيانات. وهي مكونة من قلابات (فليب فلوب) Flip Flops والتي ترتبط (تتصل) بطريقة تجعل خرج فليب فلوب بمثابة دخل فليب فلوب آخر ، اعتمادًا على نوع مسجلات الإزاحة التي يتم إنشاؤها.
D-Flip Flop shift Register
مسجلات الإزاحة هي في الأساس نوع من السجلات register التي لديها القدرة على نقل transfer ("إزاحة " shift ) البيانات. السجلات عبارة عن أجهزة تخزين عامة يتم إنشاؤها عن طريق توصيل عدد معين من الفليب فلوب معًا في سلسلة ، كما أن كمية البيانات (عدد البتات) التي يمكن تخزينها بواسطة السجل تتناسب دائمًا مع عدد الفليب فلوب ، حيث إن كل فليب فلوب قادر على تخزين بت واحد فقط في كل مرة. عندما يتم توصيل فليب فلوب في السجل بطريقة تجعل خرج فليب فلوب ، يصبح دخل لآخر ، عندئذ يتم إنشاء مسجل الإزاحة.
D Flip-Flop
الفليب فلوب (القلاب) Flip Flops هي أجهزة لها عمل مشابهة لعمل المزلاج latch . يمكن أن يشار إليها على أنها هزاز ثنائى الاتزان bistable vibrator والذي يمكن أن ينتقل بين حالتين (0 أو 1) ويكون قادرًا على تخزين البيانات بالبت. تتم قراءة البيانات الجديدة في الفليب فلوب مع كل دورة ساعة والبيانات السابقة ترسل إلى الخرج . ومع ذلك ، يعتمد هذا على نوع القلاب FF ، حيث تختلف العلاقة بين المدخلات والمخرجات ودورة الساعة باختلاف القلاب . هناك أنواع مختلفة القلابات ، ولكن الأكثر شيوعًا في إنشاء مسجلات الإزاحة هي القلابات D (Delay)-flip flops .
عمل القلابات D flip flops والذى يجعلها مرغوبة جدًا لمسجلات الإزاحة ، هو أنه كلما كان هناك تغيير في ساعة القلاب D (إما حافة صاعدة أو هابطة ، اعتمادًا على مواصفات flip flop) ، تصبح البيانات في الخرج "Q" هي نفس البيانات الموجودة في الدخل "D". سيبقى الخرج "Q" من القلاب عند هذه القيمة حتى دورة الساعة التالية ، حيث سيتغير مرة أخرى إلى القيمة (مرتفعة High أو منخفضة low ، 1 أو 0) عند الدخل .
D Flip Flop Truth Table
أنواع مسجلات الإزاحة Types of Shift Registers
يتم تصنيف مسجلات الإزاحة إلى أنواع بشكل رئيسي حسب طريقة تشغيلها ، سواء كانت متسلسلة serial أو متوازية parallel .
هناك ستة (6) أنواع أساسية من مسجلات الإزاحة مدرجة أدناه على الرغم من إمكانية تقسيم بعضها إضافيا على أساس اتجاه تدفق البيانات إما إزاحة إلى اليمين أو إزاحة إلى اليسار.
1. مسجل إزاحة "دخل تسلسلى خرج تسلسلى " Serial in – Serial out Shift Register (SISO)
2. مسجل إزاحة "دخل تسلسلى خرج متوازى " Serial In – Parallel out shift Register (SIPO)
3. مسجل إزاحة "دخل متوازى خرج متوازى " Parallel in – Parallel out Shift Register (PIPO)
4. مسجل إزاحة "دخل متوازى خرج متسلسل " Parallel in – Serial out Shift Register (PISO)
5. مسجل إزاحة ثنائى الاتجاه Bidirectional Shift Registers
6. عدادات Counters
سوف يقتصر الحديث على النوع الثانى الذى يندرج تحته مسجل الإزاحة 74HC595 .
مسجل الإزاحة "دخل متسلسل خرج متوازى" Serial in – Parallel out Shift Register
يستخدم هذا النوع من مسجلات الإزاحة لتحويل البيانات من بيانات تسلسلية إلى بيانات متوازية . تأتي البيانات في صورة بت واحدة تلو الأخرى في كل دورة ساعة ويمكن إما أن يتم إزاحتها واستبدالها أو قراءتها في كل خرج . هذا يعني أنه عند قراءة البيانات ، تصبح كل قراءة بت متاحة في وقت واحد على خط الخرج الخاص بها (Q0 - Q3 لمسجل إزاحة 4 بت الموضح أدناه).
مسلسل مكون من 4 بتات - سجل التحويل الموازي للخارج موضح في الصورة أدناه.
Serial in – Parallel out Shift Register
يظهر أدناه جدول يوضح كيف يتم نقل (إزاحة) البيانات فى مسجل إزاحة "دخل متسلسل خرج متوازى" 4 بت ، مع بيانات الدخل 1001.
مثل جيد لمسجل إزاحة دخل متسلسل خرج متوازى ، مسجل الإزاحة 74HC164 ، وهو مسجل إزاحة 8 بت.
يتميز مسجل الإزاحة هذا بأن له مدخلين للبيانات التسلسلية (DSA و DSB) ، وثمانية مخارج بيانات متوازية (Q0 إلى Q7). يتم إدخال البيانات بشكل تسلسلي من خلال DSA أو DSB ويمكن استخدام أي من المدخلين كتمكين نشط فى الحالة المرتفعة active HIGH enable من أجل المدخل الآخر . يتم نقل (إزاحة) البيانات عند التحول من الحالة المنخفضة إلى الحالة المرتفعة LOW-to-HIGH على دخل نبضة الساعة clock (CP) . تطبيق الحالة المنخفضة LOW على مدخل الإعادة الرئيسي (MR) (الدائرة الصغيرة تعنى أنه فعال فى الحالة المنخفضة) يمسح السجل ويجبر جميع المخارج على الحالة المنخفضة LOW ، بشكل مستقل عن المدخلات الأخرى. وتشمل المدخلات الثنائيات المشبك. وهذا يتيح استخدام مقاومات الحد الحالية لواجهة المدخلات إلى الفولتية التي تتجاوز VCC.
74HC164 Functional Diagram
رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects
مسجل الإزاحة 74HC595 :
مسجل إزاحة 8 بت ، دخل تسلسلى ، خرج تسلسلى أو متوازى ، مع مخارج بمزالج (اقفال) latches ، ثلاثية الحالة .
الدائرة المتكاملة 74HC595 عبارة عن مسجل إزاحة shift register 8- بت دخل تسلسلى ، خرج تسلسلى أو متوازى ، ومسجل تخزين storage register بمخارج ثلاثية الحالة . يحتوي كل من مسجل الإزاحة ومسجل التخزين على ساعات clocks منفصلة. يحتوي الجهاز على مدخل تسلسلي (DS) ومخرج تسلسلي (Q7S) لتمكين التوصيل المتتابع (المتتالى) cascading ومدخل إعادة رئيسى MR غير متزامن asynchronous . تطبيق الحالة المنخفضة LOW على الطرف MR ينتج عنه إعادة تعيين reset مسجل الإزاحة . يتم نقل (إزاحة) البيانات عند الانتقال (التحول) من الحالة المنخفضة إلى الحالة المرتفعة LOW-to-HIGH على دخل ساعة مسجل الإزاحة SHCP . يتم نقل البيانات الموجودة في مسجل الإزاحة إلى مسجل التخزين عند الانتقال من الحالة المنخفضة إلى الحالة المرتفعة LOW-to-HIGH على مدخل ساعة مسجل التخزين STCP. تظهر البيانات الموجودة في مسجل التخزين عند المخارج عندما يكون مدخل تمكين المخارج (OE) فى الحالة المنخفضة LOW . تؤدي الحالة المرتفعة HIGH على الطرف OE إلى ظهور المخرجات في حالة معاوقة مرتفعة ، حالة إيقاف OFF-state (الحالة الثالثة) . لا يؤثر عمل الدخل OE على حالة المسجلات.
المخطط الوظيفى Functional diagram:
الرمز المنطقى Logic symbol :
وصف الأطراف :
المداخل INPUTS:
• الطرف DS (Pin 14) : مدخل البيانات التسلسلية Serial Data Input .
يتم نقل (إزاحة) البيانات الموجودة على هذا الطرف إلى مسجل الإزاحة التسلسلي 8 بت .
مداخل التحكم CONTROL INPUTS:
• الطرف SHCP (Pin 11) : مدخل ساعة مسجل الإزاحة Shift Register Clock Input .
يؤدي الانتقال transition من الحالة المنخفضة إلى الحالة المرتفعة low− to−high على هذا المدخل إلى إزاحة البيانات الموجودة على طرف المدخل التسلسلي إلى داخل سجل الإزاحة ذي 8- بت.
• الطرف MR (Pin 10) : مدخل إعادة مسجل الإزاحة Shift Register Reset Input ، فعال فى الحالة المنخفضة Active−low ، غير متزامن Asynchronous .
الحالة المنخفضة lowعلى هذا الطرف تؤدى إلى إعادة تعيين جزء سجل الإزاحة فقط من هذا الجهاز . لا يتأثر جزء مسجل التخزين (المزلاج) 8 بت.
• الطرف STCP (Pin 12) : مدخل ساعة مزلاج التخزين Storage Latch Clock Input .
يؤدي الانتقال من الحالة المنخفضة إلى الحالة المرتفعة على هذا المدخل إلى إمساك latch بيانات مسجل الإزاحة (إخراج بيانات مسجل الإزاحة إلى أطراف الخرج) .
• الطرف OE (Pin 13) : مدخل تمكين الخرج . فعال فى الحالة المنخفضة Active−low .
الحالة المنخفضة low على هذا الدخل تسمح بعرض البيانات من المزالج latches إلى المخارج . تؤدي الحالة المرتفعة high على هذا الدخل إلى إجبار المخرجات (Q0 – Q7) إلى في حالة المعاوقة المرتفعة high−impedance state (الحالة الثالثة) . لا يتأثر الخرج التسلسلي بوحدة التحكم هذه.
المخارج OUTPUTS :
• الأطراف Q0 – Q7 (Pins 15, 1, 2, 3, 4, 5, 6, 7) : مخارج بمزلاج latch outputs ، لها 3- حالات 3−state ( منخفض – مرتفع – معاوقة مرتفعة ) ، غير معكوسة Noninverted .
• الطرف Q7S (Pin 9) : مخرج البيانات التسلسلية Serial Data Output ، غير معكوس .
هذا هو خرج المرحلة الثامنة من سجل الإزاحة 8- بت. هذا الخرج ليس له القدرة على الثلاث حالات.
المخطط المنطقى Logic diagram :
الوصف الوظيفى Functional description :
المخطط الزمنى (التوقيت) Timing diagram :
مسجل إزاحة 8 بت ، دخل تسلسلى ، خرج تسلسلى أو متوازى ، مع مخارج بمزالج (اقفال) latches ، ثلاثية الحالة .
الدائرة المتكاملة 74HC595 عبارة عن مسجل إزاحة shift register 8- بت دخل تسلسلى ، خرج تسلسلى أو متوازى ، ومسجل تخزين storage register بمخارج ثلاثية الحالة . يحتوي كل من مسجل الإزاحة ومسجل التخزين على ساعات clocks منفصلة. يحتوي الجهاز على مدخل تسلسلي (DS) ومخرج تسلسلي (Q7S) لتمكين التوصيل المتتابع (المتتالى) cascading ومدخل إعادة رئيسى MR غير متزامن asynchronous . تطبيق الحالة المنخفضة LOW على الطرف MR ينتج عنه إعادة تعيين reset مسجل الإزاحة . يتم نقل (إزاحة) البيانات عند الانتقال (التحول) من الحالة المنخفضة إلى الحالة المرتفعة LOW-to-HIGH على دخل ساعة مسجل الإزاحة SHCP . يتم نقل البيانات الموجودة في مسجل الإزاحة إلى مسجل التخزين عند الانتقال من الحالة المنخفضة إلى الحالة المرتفعة LOW-to-HIGH على مدخل ساعة مسجل التخزين STCP. تظهر البيانات الموجودة في مسجل التخزين عند المخارج عندما يكون مدخل تمكين المخارج (OE) فى الحالة المنخفضة LOW . تؤدي الحالة المرتفعة HIGH على الطرف OE إلى ظهور المخرجات في حالة معاوقة مرتفعة ، حالة إيقاف OFF-state (الحالة الثالثة) . لا يؤثر عمل الدخل OE على حالة المسجلات.
المخطط الوظيفى Functional diagram:
الرمز المنطقى Logic symbol :
وصف الأطراف :
المداخل INPUTS:
• الطرف DS (Pin 14) : مدخل البيانات التسلسلية Serial Data Input .
يتم نقل (إزاحة) البيانات الموجودة على هذا الطرف إلى مسجل الإزاحة التسلسلي 8 بت .
مداخل التحكم CONTROL INPUTS:
• الطرف SHCP (Pin 11) : مدخل ساعة مسجل الإزاحة Shift Register Clock Input .
يؤدي الانتقال transition من الحالة المنخفضة إلى الحالة المرتفعة low− to−high على هذا المدخل إلى إزاحة البيانات الموجودة على طرف المدخل التسلسلي إلى داخل سجل الإزاحة ذي 8- بت.
• الطرف MR (Pin 10) : مدخل إعادة مسجل الإزاحة Shift Register Reset Input ، فعال فى الحالة المنخفضة Active−low ، غير متزامن Asynchronous .
الحالة المنخفضة lowعلى هذا الطرف تؤدى إلى إعادة تعيين جزء سجل الإزاحة فقط من هذا الجهاز . لا يتأثر جزء مسجل التخزين (المزلاج) 8 بت.
• الطرف STCP (Pin 12) : مدخل ساعة مزلاج التخزين Storage Latch Clock Input .
يؤدي الانتقال من الحالة المنخفضة إلى الحالة المرتفعة على هذا المدخل إلى إمساك latch بيانات مسجل الإزاحة (إخراج بيانات مسجل الإزاحة إلى أطراف الخرج) .
• الطرف OE (Pin 13) : مدخل تمكين الخرج . فعال فى الحالة المنخفضة Active−low .
الحالة المنخفضة low على هذا الدخل تسمح بعرض البيانات من المزالج latches إلى المخارج . تؤدي الحالة المرتفعة high على هذا الدخل إلى إجبار المخرجات (Q0 – Q7) إلى في حالة المعاوقة المرتفعة high−impedance state (الحالة الثالثة) . لا يتأثر الخرج التسلسلي بوحدة التحكم هذه.
المخارج OUTPUTS :
• الأطراف Q0 – Q7 (Pins 15, 1, 2, 3, 4, 5, 6, 7) : مخارج بمزلاج latch outputs ، لها 3- حالات 3−state ( منخفض – مرتفع – معاوقة مرتفعة ) ، غير معكوسة Noninverted .
• الطرف Q7S (Pin 9) : مخرج البيانات التسلسلية Serial Data Output ، غير معكوس .
هذا هو خرج المرحلة الثامنة من سجل الإزاحة 8- بت. هذا الخرج ليس له القدرة على الثلاث حالات.
المخطط المنطقى Logic diagram :
الوصف الوظيفى Functional description :
المخطط الزمنى (التوقيت) Timing diagram :
رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects
مسجل الإزاحة (74HC595) Shift Register وزيادة عدد مخارج الاردوينو :
مسجل الإزاحة هو دائرة متكاملة (IC) خارجية يمكن استخدامها لتوسيع (زيادة) عدد أطراف الخرج المتاحة لنا. بشكل أساسي ، يسمح لك بتحويل الدخل التسلسلي من طرف واحد (بت واحد تلو الآخر) إلى إشارات خرج متوازية متعددة (جميعها مرة واحدة على خطوط منفصلة).
مسجل الإزاحة المستخدم هو الدائرة المتكاملة الشهيرة 74HC595. وهى لديها 8 خطوط خرج والتي تسمح لك بمعالجة واستخدام بايت Byte للإخراج في التعليمات البرمجية الخاصة بك.
فكيف يعمل ؟ يتكون مسجل الإزاحة هذا من مسجلين (سجلين) registers ، وهى وحدات ذاكرة والتي يمكن أن تحفظ عدة قيم ثنائية مرتبة (8 بت لهذه الدائرة المتكاملة ). هذه المسجلات هى :
• مسجل (سجل) الإزاحة shift register ، الذي يحفظ 8 قيم قبل كتابتها إلى أطراف الخرج . يمكن "زحزحة " shift القيم خلال هذا المسجل من موضع إلى آخر ، بدءًا من الموضع “A” إلى الموضع “H” .
• مسجل (سجل) التخزين storage register ، الذي يأخذ القيم من سجل الإزاحة ويرسلها إلى خطوط إخراج البيانات ، المسماة QA إلى QH ( وهى نفسها المخارج Q0 إلى Q7 ) . على سبيل المثال ، المنطق 1 في الموضع "C" من سجل التخزين من شأنه أن يخلق إشارة مرتفعة HIGH على الخرج QC .
هناك ثلاثة أطراف على IC نستخدمها للتحكم فى الاردوينو . اثنان من هذه الأطراف عبارة عن نبضات توقيت ، ساعات clocks: وهى مدخلات خاصة تؤدي إلى تشغيل (قدح) IC لفعل شيء ما عندما تتلقى إشارة تتغير من LOW إلى HIGH (تُعرف أيضًا باسم نبضة pulse أو الحافة الصاعدة rising edge).
• الطرف SER (أو DS ) :
طرف البيانات التسلسلية Serial data pin ، وهو خط إدخال البيانات التسلسلية. عندما تطبيق الساعة التسلسلية أو ساعة مسجل الإزاحة (SRCLK) (أو SH_CP ) ، يتم تخزين الإشارة الموجودة على هذا الخط في الموضع الأول (“A”) من سجل الإزاحة.
• الطرف SRCLK (أو SH_CP ) :
طرف الساعة التسلسلية Serial clock ، عند تطبيق نبضة ، تقوم بإزاحة كل قيمة في مسجل الإزاحة للأمام بمقدار موضع واحد ، ثم تقوم بتحميل القيمة من الطرف SER إلى الوضع "A". لاحظ أن هذا لا يغير الإشارات على خطوط الإخراج حتى تقوم بتطبيق نبضة ساعة مسجل التخزين (الماسك Latch ) (RCLK).
• الطرف RCLK (أو ST_CP ):
طرف ساعة سجل التخزين أو طرف ساعة الماسك Register clock, “latch pin” ، عند تطبيق نبضة ، يتم تحديث سجل التخزين storage register بقيم جديدة من سجل الإزاحة shift register ، وإرسال مجموعة جديدة من الإشارات إلى أطراف الخرج الثمانية . يحدث هذا بسرعة بحيث يبدو أنهم جميعا يتغيرون في وقت واحد!
ضع في اعتبارك أن القيمة الأولى first التي ترسلها إلى سجل الإزاحة shift register سيتم إزاحتها نحو آخر last طرف خرج عند إرسال المزيد من البيانات.
دعنا نقول أننا نريد إرسال البتات التالية : 10101010. من البديهي ، أنه من الأسهل إرسال كل بت في الرقم من اليسار إلى اليمين كما لو كانت سلسلة . إرسالها بهذه الطريقة يعني أنه بعد أن نرسل الثمانية بتات ، سيتم نقل البت الأولى فعليًا إلى آخر خرج (QH) ، وسيتم إزاحة البت الثانية إلى الخرج الثاني قبل الأخير (QG) ) ، وهلم جرا حتى يتم عكس كل شيء! تُعرف طريقة إزاحة القيم هذه بالبت الأكثر أهمية (MSB) أولاً. كما يمكن إرسال بت أقصى اليمين أو الأقل أهمية (LSB) أولاً ، كما سنرى فى البرمجة .
مخطط الأطراف :
الشكل أدناه يبين مخطط أطراف 74HC595 :
على الجانب الأيمن من الشريحة ، يمكنك رؤية أطراف التحكم الثلاثة الموضحة أعلاه ، بالإضافة إلى الخرج الأول (QA). على الجانب الأيسر ، يمكنك رؤية المخرجات السبعة الأخرى (QB - QH).
التحكم فى مسجل الإزاحة :
إذن كيف يمكن السماح لنا بالتحكم في مخارج متعددة باستخدام طرف بيانات واحد؟ حسنًا ، دعنا نقول أن لدينا 8 ليدات متصلة بالمخارج ، ونريد تشغيل الليد الثانية والرابعة والثامنة مثل: 10001010 .
• فى البداية ، سنقوم بمسح مسجل الإزاحة بحيث يتم إيقاف تشغيل جميع الليدات من خلال كتابة ثمانية أصفار في سجل الإزاحة ، ثم تطبيق نبضة على طرف المزلاج latch لكتابة المخرجات على خطوط المخرجات . يتم ذلك عن طريق ضبط الطرف SER على الوضع LOW مع الاستمرار ، ثم تطبيق 8 مرات لنبضات ساعة على الطرف SRCLK ، ثم تطبيق نبضة واحدة على الطرف RCLK.
• لكل بت من الشكل 10001010 يتم :
1- تحديد طرف البيانات SER إلى القيمة HIGH أو LOW.
2- تطبيق نبضة ساعة مسجل الإزاحة SRCLK من LOW إلى HIGH (حافة صاعدة) لإزاحة القيمة من الطرف SER إلى مسجل الإزاحة .
نكرر الخطوتين السابقتين (على سبيل المثال ، باستخدام حلقة أو دالة مخصصة لهذا الغرض كما هو الحال مع الاردوينو ) حتى يتم إزاحة جميع القيم الثمانية. ثم نطبق نبضة ساعة على الطرف RCLK لكتابة هذه القيم في سجل التخزين وخطوط المخارج ، التي تعمل على تشغيل الليدات حسب الحالة .
وبهذه الطريقة ، يمكننا التحكم في ما يصل إلى 8 مخارج مختلفة باستخدام فقط 3 أطراف دخل / خرج .
إليك مخطط يبين ملخص ما وصفناه للتو.
تسلسل ديزي Daisy-Chaining
يمكن أيضًا ربط مسجلات الإزاحة في سلسلة مع بعضها البعض لتوسيع عدد خطوط البيانات (المخارج) التي يمكن التحكم فيها مرة واحدة. يمكننا القيام بذلك عن طريق استخدام الطرف QH (Q7S)(الخرج التسلسلى ) ، والذي يتم توصيله داخل سجل الإزاحة إلى آخر خرج QH.
ما عليك سوى توصيل الطرف SER (DS) الخاص بسجل إزاحة بالطرف QH (Q7S) (الخرج التسلسلى) بسجل إزاحة آخر ، وتوصيل الأطراف SRCLK و RCLK الخاصة بهم معًا. بهذه الطريقة ، عندما تقوم بتوصيل نبضة SRCLK ، ستقرأ الشريحة الثانية من آخر خرج للشريحة الأولى ، وعندما تقوم بتوصيل نبضة على RCLK ، ستقوم كلا الرقاقتين بتحديث خطوط الخرج الخاصة بها. هذا شيء عظيم لأن هذا لا يتطلب أي أطراف دخل / خرج إضافية من الاردوينو !
لقد قمت الآن بإنشاء مسجل إزاحة 16 بت ، ويمكنك تمديد السلسلة بشكل أكبر بإضافة المزيد من الرقائق بالطريقة نفسها المذكورة أعلاه. هذا هو المعروف باسم تسلسل ديزي daisy-chaining .
مسجل الإزاحة هو دائرة متكاملة (IC) خارجية يمكن استخدامها لتوسيع (زيادة) عدد أطراف الخرج المتاحة لنا. بشكل أساسي ، يسمح لك بتحويل الدخل التسلسلي من طرف واحد (بت واحد تلو الآخر) إلى إشارات خرج متوازية متعددة (جميعها مرة واحدة على خطوط منفصلة).
مسجل الإزاحة المستخدم هو الدائرة المتكاملة الشهيرة 74HC595. وهى لديها 8 خطوط خرج والتي تسمح لك بمعالجة واستخدام بايت Byte للإخراج في التعليمات البرمجية الخاصة بك.
فكيف يعمل ؟ يتكون مسجل الإزاحة هذا من مسجلين (سجلين) registers ، وهى وحدات ذاكرة والتي يمكن أن تحفظ عدة قيم ثنائية مرتبة (8 بت لهذه الدائرة المتكاملة ). هذه المسجلات هى :
• مسجل (سجل) الإزاحة shift register ، الذي يحفظ 8 قيم قبل كتابتها إلى أطراف الخرج . يمكن "زحزحة " shift القيم خلال هذا المسجل من موضع إلى آخر ، بدءًا من الموضع “A” إلى الموضع “H” .
• مسجل (سجل) التخزين storage register ، الذي يأخذ القيم من سجل الإزاحة ويرسلها إلى خطوط إخراج البيانات ، المسماة QA إلى QH ( وهى نفسها المخارج Q0 إلى Q7 ) . على سبيل المثال ، المنطق 1 في الموضع "C" من سجل التخزين من شأنه أن يخلق إشارة مرتفعة HIGH على الخرج QC .
هناك ثلاثة أطراف على IC نستخدمها للتحكم فى الاردوينو . اثنان من هذه الأطراف عبارة عن نبضات توقيت ، ساعات clocks: وهى مدخلات خاصة تؤدي إلى تشغيل (قدح) IC لفعل شيء ما عندما تتلقى إشارة تتغير من LOW إلى HIGH (تُعرف أيضًا باسم نبضة pulse أو الحافة الصاعدة rising edge).
• الطرف SER (أو DS ) :
طرف البيانات التسلسلية Serial data pin ، وهو خط إدخال البيانات التسلسلية. عندما تطبيق الساعة التسلسلية أو ساعة مسجل الإزاحة (SRCLK) (أو SH_CP ) ، يتم تخزين الإشارة الموجودة على هذا الخط في الموضع الأول (“A”) من سجل الإزاحة.
• الطرف SRCLK (أو SH_CP ) :
طرف الساعة التسلسلية Serial clock ، عند تطبيق نبضة ، تقوم بإزاحة كل قيمة في مسجل الإزاحة للأمام بمقدار موضع واحد ، ثم تقوم بتحميل القيمة من الطرف SER إلى الوضع "A". لاحظ أن هذا لا يغير الإشارات على خطوط الإخراج حتى تقوم بتطبيق نبضة ساعة مسجل التخزين (الماسك Latch ) (RCLK).
• الطرف RCLK (أو ST_CP ):
طرف ساعة سجل التخزين أو طرف ساعة الماسك Register clock, “latch pin” ، عند تطبيق نبضة ، يتم تحديث سجل التخزين storage register بقيم جديدة من سجل الإزاحة shift register ، وإرسال مجموعة جديدة من الإشارات إلى أطراف الخرج الثمانية . يحدث هذا بسرعة بحيث يبدو أنهم جميعا يتغيرون في وقت واحد!
ضع في اعتبارك أن القيمة الأولى first التي ترسلها إلى سجل الإزاحة shift register سيتم إزاحتها نحو آخر last طرف خرج عند إرسال المزيد من البيانات.
دعنا نقول أننا نريد إرسال البتات التالية : 10101010. من البديهي ، أنه من الأسهل إرسال كل بت في الرقم من اليسار إلى اليمين كما لو كانت سلسلة . إرسالها بهذه الطريقة يعني أنه بعد أن نرسل الثمانية بتات ، سيتم نقل البت الأولى فعليًا إلى آخر خرج (QH) ، وسيتم إزاحة البت الثانية إلى الخرج الثاني قبل الأخير (QG) ) ، وهلم جرا حتى يتم عكس كل شيء! تُعرف طريقة إزاحة القيم هذه بالبت الأكثر أهمية (MSB) أولاً. كما يمكن إرسال بت أقصى اليمين أو الأقل أهمية (LSB) أولاً ، كما سنرى فى البرمجة .
مخطط الأطراف :
الشكل أدناه يبين مخطط أطراف 74HC595 :
على الجانب الأيمن من الشريحة ، يمكنك رؤية أطراف التحكم الثلاثة الموضحة أعلاه ، بالإضافة إلى الخرج الأول (QA). على الجانب الأيسر ، يمكنك رؤية المخرجات السبعة الأخرى (QB - QH).
التحكم فى مسجل الإزاحة :
إذن كيف يمكن السماح لنا بالتحكم في مخارج متعددة باستخدام طرف بيانات واحد؟ حسنًا ، دعنا نقول أن لدينا 8 ليدات متصلة بالمخارج ، ونريد تشغيل الليد الثانية والرابعة والثامنة مثل: 10001010 .
• فى البداية ، سنقوم بمسح مسجل الإزاحة بحيث يتم إيقاف تشغيل جميع الليدات من خلال كتابة ثمانية أصفار في سجل الإزاحة ، ثم تطبيق نبضة على طرف المزلاج latch لكتابة المخرجات على خطوط المخرجات . يتم ذلك عن طريق ضبط الطرف SER على الوضع LOW مع الاستمرار ، ثم تطبيق 8 مرات لنبضات ساعة على الطرف SRCLK ، ثم تطبيق نبضة واحدة على الطرف RCLK.
• لكل بت من الشكل 10001010 يتم :
1- تحديد طرف البيانات SER إلى القيمة HIGH أو LOW.
2- تطبيق نبضة ساعة مسجل الإزاحة SRCLK من LOW إلى HIGH (حافة صاعدة) لإزاحة القيمة من الطرف SER إلى مسجل الإزاحة .
نكرر الخطوتين السابقتين (على سبيل المثال ، باستخدام حلقة أو دالة مخصصة لهذا الغرض كما هو الحال مع الاردوينو ) حتى يتم إزاحة جميع القيم الثمانية. ثم نطبق نبضة ساعة على الطرف RCLK لكتابة هذه القيم في سجل التخزين وخطوط المخارج ، التي تعمل على تشغيل الليدات حسب الحالة .
وبهذه الطريقة ، يمكننا التحكم في ما يصل إلى 8 مخارج مختلفة باستخدام فقط 3 أطراف دخل / خرج .
إليك مخطط يبين ملخص ما وصفناه للتو.
تسلسل ديزي Daisy-Chaining
يمكن أيضًا ربط مسجلات الإزاحة في سلسلة مع بعضها البعض لتوسيع عدد خطوط البيانات (المخارج) التي يمكن التحكم فيها مرة واحدة. يمكننا القيام بذلك عن طريق استخدام الطرف QH (Q7S)(الخرج التسلسلى ) ، والذي يتم توصيله داخل سجل الإزاحة إلى آخر خرج QH.
ما عليك سوى توصيل الطرف SER (DS) الخاص بسجل إزاحة بالطرف QH (Q7S) (الخرج التسلسلى) بسجل إزاحة آخر ، وتوصيل الأطراف SRCLK و RCLK الخاصة بهم معًا. بهذه الطريقة ، عندما تقوم بتوصيل نبضة SRCLK ، ستقرأ الشريحة الثانية من آخر خرج للشريحة الأولى ، وعندما تقوم بتوصيل نبضة على RCLK ، ستقوم كلا الرقاقتين بتحديث خطوط الخرج الخاصة بها. هذا شيء عظيم لأن هذا لا يتطلب أي أطراف دخل / خرج إضافية من الاردوينو !
لقد قمت الآن بإنشاء مسجل إزاحة 16 بت ، ويمكنك تمديد السلسلة بشكل أكبر بإضافة المزيد من الرقائق بالطريقة نفسها المذكورة أعلاه. هذا هو المعروف باسم تسلسل ديزي daisy-chaining .
رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects
التدريب الأساسى :
كيف يعمل مسجل الإزاحة 74HC595 وربطه مع الاردوينو :
كيف يعمل مسجل الإزاحة 74HC595 ؟
يحتوي 595 على سجلين (مسجلين) (يمكن اعتبارهما "حاويات ذاكرة") ، يحتوي كل منها على 8 بتات فقط من البيانات. أول واحد يسمى سجل الإزاحة Shift Register . يقع سجل الإزاحة عميقًا داخل دوائر IC ، ويقبل الدخل بهدوء.
كلما طبقنا نبضة الساعة clock على 595 ، يحدث شيئان:
• تنتقل البتات الموجودة في Shift Register خطوة واحدة إلى اليسار. على سبيل المثال ، يقبل Bit 7 القيمة التي كانت موجودة سابقًا في bit 6 ، بينما تحصل bit 6 على قيمة bit 5 إلخ.
• تقبل البت bit 0 في مسجل الإزاحة Shift Register القيمة الحالية على طرف البيانات DATA. عند الحافة الصاعدة لنبضة الساعة ، إذا كان طرف البيانات فى الحالة المرتفعة high ، يتم دفع 1 في سجل الإزاحة. خلاف ذلك ، يكون 0.
عند تمكين طرف Latch (فى الحالة المنخفضة) ، يتم نسخ محتويات سجل الإزاحة Shift Register في السجل الثاني ، ويسمى سجل التخزين Storage أو سجل المزلاج Latch . كل بت من سجل التخزين متصل بأحد أطراف الخرج Q0-Q7 الخاصة بالدائرة المتكاملة ، ولذلك بشكل عام ، عندما تتغير القيمة في "سجل التخزين" ، تتغير المخرجات كذلك.
يمكنك فهم هذا بشكل أفضل مع الرسم التوضيحي الموضح أدناه.
برنامج إضاءة 8 ليد على التتابع ، ليد تلو الآخر :
الدائرة الكهربية :
البرنامج :
شرح البرنامج :
أول شيء نقوم به هو تعريف 3 أطراف التحكم : latch و clock و data للدائرة المتكاملة 595 . سنقوم بتوصيلها بأطراف الاردوينو 5 و 6 و 4 على الترتيب .
بعد ذلك ، يتم تعريف متغير يسمى ‘leds’ . سيتم استخدام هذا المتغير لحفظ النمط الذي يتم فيه تشغيل أو إيقاف تشغيل الليدات حاليًا. يمثل نوع البيانات ‘byte’ الأعداد التي تستخدم ثمانية بتات. يمكن تشغيل كل بت أو إيقاف تشغيلها ، لذلك فهو مثالي لتتبع أي من الليدات الثمانية الخاصة بنا تعمل on أو متوقفة off .
في الدالة ‘setup‘ : نقوم ببساطة بتهيئة الأطراف الثلاثة لتكون مخارج رقمية.
الدالة loop : في البداية تقوم بإيقاف تشغيل جميع الليدات ، عن طريق تعيين كل البتات الخاصة بالمتغير 'leds' على 0. ثم تقوم باستدعاء الدالة المعرفة بمعرفة المستخدم والتي تسمى updateShiftRegister() والتي سترسل نموذج 'leds' إلى سجل الإزاحة بحيث تكون جميع الليدات فى حالة إيقاف off . سنتعرف على كيفية عمل هذه الدالة لاحقًا.
يتوقف البرنامج لمدة نصف ثانية ، ثم يبدأ العد من 0 إلى 7 باستخدام حلقة "for" والمتغير "i". في كل مرة ، تستخدم الدالة bitSet() لتعيين set البت (جعله بواحد) الذي يتحكم في ليد معين في المتغير'leds'. ثم يتم إستدعاء الدالة updateShiftRegister() بحيث تتغير حالة الليدات وفقًا لما هو موجود في المتغير ‘leds’ .
ثم هناك تأخير لمدة نصف ثانية قبل زيادة "i" ويضيء الليد التالى .
تقوم الدالة updateShiftRegister() ، أولاً وقبل كل شيء بتعيين طرف المزلاج latch Pin على الحالة المنخفضة LOW ، ثم تستدعي الدالة shiftOut() قبل وضع طرف المزلاج على الحالة المرتفعة HIGH مرة أخرى.
لحسن الحظ ، يوفر الاردوينو Arduino دالة مساعدة خصيصًا لسجلات الإزاحة التي تسمى shiftOut() ، والتي تتيح لنا ببساطة إزاحة البتات في استدعاء واحد.
تأخذ الدالة shiftOut() أربعة بارامترات ؛ أول اثنين هما الأطراف المستخدمة فى البيانات Data والساعة Clock على التوالي. يحدد البارامتر الثالث نهاية البيانات التي تريد البدء بها. سنبدأ بالبايت أقصى اليمين ، والذي يشار إليه باسم "بت الأقل أهمية" (LSB).
البارامتر الأخير هو البيانات الفعلية المراد إزاحتها إلى سجل الإزاحة ، وهى في هذه الحالة ‘leds’ .
بمجرد تحميل الكود إلى Arduino ، سترى أن الإخراج يظهر كما يلي:
إذا كنت ترغب في إيقاف تشغيل أحد الليدات بدلاً من تشغيله ، يمكنك استدعاء دالة Arduino مماثلة وهى bitClear() للمتغير 'leds'. سيؤدي ذلك إلى تعيين هذا البت المعين من ‘leds’ على الصفر وستحتاج فقط إلى استدعاء الدالة updateShiftRegister() لتحديث الليدات الفعلية.
كيف يعمل مسجل الإزاحة 74HC595 وربطه مع الاردوينو :
كيف يعمل مسجل الإزاحة 74HC595 ؟
يحتوي 595 على سجلين (مسجلين) (يمكن اعتبارهما "حاويات ذاكرة") ، يحتوي كل منها على 8 بتات فقط من البيانات. أول واحد يسمى سجل الإزاحة Shift Register . يقع سجل الإزاحة عميقًا داخل دوائر IC ، ويقبل الدخل بهدوء.
كلما طبقنا نبضة الساعة clock على 595 ، يحدث شيئان:
• تنتقل البتات الموجودة في Shift Register خطوة واحدة إلى اليسار. على سبيل المثال ، يقبل Bit 7 القيمة التي كانت موجودة سابقًا في bit 6 ، بينما تحصل bit 6 على قيمة bit 5 إلخ.
• تقبل البت bit 0 في مسجل الإزاحة Shift Register القيمة الحالية على طرف البيانات DATA. عند الحافة الصاعدة لنبضة الساعة ، إذا كان طرف البيانات فى الحالة المرتفعة high ، يتم دفع 1 في سجل الإزاحة. خلاف ذلك ، يكون 0.
عند تمكين طرف Latch (فى الحالة المنخفضة) ، يتم نسخ محتويات سجل الإزاحة Shift Register في السجل الثاني ، ويسمى سجل التخزين Storage أو سجل المزلاج Latch . كل بت من سجل التخزين متصل بأحد أطراف الخرج Q0-Q7 الخاصة بالدائرة المتكاملة ، ولذلك بشكل عام ، عندما تتغير القيمة في "سجل التخزين" ، تتغير المخرجات كذلك.
يمكنك فهم هذا بشكل أفضل مع الرسم التوضيحي الموضح أدناه.
برنامج إضاءة 8 ليد على التتابع ، ليد تلو الآخر :
الدائرة الكهربية :
البرنامج :
- الكود:
int latchPin = 5; // Latch pin of 74HC595 is connected to Digital pin 5
int clockPin = 6; // Clock pin of 74HC595 is connected to Digital pin 6
int dataPin = 4; // Data pin of 74HC595 is connected to Digital pin 4
byte leds = 0; // Variable to hold the pattern of which LEDs are currently turned on or off
void setup()
{
// Set all the pins of 74HC595 as OUTPUT
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
}
void loop()
{
leds = 0; // Initially turns all the LEDs off, by giving the variable 'leds' the value 0
updateShiftRegister();
delay(500);
for (int i = 0; i < 8; i++) // Turn all the LEDs ON one by one.
{
bitSet(leds, i); // Set the bit that controls that LED in the variable 'leds'
updateShiftRegister();
delay(500);
}
}
/*
* updateShiftRegister() - This function sets the latchPin to low, then calls the Arduino function 'shiftOut' to shift out contents of variable 'leds' in the shift register before putting the 'latchPin' high again.
*/
void updateShiftRegister()
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, leds);
digitalWrite(latchPin, HIGH);
}
شرح البرنامج :
أول شيء نقوم به هو تعريف 3 أطراف التحكم : latch و clock و data للدائرة المتكاملة 595 . سنقوم بتوصيلها بأطراف الاردوينو 5 و 6 و 4 على الترتيب .
- الكود:
int latchPin = 5;
int clockPin = 6;
int dataPin = 4;
بعد ذلك ، يتم تعريف متغير يسمى ‘leds’ . سيتم استخدام هذا المتغير لحفظ النمط الذي يتم فيه تشغيل أو إيقاف تشغيل الليدات حاليًا. يمثل نوع البيانات ‘byte’ الأعداد التي تستخدم ثمانية بتات. يمكن تشغيل كل بت أو إيقاف تشغيلها ، لذلك فهو مثالي لتتبع أي من الليدات الثمانية الخاصة بنا تعمل on أو متوقفة off .
- الكود:
// Variable to hold the pattern of which LEDs are currently turned on or off
byte leds = 0;
في الدالة ‘setup‘ : نقوم ببساطة بتهيئة الأطراف الثلاثة لتكون مخارج رقمية.
- الكود:
void setup()
{
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
}
الدالة loop : في البداية تقوم بإيقاف تشغيل جميع الليدات ، عن طريق تعيين كل البتات الخاصة بالمتغير 'leds' على 0. ثم تقوم باستدعاء الدالة المعرفة بمعرفة المستخدم والتي تسمى updateShiftRegister() والتي سترسل نموذج 'leds' إلى سجل الإزاحة بحيث تكون جميع الليدات فى حالة إيقاف off . سنتعرف على كيفية عمل هذه الدالة لاحقًا.
يتوقف البرنامج لمدة نصف ثانية ، ثم يبدأ العد من 0 إلى 7 باستخدام حلقة "for" والمتغير "i". في كل مرة ، تستخدم الدالة bitSet() لتعيين set البت (جعله بواحد) الذي يتحكم في ليد معين في المتغير'leds'. ثم يتم إستدعاء الدالة updateShiftRegister() بحيث تتغير حالة الليدات وفقًا لما هو موجود في المتغير ‘leds’ .
ثم هناك تأخير لمدة نصف ثانية قبل زيادة "i" ويضيء الليد التالى .
- الكود:
void loop()
{
leds = 0;
updateShiftRegister();
delay(500);
for (int i = 0; i < 8; i++)
{
bitSet(leds, i);
updateShiftRegister();
delay(500);
}
}
تقوم الدالة updateShiftRegister() ، أولاً وقبل كل شيء بتعيين طرف المزلاج latch Pin على الحالة المنخفضة LOW ، ثم تستدعي الدالة shiftOut() قبل وضع طرف المزلاج على الحالة المرتفعة HIGH مرة أخرى.
لحسن الحظ ، يوفر الاردوينو Arduino دالة مساعدة خصيصًا لسجلات الإزاحة التي تسمى shiftOut() ، والتي تتيح لنا ببساطة إزاحة البتات في استدعاء واحد.
تأخذ الدالة shiftOut() أربعة بارامترات ؛ أول اثنين هما الأطراف المستخدمة فى البيانات Data والساعة Clock على التوالي. يحدد البارامتر الثالث نهاية البيانات التي تريد البدء بها. سنبدأ بالبايت أقصى اليمين ، والذي يشار إليه باسم "بت الأقل أهمية" (LSB).
البارامتر الأخير هو البيانات الفعلية المراد إزاحتها إلى سجل الإزاحة ، وهى في هذه الحالة ‘leds’ .
- الكود:
void updateShiftRegister()
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, leds);
digitalWrite(latchPin, HIGH);
}
بمجرد تحميل الكود إلى Arduino ، سترى أن الإخراج يظهر كما يلي:
إذا كنت ترغب في إيقاف تشغيل أحد الليدات بدلاً من تشغيله ، يمكنك استدعاء دالة Arduino مماثلة وهى bitClear() للمتغير 'leds'. سيؤدي ذلك إلى تعيين هذا البت المعين من ‘leds’ على الصفر وستحتاج فقط إلى استدعاء الدالة updateShiftRegister() لتحديث الليدات الفعلية.
رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects
التحكم فى السطوع Brightness باستخدام PWM
إليك مشروع آخر ، يستند إلى نفس الإعداد ولكن مع اختلاف بسيط ، حيث نتعامل مع طرف تحكم آخر على IC ، أي تمكين الخرج OE وبذلك ، يمكننا التحكم في سطوع ليدات المخارج .
لقد تعلمنا بالفعل أن الطرف OE (تمكين الخرج ) يعمل بمثابة مفتاح. عندما يتم تعيين هذا الطرف على الحالة المرتفعة HIGH ، يتم تعطيل disabled أطراف الخرج (فعال فى الحالة المنخفضة أى يعمل بالمنطق السالب ، تذكر؟). وعندما يحصل الطرف OE على الجهد المنخفض ، تعمل أطراف الخرج بشكل طبيعي.
في مثالنا السابق ، قمنا بتوصيل هذا الطرف توصيل دائم بالأرضى ، مما مكّن المخارج طوال الوقت. إذا قمنا بتوصيل هذا الطرف بأي من أطراف Arduino الرقمية وبرمجته لتبديل حالته ، فيمكننا الحصول على شيء كما هو موضح أدناه.
لكن بدلاً من القيام بذلك ، يمكننا استخدام هذا الطرف مع الدالة analogWrite() للتحكم في سطوع الليدات باستخدام PWM. لذلك ، يمكننا الحصول على نتيجة مثل تلك الموضحة أدناه.
في الواقع ستظل الأجزاء المرتفعة HIGH من إشارة PWM تتسبب في تعطيل الطرف OE مؤقتًا لجميع مخرجات IC. لكن هذا سيحدث ، بالطبع ، أسرع مما يمكن أن تراه أعيننا بشكل مباشر ، لكننا بالتأكيد سنشعر بوجود تباين في السطوع الكلي.
للقيام بذلك ، كل ما عليك القيام به ، هو تغيير توصيل الطرف 13 من 74HC595 . لذلك بدلاً من توصيله بالأرضى ، يمكنك توصيله بالطرف 3 من Arduino.
البرنامج التالى يقوم بإضاءة الليدات زاحد تلو الآخر حتى اضىء كلها ثم يحدث لها خفوت فى إضاءة جميع الليدات تدريجيا حتى التوقف off ويتكرر العمل .
بمجرد تحميل الكود إلى Arduino ، سترى أن الإخراج يظهر كما يلي:
إليك مشروع آخر ، يستند إلى نفس الإعداد ولكن مع اختلاف بسيط ، حيث نتعامل مع طرف تحكم آخر على IC ، أي تمكين الخرج OE وبذلك ، يمكننا التحكم في سطوع ليدات المخارج .
لقد تعلمنا بالفعل أن الطرف OE (تمكين الخرج ) يعمل بمثابة مفتاح. عندما يتم تعيين هذا الطرف على الحالة المرتفعة HIGH ، يتم تعطيل disabled أطراف الخرج (فعال فى الحالة المنخفضة أى يعمل بالمنطق السالب ، تذكر؟). وعندما يحصل الطرف OE على الجهد المنخفض ، تعمل أطراف الخرج بشكل طبيعي.
في مثالنا السابق ، قمنا بتوصيل هذا الطرف توصيل دائم بالأرضى ، مما مكّن المخارج طوال الوقت. إذا قمنا بتوصيل هذا الطرف بأي من أطراف Arduino الرقمية وبرمجته لتبديل حالته ، فيمكننا الحصول على شيء كما هو موضح أدناه.
لكن بدلاً من القيام بذلك ، يمكننا استخدام هذا الطرف مع الدالة analogWrite() للتحكم في سطوع الليدات باستخدام PWM. لذلك ، يمكننا الحصول على نتيجة مثل تلك الموضحة أدناه.
في الواقع ستظل الأجزاء المرتفعة HIGH من إشارة PWM تتسبب في تعطيل الطرف OE مؤقتًا لجميع مخرجات IC. لكن هذا سيحدث ، بالطبع ، أسرع مما يمكن أن تراه أعيننا بشكل مباشر ، لكننا بالتأكيد سنشعر بوجود تباين في السطوع الكلي.
للقيام بذلك ، كل ما عليك القيام به ، هو تغيير توصيل الطرف 13 من 74HC595 . لذلك بدلاً من توصيله بالأرضى ، يمكنك توصيله بالطرف 3 من Arduino.
البرنامج التالى يقوم بإضاءة الليدات زاحد تلو الآخر حتى اضىء كلها ثم يحدث لها خفوت فى إضاءة جميع الليدات تدريجيا حتى التوقف off ويتكرر العمل .
- الكود:
int latchPin = 5; // Latch pin of 74HC595 is connected to Digital pin 5
int clockPin = 6; // Clock pin of 74HC595 is connected to Digital pin 6
int dataPin = 4; // Data pin of 74HC595 is connected to Digital pin 4
int outputEnablePin = 3; // OE pin of 74HC595 is connected to PWM pin 3
byte leds = 0; // Variable to hold the pattern of which LEDs are currently turned on or off
/*
* setup() - this function runs once when you turn your Arduino on
* We initialize the serial connection with the computer
*/
void setup()
{
// Set all the pins of 74HC595 as OUTPUT
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(outputEnablePin, OUTPUT);
}
/*
* loop() - this function runs over and over again
*/
void loop()
{
setBrightness(255);
leds = 0; // Initially turns all the LEDs off, by giving the variable 'leds' the value 0
updateShiftRegister();
delay(500);
for (int i = 0; i < 8; i++) // Turn all the LEDs ON one by one.
{
bitSet(leds, i); // Set the bit that controls that LED in the variable 'leds'
updateShiftRegister();
delay(500);
}
for (byte b = 255; b > 0; b--) // Gradually fade all the LEDs back to off
{
setBrightness(b);
delay(50);
}
}
/*
* updateShiftRegister() - This function sets the latchPin to low, then calls the Arduino function 'shiftOut' to shift out contents of variable 'leds' in the shift register before putting the 'latchPin' high again.
*/
void updateShiftRegister()
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, leds);
digitalWrite(latchPin, HIGH);
}
/*
* setBrightness() - Generates PWM signal and writes it to OE pin.
*/
void setBrightness(byte brightness) // 0 to 255
{
analogWrite(outputEnablePin, 255-brightness);
}
بمجرد تحميل الكود إلى Arduino ، سترى أن الإخراج يظهر كما يلي:
رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects
الدالة shiftOut() :
الوصف :
تنقل (تزحزح) Shift out بيانات بايت Byte ، بت Bit واحد في كل مرة. تبدأ من إما البت الأقصى أهمية MSB (أي أقصى اليسار) أوالبت الأدنى أهمية LSB (أقصى اليمين) . تتم كتابة كل بت فى دورها إلى طرف البيانات data pin ، وبعد ذلك يتم تفعيل طرف الساعة clock pin (يتم رفعه high ، ثم خفضه low) للإشارة إلى توفر البت.
ملاحظة - إذا كنت تتفاعل مع جهاز تزامنه (ساعته) بواسطة حواف صاعدة ، فستحتاج إلى التأكد من خفض طرف الساعة قبل استدعاء الدالة shiftOut() ، على سبيل المثال باستدعاء الدالة digitalWrite(clockPin, LOW) .
الصيغة :
البارامترات :
البارامتر dataPin : الطرف pinالذى سوف يتم عليه إخراج كل بت ( نوع int).
البارامتر clockPin : الطرف يتم تبديله بمجرد تعيين طرف البيانات dataPin إلى القيمة الصحيحة (نوع int ) .
البارامتر bitOrder : ترتيب البتات المزاحة ، وهى إما "البت الأقصى أهمية أولا" MSBFIRST أو " البت الأدنى أهمية أولا" LSBFIRST .
البارامتر value : البيانات المراد إزاحتها (بايت byte ) .
العائد :
لا شىء .
مثال1 : إنشاء عداد رقمى ثنائى من 0 إلى 255 باستخدام 8 ليدات ، باستخدام مسجل إزاحة واحد لتوسعة مخارج الاردوينو
الدائرة الكهربية :
يجب بالفعل تهيئة (تكوين) كل من dataPin و clockPin كمخارج بواسطة استدعاء الدالة pinMode() .
تتم كتابة الدالة shiftOut لإخراج 1 بايت (8 بت) ، لذلك إخراج قيم أكبر من 255 يتطلب عملية من خطوتين (مرتين) ، كما يلى :
الوصف :
تنقل (تزحزح) Shift out بيانات بايت Byte ، بت Bit واحد في كل مرة. تبدأ من إما البت الأقصى أهمية MSB (أي أقصى اليسار) أوالبت الأدنى أهمية LSB (أقصى اليمين) . تتم كتابة كل بت فى دورها إلى طرف البيانات data pin ، وبعد ذلك يتم تفعيل طرف الساعة clock pin (يتم رفعه high ، ثم خفضه low) للإشارة إلى توفر البت.
ملاحظة - إذا كنت تتفاعل مع جهاز تزامنه (ساعته) بواسطة حواف صاعدة ، فستحتاج إلى التأكد من خفض طرف الساعة قبل استدعاء الدالة shiftOut() ، على سبيل المثال باستدعاء الدالة digitalWrite(clockPin, LOW) .
الصيغة :
- الكود:
shiftOut(dataPin, clockPin, bitOrder, value)
البارامترات :
البارامتر dataPin : الطرف pinالذى سوف يتم عليه إخراج كل بت ( نوع int).
البارامتر clockPin : الطرف يتم تبديله بمجرد تعيين طرف البيانات dataPin إلى القيمة الصحيحة (نوع int ) .
البارامتر bitOrder : ترتيب البتات المزاحة ، وهى إما "البت الأقصى أهمية أولا" MSBFIRST أو " البت الأدنى أهمية أولا" LSBFIRST .
البارامتر value : البيانات المراد إزاحتها (بايت byte ) .
العائد :
لا شىء .
مثال1 : إنشاء عداد رقمى ثنائى من 0 إلى 255 باستخدام 8 ليدات ، باستخدام مسجل إزاحة واحد لتوسعة مخارج الاردوينو
الدائرة الكهربية :
- الكود:
//**************************************************************//
// Name : shiftOutCode, Hello World //
// Notes : Code for using a 74HC595 Shift Register //
// : to count from 0 to 255 //
//****************************************************************
//Pin connected to ST_CP of 74HC595
int latchPin = 8;
//Pin connected to SH_CP of 74HC595
int clockPin = 12;
////Pin connected to DS of 74HC595
int dataPin = 11;
void setup() {
//set pins to output because they are addressed in the main loop
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
void loop() {
//count up routine
for (int j = 0; j < 256; j++) {
//ground latchPin and hold low for as long as you are transmitting
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, j);
//return the latch pin high to signal chip that it
//no longer needs to listen for information
digitalWrite(latchPin, HIGH);
delay(1000);
}
}
يجب بالفعل تهيئة (تكوين) كل من dataPin و clockPin كمخارج بواسطة استدعاء الدالة pinMode() .
تتم كتابة الدالة shiftOut لإخراج 1 بايت (8 بت) ، لذلك إخراج قيم أكبر من 255 يتطلب عملية من خطوتين (مرتين) ، كما يلى :
- الكود:
// Do this for MSBFIRST serial
int data = 500;
// shift out highbyte
shiftOut(dataPin, clock, MSBFIRST, (data >> 8));
// shift out lowbyte
shiftOut(dataPin, clock, MSBFIRST, data);
// Or do this for LSBFIRST serial
data = 500;
// shift out lowbyte
shiftOut(dataPin, clock, LSBFIRST, data);
// shift out highbyte
shiftOut(dataPin, clock, LSBFIRST, (data >> 8));
رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects
إضاءة متتابعة فى الاتجاهين 8 ليد :
يوضح هذا المثال كيفية تشغيل 74HC595 واحد باستخدام مخارج لتشغيل ليدات ، إضاءة ليد تلو الآخر . يتم التحكم في اتجاه التشغيل من خلال المتغير dir بينما يتم تعيين القيمة الفعلية إلى المتغير d. إذا تم اكتشاف بت مرتفعة high في أي من طرفي البايت عندئذ يتم تغيير الاتجاه. وبهذه الطريقة ، يتم السير يسارًا ويمينًا عبر البايت. بعد كل إزاحة يتم إخراج القيمة إلى 74HC595 باستخدام الدالة shiftOut ، و MSB أولاً.
ملاحظة: تعمل الدالة shiftOut على بايت واحد فقط.
إضاءة متتابعة فى الاتجاهين 16 ليد :
هذا المثال لبرنامج يوسع المثال السابق لتشغيل اثنين 74HC595 لإنشاء مسجل إزاحة 16 بت واستخدام المخارج لتشغيل ليدات . مرة أخرى ، يتم إنشاء مسير خطوة ، لكن في هذه المرة يستخدم الكود عددًا صحيحًا بدون إشارة unsigned integer لتخزين القيمة التي تتيح 16 بت من المخارج . لاحظ كيف يجب استخدام الدالة shiftOut مرتين لإخراج قيمة 16 بت (والتي يجب أيضًا تقسيمها إلى قطعتين باستخدام إزاحة البت bit shifting لأن shiftOut لا يمكنه التعامل إلا مع 8 بتات من البيانات في كل مرة).
مسجل إزاحة 32 بت لتشغيل 16 ليد إضاءة متتابعة وتشغيل 2 سفن سيجمنت لعرض الأرقام من 0 إلى 99 :
هذا المثال لبرنامج يوسعالمثال السابق مع الحفاظ على التشغيل الأصلي ولكنه أيضا يقود وحدتى عرض سفن سيجمنت . وحدات العرض السفن سيجمنت هي مجرد ترتيبات (تنسيق) لليدات يتم استخدامها لعرض الأرقام. في الداتا شيت ، يتم تعيين حرف لكل ؛ هذه الأحرف هى "a" إلى "g" و "dp" (للفاصلة العشرية). لتسهيل عملية الترميز ، من الأفضل تعيين 'a'-'g' إلى b0-b6 من المخارج وتعيين dp إلى الخرج b7.
في هذا المثال ، يتم الاحتفاظ السير خطوة كما كان من قبل ولكن الآن يتم مزيد من إستدعاء دالة إزاحة 8 بت shiftOut . لاحظ كيف يتم إزاحة كل شيء بشكل صحيح للوصول إلى أدنى 8 بت من أجل الدالة shiftOut.
ملحوظة :
حتى بالنسبة إلى 32 خرج (أو أكثر) ، لا تزال بحاجة إلى 3 أطراف تحكم فقط!
يوضح هذا المثال كيفية تشغيل 74HC595 واحد باستخدام مخارج لتشغيل ليدات ، إضاءة ليد تلو الآخر . يتم التحكم في اتجاه التشغيل من خلال المتغير dir بينما يتم تعيين القيمة الفعلية إلى المتغير d. إذا تم اكتشاف بت مرتفعة high في أي من طرفي البايت عندئذ يتم تغيير الاتجاه. وبهذه الطريقة ، يتم السير يسارًا ويمينًا عبر البايت. بعد كل إزاحة يتم إخراج القيمة إلى 74HC595 باستخدام الدالة shiftOut ، و MSB أولاً.
ملاحظة: تعمل الدالة shiftOut على بايت واحد فقط.
- الكود:
// Demonstration code for 74HC595 8 bit output
int RCLKPin = 3; // pin 12 on the 74hc595 latch ST_CP
int SRCLKPin = 6; // pin 11 on the 74hc595 shift register clock – SH_CP
int SERPin = 4; // pin 14 on the 74hc595 data - DS
unsigned int d; // Data to be sent to the shift reg.
int dir =0; // Direction of walking.
void setup() {
pinMode(RCLKPin, OUTPUT); // Set 595 control PIN sto output.
pinMode(SRCLKPin, OUTPUT);
pinMode(SERPin, OUTPUT);
d=1;
}
void loop() {
delay(100);
digitalWrite(RCLKPin, LOW);//Latch Low
shiftOut(SERPin, SRCLKPin, MSBFIRST, 0x00ff & d);//Shift Out
digitalWrite(RCLKPin, HIGH);//Latch High
if (!dir) d<<=1; else d>>=1; // Shift
if (d&0x80) dir=1; // Set direction.
if (d&0x01) dir=0;
}
إضاءة متتابعة فى الاتجاهين 16 ليد :
هذا المثال لبرنامج يوسع المثال السابق لتشغيل اثنين 74HC595 لإنشاء مسجل إزاحة 16 بت واستخدام المخارج لتشغيل ليدات . مرة أخرى ، يتم إنشاء مسير خطوة ، لكن في هذه المرة يستخدم الكود عددًا صحيحًا بدون إشارة unsigned integer لتخزين القيمة التي تتيح 16 بت من المخارج . لاحظ كيف يجب استخدام الدالة shiftOut مرتين لإخراج قيمة 16 بت (والتي يجب أيضًا تقسيمها إلى قطعتين باستخدام إزاحة البت bit shifting لأن shiftOut لا يمكنه التعامل إلا مع 8 بتات من البيانات في كل مرة).
- الكود:
// Demonstration code for 74HC595 16 bit output
int RCLKPin = 3; // pin 12 on the 74hc595 latch - nSS
int SRCLKPin = 6; // pin 11 on the 74hc595 shift register clock - SCK
int SERPin = 4; // pin 14 on the 74hc595 data - MOSI
unsigned int d; // Data to be sent to the shift reg.
int dir =0; // Direction of walking 1.
void setup() {
pinMode(RCLKPin, OUTPUT); // Set 595 control PIN sto output.
pinMode(SRCLKPin, OUTPUT);
pinMode(SERPin, OUTPUT);
d=1;
}
void loop() {
delay(100);
digitalWrite(RCLKPin, LOW);
shiftOut(SERPin, SRCLKPin, MSBFIRST, (0xff00 & d)>>8); // shift out high byte
shiftOut(SERPin, SRCLKPin, MSBFIRST, 0x00ff & d); // shift out low byte
digitalWrite(RCLKPin, HIGH);
if (!dir) d<<=1; else d>>=1; // Shift
if (d&0x8000) dir=1; // Set direction.
if (d&0x0001) dir=0;
}
مسجل إزاحة 32 بت لتشغيل 16 ليد إضاءة متتابعة وتشغيل 2 سفن سيجمنت لعرض الأرقام من 0 إلى 99 :
هذا المثال لبرنامج يوسعالمثال السابق مع الحفاظ على التشغيل الأصلي ولكنه أيضا يقود وحدتى عرض سفن سيجمنت . وحدات العرض السفن سيجمنت هي مجرد ترتيبات (تنسيق) لليدات يتم استخدامها لعرض الأرقام. في الداتا شيت ، يتم تعيين حرف لكل ؛ هذه الأحرف هى "a" إلى "g" و "dp" (للفاصلة العشرية). لتسهيل عملية الترميز ، من الأفضل تعيين 'a'-'g' إلى b0-b6 من المخارج وتعيين dp إلى الخرج b7.
في هذا المثال ، يتم الاحتفاظ السير خطوة كما كان من قبل ولكن الآن يتم مزيد من إستدعاء دالة إزاحة 8 بت shiftOut . لاحظ كيف يتم إزاحة كل شيء بشكل صحيح للوصول إلى أدنى 8 بت من أجل الدالة shiftOut.
ملحوظة :
حتى بالنسبة إلى 32 خرج (أو أكثر) ، لا تزال بحاجة إلى 3 أطراف تحكم فقط!
- الكود:
// Demonstration code for 74HC595 16 bit output and 2x7 segment displays
int RCLKPin = 3; // pin 12 on the 74hc595 latch - nSS
int SRCLKPin = 6; // pin 11 on the 74hc595 shift register clock - SCK
int SERPin = 4; // pin 14 on the 74hc595 data - MOSI
unsigned long d; // Data to be sent to the shift reg.
int dir,num; // Direction of walking 1, output number.
// Define an array to translate number to 7segment
char segment[10] = { // segment bit pos: dp g f e d c b a
0x3f, // zero
0x06, // one
0x5b, // two
0x4f, // three
0x66, // four
0x6d, // five
0x7c, // six
0x07, // seven
0x7f, // eight
0x67 // nine
};
void setup() {
pinMode(RCLKPin, OUTPUT); // Set 595 control PINs to output.
pinMode(SRCLKPin, OUTPUT);
pinMode(SERPin, OUTPUT);
d=1;
num = 0;
}
void loop() {
unsigned char lnum,rnum;
if(num++>99) num=0;
lnum = num / 10;
rnum = num % 10;
digitalWrite(RCLKPin, LOW);
shiftOut(SERPin, SRCLKPin, MSBFIRST, segment[lnum]);
shiftOut(SERPin, SRCLKPin, MSBFIRST, segment[rnum]);
shiftOut(SERPin, SRCLKPin, MSBFIRST, (0xff00 & d)>>8);
shiftOut(SERPin, SRCLKPin, MSBFIRST, 0x00ff & d);
digitalWrite(RCLKPin, HIGH);
if (!dir) d<<=1; else d>>=1; // Shift
if (d&0x8000) dir=1; // Set direction.
if (d&0x1) dir=0;
delay(200);
}
رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects
وحدات العرض (شاشة) السفن سيجمنت (الشرائح السبعة) Seven Segment وربطها مع الاردوينو :
كم مرة شاهدت فيلمًا يحتاج فيه شخص ما لإيقاف عمل قنبلة؟ يشاهد البطل الشاشة والوقت يمر ، وكل ثانية تمر تكون أكثر قيمة من السابقة. حسنًا ، إذا لاحظت ، إن كل تلك القنابل في الأفلام بها شاشات عرض من سبعة شرائح seven-segment . يجب أن تكون موجودة ، وإلا ، كيف يمكن للبطل أن يعرف كم من الوقت بقي؟
ربما لا تبدو شاشات العرض المكونة من سبعة شرائح حديثة بدرجة كافية بالنسبة لك ، ولكنها أكثر الطرق عملية لعرض الأرقام. إنها سهلة الاستخدام وفعالة من حيث التكلفة وقابلة للقراءة للغاية ، سواء في ظروف الإضاءة المحدودة أو في ضوء الشمس القوي.
مثال على العالم الحقيقي الذي يستخدم شاشة العرض المكونة من سبعة شرائح هو ساعة العد التنازلي الشهيرة في كيب كانافيرال بولاية فلوريدا التي استخدمتها ناسا لإطلاق أبولو.
نظرة عامة على الأجهزة (الهاردوير) :
دعنا نناقش بإيجاز خصائص ووظائف شاشة العرض المكونة من 7 شرائح قبل توصيلها بأردوينو.
إن شاشات العرض المكونة من 7 شرائح هي في الحقيقة سبعة ليدات LED مصفوفة بنمط معين. في هذه الحالة ، شكل الرقم "8" الذي نعرفه جميعًا. يُطلق على كل ليد من الليدات السبعة مقطع أو شريحة segment لأنه عند إضاءة الشريحة فإنها تشكل جزءًا من رقم رقمي (عشري أو سداسى عشرى على حد سواء) ليتم عرضها. أحيانًا يتم استخدام ليد إضافي لبيان العلامة العشرية.
يتم منح كل واحد من الليدات السبعة في الشاشة شريحة موضعية مع إخراج أحد أطراف التوصيل الخاصة بها مباشرة من العبوة البلاستيكية المستطيلة. يتم تمييز (تسمية) أطراف الليد الفردية هذه من a إلى g لتمثل كل ليد بشكل فردي. يتم توصيل أطراف الليد معًا لتشكيل الطرف المشترك.
لتشغيل وإيقاف جزء معين من الشاشة ، يمكنك تعيين الطرف المناسب على الحالة المرتفعة HIGH أو الحالة المنخفضة LOW تمامًا كما تفعل مع الليد العادى . لذلك تكون بعض الشرائح مضاءة والبعض الآخر سيكون مظلمًا مما يسمح بنمط الأحرف المرغوب في الرقم الذي سيتم إنشاؤه على الشاشة. هذا يسمح لنا بعد ذلك بعرض كل من العشرة أرقام العشرية من 0 إلى 9 على نفس شاشة السبعة شرائح.
أطراف شاشة السفن سيجمنت :
الآن ، دعنا ننتقل إلى تهيئة الشريحة حتى نعرف أي الأطراف تضيء أي الشرائح . الشكل التالى يبين أطراف شاشة السفن سيجمنت :
• الأطراف a-g & DP ، من بين 10 أطراف ، الثمانى أطراف a, b, c, d, e, f, g و DP (النقطة العشرية decimal point ) تتصل داخليا بشرائح العرض وتتصل خارجيا بالأطراف الرقمية للاردوينو . عن طريق التحكم بكل ليد على شريحة يمكن عرض الأرقام .
• الأطراف COM (المشتركة Common ) هى الأطراف 3 و 8 ، متصلة داخليا لتشكيل الطرف المشترك . هذا الطرف يجب أن يتصل بالارضى GND ( الكاثود المشترك) أو بالجهد 5V (الأنود المشترك) بناء على نوع الشاشة .
الكاثود المشترك (CC) مقابل الأنود المشترك (CA) :
شاشات السفن سيجمنت نوعين: الكاثود المشترك (CC) والأنود المشترك (CA). البناء الداخلي لكلا النوعين هو نفسه تقريبا. الفرق هو قطبية الليدات والطرف المشترك. كما يوحي اسمها ، فإن الكاثود المشترك يحتوي على جميع الكاثودات الخاصة بالليدات في الشرائح السبعة متصلة ببعضها البعض ، ويحتوي الأنود المشترك على جميع أنودات الليدات بالشرائح السبعة متصلة ببعضها البعض.
في شاشة الكاثود المشترك ، يتم توصيل جميع وصلات الكاثود لشرائح الليدات إلى "المنطق 0" / GND. يتم بعد ذلك إضاءة الشرائح الفردية عن طريق تطبيق إشارة مرتفعة HIGH / 'المنطق 1' على أطراف الأنود الفردية (a-g).
Common Cathode 7 Segment Working
في شاشة الأنود المشترك ، يتم توصيل جميع وصلات الأنود لشرائح الليدات بالمنطق "1" HIGH . يتم إضاءة الشرائح الفردية عن طريق تطبيق إشارة الأرضى ،أى المنطق "0" أو "LOW" على الكاثود الخاص بشريحة معينة (a-g).
Common Anode 7 Segment Working
ملحوظة
بشكل عام ، تعد شاشات الأنود المشترك أكثر شيوعًا نظرًا لأن العديد من الدوائر المنطقية يمكن أن تعمل كمصب sink لتيار أكثر من عملها كمصدر للتيار source .
لاحظ أيضًا أن شاشة الكاثود المشترك ليست بديلاً مباشرًا في الدائرة لشاشة الأنود المشترك والعكس صحيح ، حيث إنها تشبه توصيل الليدات في الاتجاه المعاكس ، وبالتالي لن يحدث انبعاث للضوء.
كيف تعمل شاشة السفن سيجمنت ؟
اعتمادًا على الرقم العشري الذي سيتم عرضه ، يتم إضاءة مجموعة معينة من الليدات LEDs. على سبيل المثال ، لعرض الرقم العددى 4 ، سوف نحتاج إلى إضاءة أربعة من شرائح الليدات المقابلة وهى b و c و f و g. وبالتالي ، يمكن عرض الأرقام المختلفة من "0 إلى 9" والأحرف من "A إلى F" باستخدام شاشة السبعة شرائح كما هو موضح أدناه.
يظهر جدول الحقيقة أدناه الشرائح الفردية التي تحتاج إلى إضاءة من أجل إنتاج أرقام وأحرف. يرجى ملاحظة أن جدول الحقيقة لشاشة الانود المشترك عكس تمامًا مع شاشة الكاثود المشترك.
كم مرة شاهدت فيلمًا يحتاج فيه شخص ما لإيقاف عمل قنبلة؟ يشاهد البطل الشاشة والوقت يمر ، وكل ثانية تمر تكون أكثر قيمة من السابقة. حسنًا ، إذا لاحظت ، إن كل تلك القنابل في الأفلام بها شاشات عرض من سبعة شرائح seven-segment . يجب أن تكون موجودة ، وإلا ، كيف يمكن للبطل أن يعرف كم من الوقت بقي؟
ربما لا تبدو شاشات العرض المكونة من سبعة شرائح حديثة بدرجة كافية بالنسبة لك ، ولكنها أكثر الطرق عملية لعرض الأرقام. إنها سهلة الاستخدام وفعالة من حيث التكلفة وقابلة للقراءة للغاية ، سواء في ظروف الإضاءة المحدودة أو في ضوء الشمس القوي.
مثال على العالم الحقيقي الذي يستخدم شاشة العرض المكونة من سبعة شرائح هو ساعة العد التنازلي الشهيرة في كيب كانافيرال بولاية فلوريدا التي استخدمتها ناسا لإطلاق أبولو.
نظرة عامة على الأجهزة (الهاردوير) :
دعنا نناقش بإيجاز خصائص ووظائف شاشة العرض المكونة من 7 شرائح قبل توصيلها بأردوينو.
إن شاشات العرض المكونة من 7 شرائح هي في الحقيقة سبعة ليدات LED مصفوفة بنمط معين. في هذه الحالة ، شكل الرقم "8" الذي نعرفه جميعًا. يُطلق على كل ليد من الليدات السبعة مقطع أو شريحة segment لأنه عند إضاءة الشريحة فإنها تشكل جزءًا من رقم رقمي (عشري أو سداسى عشرى على حد سواء) ليتم عرضها. أحيانًا يتم استخدام ليد إضافي لبيان العلامة العشرية.
يتم منح كل واحد من الليدات السبعة في الشاشة شريحة موضعية مع إخراج أحد أطراف التوصيل الخاصة بها مباشرة من العبوة البلاستيكية المستطيلة. يتم تمييز (تسمية) أطراف الليد الفردية هذه من a إلى g لتمثل كل ليد بشكل فردي. يتم توصيل أطراف الليد معًا لتشكيل الطرف المشترك.
لتشغيل وإيقاف جزء معين من الشاشة ، يمكنك تعيين الطرف المناسب على الحالة المرتفعة HIGH أو الحالة المنخفضة LOW تمامًا كما تفعل مع الليد العادى . لذلك تكون بعض الشرائح مضاءة والبعض الآخر سيكون مظلمًا مما يسمح بنمط الأحرف المرغوب في الرقم الذي سيتم إنشاؤه على الشاشة. هذا يسمح لنا بعد ذلك بعرض كل من العشرة أرقام العشرية من 0 إلى 9 على نفس شاشة السبعة شرائح.
أطراف شاشة السفن سيجمنت :
الآن ، دعنا ننتقل إلى تهيئة الشريحة حتى نعرف أي الأطراف تضيء أي الشرائح . الشكل التالى يبين أطراف شاشة السفن سيجمنت :
• الأطراف a-g & DP ، من بين 10 أطراف ، الثمانى أطراف a, b, c, d, e, f, g و DP (النقطة العشرية decimal point ) تتصل داخليا بشرائح العرض وتتصل خارجيا بالأطراف الرقمية للاردوينو . عن طريق التحكم بكل ليد على شريحة يمكن عرض الأرقام .
• الأطراف COM (المشتركة Common ) هى الأطراف 3 و 8 ، متصلة داخليا لتشكيل الطرف المشترك . هذا الطرف يجب أن يتصل بالارضى GND ( الكاثود المشترك) أو بالجهد 5V (الأنود المشترك) بناء على نوع الشاشة .
الكاثود المشترك (CC) مقابل الأنود المشترك (CA) :
شاشات السفن سيجمنت نوعين: الكاثود المشترك (CC) والأنود المشترك (CA). البناء الداخلي لكلا النوعين هو نفسه تقريبا. الفرق هو قطبية الليدات والطرف المشترك. كما يوحي اسمها ، فإن الكاثود المشترك يحتوي على جميع الكاثودات الخاصة بالليدات في الشرائح السبعة متصلة ببعضها البعض ، ويحتوي الأنود المشترك على جميع أنودات الليدات بالشرائح السبعة متصلة ببعضها البعض.
في شاشة الكاثود المشترك ، يتم توصيل جميع وصلات الكاثود لشرائح الليدات إلى "المنطق 0" / GND. يتم بعد ذلك إضاءة الشرائح الفردية عن طريق تطبيق إشارة مرتفعة HIGH / 'المنطق 1' على أطراف الأنود الفردية (a-g).
Common Cathode 7 Segment Working
في شاشة الأنود المشترك ، يتم توصيل جميع وصلات الأنود لشرائح الليدات بالمنطق "1" HIGH . يتم إضاءة الشرائح الفردية عن طريق تطبيق إشارة الأرضى ،أى المنطق "0" أو "LOW" على الكاثود الخاص بشريحة معينة (a-g).
Common Anode 7 Segment Working
ملحوظة
بشكل عام ، تعد شاشات الأنود المشترك أكثر شيوعًا نظرًا لأن العديد من الدوائر المنطقية يمكن أن تعمل كمصب sink لتيار أكثر من عملها كمصدر للتيار source .
لاحظ أيضًا أن شاشة الكاثود المشترك ليست بديلاً مباشرًا في الدائرة لشاشة الأنود المشترك والعكس صحيح ، حيث إنها تشبه توصيل الليدات في الاتجاه المعاكس ، وبالتالي لن يحدث انبعاث للضوء.
كيف تعمل شاشة السفن سيجمنت ؟
اعتمادًا على الرقم العشري الذي سيتم عرضه ، يتم إضاءة مجموعة معينة من الليدات LEDs. على سبيل المثال ، لعرض الرقم العددى 4 ، سوف نحتاج إلى إضاءة أربعة من شرائح الليدات المقابلة وهى b و c و f و g. وبالتالي ، يمكن عرض الأرقام المختلفة من "0 إلى 9" والأحرف من "A إلى F" باستخدام شاشة السبعة شرائح كما هو موضح أدناه.
يظهر جدول الحقيقة أدناه الشرائح الفردية التي تحتاج إلى إضاءة من أجل إنتاج أرقام وأحرف. يرجى ملاحظة أن جدول الحقيقة لشاشة الانود المشترك عكس تمامًا مع شاشة الكاثود المشترك.
رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects
شاشات السفن سيجمنت 7 segment المتعددة الوحدات وطريقة الانتخاب من لمتعدد Multiplexing
هنا ، سنتعلم كيفية تعامل شاشات العرض السفن سيجمنت (الشرائح السبعة) 7 segment (الكاثود المشترك والأنود المشترك) مع Arduino ومفهوم استخدام الانتخاب من المتعدد multiplexing . سوف نتعلم كيفية التعامل مع (ربط) شاشة مكونة من واحد إلى أربعة أرقام مع اردوينو.
ما هى تقنية الانتخاب من المتعدد Multiplexing فى وحدات السفن سيجمنت ؟
الانتخاب من المتعدد Multiplexing هى تقنية يتم فيها تمرير إشارات بيانات مختلفة عبر مسار مشترك أو مجموعة مشتركة من الأسلاك (تسمى الناقل bus) والتي يتم مشاركتها مع وجهات destinations مختلفة.
على سبيل المثال: دعنا نفترض أن لدينا الأجهزة A و B و C وهذه الأجهزة تكون أي أجهزة اتصال وأن A و B و C تحتاج إلى 5 أسلاك لكل منها لنقل البيانات data . الآن بدلاً من الأسلاك 5 + 5 + 5 = 15 ، سوف نقوم بتوصيل 5 أسلاك فقط لجميع الأجهزة الثلاثة. الآن قد تتساءل حيث أن الأجهزة بأكملها تشترك في نفس الأسلاك الخمسة ، كيف يمكننا منع تدفق البيانات الخاطئ من دخول الأجهزة الخطأ؟ سؤال جيد ، يتم معالجة هذه المشكلة عن طريق "خطوط الإختيار أو الانتخاب " “select lines” .
خطوط الاختيار Select Lines :
خطوط الاختيار "Select Lines" هي الأسلاك التي تمكّن enable أو تعطل disable الاتصال بالأجهزة بشكل فردى (كل على حدة)، نظرًا لأن لدينا 3 أجهزة هنا ، سيكون لدينا 3 خطوط اختيار . عند اختيار الجهاز "A" ، يتم تعطيل الجهاز B و C ، وسنرسل دفق البيانات عبر 5 أسلاك تصل إلى الجهاز المستهدف "A" فى حين أن الأجهزة B و C ستتجاهل دفق البيانات. بالمثل ، عند اختيار الجهاز "B" ، يتم الآن تعطيل “A” و “C” ، وسيتجاهل "A" و "C" دفق البيانات الوارد.
لذلك نحن بحاجة فقط إلى 5 أسلاك (بيانات data ) + 3 أسلاك (اختيار select ) = 8 أسلاك بدلاً من 15 سلكًا.
يتم تطبيق نفس المفهوم تماما على وحدات العرض السفن سيجمنت المتعددة الوحدات . يوجد أدناه رسم تخطيطي لأربع وحدات سفن سيجمنت والتى تستخدم نظام الانتخاب :
تحتوي كل شاشة عرض سفن سيجمنت على 8 خطوط بيانات (A ، B ، C ، D ، E ، F ، G و نقطة عشرية decimal point) والتي تضيء 8 ليدات فردية ، لعرض أربعة أرقام نحتاج 8 x 4 = 32 سلك عند عدم استخدام الانتخاب .
يتضمن انتخاب السفن سيجمنت توصيل كل الشرائح المتماثلة معًا كما هو موضح في الرسم التخطيطي. خطوط الاختيار(الانتخاب) هي الأطراف المشتركة لكل وحدة على حدة . الآن انخفض عدد الأسلاك إلى 8 (خطوط بيانات) + 4 (خطوط اختيار ) = 12 سلكًا بدلاً من 32 سلكًا.
كيف يتم عمل الانتخاب فى وحدات السفن سيجمنت ؟
لنفترض أننا نريد عرض العدد "9867" على شاشة مكونة من 4 أرقام ، لفعل ذلك يقوم المتحكم الدقيق بتطبيق إشارة LOW (على طرف الكاثود المشترك ) لوحدة الرقم الأول (من اليسار) وتطبيق إشارات +Ve على كل شريحة على حدة لإضاءة الليدات لإظهار الرقم " 9 "، بعد بضع ميلي ثانية ، يتوقف عن تطبيق إشارة LOW على الرقم الأول ويطبق إشارة LOW على الرقم الثاني ويطبق أيضًا إشارات +Ve على كل شريحة على حدة لإظهار الرقم" 8 " وبشكل مماثل بالنسبة إلى الرقم الثالث لإظهار الرقم" 6 "والرقم الرابع لإظهار "7" وتكرر الدورة.
أحد الأشياء المهمة الجديرة بالملاحظة هو أنه في أي لحظة معيّنة يضيء رقم واحد فقط وتبقى الأرقام الثلاثة مغلقة OFF ، ولكن نتيجة لظاهرة "استمرارية الرؤية persistence of vision " ، سنرى أن جميع الأرقام الأربعة مضاءة في وقت واحد كما هو موضح بالشكل أدناه .
إذا كنت لا ترغب في توصيل 4 شاشات عرض سفن سيجمنت بأسلاك كما هو موضح أعلاه ، فيمكنك شراء شاشة عرض مكونة من 4 أرقام سفن سيجمنت كما هو موضح أدناه:
هنا ، سنتعلم كيفية تعامل شاشات العرض السفن سيجمنت (الشرائح السبعة) 7 segment (الكاثود المشترك والأنود المشترك) مع Arduino ومفهوم استخدام الانتخاب من المتعدد multiplexing . سوف نتعلم كيفية التعامل مع (ربط) شاشة مكونة من واحد إلى أربعة أرقام مع اردوينو.
ما هى تقنية الانتخاب من المتعدد Multiplexing فى وحدات السفن سيجمنت ؟
الانتخاب من المتعدد Multiplexing هى تقنية يتم فيها تمرير إشارات بيانات مختلفة عبر مسار مشترك أو مجموعة مشتركة من الأسلاك (تسمى الناقل bus) والتي يتم مشاركتها مع وجهات destinations مختلفة.
على سبيل المثال: دعنا نفترض أن لدينا الأجهزة A و B و C وهذه الأجهزة تكون أي أجهزة اتصال وأن A و B و C تحتاج إلى 5 أسلاك لكل منها لنقل البيانات data . الآن بدلاً من الأسلاك 5 + 5 + 5 = 15 ، سوف نقوم بتوصيل 5 أسلاك فقط لجميع الأجهزة الثلاثة. الآن قد تتساءل حيث أن الأجهزة بأكملها تشترك في نفس الأسلاك الخمسة ، كيف يمكننا منع تدفق البيانات الخاطئ من دخول الأجهزة الخطأ؟ سؤال جيد ، يتم معالجة هذه المشكلة عن طريق "خطوط الإختيار أو الانتخاب " “select lines” .
خطوط الاختيار Select Lines :
خطوط الاختيار "Select Lines" هي الأسلاك التي تمكّن enable أو تعطل disable الاتصال بالأجهزة بشكل فردى (كل على حدة)، نظرًا لأن لدينا 3 أجهزة هنا ، سيكون لدينا 3 خطوط اختيار . عند اختيار الجهاز "A" ، يتم تعطيل الجهاز B و C ، وسنرسل دفق البيانات عبر 5 أسلاك تصل إلى الجهاز المستهدف "A" فى حين أن الأجهزة B و C ستتجاهل دفق البيانات. بالمثل ، عند اختيار الجهاز "B" ، يتم الآن تعطيل “A” و “C” ، وسيتجاهل "A" و "C" دفق البيانات الوارد.
لذلك نحن بحاجة فقط إلى 5 أسلاك (بيانات data ) + 3 أسلاك (اختيار select ) = 8 أسلاك بدلاً من 15 سلكًا.
يتم تطبيق نفس المفهوم تماما على وحدات العرض السفن سيجمنت المتعددة الوحدات . يوجد أدناه رسم تخطيطي لأربع وحدات سفن سيجمنت والتى تستخدم نظام الانتخاب :
تحتوي كل شاشة عرض سفن سيجمنت على 8 خطوط بيانات (A ، B ، C ، D ، E ، F ، G و نقطة عشرية decimal point) والتي تضيء 8 ليدات فردية ، لعرض أربعة أرقام نحتاج 8 x 4 = 32 سلك عند عدم استخدام الانتخاب .
يتضمن انتخاب السفن سيجمنت توصيل كل الشرائح المتماثلة معًا كما هو موضح في الرسم التخطيطي. خطوط الاختيار(الانتخاب) هي الأطراف المشتركة لكل وحدة على حدة . الآن انخفض عدد الأسلاك إلى 8 (خطوط بيانات) + 4 (خطوط اختيار ) = 12 سلكًا بدلاً من 32 سلكًا.
كيف يتم عمل الانتخاب فى وحدات السفن سيجمنت ؟
لنفترض أننا نريد عرض العدد "9867" على شاشة مكونة من 4 أرقام ، لفعل ذلك يقوم المتحكم الدقيق بتطبيق إشارة LOW (على طرف الكاثود المشترك ) لوحدة الرقم الأول (من اليسار) وتطبيق إشارات +Ve على كل شريحة على حدة لإضاءة الليدات لإظهار الرقم " 9 "، بعد بضع ميلي ثانية ، يتوقف عن تطبيق إشارة LOW على الرقم الأول ويطبق إشارة LOW على الرقم الثاني ويطبق أيضًا إشارات +Ve على كل شريحة على حدة لإظهار الرقم" 8 " وبشكل مماثل بالنسبة إلى الرقم الثالث لإظهار الرقم" 6 "والرقم الرابع لإظهار "7" وتكرر الدورة.
أحد الأشياء المهمة الجديرة بالملاحظة هو أنه في أي لحظة معيّنة يضيء رقم واحد فقط وتبقى الأرقام الثلاثة مغلقة OFF ، ولكن نتيجة لظاهرة "استمرارية الرؤية persistence of vision " ، سنرى أن جميع الأرقام الأربعة مضاءة في وقت واحد كما هو موضح بالشكل أدناه .
إذا كنت لا ترغب في توصيل 4 شاشات عرض سفن سيجمنت بأسلاك كما هو موضح أعلاه ، فيمكنك شراء شاشة عرض مكونة من 4 أرقام سفن سيجمنت كما هو موضح أدناه:
رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects
برمجة وحدة سفن سيجمنت واحدة بدون استخدام الدوال المساعدة
الدائرة الكهربية :
البرنامج :
وحدة السفن سيجمنت المستخدمة من نوع الكاثود المشترك ، لذلك يقوم الاردوينو بإرسال إشارة الحالة المرتفعة HIGH إلى أنودات السفن سجمنت لإضاءتها .
البرنامج يبدو طويل جدا ولكنه بسيط للغاية فى الفهم والغرض هو استخدام المبادىء الأولية .
الدائرة الكهربية :
البرنامج :
وحدة السفن سيجمنت المستخدمة من نوع الكاثود المشترك ، لذلك يقوم الاردوينو بإرسال إشارة الحالة المرتفعة HIGH إلى أنودات السفن سجمنت لإضاءتها .
البرنامج يبدو طويل جدا ولكنه بسيط للغاية فى الفهم والغرض هو استخدام المبادىء الأولية .
- الكود:
/*Seven Segment Display Connection
Arduino Pin Seven Segment Pin
0 => a
1 => b
2 => c
3 => d
4 => e
5 => f
6 => g
7 => dp
*/
void setup() {
pinMode(0, OUTPUT);
pinMode(1, OUTPUT);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
digitalWrite(7, 0); // Make pin "dp" off in all digit
}
void loop() {
// Display Digit '0'
digitalWrite(0, 1);
digitalWrite(1, 1);
digitalWrite(2, 1);
digitalWrite(3, 1);
digitalWrite(4, 1);
digitalWrite(5, 1);
digitalWrite(6, 0);
delay(1000);
// Display Digit '1'
digitalWrite(0, 0);
digitalWrite(1, 1);
digitalWrite(2, 1);
digitalWrite(3, 0);
digitalWrite(4, 0);
digitalWrite(5, 0);
digitalWrite(6, 0);
delay(1000);
// Display Digit '2'
digitalWrite(0, 1);
digitalWrite(1, 1);
digitalWrite(2, 0);
digitalWrite(3, 1);
digitalWrite(4, 1);
digitalWrite(5, 0);
digitalWrite(6, 1);
delay(1000);
// Display Digit '3'
digitalWrite(0, 1);
digitalWrite(1, 1);
digitalWrite(2, 1);
digitalWrite(3, 1);
digitalWrite(4, 0);
digitalWrite(5, 0);
digitalWrite(6, 1);
delay(1000);
// Display Digit '4'
digitalWrite(0, 0);
digitalWrite(1, 1);
digitalWrite(2, 1);
digitalWrite(3, 0);
digitalWrite(4, 0);
digitalWrite(5, 1);
digitalWrite(6, 1);
delay(1000);
// Display Digit '5'
digitalWrite(0, 1);
digitalWrite(1, 0);
digitalWrite(2, 1);
digitalWrite(3, 1);
digitalWrite(4, 0);
digitalWrite(5, 1);
digitalWrite(6, 1);
delay(1000);
// Display Digit '6'
digitalWrite(0, 1);
digitalWrite(1, 0);
digitalWrite(2, 1);
digitalWrite(3, 1);
digitalWrite(4, 1);
digitalWrite(5, 1);
digitalWrite(6, 1);
delay(1000);
// Display Digit '7'
digitalWrite(0, 1);
digitalWrite(1, 1);
digitalWrite(2, 1);
digitalWrite(3, 0);
digitalWrite(4, 0);
digitalWrite(5, 0);
digitalWrite(6, 0);
delay(1000);
// Display Digit '8'
digitalWrite(0, 1);
digitalWrite(1, 1);
digitalWrite(2, 1);
digitalWrite(3, 1);
digitalWrite(4, 1);
digitalWrite(5, 1);
digitalWrite(6, 1);
delay(1000);
// Display Digit '9'
digitalWrite(0, 1);
digitalWrite(1, 1);
digitalWrite(2, 1);
digitalWrite(3, 1);
digitalWrite(4, 0);
digitalWrite(5, 1);
digitalWrite(6, 1);
delay(1000);
}
رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects
تعديل بسيط للبرنامج السابق
الدائرة الكهربية :
الدائرة الكهربية :
- الكود:
// segment | Arduino board PIN number
#define A 0
#define B 1
#define C 2
#define D 3
#define E 4
#define F 5
#define G 6
#define DP 7
// functions to display digits
void digit0 () {
// for 0 needed to turn ON A B C D E F segments, so:
digitalWrite(A, HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, HIGH);
digitalWrite(F, HIGH);
//////////////////////// G segment should be turn OFF
digitalWrite(G, LOW);
}
void digit1 () {
digitalWrite(A,LOW);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, LOW);
digitalWrite(E, LOW);
digitalWrite(F, LOW);
digitalWrite(G, LOW);
}
void digit2 () {
digitalWrite(A,HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, LOW);
digitalWrite(D, HIGH);
digitalWrite(E, HIGH);
digitalWrite(F, LOW);
digitalWrite(G, HIGH);
}
void digit3 () {
digitalWrite(A,HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, LOW);
digitalWrite(F, LOW);
digitalWrite(G, HIGH);
}
void digit4 () {
digitalWrite(A,LOW);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, LOW);
digitalWrite(E, LOW);
digitalWrite(F, HIGH);
digitalWrite(G, HIGH);
}
void digit5 () {
digitalWrite(A,HIGH);
digitalWrite(B, LOW);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, LOW);
digitalWrite(F, HIGH);
digitalWrite(G, HIGH);
}
void digit6 () {
digitalWrite(A,HIGH);
digitalWrite(B, LOW);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, HIGH);
digitalWrite(F, HIGH);
digitalWrite(G, HIGH);
}
void digit7 () {
digitalWrite(A,HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, LOW);
digitalWrite(E, LOW);
digitalWrite(F, LOW);
digitalWrite(G, LOW);
}
void digit8 () {
digitalWrite(A, HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, HIGH);
digitalWrite(F, HIGH);
digitalWrite(G, HIGH);
}
void digit9 () {
digitalWrite(A, HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, LOW);
digitalWrite(F, HIGH);
digitalWrite(G, HIGH);
}
//function to display digit from inputed int
void showdigit (int digit)
{
switch (digit) {
case 0:
digit0 ();
break;
case 1:
digit1 ();
break;
case 2:
digit2 ();
break;
case 3:
digit3 ();
break;
case 4:
digit4 ();
break;
case 5:
digit5 ();
break;
case 6:
digit6 ();
break;
case 7:
digit7 ();
break;
case 8:
digit8 ();
break;
case 9:
digit9 ();
break;
default:
break;
}
}
void setup()
{
pinMode(A, OUTPUT);
pinMode(B, OUTPUT);
pinMode(C, OUTPUT);
pinMode(D, OUTPUT);
pinMode(E, OUTPUT);
pinMode(F, OUTPUT);
pinMode(G, OUTPUT);
pinMode(DP, OUTPUT);
}
void loop ()
{
for (int i=0;i<10;i++) { //counting from 0 to 9
showdigit(i);
delay (1000); // 1000ms= 1s delay
if (i%2) { digitalWrite(DP, HIGH); }
else {digitalWrite(DP, LOW); }
}
}
رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects
شاشة سفن سيجمنت متعددة ، أربعة ارقام ، وقرأة دخل تناظرى مع الاردوينو :
الدائرة الكهربية :
البرنامج يعرض قرأة الدخل التناظرى على المدخل A0 والناتج عن مقاومة متغيرة 0-5V تعادل العدد 0-1023 .
يتم استخدام شاشة مكونة من 4 وحدات سفن سيجمنت نوع الكاثود المشترك ، وأربع ترانزستورات BC547 و تستخدم مقاومات 1K من أجل تحديد تيار القاعدة ، ومقاومات 330R لتحديد التيار المار بليدات الشاشة .
فى الاردوينو تستخدم المخارج الرقمية D2-D8 لنشغيل الشرائح a-g ، كما تستخدم المخارج القمية D9-D12 من أجل الأرقام digits (D0-D3) ، كما يمكن المخرج الرقمى D13 لتشغيل النقطة العشرية DP .
الدائرة الكهربية :
البرنامج يعرض قرأة الدخل التناظرى على المدخل A0 والناتج عن مقاومة متغيرة 0-5V تعادل العدد 0-1023 .
يتم استخدام شاشة مكونة من 4 وحدات سفن سيجمنت نوع الكاثود المشترك ، وأربع ترانزستورات BC547 و تستخدم مقاومات 1K من أجل تحديد تيار القاعدة ، ومقاومات 330R لتحديد التيار المار بليدات الشاشة .
فى الاردوينو تستخدم المخارج الرقمية D2-D8 لنشغيل الشرائح a-g ، كما تستخدم المخارج القمية D9-D12 من أجل الأرقام digits (D0-D3) ، كما يمكن المخرج الرقمى D13 لتشغيل النقطة العشرية DP .
- الكود:
/*
* Arduino 4x7 LED Display
* Displays numbers ranging from 0 through 1023
* Test Code displays the value of a sensor connected to the analog input A0
*/
// bits representing segments A through G (and decimal point) for numerals 0-9
const int numeral[10] = {
//ABCDEFG /dp
B11111100, // 0
B01100000, // 1
B11011010, // 2
B11110010, // 3
B01100110, // 4
B10110110, // 5
B00111110, // 6
B11100000, // 7
B11111110, // 8
B11100110, // 9
};
// pins for decimal point and each segment
// DP,G,F,E,D,C,B,A
const int segmentPins[] = { 13,8,7,6,5,4,3,2 };
const int nbrDigits= 4; // the number of digits in the LED display
//dig 0 1 2 3
const int digitPins[nbrDigits] = { 9,10,11,12 };
void setup()
{
for(int i=0; i < 8; i++) {
pinMode(segmentPins[i], OUTPUT); // set segment and DP pins to output
}
for(int i=0; i < nbrDigits; i++) {
pinMode(digitPins[i], OUTPUT);
}
}
void loop()
{
int value = analogRead(0);
showNumber(value);
}
void showNumber( int number)
{
if(number == 0) {
showDigit( 0, nbrDigits-1) ; // display 0 in the rightmost digit
} else {
// display the value corresponding to each digit
// leftmost digit is 0, rightmost is one less than the number of places
for( int digit = nbrDigits-1; digit >= 0; digit--) {
if(number > 0) {
showDigit( number % 10, digit) ;
number = number / 10;
}
}
}
}
// Displays given number on a 7-segment display at the given digit position
void showDigit( int number, int digit)
{
digitalWrite( digitPins[digit], HIGH ); //digit on
for(int segment = 1; segment < 8; segment++) {// repeat for each bit of number
boolean isBitSet = bitRead(numeral[number], segment);
// isBitSet will be true if given bit is 1
// isBitSet = ! isBitSet; // Code Option*
// uncomment the above Code Option line for common anode display
digitalWrite( segmentPins[segment], isBitSet);
}
delay(5);
digitalWrite( digitPins[digit], LOW );//digit off
}
رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects
برمجة الاردوينو باستخدام المكتبة SevSeg :
قبل أن تتمكن من بدء كتابة التعليمات البرمجية للتحكم في شاشات العرض المكونة من 7 شرائح ، ستحتاج إلى تنصيب (تثبيت) install المكتبة SevSeg أولاً.
لتنصيب المكتبة ، افتح Arduino IDE ، انتقل إلى Sketch> Include Library> Manage Libraries… ، تظهر لك نافذة مدير المكتبة . فى حقل البحث اكتب اسم المكتبة SevSeg ، تظهر لك المكتبات المتوفرة بهذا الاسم ، انقر على Install لتنصيب المكتبة تجهيزا لاستخدامها فى برامجك . حدد Sketch> Include Library وستجد أنها قد أصيفت إلى المكتبات المضمنة .
المكتبة SevSeg :
تحول هذه المكتبة الاردوينو Arduino إلى وحدة تحكم فى شاشة السفن سيجمنت . فهى تستخدم لعرض الأرقام numbers بسهولة على شاشة العرض السفن سيجمنت دون أي وحدات تحكم إضافية.
وهى تدعم نوع الكاثود المشترك ونوع الأنود المشترك ، وتستخدم الترانزستورات كمفاتيح . يمكن عرض الأرقام في التمثيل العشري أو السداسي عشر ، مع العلامة العشرية. يمكن عرض الأحرف (بأكبر قدر ممكن من الدقة). كما تدعم الشاشات المتعددة ، بأبعادها المختلفة. لا تدعم مسجلات الإزاحة Shift registers والأجهزة المماثلة.
الأجهزة (الهاردوير) Hardware :
أطراف شاشة السفن سيجمنت :
يجب أن تحتوى الشاشة :
• "أطراف الأرقام " Digit Pins : طرف لكل رقم . وهى "الأطراف المشتركة" . فهى سوف تكون الكاثودات (الأطراف السالبة) للشاشات نوع الكاثود المشترك ، أو الأنودات (الأطراف الموجبة ) للشاشات نوع الأنود المشترك .
• أطراف الثمانية شرائح 8 Segment Pins : طرف لكل شريحة بالإضافة إلى النقطة العشرية .
توصيلات الأردوينو :
يمكن توصيل جميع أطراف الأرقام وأطراف الشريحة بأي من أطراف الاردوينو Arduino الرقمية ، أو الأطراف التناظرية مع الدعم الرقمي .
مقاومات تحديد التيار Current-limiting resistors :
لا تنس أن الشاشة تستخدم ليدات LED ، لذلك يجب عليك استخدام مقاومات الحد من التيار على التوالى مع أطراف"الارقام" digit pins . استخدام 330 أوم هي قيمة آمنة إذا كنت غير متأكد. إذا كنت تستخدم مقاومات لتحديد التيار على أطراف الشرائح بدلاً من ذلك ، فقم بتعيين resistorsOnSegments على "صحيح" true (راجع مثال SevSeg_Counter.ino).
تهيئة الأجهزة Hardware configuration :
يجب عليك تحديد تهيئة الهاردوير الخاص بك للمكتبة كوسيط أول في الأمر sevseg.begin. الخيارات مفصلة أدناه.
الشاشات البسيطة منخفضة القدرة Simple, low power displays :
هذه الشاشات يتم تغذيتها مباشرة من خلال أطراف خرج الاردوينو .
• البارامتر COMMON_CATHODE : لشاشات الكاثود المشترك بدون ترانزستورات كمفاتيح . هذه الشاشات تتطلب جهد منخفض low على طرف الرقم لإضاءة الرقم .
• البارامتر COMMON_ANODE : لشاشات الأنود المشترك بدون ترانزستورات كمفاتيح . هذه الشاشات تتطلب جهد مرتفع high على طرف الرقم لإضاءة الرقم .
الشاشات بمفاتيح (ترانزستورات) : Displays with switches
تستخدم بعض شاشات العرض (معظمها أكبر حجمًا) ترانزيستورات للتحويل ، لا داعى إلى القلق بشأن التكوينات أدناه.
• البارامتر N_TRANSISTORS : إذا كنت تستخدم ترانزستورات من النوع N كمصب للتيار .
• البارامتر P_TRANSISTORS : إذا كنت تستخدم ترانزستورات من النوع P لإمداد التيار .
الإعداد Setting up :
المصفوفة digitPins لتخزين أرقام أطراف الاردوينو التي تتصل بها الأرقام digits. مرتبة من اليسار إلى اليمين. المصفوفة segmentPins لتخزين أرقام أطراف الاردوينو التي تتصل بها الشرائح segments . مرتبة من الشريحة a إلى الشريحة g ، ثم شريحة العلامة العشرية (إذا كانت متصلة). إذا كنت ترغب في استخدام أكثر من 8 أرقام ، فقم بزيادة MAXNUMDIGITS في الملف SevSeg.h.
ضبط العدد Setting a number :
الوسيط الأول هو العدد المطلوب عرضه. يشير الوسيط الثانى إلى المكان الذي يجب أن يكون فيه العلامة العشرية ، العد من الرقم الأدنى أهمية. مثلا لعرض عدد صحيح integer ، يكون الوسيط الثانى هي 0. يتم دعم النوع float . في هذه الحالة ، شير الوسيط الثانى إلى عدد الأماكن العشرية بالدقة التي تريد عرضها . مثلا:
تظهر الأعداد خارج النطاق كما يلى "----".
إذا كان الوسيط الثانى هو “-1” أو تم حذفه ، فلن يكون هناك مكان عشري.
أدخل 'true' كوسيط ثالث لعرض العدد في التمثيل السداسي عشر.
ضبط سلسلة الأحرف Setting a character string :
يمكن عرض مصفوفات الأحرف - بأكبر قدر ممكن من الدقة على شاشة السفن سيجمنت . الأحرف الأبجدية الرقمية فقط ، بالإضافة إلى ' ', '-' , '.' مدعومة . يجب أن تنتهى مصفوفة الأحرف بحرف النهاية NULL.
تحديث الشاشة Refreshing the display :
يجب أن يقوم البرنامج بتشغيل الدالة refreshDisplay() بشكل متكرر لعرض العدد . لاحظ أن أي تأخير يتم تقديمه بواسطة دوال أخرى سوف ينتج عنه تأثيرات غير مرغوب فيها على الشاشة.
لإفراغ blank الشاشة ، يتم استدعاء الدالة :
ضبط السطوع Setting the brightness :
يمكن ضبط السطوع باستخدام قيمة تتراوح بين “-200” و “200” . 0 إلى 100 هو النطاق القياسي. قد تؤدي الأرقام التي تزيد عن 100 وأقل من “-100” إلى حدوث وميض (رعشة) ملحوظ. لاحظ أن 0 لا تناظر عدم وجود سطوع ، ولا “-200” . إذا كان لشاشتك وميض ملحوظ ، فإن تعديل السطوع باتجاه 0 قد يصححه. ستختلف النتائج لكل تطبيق . يعتمد السطوع على خصائص الشاشة وطراز الاردوينو الذي يقودها والمقاومات المستخدمة ومقدار الوقت الذي يقضيه في عمل أشياء أخرى في البرنامج.
مثال المكتبة SevSeg:
الدائرة الكهربية :
يوضح هذا المثال استخدامًا بسيطًا جدًا للمكتبة SevSeg مع شاشة مكونة من 4 أرقام ، يعرض عدادًا تصاعديا ، يعرض بالديسى ثانية deci-seconds .
قبل أن تتمكن من بدء كتابة التعليمات البرمجية للتحكم في شاشات العرض المكونة من 7 شرائح ، ستحتاج إلى تنصيب (تثبيت) install المكتبة SevSeg أولاً.
لتنصيب المكتبة ، افتح Arduino IDE ، انتقل إلى Sketch> Include Library> Manage Libraries… ، تظهر لك نافذة مدير المكتبة . فى حقل البحث اكتب اسم المكتبة SevSeg ، تظهر لك المكتبات المتوفرة بهذا الاسم ، انقر على Install لتنصيب المكتبة تجهيزا لاستخدامها فى برامجك . حدد Sketch> Include Library وستجد أنها قد أصيفت إلى المكتبات المضمنة .
المكتبة SevSeg :
تحول هذه المكتبة الاردوينو Arduino إلى وحدة تحكم فى شاشة السفن سيجمنت . فهى تستخدم لعرض الأرقام numbers بسهولة على شاشة العرض السفن سيجمنت دون أي وحدات تحكم إضافية.
وهى تدعم نوع الكاثود المشترك ونوع الأنود المشترك ، وتستخدم الترانزستورات كمفاتيح . يمكن عرض الأرقام في التمثيل العشري أو السداسي عشر ، مع العلامة العشرية. يمكن عرض الأحرف (بأكبر قدر ممكن من الدقة). كما تدعم الشاشات المتعددة ، بأبعادها المختلفة. لا تدعم مسجلات الإزاحة Shift registers والأجهزة المماثلة.
الأجهزة (الهاردوير) Hardware :
أطراف شاشة السفن سيجمنت :
يجب أن تحتوى الشاشة :
• "أطراف الأرقام " Digit Pins : طرف لكل رقم . وهى "الأطراف المشتركة" . فهى سوف تكون الكاثودات (الأطراف السالبة) للشاشات نوع الكاثود المشترك ، أو الأنودات (الأطراف الموجبة ) للشاشات نوع الأنود المشترك .
• أطراف الثمانية شرائح 8 Segment Pins : طرف لكل شريحة بالإضافة إلى النقطة العشرية .
توصيلات الأردوينو :
يمكن توصيل جميع أطراف الأرقام وأطراف الشريحة بأي من أطراف الاردوينو Arduino الرقمية ، أو الأطراف التناظرية مع الدعم الرقمي .
مقاومات تحديد التيار Current-limiting resistors :
لا تنس أن الشاشة تستخدم ليدات LED ، لذلك يجب عليك استخدام مقاومات الحد من التيار على التوالى مع أطراف"الارقام" digit pins . استخدام 330 أوم هي قيمة آمنة إذا كنت غير متأكد. إذا كنت تستخدم مقاومات لتحديد التيار على أطراف الشرائح بدلاً من ذلك ، فقم بتعيين resistorsOnSegments على "صحيح" true (راجع مثال SevSeg_Counter.ino).
تهيئة الأجهزة Hardware configuration :
يجب عليك تحديد تهيئة الهاردوير الخاص بك للمكتبة كوسيط أول في الأمر sevseg.begin. الخيارات مفصلة أدناه.
الشاشات البسيطة منخفضة القدرة Simple, low power displays :
هذه الشاشات يتم تغذيتها مباشرة من خلال أطراف خرج الاردوينو .
• البارامتر COMMON_CATHODE : لشاشات الكاثود المشترك بدون ترانزستورات كمفاتيح . هذه الشاشات تتطلب جهد منخفض low على طرف الرقم لإضاءة الرقم .
• البارامتر COMMON_ANODE : لشاشات الأنود المشترك بدون ترانزستورات كمفاتيح . هذه الشاشات تتطلب جهد مرتفع high على طرف الرقم لإضاءة الرقم .
الشاشات بمفاتيح (ترانزستورات) : Displays with switches
تستخدم بعض شاشات العرض (معظمها أكبر حجمًا) ترانزيستورات للتحويل ، لا داعى إلى القلق بشأن التكوينات أدناه.
• البارامتر N_TRANSISTORS : إذا كنت تستخدم ترانزستورات من النوع N كمصب للتيار .
• البارامتر P_TRANSISTORS : إذا كنت تستخدم ترانزستورات من النوع P لإمداد التيار .
الإعداد Setting up :
- الكود:
#include "SevSeg.h"
SevSeg sevseg; //Instantiate a seven segment object
void setup() {
byte numDigits = 4;
byte digitPins[] = {2, 3, 4, 5};
byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12, 13};
bool resistorsOnSegments = false; // 'false' means resistors are on digit pins
byte hardwareConfig = COMMON_ANODE;
bool updateWithDelays = false; // Default 'false' is Recommended
bool leadingZeros = false; // Use 'true' if you'd like to keep the leading zeros
bool disableDecPoint = false; // Use 'true' if your decimal point doesn't exist or isn't connected. Then, you only need to specify 7 segmentPins[]
sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments,
updateWithDelays, leadingZeros, disableDecPoint);
...
}
المصفوفة digitPins لتخزين أرقام أطراف الاردوينو التي تتصل بها الأرقام digits. مرتبة من اليسار إلى اليمين. المصفوفة segmentPins لتخزين أرقام أطراف الاردوينو التي تتصل بها الشرائح segments . مرتبة من الشريحة a إلى الشريحة g ، ثم شريحة العلامة العشرية (إذا كانت متصلة). إذا كنت ترغب في استخدام أكثر من 8 أرقام ، فقم بزيادة MAXNUMDIGITS في الملف SevSeg.h.
ضبط العدد Setting a number :
- الكود:
sevseg.setNumber(3141,3); // Displays '3.141'
الوسيط الأول هو العدد المطلوب عرضه. يشير الوسيط الثانى إلى المكان الذي يجب أن يكون فيه العلامة العشرية ، العد من الرقم الأدنى أهمية. مثلا لعرض عدد صحيح integer ، يكون الوسيط الثانى هي 0. يتم دعم النوع float . في هذه الحالة ، شير الوسيط الثانى إلى عدد الأماكن العشرية بالدقة التي تريد عرضها . مثلا:
- الكود:
sevseg.setNumber(3.14159f,3); //Displays '3.141'
تظهر الأعداد خارج النطاق كما يلى "----".
إذا كان الوسيط الثانى هو “-1” أو تم حذفه ، فلن يكون هناك مكان عشري.
أدخل 'true' كوسيط ثالث لعرض العدد في التمثيل السداسي عشر.
ضبط سلسلة الأحرف Setting a character string :
- الكود:
sevseg.setChars("abcd");
يمكن عرض مصفوفات الأحرف - بأكبر قدر ممكن من الدقة على شاشة السفن سيجمنت . الأحرف الأبجدية الرقمية فقط ، بالإضافة إلى ' ', '-' , '.' مدعومة . يجب أن تنتهى مصفوفة الأحرف بحرف النهاية NULL.
تحديث الشاشة Refreshing the display :
- الكود:
sevseg.refreshDisplay();
يجب أن يقوم البرنامج بتشغيل الدالة refreshDisplay() بشكل متكرر لعرض العدد . لاحظ أن أي تأخير يتم تقديمه بواسطة دوال أخرى سوف ينتج عنه تأثيرات غير مرغوب فيها على الشاشة.
لإفراغ blank الشاشة ، يتم استدعاء الدالة :
- الكود:
sevseg.blank();
ضبط السطوع Setting the brightness :
- الكود:
sevseg.setBrightness(90);
يمكن ضبط السطوع باستخدام قيمة تتراوح بين “-200” و “200” . 0 إلى 100 هو النطاق القياسي. قد تؤدي الأرقام التي تزيد عن 100 وأقل من “-100” إلى حدوث وميض (رعشة) ملحوظ. لاحظ أن 0 لا تناظر عدم وجود سطوع ، ولا “-200” . إذا كان لشاشتك وميض ملحوظ ، فإن تعديل السطوع باتجاه 0 قد يصححه. ستختلف النتائج لكل تطبيق . يعتمد السطوع على خصائص الشاشة وطراز الاردوينو الذي يقودها والمقاومات المستخدمة ومقدار الوقت الذي يقضيه في عمل أشياء أخرى في البرنامج.
مثال المكتبة SevSeg:
الدائرة الكهربية :
يوضح هذا المثال استخدامًا بسيطًا جدًا للمكتبة SevSeg مع شاشة مكونة من 4 أرقام ، يعرض عدادًا تصاعديا ، يعرض بالديسى ثانية deci-seconds .
- الكود:
*/
#include "SevSeg.h"
SevSeg sevseg; //Instantiate a seven segment controller object
void setup() {
byte numDigits = 4;
byte digitPins[] = {2, 3, 4, 5};
byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12, 13};
bool resistorsOnSegments = false; // 'false' means resistors are on digit pins
byte hardwareConfig = COMMON_ANODE; // See README.md for options
bool updateWithDelays = false; // Default 'false' is Recommended
bool leadingZeros = false; // Use 'true' if you'd like to keep the leading zeros
bool disableDecPoint = false; // Use 'true' if your decimal point doesn't exist or isn't connected
sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments,
updateWithDelays, leadingZeros, disableDecPoint);
sevseg.setBrightness(90);
}
void loop() {
static unsigned long timer = millis();
static int deciSeconds = 0;
if (millis() - timer >= 100) {
timer += 100;
deciSeconds++; // 100 milliSeconds is equal to 1 deciSecond
if (deciSeconds == 10000) { // Reset to 0 after counting for 1000 seconds.
deciSeconds=0;
}
sevseg.setNumber(deciSeconds, 1);
}
*/
#include "SevSeg.h"
SevSeg sevseg; //Instantiate a seven segment controller object
void setup() {
byte numDigits = 4;
byte digitPins[] = {2, 3, 4, 5};
byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12, 13};
bool resistorsOnSegments = false; // 'false' means resistors are on digit pins
byte hardwareConfig = COMMON_ANODE; // See README.md for options
bool updateWithDelays = false; // Default 'false' is Recommended
bool leadingZeros = false; // Use 'true' if you'd like to keep the leading zeros
bool disableDecPoint = false; // Use 'true' if your decimal point doesn't exist or isn't connected
sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments,
updateWithDelays, leadingZeros, disableDecPoint);
sevseg.setBrightness(90);
}
void loop() {
static unsigned long timer = millis();
static int deciSeconds = 0;
if (millis() - timer >= 100) {
timer += 100;
deciSeconds++; // 100 milliSeconds is equal to 1 deciSecond
if (deciSeconds == 10000) { // Reset to 0 after counting for 1000 seconds.
deciSeconds=0;
}
sevseg.setNumber(deciSeconds, 1);
}
sevseg.refreshDisplay(); // Must run repeatedly
}
/// END ///
sevseg.refreshDisplay(); // Must run repeatedly
}
/// END ///
رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects
مثال على شاشة مكونة من وحدة واحدة مع المكتبة SevSeg:
هذا البرنامج يعد تصاعديا من 0 إلى 9 ، سوف نتناوله بالشرح ببعض التفصيل .
يبدأ البرنامج بتضمين مكتبة SevSeg التي تعمل على تبسيط التحكم فى السفن سيجمنت . بعد ذلك ، يتعين علينا إنشاء كائن من الفئة SevSeg يمكننا بعد ذلك استخدامه خلال البرنامج .
بعد ذلك ، يتعين علينا تحديد عدد الأرقام digits الموجودة على الشاشة. نظرًا لأننا نستخدم شاشة من رقم واحد ، فقم بتعيينها على 1. في حالة استخدام شاشة من 4 أرقام ، قم بتعيينها على 4.
تحدد المصفوفة digitPins ببساطة "الأطراف المشتركة" ‘common pins’ عند استخدام شاشة متعددة الأرقام. اتركها فارغًا إذا كان لديك شاشة من رقم واحد. بخلاف ذلك ، ضع أرقام أطراف الاردوينو التي تتصل بها "الأطراف المشتركة " من لكل رقم فردى . رتبهم من اليسار إلى اليمين.
المصفوفة الثانية segmentPins تهىء أطراف الشرائح . وهى مصفوفة لجميع أرقام أطراف الاردوينو التي تتصل بشرائح الشاشة. يجب أيضًا ترتيبها بالترتيب الصحيح حيث تفترض المكتبة أن بالترتيب التالى A, B, C, D, E, F, G, DP .
بعد إنشاء هذه المتغيرات ، نقوم بتمريرها إلى مُنشئ كائن الفئة SevSeg باستخدام الدالة begin() .
في قسم ‘loop’ : يبدأ البرنامج في العد من 0 إلى 9 باستخدام حلقة "for" والمتغير "i". في كل مرة ، يستخدم الدالة setNumber() مع الدالة refreshDisplay () لتعيين الرقم على الشاشة.
ثم هناك تأخير ثانٍ قبل زيادة "i" وعرض الرقم التالي.
مثال على وحدة واحدة مع المكتبة ومفتاح ضاغط يقوم مقام حجرالنرد (الزهر) المتدحرج
بيت القصيد من النرد هو توفير وسيلة للوصول عشوائيا لرقم من 1 إلى 6. وأفضل طريقة للحصول على رقم عشوائي هي استخدام الدالة المدمجة random(min,max) . وهى تأخذ يارامترين ، البارامتر الأول يحدد الحد الأدنى للقيمة العشوائية (بما في ذلك هذا الرقم) والبارامتر الثانى يحدد الحد الأعلى للقيمة العشوائية (باستثناء هذا الرقم). يعني سيتم إنشاء عدد عشوائي بين min و max-1 .
البرنامج :
هذا البرنامج يعد تصاعديا من 0 إلى 9 ، سوف نتناوله بالشرح ببعض التفصيل .
- الكود:
#include "SevSeg.h"
SevSeg sevseg;
void setup()
{
//Set to 1 for single digit display
byte numDigits = 1;
//defines common pins while using multi-digit display. Left empty as we have a single digit display
byte digitPins[] = {};
//Defines arduino pin connections in order: A, B, C, D, E, F, G, DP
byte segmentPins[] = {2, 3, 4, 5, 6, 7, 8, 9};
bool resistorsOnSegments = true;
//Initialize sevseg object. Uncomment second line if you use common cathode 7 segment
sevseg.begin(COMMON_ANODE, numDigits, digitPins, segmentPins, resistorsOnSegments);
//sevseg.begin(COMMON_CATHODE, numDigits, digitPins, segmentPins, resistorsOnSegments);
sevseg.setBrightness(90);
}
void loop()
{
//Display numbers one by one with 2 seconds delay
for(int i = 0; i < 10; i++)
{
sevseg.setNumber(i);
sevseg.refreshDisplay();
delay(1000);
}
}
يبدأ البرنامج بتضمين مكتبة SevSeg التي تعمل على تبسيط التحكم فى السفن سيجمنت . بعد ذلك ، يتعين علينا إنشاء كائن من الفئة SevSeg يمكننا بعد ذلك استخدامه خلال البرنامج .
- الكود:
#include "SevSeg.h"
SevSeg myDisplay;
بعد ذلك ، يتعين علينا تحديد عدد الأرقام digits الموجودة على الشاشة. نظرًا لأننا نستخدم شاشة من رقم واحد ، فقم بتعيينها على 1. في حالة استخدام شاشة من 4 أرقام ، قم بتعيينها على 4.
- الكود:
//Set to 1 for single digit display
byte numDigits = 1;
تحدد المصفوفة digitPins ببساطة "الأطراف المشتركة" ‘common pins’ عند استخدام شاشة متعددة الأرقام. اتركها فارغًا إذا كان لديك شاشة من رقم واحد. بخلاف ذلك ، ضع أرقام أطراف الاردوينو التي تتصل بها "الأطراف المشتركة " من لكل رقم فردى . رتبهم من اليسار إلى اليمين.
- الكود:
المصفوفة الثانية segmentPins تهىء أطراف الشرائح . وهى مصفوفة لجميع أرقام أطراف الاردوينو التي تتصل بشرائح الشاشة. يجب أيضًا ترتيبها بالترتيب الصحيح حيث تفترض المكتبة أن بالترتيب التالى A, B, C, D, E, F, G, DP .
- الكود:
//Defines arduino pin connections in order: A, B, C, D, E, F, G, DP
byte segmentPins[] = {2, 3, 4, 5, 6, 7, 8, 9};
بعد إنشاء هذه المتغيرات ، نقوم بتمريرها إلى مُنشئ كائن الفئة SevSeg باستخدام الدالة begin() .
- الكود:
//Initialize sevseg object
sevseg.begin(COMMON_ANODE, numDigits, digitPins, segmentPins, resistorsOnSegments);
في قسم ‘loop’ : يبدأ البرنامج في العد من 0 إلى 9 باستخدام حلقة "for" والمتغير "i". في كل مرة ، يستخدم الدالة setNumber() مع الدالة refreshDisplay () لتعيين الرقم على الشاشة.
ثم هناك تأخير ثانٍ قبل زيادة "i" وعرض الرقم التالي.
- الكود:
for(int i = 0; i < 10; i++)
{
sevseg.setNumber(i);
sevseg.refreshDisplay();
delay(1000);
}
مثال على وحدة واحدة مع المكتبة ومفتاح ضاغط يقوم مقام حجرالنرد (الزهر) المتدحرج
بيت القصيد من النرد هو توفير وسيلة للوصول عشوائيا لرقم من 1 إلى 6. وأفضل طريقة للحصول على رقم عشوائي هي استخدام الدالة المدمجة random(min,max) . وهى تأخذ يارامترين ، البارامتر الأول يحدد الحد الأدنى للقيمة العشوائية (بما في ذلك هذا الرقم) والبارامتر الثانى يحدد الحد الأعلى للقيمة العشوائية (باستثناء هذا الرقم). يعني سيتم إنشاء عدد عشوائي بين min و max-1 .
البرنامج :
- الكود:
#include "SevSeg.h"
SevSeg sevseg;
const int buttonPin = 10; // the number of the pushbutton pin
// variables will change:
int buttonState = 0; // variable for reading the pushbutton status
void setup(){
byte numDigits = 1;
byte digitPins[] = {};
byte segmentPins[] = {2, 3, 4, 5, 6, 7, 8, 9};
bool resistorsOnSegments = true;
sevseg.begin(COMMON_ANODE, numDigits, digitPins, segmentPins, resistorsOnSegments);
sevseg.setBrightness(90);
// initialize the pushbutton pin as an input:
pinMode(buttonPin, INPUT);
}
void loop()
{
// read the state of the pushbutton value:
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH)
{
sevseg.setNumber(random(1,7));
sevseg.refreshDisplay();
}
}
رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects
مقياس درجة حرارة (ثرموميتر) Thermometer باستخدام الحساس LM35 و شاشة السفن سيجمنت مع الاردوينو :
الشاشة المستخدمة مكونة من 3 وحدات سفن سيجمنت .
الدائرة الكهربية :
البرنامج :
بادئ ذي بدء ، أضفنا مكتبة شاشة السفن سيجمنت والتي سوف تساعدنا في عرض درجة الحرارة على هذه الشاشة . تتمثل فائدة استخدام هذه المكتبة في أننا لسنا بحاجة إلى تشغيل أو إيقاف تشغيل الليدات بشكل فردي. سنقوم فقط بإعطاء العدد number إلى المكتبة وسيظهر هذا العدد على شاشات العرض.
إذا أردنا إظهار العلامة العشرية على الشاشة ، فعندئذ نحتاج إلى تحديد أين سنقوم بعرضها من الرقم digit أقصى اليمين . في حالتنا ، سيتم عرضه بعد الرقم الأول من اليمين.
نحتاج أيضًا إلى تحديد عدد الأرقام التي نريد عرضها أو عدد وحدات السفن سيجمنت التي نستخدمها.
يتم تحديث الشاشة تلقائيًا ، لذا عندما تتغير درجة الحرارة ، ستنشئ الشاشة وميضًا. لتجنب ذلك ، أضفنا وظيفة التأخير التي لن تؤدي إلا إلى تحديث الشاشة بعد ثانية واحدة.
كود البرنامج :
الشاشة المستخدمة مكونة من 3 وحدات سفن سيجمنت .
الدائرة الكهربية :
البرنامج :
بادئ ذي بدء ، أضفنا مكتبة شاشة السفن سيجمنت والتي سوف تساعدنا في عرض درجة الحرارة على هذه الشاشة . تتمثل فائدة استخدام هذه المكتبة في أننا لسنا بحاجة إلى تشغيل أو إيقاف تشغيل الليدات بشكل فردي. سنقوم فقط بإعطاء العدد number إلى المكتبة وسيظهر هذا العدد على شاشات العرض.
- الكود:
#include "SevSeg.h"
إذا أردنا إظهار العلامة العشرية على الشاشة ، فعندئذ نحتاج إلى تحديد أين سنقوم بعرضها من الرقم digit أقصى اليمين . في حالتنا ، سيتم عرضه بعد الرقم الأول من اليمين.
نحتاج أيضًا إلى تحديد عدد الأرقام التي نريد عرضها أو عدد وحدات السفن سيجمنت التي نستخدمها.
- الكود:
byte numDigits = 3;
sevseg.setNumber(tempc, 1);
يتم تحديث الشاشة تلقائيًا ، لذا عندما تتغير درجة الحرارة ، ستنشئ الشاشة وميضًا. لتجنب ذلك ، أضفنا وظيفة التأخير التي لن تؤدي إلا إلى تحديث الشاشة بعد ثانية واحدة.
- الكود:
void delay_function() {
unsigned long currentMillis = millis(); // grab current time
// check if "interval" time has passed (1000 milliseconds)
if ((unsigned long)(currentMillis - previousMillis) >= interval) {
sevseg.setNumber(tempc, 1);
previousMillis = millis();
}
}
كود البرنامج :
- الكود:
#include "SevSeg.h" // Included the library for the 7 segment display
SevSeg sevseg; // Created an object
const int sensor_pin = A0; // initialized A0 for LM35 sensor
float tempc; //variable to store temperature in degree Celsius
float sensor_out; // variable to store the output
unsigned long interval=1000; // the time we need to wait
unsigned long previousMillis=0; // millis() returns an unsigned long.
void setup(){
pinMode(sensor_pin, INPUT); // Declared the sensor pin as Input
byte numDigits = 3; // We are showing 3 digits so set it to 3.
byte digitPins[] = {10, 11, 12}; // Arduino Pins where we have connected the ground pins of 7 segment displays
byte segmentPins[] = {2, 3, 4, 5, 6, 7, 8, 9}; // Arduino pins where we have connected the segment pins of displays
bool resistorsOnSegments = true;
bool updateWithDelaysIn = true;
byte hardwareConfig = COMMON_CATHODE; // Type of display we are using
sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments); // Initialized the display
sevseg.setBrightness(100); // Sets the brigtness of the displays. This can be from 0 to 100
}
void loop(){
sensor_out = analogRead(sensor_pin); // Gets the output from LM35
tempc = (sensor_out*500)/1023; // Calculated the temperature in C
delay_function(); // function to add 1 second delay
sevseg.refreshDisplay(); // This function is required to continue displaying
}
void delay_function() {
unsigned long currentMillis = millis(); // grab current time
// check if "interval" time has passed (1000 milliseconds)
if ((unsigned long)(currentMillis - previousMillis) >= interval) {
sevseg.setNumber(tempc, 1); // Sets temperature on display
previousMillis = millis();
}
}
رد: تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects
الاردوينو وموديول سفن سيجمنت مكون من أربع وحدات عرض ومسجلات الإزاحة 74HC595 :
وحدة العرض مكونة من أربعة أرقام digit . توفر هذه الوحدة شاشة مثالية للبيانات الرقمية أو السداسية عشرية. يمكن عرض الأرقام من 0 إلى 9 بما في ذلك العلامة العشرية ، والحروف من A إلى F. يمكن أيضًا التحكم في كل شريحة على حدة إذا كنت ترغب في ذلك.
يحتوي الموديول على أربعة سجلات إزاحة 74HC595 – واحد لكل تحكم فى رقم.
الدائرة الكهربية :
البرنامج :
طريقة العمل :
• فى البداية ، نعرف أطراف الخرج الرقمية المستخدمة في المزلاج latch والساعة clock والبيانات data فى السطور :
• ثم ننشىء مصفوفة تحتوي على قيم والتى يتم إرسالها إلى سجلات الإزاحة في الموديول لعرض الأرقام والحروف الممكنة. على سبيل المثال ، العنصر الأول – 0xfc – سوف يفعل الشرائح لعرض الرقم “0” ، والعنصر 0x7a للحرف C ، وهلم جرا.
• كما أنشأنا دالة ، بمعرفة المستخدم ، والتى تستخدم لإرسال العدد ككل whole number بين “0” و “9999” إلى الشاشة . للقيام بذلك ، ببساطة استخدم الدالة بالصيغة :
حيث value هي العدد number المطلوب عرضه (أو المتغير الذي يحتوي على العدد ) – والبارامتر الثانى هو true أو false . يتحكم هذا البارامتر فيما إذا كان لديك صفر بادئة leading zero معروضة (أصفار على الشمال) – true تعنى نعم وجود أصفار على اليسار ، و false تعنى عدم وجود أصفار على اليسار ا.
على سبيل المثال ، لعرض "0123" ، ستستخدم:
والنتيجة :
أو لعرض 500” استخدم :
وتكون النتيجة :
لإيقاف تشغيل جميع الأرقام ، تحتاج إلى إرسال أصفار إلى كل بت في سجل الإزاحة ، ويتم ذلك عن طريق الدالة الآتية :
ماذا عن العلامة العشرية؟
لتشغيل العلامة العشرية لرقم معين ، أضف 1 إلى القيمة التي يتم إرسالها إلى رقم معين. على سبيل المثال ، لعرض 87.65 ، تستخدم:
والنتيجة تكون :
شرح لكيفية التحكم في الموديول :
كما هو موضح في الدائرة الكهربية أعلاه ، يتم التحكم في كل رقم 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 .
على سبيل المثال ، باستخدام الكود:
تكون النتيجة :
لاحظ كيف تتطابق البايتات الثنائية مع خريطة الأرقام وموضعها. على سبيل المثال ، كان البايت الأول مرسل للرقم الرابع ، وتم تشغيل الشريحة A. وهذا كل ما في الأمر - عرض أنيق وبسيط.
وحدة العرض مكونة من أربعة أرقام 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[b]);
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. وهذا كل ما في الأمر - عرض أنيق وبسيط.
صفحة 2 من اصل 4 • 1, 2, 3, 4
مواضيع مماثلة
» الأردوينو Arduino للمبتدئين
» الميكروكونترولر PIC والبرمجة بلغة C ومشاريع متقدمة مع المترجم مبكروسى برو
» الناقل 2IC وساعة التوقيت الحقيقى DS1307 ومشاريع الساعات الرقمية :
» 30 LED Projects
» SD-Card-Projects-Using-the-PIC-Microcontroller
» الميكروكونترولر PIC والبرمجة بلغة C ومشاريع متقدمة مع المترجم مبكروسى برو
» الناقل 2IC وساعة التوقيت الحقيقى DS1307 ومشاريع الساعات الرقمية :
» 30 LED Projects
» SD-Card-Projects-Using-the-PIC-Microcontroller
منتديات الهندسة الكهربية والإلكترونية والميكاترونكس والكومبيوتر :: البرمجة بلغة ++C مع ++Microsoft Visual C :: منتدى الاردوينو Arduino
صفحة 2 من اصل 4
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى