راه اندازی 8 LED با استفاده از آیسی شيفت رجيستر

مقدمه

با سلام خدمت همه شما دوستان. در جلسه قصد داریم یه خورده آیسی شیفت رجیستر رو با هم بهتر بشناسیم و یاد بگیریم که چگونه میشه 8 عدد LED رو با استفاده از این آیسی راه اندازی کرد. پیشنهاد میکنم اگه با آردوینو اصلا آشنایی ندارید ، ابتدا یک نگاه به دوره آردوینو وبسایت بندازید. لینک این دوره در زیر آورده شده است :

دوست عزیز ، این جلسه یک جلسه کاملا عملی است. اگر نیاز به کدنویسی دارد ، ادیتور خود را باز کنید. اگر مداری لازم است بسته شود ، قطعات آن را تهیه کنید و گام به گام با این جلسه پیش بروید. اگر هم محاسباتی لازم است ، خودتان کاغذ و قلم را بردارید و محاسبات را انجام دهید. این کارها را انجام دهید تا یک بار برای همیشه آردوینو را به صورت حرفه ای یاد بگیرید.

سخت افزار پروژه:

آشنایی با شيفت رجيستر 74HC595

در جلسه قصد داریم با استفاده از شيفت رجيستر 74HC595 و 8 عدد ال ای دی را بدون استفاده از 8پایه آردوینو راه اندازی می کنیم. اگرچه ما می توانیم به راحتی از 8 پین آردوینو جهت روشن کردن ال ای دی ها استفاده کنیم ولی به دلیل اینکه بیشتر زمان ها قطعات دیگری مثل سنسورها، کلیدها و موتورها داریم با کمبود پایه مواجه می شویم پس بهتر است روش دیگری همانند استفاده از شيفت رجيستر 74HC595 را درپیش گیریم. در این روش ما از یک آي سي شيفت رجيستر بنام 74HC595 Serial to Parallel Converter استفاده می کنیم. این شيفت رجيستر 8تا خروجی داره و 3تا ورودی. برای توضیح دقیق تر در مورد این شیفت رجیستر میتونید از این آموزش که قبلا در سایت منتشر شده استفاده کنید:

مدار پروژه:ابتدا مدار زیر را که شامل 8عدد ال ای دی و 8عدد مقاومت می باشد بر روی بردبرد ببندید: (آسونتر اینه که اول آي سي شيفت رجيستر 74HC595 رو در جای خودش قرار دهید وبعد بقیه قطعات را متصل کنید. طوری اون رو در مدار قرار دهید که قسمت فرورفتگی U شکل روی آن به سمت بالای بردبرد باشد. پین 1 این چیپ در سمت چپ این فرورفتگی می باشد.)

شيفت رجيستر

پین 14 این چیپ به پین دیجیتال شماره 4 آردوینو وصل می شود.

پین 12 این چیپ به پین دیجیتال شماره 5 آردوینو وصل می شود.

پین 11 این چیپ به پین دیجیتال شماره 6 آردوینو وصل می شود.

بعد از جایگذاری این چیپ مقاومت ها را جایگزین کنید و دقت کنید که پایه های آن ها به هم متصل نشود و در آخر LED ها را روی برد نصب کنید.

نرم افزار

 ابتدا یک نگاه کلی به این کد بیندازید تا در ادامه اون رو به صورت دقیق توضیح بدیم:

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 است.

توضیح خط به خط کد:

در سه خط اول که پایه هایی که قراره استفاده کنیم رو معرفی می کنیم. پایه 5آردوینو رو برای Latchpin معرفی می کنیم که کار نمایش داده های ورودی رو بصورت موازی انجام می داد.

پایه 6 رو برای پالس اعمالی موقع ارسال داده ها قرار می دهیم. پایه 4 هم برای ارسال داده می باشد.

در مرحله بعد یک متغیر با نام leds تعریف می کنیم.

byte leds = 0;

این متغیر برای این استفاده می شود که بگوییم از کدام الگو برای روشن شدن ال ای دی ها استفاده کنیم.

نوع داده هم byte تعریف کردیم چون 8عدد ال ای دی بیشتر نداریم. هر بیت هم می تواند صفر باشد و هم یک باشد که نشان دهنده روشن خاموش بودن ال ای دی هاست.

تابع setup :

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

در تابع setup ما سه تا پایه آردوینو که در بالا معرفی کردیم رو خروجی قرار می دهیم و چون فقط یک بار اجرا می شوند آنها را در تابع setup قرار دادیم نه تابع loop.

حلقه loop :

the next LED is lit.
Copy Code

    void loop() 
    {
      leds = 0;
      updateShiftRegister();
      delay(500);
      for (int i = 0; i < 8; i++)
      {
        bitSet(leds, i);
        updateShiftRegister();
        delay(500);
      }
    }

در قسمت اول تمامی ال ای دی ها رو با کد leds=0 صفر می کنیم. وقتی همه بیت ها رو صفر کردیم با استفاده از تابع ‘updateShiftRegister’  این صفرها رو به 74hc595 می فرستیم تا همگی خاموش شوند. در کد بعدی در مورد تابع ‘updateShiftRegister’ به طور کامل توضیح می دهیم. سپس تابع loop به مدت 500 میلی ثانیه متوقف می شود و سپس وارد حلقه for می شود و از 0 تا 7 توسط متغیر i شروع به شمارش می کند. هر بار که شمارش می کند توسط تابع bitset این مقدار را درون متغیر leds قرار می دهد. مثلا i به عدد 1 که رسید تابع bitset این 1 را بر می دارد و درون متغیر leds که قبلا صفر بود قرار می دهد. سپس توسط تابع ‘updateShiftRegister’  مقدار درون متغیر leds را به ای سی 74hc595 منعکس می کنیم. 0.5 ثانیه هم صبر می کنیم و سپس خاموش می شود وعدد2 دورن leds قرار می گیرد و ال ای دی بعدی را روشن می کند و سپس خاموش می شود و عدد 3 درون leds قرار می گیرد و این کار تا عدد7تکرار می شود و همه ال ای دی ها را به این صورت خاموش روشن می کند.

 تابع updateShiftRegister :

    void updateShiftRegister()
    {
       digitalWrite(latchPin, LOW);
       shiftOut(dataPin, clockPin, LSBFIRST, leds);
       digitalWrite(latchPin, HIGH);
    }

 

تابع ‘updateShiftRegister’  ابتدا با استفاده از latchpin همه ال ای دی ها راخاموش می کند. سپس قبل از اینکه دوباره توسط تابع latchpin ال ای دی مورد نظر را روشن کنیم تابع ‘shiftOut’ که یکی از توابع مهم آردوینو است را فراخوانی می کنیم. این تابع 4 پارامتر ورودی دارد. پارامترهای های اول و دوم برای داده و کلاک است. پارامتر سوم مربوط به این است که از کدام داده می خواهید برای شروع شمارش استفاده کنید. مسلما هنگامی که i شروع به شمارش می کند ما باید مشخص کنیم که شروع روشن شدن از کدام ال ای دی باشد کار این پارامتر هم همین است. ما از بیت سمت راست یا همان ‘Least Significant Bit’ که به بیت کم ارزش معروف است شروع می کنیم. به طور مخفف LSB خوانده می شود. پارامتر چهارم هم دیتای واقعی است که شیفت داده می شود.

خوب دوستان. به پایان این جلسه هم رسیدیم. مثل همیشه میتونید ما رو در تلگرام و یا اینستاگرام دنبال کنید:

اشتراک گذاری:
مطالب زیر را حتما بخوانید

8 دیدگاه

به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.

  • سلام ..خسته نباشید ..ببخشید اگه امکانش هست و فرصتشو دارین پروژه های پیشرفته تری هم بزارین … خیلیه جالبه چیزای زیادی یاد میگیریم ..ممنون

    • با سلام.
      قرار دادن پروژه های پیشرفته تر در برنامه ما بوده و هست و در آینده حتما قرار داده می شود. برنامه کنونی ما فعلا بر روی مباحث پایه و مقدماتی است.
      موفق باشید.

  • سلام
    ممنون بابت سایت خوبتون.
    امکان خرید مطالب سایتتون و استفاده از اون در جای دیگه وجود نداره؟
    چندین بار سوال پرسیدم ولی جواب ندادین.
    ممنون میشم پسخ بدین
    ایمیل بنده:
    Hamidrezan73@gmail.com

    • با سلام.
      لطفا مورد استفاده خود را به صورت دقیق شرح دهید.
      با تشکر.

  • با سلام
    من می خوام دما و رطوبت را در 2 سون سگمنت اند مشترک 2 رقمی نمایش بدم(سنسور DHT) و از 4 تا ای سی شیف استفاده کنم(برای هر رقم یک ای سی) در کد نویسی این برنامه باید چند پایه از ای سی اول خاموش و چند پایه از ایسی دوم خاموش و همینطور تا چهارمین ای سی .چطور این کد را بنویسم؟

    • با سلام خدمت شما.
      سوالی که فرمودید نیازمند یک جلسه مجزا هست که به صورت کامل در مورد‌ آن صحبت شود و روش های اتصال و کد نویسی آن بررسی شود. . البته ما قبلا در جلسه زیر به سوالی مشابه با سوال شما پاسخ داده ایم که میتوانید از لینک زیر به آن دسترسی داشته باشید‌:
      آشنایی با شیفت رجیستر 74HC596
      آموزش زیر نیز میتواند به سوال شما پاسخ مناسبی دهد :‌
      لینک آموزش
      در واقع ایده ی کلی به این صورت است که برای یک سون سگمنت دو رقمه پایه شماره ۹ از آیسی اول به پایه شماره ۱۴ از آیسی دوم وصل شود. توجه داشته باشید که برای هر رقم سون سگمنت شما نیازمند استفاده از یک 74HC295 می باشید.
      شکل زیر را ببینید‌:‌

      موفق باشید.

دیدگاهتان را بنویسید