تعلم الوحدات · الدرس 2.22

ثمانية LEDs مع مسجل الإزاحة (74HC595 IC)

العودة إلى الدروس

لماذا نستخدم مسجل إزاحة؟

ستشغل ثمانية LEDs حمراء كبيرة دون استهلاك ثمانية منافذ خرج. يمكن توصيل كل LED ومقاومته بمنفذ مستقل إذا لم تكن مكونات أخرى كثيرة، لكن الأزرار والحساسات والمحركات قد تستنفد المنافذ سريعًا.

تستخدم 74HC595 محولًا من التسلسلي إلى المتوازي، له ثمانية مخارج وثلاثة مداخل لتغذيته بتًا بعد بت. ينخفض معدل التغيير من نحو 8,000,000 إلى 500,000 مرة في الثانية، وهو لا يزال أسرع بكثير مما تميزه العين.

المكونات المطلوبة

المبدأ

مسجل الإزاحة (Shift Register) يحمل ثمانية مواضع، لكل منها 0 أو 1. تدخل البيانات عبر Data و Clock. مع كل نبضة من النبضات الثماني يدفع 1 إذا كان Data مرتفعًا، وإلا 0. بعد الثماني ينقل تمكين Latch القيم إلى سجل الخرج؛ فيمنع وميض LEDs غير المقصود أثناء تحميل البيانات.

طرف OE يمكّن المخارج أو يعطلها جميعًا. يمكن توصيله بمنفذ PWM واستخدام analogWrite() لضبط السطوع. وهو فعال عند LOW، لذلك يوصل بالأرضي في هذه التجربة.

عمل مسجل الإزاحة (Shift Register) و Data و Clock و Latch
عمل مسجل الإزاحة (Shift Register) و Data و Clock و Latch

توصيل الدائرة

المخطط الكهربائي لثمانية LEDs مع 74HC595
المخطط الكهربائي لثمانية LEDs مع 74HC595
التوصيل العملي على لوحة التجارب (Breadboard)
التوصيل العملي على لوحة التجارب (Breadboard)

التركيب وشرح البرنامج

ابدأ بوضع الشريحة لأن معظم المكونات تتصل بها. اجعل شق U الصغير نحو أعلى اللوحة؛ الطرف 1 يسار الشق. وصّل منفذ D12 بالطرف 14 للشريحة، و D11 بالطرف 12، و D9 بالطرف 11.

جميع المخارج إلا واحدًا تقع يسار الشريحة، لذلك توضع LEDs هناك لتسهيل التوصيل. ركّب المقاومات وتأكد من عدم تلامس أرجلها، وأعد الفحص قبل التغذية. إذا صعب ترتيبها، قصّر الأرجل لتقترب من سطح اللوحة.

ركّب LEDs، واجعل رجلها الموجبة الأطول نحو الشريحة أيًا كان جانب اللوحة. أضف أسلاك التوصيل كما في الرسم، ولا تنس توصيل الطرف 8 للشريحة بأرضي لوحة التجارب (Breadboard). عند تشغيل المثال على لوحة أردوينو (UNO R3 Board)، يضيء كل LED بالتتابع ثم تنطفئ المجموعة وتتكرر الدورة.

البرنامج

افتح ملف البرنامج Eight_LED_with_74HC595_Flash_LED.ino من ملفات الدرس في بيئة Arduino IDE. بعد إتمام التوصيلات، وصّل لوحة أردوينو (UNO R3 Board) بالحاسوب بكابل توصيل (USB Cable)، ثم اضغط زر Upload (رفع) لنقل البرنامج إلى اللوحة وتشغيله عليها.

إذا تعذر نقل البرنامج إلى اللوحة، فراجع قسم «رفع البرنامج ومعالجة خطأ الاتصال» في الدرس 1.5 «وميض LED وإضافة المكتبات» للتحقق من اتصال USB واختيار نوع اللوحة والمنفذ التسلسلي في بيئة Arduino IDE.

يعرف البرنامج منافذ Latch و Clock و Data، ثم المتغير leds من النوع byte؛ لكل بت حالة LED، وهذا يلائم العناصر الثمانية.

تهيئ setup() المنافذ الثلاثة OUTPUT. تبدأ loop() بتصفير leds ثم تستدعي updateShiftRegister() لإطفاء الجميع.

تتابع الإضاءة وتحديث المسجل

تنتظر loop() نصف ثانية، ثم تعد for من 0 إلى 7 باستخدام i. تضبط bitSet(leds, i) البت الخاص بالـ LED، ثم تستدعي updateShiftRegister() لعرض النمط، وتنتظر نصف ثانية قبل الانتقال للعنصر التالي.

تخفض updateShiftRegister() قيمة latchPin، وتستدعي shiftOut() ثم ترفع latchPin. المعاملان الأول والثاني Data و Clock، والثالث ترتيب البتات. يستخدم المثال LSBFIRST للبدء بالبت الأقل أهمية، أي أقصى اليمين. المعامل الأخير البيانات نفسها، leds.

إذا أردت إطفاء عنصر بدل تشغيله، استخدم bitClear() مع leds لجعل البت 0، ثم استدع updateShiftRegister() لتحديث LEDs الفعلية.

الكود

Eight_LED_with_74HC595_Flash_LED/Eight_LED_with_74HC595_Flash_LED.ino

//www.elegoo.com
//2016.12.9 

int tDelay = 100;
int latchPin = 11;      // (11) ST_CP [RCK] on 74HC595
int clockPin = 9;      // (9) SH_CP [SCK] on 74HC595
int dataPin = 12;     // (12) DS [S1] on 74HC595

byte leds = 0;
/*   The most common method of using 74CH595
 *   lctchPin->LOW : Begin transmitting signals.
 *   shiftOut(dataPin, clockPin, bitOrder, value)
 *   dataPin: the pin on which to output each bit. Allowed data types: int.
 *   clockPin: the pin to toggle once the dataPin has been set to the correct value. Allowed data types: int.
 *   bitOrder: which order to shift out the bits; either MSBFIRST or LSBFIRST. (Most Significant Bit First, or, Least Significant Bit First).
 *   value: the data to shift out. Allowed data types: byte. 
 *   lctchPin->HIch : The end of the transmission signal.
*/
void updateShiftRegister()
{
   digitalWrite(latchPin, LOW);
   shiftOut(dataPin, clockPin, LSBFIRST, leds);
   digitalWrite(latchPin, HIGH);
}

void setup() 
{
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);  
  pinMode(clockPin, OUTPUT);
}

void loop() 
{
  //Turn off all led
  leds = 0;
  updateShiftRegister();
  delay(tDelay);
  //Create a for loop:i 0 through 7 have gradually increased
  for (int i = 0; i < 8; i++)
  {
    //turn on the led with the i transform
    bitSet(leds, i);
    updateShiftRegister();
    delay(tDelay);
  }
}

ملفات الدرس والمكتبات

ملفات الدرس

100%

عرض الصورة

استخدم + و− للتكبير والتصغير، أو اضغط Esc للإغلاق.