مسجل الإزاحة 74HC595
مقدمة
أحد الأشياء الرائعة في الاردوينو هو أنه يحتوي على عدد جيد من الأقطاب
الدخل/الخرج للعمل معها. يمكنك توصيل بعض الأزرار والحساسات والمحركات وما إلى
ذلك ، ولكن مع زيادة العناصر والاجهزة وعندما يكون المشروع كبيراً سوف تنتهي
هذه الأقطاب بسرعة.
الحل الافضل في هذه الحالة هو استخدام مسجل الازاحة والذي يسمح لك بزيادة عدد
الأقطاب الدخل/الخرج في الاردوينو أو حتى مع اي متحكم آخر، وأكثر أنواع مسجلات
الازاحة انتشاراً هو مسجل الازاحة 74HC595.
يستطيع هذا المسجل التحكم بثمانية أقطاب من خلال ثلاثة أقطاب فقط من المتحكم
وفي حالة أنك كنت تحتاج لزيادة الاقطاب أكثر يمكنك استخدام سلسلة متصلة بأكبر
عدد ممكن من مسجلات الازاحة حسب الضرورة للحصول على عدد كبير من أقطاب الدخال /
الخرج.
كيف يعمل مسجل الازاحة 74HC595
يحتوي 74HC595 على مسجلين بطول 8 بت (يمكن اعتبارهما ذاكرة)، يشار إلى الأول باسم مسجل الازاحة (Shift Register) وهو متصل بقطب البيانات في الدخل، والثاني باسم مسجل التخزين أو الماسك (Storage/Latch Register) الذي يتصل مع الخرج، وفي كل مرة يتلقى فيها المسجل نبضة ساعة يحدث أمران بشكل مستمر طالما هناك نبضات ساعة على القطب Shift Clock (SRCLK)
- يتم إزاحة البتات الموجودة في مسجل الإزاحة (Storage/Latch Register) إلى اليسار بمقدار بت واحد أي يتم نقل قيمة البت 0 إلى البت 1، ويتم نقل قيمة البت 1 إلى البت 2 وهكذا…
- عندما تأتي جبهة الصاعدة لنبضة الساعة سوف يتم تخزين قيمة الموجودة على قطب البيانات في البت رقم 0 لمسجل الازاحة (Shift Register).
وعند تمكين قطب الماسك سوف يتم نسخ محتويات مسجل الازاحة (Shift Register) الى مسجل التخزين (Storage/Latch Register) وكما ذكرت سابقاً أن كل بت من هذا المسجل يتصل مع قطب من أقطاب الخرج أي باختصار في هذه الحالة سوف يتغير الخرج.
أقطاب مسجل الازاحة 74HC595
- GND: قطب الارضي.
- VCC: هو مصدر التغذية لمسجل الازاحة 74HC595، والذي يجب توصيله بجهد 5 فولت.
- SER: اختصاراً الى (Serial Input) ويتم استخدام هذا الفطب لإرسال البيانات إلى مسجل الإزاحة بت واحدة في كل نبضة ساعة.
- SRCLK: اختصاراً الى (Shift Register Clock) ويمثل القطب الخاص بنبضات الساعة ويتم نقل البيانات الى مسجل الازاحة عند الجبهة الصاعدة.
- RCLK: اختصاراً الى (Register Clock / Latch) القطب الخاص بمسجل التخزين أو الماسك ويعمل عند القيمة HIGH يتم نقل محتويات مسجل الازاحة الى مسجل التخزين أو الماسك (الخرج).
- SRCLR: اختصاراً الى (Shift Register Clear) ويستخدم هذا القطب لمسح محتويات مسجل الازاحة بالكامل وضبط جميع البتات على 0 في حال إعطاءه LOW لذلك سوف نقوم بتوصيله دائما مع 5v والتي تمثل HIGH
- OE: اختصاراً الى (Output Enable) وهو القطب المسؤول عن تفعيل الخرج، في حال تم إعطاء هذا القطب HIGH سوف يتم تعطيل الخرج (يتم ضبطها على حالة مقاومة عالية)، وفي حاله إعطاءه LOW سوف تعمل أقطاب الخرج بشكل طبيعي.
- QA–QH: أقطاب الخرج.
-
QH’: يتم استخدام هذا القطب في حال أنك كنت بحاجة لمسجل إزاحة بطول أكبر من 8
بت، فإذا قمت بتوصيل هذا القطب من المسجل الاول مع القطب SER من المسجل
الثاني وقمت بإعطاء نفس نبضات الساعة لكل من المسجلين بهذه الحالة سوف يصبح
لديك مسجل ازاحة بطول 16بت، يمكنك توصيل عدد أكبر من المسجلات بنفس
الطريقة.
مخطط التوصيل
ابدأ بوضع مسجل الازاحة على لوح التجارب، تأكد من أن كل جانب من جوانب IC على
جانب مختلف من لوح التجارب، مع وجود الشق الصغيرعلى شكل حرف U لأعلى، وهكذا
يكون القطب رقم 1 من الشريحة على يسار هذا الشق.
قم بتوصيل الأقطاب 16 (VCC) و10 (SRCLR) مع قطب 5v بالاردوينو، والاقطاب 8
(GND) و13 (OE) مع الأرضي بالاردوينو.
بعد ذلك، قم بتوصيل الأقطاب الثلاثة التي سيتم استخدامها للتحكم في مسجل
الإزاحة، ثم قم بتوصيل القطب 11 (SRCLK) والقطب 12 (RCLK) والقطب 14 (SER) من
مسجل الإزاحة بأقطاب 6 و 5 و 4 على التوالي من الأردوينو.
كل ما تبقى هو توصيل مصابيح LED أقطاب الخرج، قم بتوصيل الكاثود (قطب القصير)
لكل LED مع الارضي، والأنود (قطب طويل) لكل LED بقطب خرج مسجل الإزاحة الخاص
به.
لا تنس إضافة المقاومة 220 على التوالي لحماية مصابيح LED.
عند توصيل مصابيح LED، تأكد من أن QA متصل بمصباح LED الأول وأن QH متصل
بالأخير،
الكود البرمجي
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);
}
}
void updateShiftRegister() {
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, leds);
digitalWrite(latchPin, HIGH);
}
شرح الكود البرمجي
في البداية قمنا بتعريف ثلاثة متغيرات خاصة بأقطاب مسجل الازاحة 74HC595 وهي الماسك مع القطب 5 والساعة مع القطب 6 والبيانات مع القطب 4.
int latchPin = 5;
int clockPin = 6;
int dataPin = 4;
بعد ذلك، يتم تعريف متغير يسمى LEDs من نوع بيانات بايت، يمكن لنوع البيانات بايت تخزين ثمانية بتات، وهي مثالية لتتبع حالة التشغيل/الإيقاف للمصابيح LED الثمانية.
// Variable to hold the pattern of which LEDs are currently turned on or off
byte leds = 0;
في التابع الرئيسي نقوم بضبط الاقطاب الثلاثة على أنها أقطاب خرج
void setup() {
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
}
في التابع التكراري نقوم أولا بإيقاف التشغيل لكل المصابيج LED وذلك من خلال إعطاء القيمة 0 للمتغير led ومن ثم نقوم باستدعاء التابع الخاص ()updateShiftRegister والذي قمنا يإنشاءه وسوف نشرحه لاحقاً، بعدها أضفنا تأخير زمني بمقدار 500 مللي ثانية لكي نلاحظ حالة إطفاء الليدات في كل مرة، ومن ثم قمنا بعمل حلقة تكرارية for من 0 الى 7 في كل مرة يتم استدعاء التابع الموجود مسبقا من قبل الاردوينو ()bitSet الذي يقوم بتغير حالة بت مخصص من المتغير الى HIGH ويستقبل بارمترين الاول هو المتغير الذي سوف يتم تغير بت منه والثاني هو رقم البت الذي سوف يتم تغيره، وبعدها نقوم باستدعاء التابع الخاص ()updateShiftRegister ومن ثم تأخير زمني بمقدار 500 مللي ثانيةز
void loop() {
leds = 0;
updateShiftRegister();
delay(500);
for (int i = 0; i < 8; i++)
{
bitSet(leds, i);
updateShiftRegister();
delay(500);
}
}
وظيفة التابع ()updateShiftRegister اولا بضبط حالة القطب الماسك بـ LOW ومن ثم استدعاء التابع الموجود مسبقا من قبل الاردوينو ()shiftOut والذي يقوم بالازاحة بمقدار بايت (8 بت) وتستقبل 4 بارمترات الاول قطب البيانات والثاني قطب الساعة والثالث طريقة الازاحة (بترتيب MSBFIRST أو LSBFIRST (البت الأكثر أهمية أولاً، أو البت الأقل أهمية أولاً)) والرابع هو القيمة التي سوف يتم ازاحتها، وفي النهاية نقوم بضبط قيمة القطب الخاص بالماسك للقيمة HIGH ليتم نسخ محتويات مسجل الذاكرة الى مسجل الذاكرة (الخرج)
void updateShiftRegister(){
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, leds);
digitalWrite(latchPin, HIGH);
}
رابط محاكاة المشروع اضغط هنا