Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

Arduino:Примеры/Создание эффекта "бегущий всадник" с помощью сдвигового регистра 74HC595

Материал из Онлайн справочника
Перейти к: навигация, поиск

Проверка/Оформление/Редактирование: Мякишев Е.А.


Ambox content.png Черновик


Создание эффекта "бегущий всадник" с помощью сдвигового регистра 74HC595

Данный пример демонстрирует как создать анимационный эффект "бегущий всадник"(горящий светодиод сначала движется в одну сторону,а потом в обратную) с 8-ю светодиодами задействуя только 3 цифровых контакта Arduino. В этом нам поможет сдвиговый регистр 74HC595.

Схема работы кода(o - светодиод не горит, * - светодиод горит), где справа указаны значения которые мы будет передавать регистру сдвига:

  1. ooooooo* 1
  2. oooooo*o 2
  3. ooooo*oo 4
  4. oooo*ooo 8
  5. ooo*oooo 16
  6. oo*ooooo 32
  7. o*oooooo 64
  8. *ooooooo 128
  9. o*oooooo 64
  10. oo*ooooo 32
  11. ooo*oooo 16
  12. oooo*ooo 8
  13. ooooo*oo 4
  14. oooooo*o 2

Сдвиговый регистр это синхронное устройство, он принимает данные по нарастающему фронту сигнала. В данном случае, когда мы подаем на вход SH_CP сдвигового регистра 74HC595 высокий уровень сигнала, все значения, хранящиеся в нем сдвигаются на одну позицию и происходит запись в первую ячейку значения которое установлено на входе DS сдвигового регистра 74HC595. Данные из последней ячейки или отбрасываются или передаются на выход Q7"(при каскадном подключении). За восемь тактов мы можем загрузить в регистр сдвига новые значения. При подаче на вход ST_CP сдвигового регистра 74HC595 высокого уровня напряжения, происходит вывод значений, хранящихся в ячейках, на выходы регистра.

В данном примере мы будем использовать встроенную функцию shiftOut для поразрядной выдачи данных на выход Arduino, которая упростит работу со сдвиговым регистром.

Она принимает в качестве аргументов:

  • номер контакта Arduino, подключенный к контакту DS ввода последовательных данных сдвигового регистра;
  • номер контакта Arduino, подключенный к тактовому контакту SH_CP сдвигового регистра;
  • порядок выдачи битов;
    • MSBFIRST - старший бит будет отправлен первым;
    • LSBFIRST - младший бит будет отправлен первым;
  • значение для вывода на выводы сдвигового регистра;

Необходимые компоненты

Схема

Arduino uno control led bar 74HC595 1.png


Распиновка сдвигового регистра 74HC595
Контакты 1-7, 15 Q0-Q7 Выходные контакты
Контакт 8 GND «Земля», Vss
Контакт 9 Q7’’ Контакт для вывода последовательных данных
Контакт 10 MR Контакт, позволяющий «очистить» значения на всех выходных контактах и выставить их на LOW (если подать на него LOW)
Контакт 11 SH_CP Тактовый контакт для сдвигового регистра
Контакт 12 ST_CP Тактовый контакт для регистра данных (контакт-защелка)
Контакт 13 OE Контакт, разрешающий вывод данных (если подать на него LOW)
Контакт 14 DS Контакт для ввода последовательных данных
Контакт 16 Vcc Контакт для питания напряжением с положительным зарядом

Код

  1. #define SER   8                                      // Контакт для ввода последовательных данных в сдвиговый регистр
  2. #define LATCH 9                                      // Тактовый контакт для регистра данных (контакт-защелка)
  3.                                                      // служит для одновременного вывода полученных последовательных данных  
  4.                                                      // на параллельные выходы сдвигового регистра
  5. #define CLK   10                                     // Тактовый контакт для сдвигового регистра
  6.                                                      // При подаче HIGH происходит запись одного бита в сдвиговый регистр
  7.  
  8. int seq[14] = {1,2,4,8,16,32,64,128,64,32,16,8,4,2}; // последовательность включения светодиодов
  9.  
  10. void setup()
  11. {
  12.   //Установка выводов как выходов
  13.   pinMode(SER, OUTPUT);
  14.   pinMode(LATCH, OUTPUT);
  15.   pinMode(CLK, OUTPUT);
  16. }
  17.  
  18. void loop()
  19. {
  20. for (int i = 0; i < 14; i++)
  21.   {
  22.     digitalWrite(LATCH, LOW);                        // устанавливаем LATCH в LOW, чтобы значения на параллельных выходах
  23.                                                      // сдвигового регистра не изменялись во время ввода последовательных
  24.                                                      // данных
  25.     shiftOut(SER, CLK, MSBFIRST, seq[i]);            // ввод последовательных данных в сдвиговый регистр
  26.     digitalWrite(LATCH, HIGH);                       // устанавливаем LATCH в HIGH для вывода значений
  27.                                                      // на параллельные выводы сдвигового регистра
  28.     delay(100);                                      // задержка 100 мс.
  29.   }
  30. }

См.также

Внешние ссылки