Arduino:Основы/Ввод данных при помощи сдвигового регистра CD4021BE
Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Ввод данных при помощи сдвигового регистра CD4021BE[1]
Иногда вашему проекту нужно больше входных контактов, чем может предложить Arduino. Используя сдвиговый регистр (преобразующий параллельные данные в последовательные), вы можете собирать информацию с 8 (и даже больше) переключателей при помощи всего 3 контактов Arduino.
Одним из таких регистров является CD4021B, который также называют иногда «8-разрядным статическим сдвиговым регистром». Это значит, что вы можете считывать состояния с 8 цифровых линий ввода данных, подключенных к этому регистру. Данный метод называют «асинхронным параллельным вводом данных». «Ввод данных» – потому что вы собираете информацию, «параллельный» – потому что все данные идут одновременно, и «асинхронный» – потому что CD4021B собирает данные в собственном ритме (такте), без какой-либо координации с Arduino.
Данные, идущие от 8 устройств ввода, трансформируются в серию импульсов HIGH и LOW, а затем передаются на контакт сдвигового регистра, предназначенный для последовательного вывода данных (в оригинале – «serial-out» или «serial-output»). Этот контакт нужно подключить к входному контакту на Arduino, который называется «контактом для данных». Передачу данных на этот контакт называют «синхронным последовательным выводом данных», потому что в данном случае сдвиговый регистр поступает не своевольно, а ждет, когда Arduino запросит у него эти данные, а передаваемые данные выстроены в линейную (т.е. последовательную) «цепочку». Синхронная последовательная коммуникация (независимо от того, вводятся данные или выводятся) сильно зависит от так называемого «тактового контакта». Это своеобразный метроном, координирующий «разговор» между сдвиговым регистром и Arduino – благодаря ему коммуникация между двумя устройствами остается «синхронной». Каждый раз, когда Arduino меняет значение на тактовом контакте с LOW на HIGH, сдвиговый регистр меняет состояние на контакте «serial-out», что сообщает Arduino о переходе к значению от следующего переключателя.
Третий контакт Arduino, необходимый для коммуникации со сдвиговым регистром – это «контакт управления параллельно-последовательной коммуникацией». Его также называют «контактом-защелкой». Когда контакт-защелка находится в состоянии HIGH, сдвиговый регистр считывает параллельные данные с 8 устройств ввода. Но когда контакт-защелка переключается в состояние LOW, сдвиговый регистр начинает «слушать» тактовый контакт и передавать последовательные данные через контакт для данных. Это значит, что каждый раз, когда контакт-защелка переключается из HIGH в LOW, сдвиговый регистр начинает передавать Arduino самые последние данные от 8 устройств ввода.
Схематически код для координации этой коммуникации будет выглядеть следующим образом:
- Сначала нужно убедиться, что регистр обладает самой последней информацией, считанной с устройств ввода (т.е. в том, что контакт-защелка находится в состоянии HIGH)
- Затем говорим регистру, что Arduino готова к получению последовательных данных (переключаем контакт-защелку в состояние LOW)
- Даем импульсы на тактовый контакт (по импульсу для каждого устройства ввода) и проверяем, в каком состоянии находится контакт для данных – HIGH или LOW
Вот как это выглядит графически:
Ввод данных -> | |
Ввод данных -> | C |
Ввод данных -> | D |
Ввод данных -> | 4 | -> Передача последовательных данных на Arduino
Ввод данных -> | 0 |
Ввод данных -> | 2 |
Ввод данных -> | 1 | <- Передача тактовых данных от Arduino
Ввод данных -> |_____| <- Передача «защелкивающих» данных от Arduino
Дополнительно об использовании сдвиговых регистров можно прочесть в этом руководстве.
Перед тем, как вы начнете строить цепь, имеет смысл ознакомиться с распиновкой CD4021 из даташита Texas Instruments:
Контакты 1, 4-7, 13-15 | P1-P8 (0-7) | Контакты для параллельного ввода данных |
Контакты 2, 12, 3 | Q6, Q7, Q8 | Контакты для последовательного вывода данных, предназначенные для разных участков цепочки данных. Q7 – это импульс, идущий за Q8, а Q6 – за Q7. В скетчах используется только Q8. |
Контакт 8 | Vss | Контакт для «земли» |
Контакт 9 | P/S C | Контакт для управления параллельно-последовательной коммуникацией (контакт-защелка) |
Контакт 10 | CLOCK | Тактовый контакт на сдвиговом регистре |
Контакт 11 | SERIAL-IN | Контакт для ввода последовательных данных |
Контакт 16 | Vdd | Контакт для питания постоянным током |
Пример 1: Использование одного сдвигового регистра
Сначала сдвиговый регистр нужно обеспечить питанием. Для этого нужно подключить следующие контакты:
- Vss (контакт 8) на регистре к «земле» на Arduino
- Vdd (контакт 16) на регистре к 5V на Arduino
Затем к Arduino нужно подключить 3 «интерфейсных» контакта:
- Q8 (контакт 3) на регистре к цифровому контакту 9 на Arduino (синий провод)
- CLOCK (контакт 10) на регистре к цифровому контакту 7 на Arduino (желтый провод)
- P/S C (контакт 9) на регистре к цифровому контакту 8 на Arduino (зеленый провод)
В скетчах эти контакты будут называться dataPin(контакт для данных), clockPin (тактовый контакт) и latchPin (контакт-защелка) соответственно:
Далее подключаем 8 переключателей:
Так будет выглядеть вся схема:
Ниже – скетчи, которые можно использовать вместе с этой цепью:
- Привет, мир!
- Какая кнопка нажата?
- Проверка разных комбинаций
- Нажата ли кнопка? (используется подфункция)
Пример 2: Использование нескольких сдвиговых регистров
В этом примере к цепи добавляется еще один сдвиговый регистр, удваивающий количество входных контактов. При этом количество контактов, используемых на Arduino (т.е. три), останется неизменным.
Если 8 дополнительных цифровых контактов для вашего проекта недостаточно, вы можете подключить к цепи еще один сдвиговый регистр. Впрочем, он будет передавать данные на Arduino не напрямую, а через первый сдвиговый регистр, т.е. в результате первый регистр будет передавать на Arduino 16-битный (8 бит от одного регистра и 8 бит от другого) поток данных. Если вы хотите использовать в своем проекте несколько сдвиговых регистров, обязательно проверьте, чтобы они поддерживали не только синхронный последовательный вывод данных (т.е. «synchronous serial output»), но и синхронный последовательный ввод данных (т.е. «synchronous serial input»). Синхронный последовательный ввод данных – это функция, которая позволяет первому сдвиговому регистру получать и отправлять выходные последовательные данные от второго регистра. То, как работает эта система, показано на графике ниже. Более того, эту «гирляндную» цепь можно расширить (но в разумных пределах), добавив еще сдвиговых регистров.
Ввод данных -> | |
Ввод данных -> | C |
Ввод данных -> | D |
Ввод данных -> | 4 | -> Передача последовательных данных на Arduino
Ввод данных -> | 0 |
Ввод данных -> | 2 | <- Передача тактовых данных от Arduino
Ввод данных -> | 1 | <- Передача «защелкивающих» данных от Arduino
Ввод данных -> |_____| <------
|
|
|
_______ | Последовательные данные, передаваемые
Ввод данных -> | | | первому сдвиговому регистру
Ввод данных -> | C | |
Ввод данных -> | D | |
Ввод данных -> | 4 | ______|
Ввод данных -> | 0 |
Ввод данных -> | 2 | <- Передача тактовых данных от Arduino
Ввод данных -> | 1 | <- Передача «защелкивающих» данных от Arduino
Ввод данных -> |_____|
Добавляем второй сдвиговый регистр.
Соединяем сдвиговые регистры друг с другом. Два «интерфейсных» контакта второго сдвигового регистра (для тактового сигнала и «защелкивания») можно подключить к тем же контактам Arduino, которые использует первый регистр (речь о clockPin и latchPin). Это желтый и зеленый провода. Дополнительный синий провод нужен для того, чтобы передать последовательные данные от второго регистра (они выходят из него через контакт Q8) первому (они поступают в него через контакт SERIAL-IN).
Подключаем еще 8 переключателей. Обратите внимание, что среди них 7 тумблеров и лишь 1 нажимная кнопка – это сделано для удобства пользователя. Дело в том, что переключатели на втором регистре будут работать чем-то вроде «файла настроек», а не триггерами, запускающими какие-либо события. То есть 7 тумблеров отвечают за различные настройки, а оставшаяся кнопка, добавленная для наглядности, предназначена для включения/выключения режима изменения этих настроек.
Так будет выглядеть вся схема:
Ниже – скетчи, которые можно использовать вместе с этой цепью:
- Привет, мир!
- Использование второго байта для настроек; печатаются все
- Использование второго байта для настроек; печатаются только «вкл» (используется подфункция)
См.также
Внешние ссылки
Arduino продукты | |
---|---|
Начальный уровень | Arduino Uno • Arduino Leonardo • Arduino 101 • Arduino Robot • Arduino Esplora • Arduino Micro • Arduino Nano • Arduino Mini • Arduino Starter Kit • Arduino Basic Kit • MKR2UNO • TFT-дисплей Arduino |
Продвинутые функции | Arduino Mega 2560 • Arduino Zero • Arduino Due • Arduino Mega ADK • Arduino Pro • Arduino Motor Shield • Arduino USB Host Shield • Arduino Proto Shield • MKR Proto Shield • MKR Proto Large Shield • Arduino ISP • Arduino USB 2 Serial Micro • Arduino Mini USB Serial Adapter |
Интернет вещей | Arduino Yun • Arduino Ethernet • Arduino MKR1000 • Arduino WiFi 101 Shield • Arduino GSM Shield V2 • Arduino WiFi Shield • Arduino Wireless SD Shield • Arduino Wireless Proto Shield • Arduino Ethernet Shield V2 • Arduino Yun Shield • Arduino MKR1000 Bundle |
Носимые устройства | Arduino Gemma • Lilypad Arduino Simple • Lilypad Arduino Main Board • Lilypad Arduino USB • LilyPad Arduino SimpleSnap |
3D-печать | Arduino Materia 101 |
Устаревшие устройства | - |
Примеры Arduino | |
---|---|
Стандартные функции | |
Основы |
|
Цифровой сигнал |
|
Аналоговый сигнал |
|
Связь |
|
Управляющие структуры |
|
Датчики |
|
Дисплей |
Примеры, объясняющие основы управления дисплеем:
|
Строки |
|
USB (для Leonardo, Micro и Due плат) |
В этой секции имеют место примеры, которые демонстрируют использование библиотек, уникальных для плат Leonardo, Micro и Due.
|
Клавиатура |
|
Мышь |
|
Разное |