الكود البرمجي
int latchPin = 5; int clockPin = 6; int dataPin = 4; byte leds = 0; void setup() { pinMode(latchPin, OUTPUT); pinMode(dataPin, OUTPUT); pinMode(clockPin, OUTPUT); } void loop() { leds = 0; updateShiftRegister(); delay(500); for (int i = 0; i < 8; i++) { bitSet(leds, i); updateShiftRegister(); delay(500); } } void updateShiftRegister() { digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, LSBFIRST, leds); digitalWrite(latchPin, HIGH); }
تمتلك مكتبة الاردوينو “دالة” مميزة تسمى “ShiftOut” وهي مصممة خصيصًا لإرسال البيانات لرقاقة مسجل الإزاحة shift register.
أول ما عليك فعله هو التعريف بالمنافذ الثلاث التي ستستعملها. هذه هي منافذ الاردوينو التي ستستعملها للتحكم في “Latch”، “Clock” ومنفذ “Data” من الرقاقة 74HC595.
Int latchPin=5; Int clockPin=6; Int dataPin=4;
ثم يأتي التعريف بالمتغير المسمى Leds ستستعمل هذا المتغير لإحتواء نمط تغيير (تشغيل أو اطفاء) الـ LED.
تمثل البيانات من نوع ” – Byteبايت” أرقام تكتب بإستعمال 8 أجزاء. يمكن أن يحمل كل جزء قيمة 1 أو 0
وهذا سيمكنك من تتبع قيمة كل LED.
byte leds = 0;
تقوم دالة التنصيب “Setup” هذه بإعداد المنافذ الثلاث التي ستستخدمها كمخرجات للـ LEDs.
void setup() { pinMode(latchPin, OUTPUT); pinMode(dataPin, OUTPUT); pinMode(clockPin, OUTPUT); }
تقوم دالة “Loop” بإطفاء كل LED وذلك بإعطاء قيمة ‘0’ كقيمة للـ LEDs ثم تقوم بمناداة دالة “updateShiftRegister” التي سترسل نمط Leds إلى رقاقة مسجل الإزاحة حتى تنطفئ كل LED. سوف تتعلم كيفية عمل “updateShiftRegister” لاحقًا.
تقف دالة “Loop” لنصف ثانية ثم تبدء بالعد من 0 إلى 7 عبر دورة “For” والمتغير “I” وفي كل مرة تستعمل وظيفة “bitSet” لتثبيت الجزء المتحكم في الـLED داخل متغير Leds . ثم تنادي دالة “updateShiftRegister” حتى يتم تحديث حالة الـLED التي تعكس قيمة المتغير”leds”.
هنالك فترة إنتظار نصف ثانية في كل تكرار للدورة “For”.
void loop() { leds = 0; updateShiftRegister(); delay(500); for (int i = 0; i < 8; i++) { bitSet(leds, i); updateShiftRegister(); delay(500); } }
تقوم دالة UpdateShiftRegister بوضع منفذ “Latch” إلى الوضع المنخفض ثم تنادي دالة shiftOut قبل أن تعيد منفذ “Latch” إلى الوضع العالي مره أخرى، تأخذ هذه الدالة أربع متغيرات، تحدد المتغيرتان الأولى المنافذ المستعملة لنقل البيانات عبر “Data” و”Clock”.
تحدد المتغيرة الثالثة جهة البدء بقراءة البايت سوف نقرأ البايت من اليمين إلى اليسار.
المتغير الأخير يمثل القيمة الفعلية التي سترسل إلى رقاقة مسجل الإزاحة shift register.
void updateShiftRegister() { digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, LSBFIRST, leds); digitalWrite(latchPin, HIGH); }
إذا كنت تود تغيير قيم أحد الـ LEDs، كل ماعليك هو أن تنادي دالة مشابهة اسمها (bitClear) لتغير قيمتها إلى 0
هكذا ستطفئ واحدة من الـLEDs وكل ما يتبقى عليك فعله هو مناداة دالة “updateShiftRegister” لتحديث حالة الـLED.
التحكم في البريق:
لم نتحدث كثيرًا في رقاقة الـ 74HC595 عن منفذ “OE” أو “OutputEnable” ، رقم هذا الـ LED هو 13, وفي لوح التجارب مربوط دومًا بالأرض. يعمل هذه المنفذ كالمحول، هو الذي يمكن له ان يطفئ ويشغل المخرجات الـ (LEds)
ولكن عليك أن تحذر لأنها تعمل في الوضع المنخفض. ذلك يعني، إن كانت كلها مربوطة بطاقة5V ستطفئ جميعها. وإن كانت مربوطة بالمنفذ الأرضي ستعمل جميعها حسب ما يأتيها من بيانات.
يمكن لك أن تستعمل هذه المنفذ والإستعانة بدالة “analogWrite” للتحكم في بريق إضاءة الـ LED معًا.
كل ما عليك فعله هو تغيير المنفذ 13 من الأرض إلى المنفذ 3 في الأردوينو.
سيجعل الكود التالي كل الـLEDs تعمل ببطء ثم تنطفئ ببطء.
int latchPin = 5; int clockPin = 6; int dataPin = 4; int outputEnablePin = 3; byte leds = 0; void setup() { pinMode(latchPin, OUTPUT); pinMode(dataPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(outputEnablePin, OUTPUT); } void loop() { setBrightness(255); leds = 0; updateShiftRegister(); delay(500); for (int i = 0; i < 8; i++) { bitSet(leds, i); updateShiftRegister(); delay(500); } for (byte b = 255; b > 0; b--) { setBrightness(b); delay(50); } } void updateShiftRegister() { digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, LSBFIRST, leds); digitalWrite(latchPin, HIGH); } void setBrightness(byte brightness) // 0 to 255 { analogWrite(outputEnablePin, 255-brightness); }