74HC595
Из этого руководства вы узнаете, как управлять 16 светодиодами используя всего 3 линии управления. Мы осуществим это путем последовательной передачи данных в сдвиговые регистры .
Микросхема 74HC595 содержит 8 битный регистр хранения и 8 битный сдвиговый регистр. Данные последовательно передаются в сдвиговый регистр, затем фиксируются в регистре хранения. К регистру хранения подключены 8 выходных линий. На картинке ниже показано расположение выводов микросхемы 74HC595.
Вывод 14 (DS) это вывод данных. В некоторых описаниях он обозначается как «SER».
Когда уровень на выводе 11 (SH_CP, иногда обозначается как SRCLK) переходит из низкого в высокий, значение на выводе DS сохраняется в сдвиговом регистре, при этом данные сдвигаются на один разряд, чтобы предоставить место для нового бита.
Пока на выводе 12 (ST_CP, иногда обозначается как RCLK) низкий уровень, данные записываются в регистр сдвига. Когда уровень переходит в высокий, данные из сдвигового регистра фиксируются в регистре хранения, из которого поступают на выводы Q0…Q7.
На представленной ниже временная диаграмме, показано, каким образом можно установить на выходах Q0…Q7 микросхемы значение 11000011, учитывая что изначально там было значение 00000000.
Ниже показана схема, которую мы соберем в несколько шагов.
Мы используем перфорированную макетную плату с контроллером , которую использовали во многих наших проектах. Добавим еще 2 пустых макетных платы и подведем к ним питание.
Установим микросхему регистра сдвига и подключим к ней питание +5 В и общий провод.
Теперь проведем 3 линии управления между микроконтроллером и регистром сдвига, для чего подсоединим:
- PC0 к DS
- PC1 к ST_CP
- PC2 к SH_CP
Этими линиями являются 3 синих провода на картинке ниже.
Затем подключим светодиоды и резисторы. Я использовал резисторы сопротивлением 510 Ом, но допустимы и другие номиналы.
Для демонстрации работы схемы я написал небольшую программу, которая выводит перемещающийся из стороны в сторону огонек на 8 светодиодах.
Все это конечно впечатляет, но разве я не говорил, что мы будем управлять 16 светодиодами? Чтобы сделать это, нам потребуется еще один сдвиговый регистр 74HC595, больше светодиодов, больше резисторов и больше оранжевых и голубых проводов.
Мы используем вывод Q7, чтобы соединить регистры сдвига в одну цепочку.
Модифицированная схема показана ниже.
Мы остановились на 16 светодиодах, но можно соединить в одну цепочку еще больше регистров сдвига. Эта методика конечно не ограничивается управлением светодиодами, ее можно использовать для увеличения числа портов вывода, чтобы управлять другими видами устройств.
Одно предупреждение касательно этой методики. Когда вы включаете схему, на выходах регистров наблюдаются некоторое произвольное значение. Для того чтобы записать требуемое значение, требуется меньше микросекунды, но для некоторых схем это может стать причиной проблем. В этом случае вы должны использовать выводы MR и OE, для сброса регистров хранения.
Как работает регистр сдвига?
Прежде чем мы начнем подключать чип, давайте рассмотрим, как этот процесс работает.
Первое, что нужно прояснить, — это понятие «биты» для тех из вас, кто не знаком с двоичным кодом. Когда мы говорим о «битах», мы имеем в виду одно из чисел, составляющих двоичное значение. В отличие от обычных чисел, мы обычно считаем, что первый бит является самым большим. Итак, если мы берем двоичное значение 10100010, первый бит на самом деле равен 0, а восьмой бит равен 1. Следует также отметить, если это не подразумевалось, каждый бит может быть только 0 или 1.
Чип содержит восемь контактов, которые мы можем использовать для вывода, каждый из которых связан с битом в регистре. В случае сдвигового регистра 74HC595 мы рассматриваем их от QA до QH.
Чтобы записать эти выходы через Arduino, мы должны отправить двоичное значение в регистр сдвига, и из этого числа сдвиговый регистр может определить, какие выходы использовать. Например, если мы отправили двоичное значение 10100010, контакты, выделенные зеленым цветом на изображении выше, будут активными, а выделенные красным цветом будут неактивными.
Это означает, что самый правый бит сопоставляется как QH, а левый бит сопоставляется с QA. Выход считается активным, когда бит, сопоставленный с ним, установлен на 1
Важно помнить об этом, так как иначе вам будет очень сложно узнать, какие контакты вы используете
Теперь, когда у нас есть основное понимание того, как мы используем смещение битов, чтобы указать, какие контакты использовать, мы можем начать подключать его к нашему Arduino.
74HC595 datasheet (77)
Part | ECAD Model | Manufacturer | Description | Type | |
---|---|---|---|---|---|
74HC595 |
Diodes |
8-BIT SHIFT REGISTER WITH 8-BIT OUTPUT REGISTER | Original |
|
|
74HC595 |
Hitachi Semiconductor |
8-bit Shift Register/Latch (with 3-state outputs) | Original |
|
|
74HC595 |
Motorola |
8-Bit Serial-Input/Serial or Parallel-Output Shift Register with Latched 3-State Outputs | Original |
|
|
74HC595 |
On Semiconductor |
8-Bit Serial-Input/Serial or Parallel-Output Shift Register with Latched 3-State Outputs | Original |
|
|
74HC595 |
Philips Semiconductors |
8-bit serial-in/serial or parallel-out shift register with output latches,3-state | Original |
|
|
74HC595 |
STMicroelectronics |
8 BIT SHIFT REGISTER WITH OUTPUT LATCHES 3 STATE | Original |
|
|
74HC595BQ |
NXP Semiconductors |
8-bit serial-in, serial or parallel-out shift register with output latches; 3-state | Original |
|
|
74HC595BQ |
Philips Semiconductors |
74HC595: 74HCT595: 8-bit serial-in, serial or parallel-out shift register with output latches: 3-state | Original |
|
|
74HC595BQ,115 |
NXP Semiconductors |
8-bit serial-in, serial or parallel-out shift register with output latches; 3-state — Description: 8-Bit Shift Register with Output Latches (3-State) ; F<sub>max</sub>: 108 MHz; Logic switching levels: CMOS ; Number of pins: 16 ; Output drive capability: +/- 7.8 mA on parallel outputs ; Power dissipation considerations: Low Power or Battery Applications ; Propagation delay: 16@5V ns; Voltage: 2.0-6.0 V; Package: SOT763-1 (DHVQFN16); Container: Reel Pack, SMD, 7" | Original |
|
|
74HC595BQ,115 |
NXP Semiconductors |
74HC595 — IC HC/UH SERIES, 8-BIT RIGHT SERIAL IN PARALLEL OUT SHIFT REGISTER, TRUE OUTPUT, PQCC16, 2.50 X 3.50 MM, 0.85 MM HEIGHT, PLASTIC, MO-241, SOT-763-1, DHVQFN-16, Shift Register | Original |
|
|
74HC595BQ-G |
NXP Semiconductors |
8-bit serial-in, serial or parallel-out shift register with output latches; 3-state — Description: 8-Bit Shift Register with Output Latches (3-State) ; F<sub>max</sub>: 108 MHz; Logic switching levels: CMOS ; Number of pins: 16 ; Output drive capability: +/- 7.8 mA on parallel outputs ; Power dissipation considerations: Low Power or Battery Applications ; Propagation delay: 16@5V ns; Voltage: 2.0-6.0 V | Original |
|
|
74HC595BQ-G |
NXP Semiconductors |
74HC595BQ — 8-bit serial-in, serial or parallel-out shift register with output latches; 3-state — Description: 8-Bit Shift Register with Output Latches (3-State) ; Fmax: 108 MHz; Logic switching levels: CMOS ; Number of pins: 16 ; Output drive capability: +/- 7.8 mA on parallel outputs ; Power dissipation considerations: Low Power or Battery Applications ; Propagation delay: 16@5V ns; Voltage: 2.0-6.0 V | Original |
|
|
74HC595BQ-Q100 |
NXP Semiconductors |
8-bit serial-in, serial or parallel-out shift register with output latches; 3-state | Original |
|
|
74HC595BQ-Q100,115 |
NXP Semiconductors |
74HC595BQ-Q100 — 74HC595BQ-Q100 — 8-bit serial-in, serial or parallel-out shift register with output latches; 3-state | Original |
|
|
74HC595D |
NXP Semiconductors |
8-bit serial-in, serial or parallel-out shift register with output latches; 3-state | Original |
|
|
74HC595D |
Philips Semiconductors |
8 Bit Serial-In/Serial or Parallel-Out Shift Register with Output Latches, 3-State | Original |
|
|
74HC595D |
Toshiba Semiconductor and Storage |
Integrated Circuits (ICs) — Logic — Shift Registers — IC SHIFT REGISTER 8BIT 16SOP | Original |
|
|
74HC595D |
Others |
Historical semiconductor price guide (US$ — 1998). From our catalog scanning project. | Scan |
|
|
74HC595D,112 |
NXP Semiconductors |
8-bit serial-in, serial or parallel-out shift register with output latches; 3-state — Description: 8-Bit Shift Register with Output Latches (3-State) ; F<sub>max</sub>: 108 MHz; Logic switching levels: CMOS ; Number of pins: 16 ; Output drive capability: +/- 7.8 mA on parallel outputs ; Power dissipation considerations: Low Power or Battery Applications ; Propagation delay: 16@5V ns; Voltage: 2.0-6.0 V; Package: SOT109-1 (SO16); Container: Tube | Original |
|
|
74HC595D,112 |
NXP Semiconductors |
74HC595 — IC HC/UH SERIES, 8-BIT RIGHT SERIAL IN PARALLEL OUT SHIFT REGISTER, TRUE OUTPUT, PDSO16, 3.90 MM, PLASTIC, MS-012, SOT-109-1, SOP-16, Shift Register | Original |
|
Преимущества использования сдвигового регистра 74HC595:
- не требует никакой обвязки кроме конденсатора по питанию;
- работает через широкораспостраненный интерфейс SPI;
- для самого простого включения достаточно двух выходов микроконтроллера;
- возможность практически неограниченного расширения количества выходов без увеличения занятых выходов микроконтроллера;
- частота работы до 100 МГц;
- напряжение питания от 2 В до 6 В;
- дешевый — стоит менее 5 центов;
- выпускается как в планарных корпусах (74HC595D удобен для производства), так и в DIP16 (74HC595N удобен для радиолюбителей и макетирования).
Для понимания работы регистра стоит взглянуть на функциональную схему. Она состоит из:
- 8-битного регистра сдвига,
- 8-битного регистра хранения,
- 8-битного выходного регистра.
Рассмотрим какие выводы есть у сдвигового регистра 74hc595.
Общего вывод и вывод питания объяснений не требуют.
- GND — земля
- VCC — питание 5 вольт
Начинаем с 8 светодиодов
Для первой части урока нам понадобятся следующие комплектующие:
- Arduino Uno
- Макетная плата
- Ардуино сдвиговый регистр 74HC595
- 8 светодиодов
- 8 резисторов – 220 ом должно хватить
- Провода/перемычки
Начните с размещения сдвигового регистра на вашем макете, гарантируя, что каждая сторона находится на отдельной стороне макета, как показано ниже.
С надписью, направленной вверх, штифты 1-8 с левой стороны сверху вниз и 16 — 9 с правой стороны сверху вниз, как показано на рисунке ниже.
Собираем схему
Для начала подключим контакты 16 (VCC) и 10 (SRCLR) к выходу 5v на Arduino и соединяем выводы 8 (GND) и 13 (OE) с выводом Gnd на Arduino. Pin 13 (OE) используется для включения выходов, так как это активный низкий контакт, который мы можем подключить непосредственно к земле.
Затем нам нужно соединить три контакта, которыми мы будем управлять сдвиговым регистром:
- Pin 11 (SRCLK) сдвигового регистра 74HC595 на пин 11 на Arduino — это будет называться «синхронизирующим пином»,
- Pin 12 (RCLK) сдвигового регистра на пин 12 на Arduino — это будет обозначаться как «пин защелка»,
- Pin 14 (SER) сдвигового регистра на пин 13 на Arduino — это будет называться «пином данных»,
Все три этих контакта используются для выполнения сдвига битов, упомянутого ранее в этом руководстве. К счастью, ардуино предоставляет вспомогательную функцию специально для регистров сдвига, называемую shiftOut, которая будет обрабатывать почти все для нас, но мы вернемся к этому при просмотре кода.
Теперь нам просто нужно подключить все выходные выводы к нашим светодиодам, гарантируя, что резистор размещается перед светодиодами, чтобы уменьшить ток и что катоды светодиодов направлены на землю.
Чтобы уменьшить нагромождение проводов до минимума, мы поместили резисторы и светодиоды на отдельный макет, однако, вы можете воспользоваться одной макетной платой.
При размещении светодиодов убедитесь, что они подключены по порядку, так что QA подключен к первому светодиоду, а QH подключен к последнему светодиоду, так как иначе наш код не включит светодиоды в правильном порядке. Когда вы закончите, у вас должно получится что-то вроде этого:
Скетч для ардуино
Теперь мы готовы загрузить код. Подключите свой Arduino к компьютеру и загрузите на него следующий эскиз для 74hc595 Arduino:
Для начала определим в верхней части эскиза следующее:
- Расположение пинов: синхронизатора, защелки и данных
- Байт, который будет хранить биты, которые указывают сдвиговому регистру, какой вывод использовать
- Переменную, которая будет отслеживать, какой светодиод мы должны включить
В методе setup мы просто инициализируем режимы пинов и переменную светодиодов.
В методе loop (цикл) мы очищаем биты в переменной leds в начале каждой итерации, так что все биты устанавливаются в 0, так как мы хотим только включать один светодиод за раз. После этого мы увеличиваем или перезапускаем текущую переменную currentLED, чтобы затем опять включать правильный светодиод.
После этих двух операций мы переходим к более важной части — смещению бит. Сначала мы начинаем с вызова метода bitSet
Мы передаем методу bitSet байт, что хранит биты, и переменную currentLED.
Этот метод позволяет нам установить отдельные биты байта, указав их положение. Например, если мы хотим вручную установить байт в 10010, мы могли бы использовать следующие вызовы, поскольку биты, которые нам нужно установить в 1, являются вторыми справа (это позиция 1, когда мы начинаем в позиции 0) и пятый справа, который находится в положении 4:
Таким образом, каждый раз, когда мы увеличиваем текущую переменную currentLED и передаем ее методу bitSet, мы каждый раз устанавливаем бит слева от предыдущего до 1 и, таким образом сообщаем сдвиговому регистру активировать вывод слева от предыдущего.
После установки бит мы записываем на контакт защелки указание сдвиговому регистру, что собираемся отправить ему данные. Как только мы это сделаем, мы вызываем метод shiftOut, который есть Arduino. Этот метод разработан специально для использования сдвиговых регистров и позволяет просто сдвигать биты за один вызов. Для этого мы передаем данные и синхронизацию в качестве первых двух параметров, затем передаем константу LSBFIRST, которая сообщает методу, что первый бит должен быть наименее значимым, а затем мы проходим через байт, содержащий биты, которые мы действительно хотим перенести в регистр сдвига.
Как только мы закончим смещение битов, мы снова обращаемся на контакт защелки (используя HIGH в этот раз), чтобы указать, что мы отправили все данные. После того, как операция записи будет завершена, загорится соответствующий светодиодный индикатор, а затем задержится на 250 миллисекунд, прежде чем всё повторится.
16 светодиодов
Теперь перейдем к более сложной схеме используем 74hc595 Arduino для 16 светодиодов.
Детали
По большому счету в данном случае количество всех комплектующих увеличиваем вдвое, кроме, конечно, Ардуино Уно:
- Arduino UNO (x1)
- 74HC595 сдвиговый регистр (x2)
- Светодиоды (x16)
- 220 ом резисторы (x16)
- Провода/перемычки
- Две макетные платы (одна с 400 пинами, вторая с 830 пинами)
- Потенциометр для контроля яркости (по желанию)
Схема соединения
Схема соединения получилась уже больше, чем при 8 светодиодах и одном регистре сдвига 74HC595.
Соберите схему как на рисунке выше и подключите первый регистр сдвига следующим образом:
- GND (контакт 8) на землю
- Vcc (контакт 16) — 5В
- OE (контакт 13) на землю (GND)
- MR (контакт 10) — 5 В
- DS (контакт 14) — пин 11 Arduino
- SH_CP (контакт 11) на контакт Arduino 12
- ST_CP (контакт 12) к контакту 8 Arduino
Подключите второй регистр сдвига точно так же, но подключите DS (контакт 14) к первому выходу 9 регистра. После этого соедините контакты 1, 2, 3, 4, 5, 6, 7 и 15 из обоих регистров и светодиоды. Это соединение делает все контакты всегда активными и адресными, однако при включении Arduino некоторые из светодиодов могут быть включены. Решение для этого — подключить MR (контакт 10) и OE (контакт 13) к Arduino напрямую, но таким образом вы должны пожертвовать 2 выводами ардуины.
Чтобы добавить больше регистров сдвига, соедините их, как второй регистр. Всегда подключайте контакты MR и OE непосредственно к контакту Arduino и DS к предыдущему регистру. Если вы хотите отрегулировать яркость светодиодов, подключите потенциометр, как показано на рисунке выше, для управления сопротивлением для всех светодиодов. Однако это необязательно, и вы можете обойтись без него.
Скетч для ардуино
Варианты скетчей обычно предназначены для ограниченного числа регистров сдвига, т.к. для этого нет универсальной функции/метода. Данный код ниже переработан так, чтобы вы могли использовать неограниченное количество регистров сдвига:
В коде добавлено несколько эффектов для этих 16 светодиодов. Если вы хотите добавить больше светодиодов, подключите больше регистров сдвига по примеру выше и измените значение numOfRegisters в коде.
Вы также можете использовать этот код не только для светодиодов, если вам просто нужно больше контактов для вашего Arduino, используйте функцию regWrite (int pin, bool state) для записи состояния любого вывода. И нет предела, сколько сдвиговых регистров вы используете, просто измените значение numOfRegisters, а все остальное уже втоматизировано.
В ситуации когда не хватает выходов микроконтроллера, что обычно делают? Правильно – берут микроконтроллер с большим количеством выходов. А если не хватает выводов у микроконтроллера с самым большим количеством выходов, то могут поставить и второй микроконтроллер. Но в большинстве случаев проблему можно решить более дешевыми способами например использовать сдвиговый регистр 74HC595.