На первый взгляд, плата Raspberry Pi имеет достаточно много контактов ввода/вывода (GPIO pins), однако при подключении к ней ряда устройств, например, 3D принтера, этого количества контактов все равно может не хватить. В этих случаях для увеличения количества выходных контактов и может применяться регистр сдвига, который будет получать данные от Raspberry Pi в последовательной форме, а далее передавать их уже в параллельной форме. Используемый нами в этом проекте регистр сдвига является 8-битным, то есть он последовательно от Raspberry Pi будет получать 8 бит, а затем будет передавать эти 8 бит параллельно с помощью своих выходных контактов.
В качестве 8-битного регистра сдвига мы будем использовать микросхему 74HC595. Данная микросхема имеет 16 выводов. Мы будем использовать три контакта ввода/вывода (GPIO pins) платы Raspberry Pi для управления состоянием регистра сдвига. Помните о том, что выходные контакты регистра сдвига предназначены только для вывода данных и к ним нельзя подключить какие либо датчики либо считать их состояние с помощью Raspberry Pi. К выходным контактам регистра сдвига мы подключим светодиоды чтобы наблюдать за их состоянием.
Схема расположения контактов ввода/вывода (GPIO) на плате Raspberry Pi 2 показана на следующем рисунке. Более подробно об этих контактах вы можете прочитать в статье про мигание светодиода с помощью Raspberry Pi.
Каждый из 17 универсальных контактов ввода/вывода (GPIO) может выдерживать ток до 15mA. А суммарный ток от всех контактов ввода/вывода не должен превышать 50mA – таким образом, в среднем на каждый контакт будет приходиться ток примерно 3mA.
Необходимые компоненты
- Плата Raspberry Pi 2 Model B или другая аналогичная (купить на AliExpress).
- Резистор 220 Ом или 1 кОм – 6 шт. (купить на AliExpress).
- Светодиод – 8 шт. (купить на AliExpress).
- Конденсатор 0,01 мкФ (купить на AliExpress).
- Регистр сдвига 74HC595 (купить на AliExpress).
- Макетная плата.
- Соединительные провода.
Реклама: ООО «АЛИБАБА.КОМ (РУ)» ИНН: 7703380158
Схема проекта
Схема подключения регистра сдвига 74HC595 к плате Raspberry Pi представлена на следующем рисунке.
Регистр сдвига 74HC595
Распиновка (назначение контактов) микросхемы регистра сдвига 74HC595 представлена на следующем рисунке. Расшифрованы контакты в таблице ниже.
Наименование контактов | Выполняемые функции |
Q0 — Q7 | Выходные контакты микросхемы (на рисунке обозначены красным прямоугольником), на них выдаются параллельно 8 бит данных. Мы к ним подключаем светодиоды. |
Data Pin (DS) | Контакт, на который мы передаем данные последовательно, бит за битом. Чтобы передать 1, мы с помощью подтягивающего резистора подаем на него напряжение высокого уровня (high), а чтобы передать 0 – мы подаем на него напряжение низкого уровня. |
Clock Pin (SHCP) | Контакт синхронизации. Каждый импульс на этом контакте заставляет регистр сдвига считать один бит с контакта Data Pin и сохранить его. |
Shift Output (STCP) | После приема 8 бит мы подаем импульс на этот контакт чтобы увидеть выход регистра сдвига. |
Алгоритм работы
Алгоритм взаимодействия с регистром сдвига показан на следующем рисунке.
1. Сначала мы передаем один бит данных на контакт Data Pin.
2. После этого мы подаем импульс на Clock Pin, в результате этого регистр сдвига считывает бит данных с контакта Data Pin и сохраняет его.
3. Затем мы подаем второй бит данных на контакт Data Pin и импульс на Clock Pin, в результате чего регистр сдвига считывает второй бит данных с контакта Data Pin и сохраняет его. Этот процесс мы продолжаем до тех пор, пока не передадим регистру сдвига все 8 бит.
4. Когда все 8 бит приняты последовательно, один за одним, мы подаем импульс на контакт Shift Output (STCP) чтобы передвинуть (передать) все сохраненные 8 бит на 8 выходных контактов микросхемы.
Объяснение программы для Raspberry Pi
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
После того, как все необходимые соединения в схеме сделаны, мы можем подать питание на Raspberry Pi и после загрузки ее операционной системы можно начать писать программу в ней на Python. Подробнее о том, как это можно сделать, можно прочитать в статье про мигание светодиода с помощью Raspberry Pi.
В программе нам первым делом необходимо подключить (импортировать) библиотеку для работы с контактами ввода/вывода. Также мы импортируем эту библиотеку RPi.GPIO под именем “IO” (то есть переименовываем ее для использования в программе), то есть далее в программе всегда, когда мы захотим обратиться к контактам ввода/вывода, мы будем использовать слово ‘IO’.
1 |
import RPi.GPIO as IO |
Иногда контакты ввода/вывода (GPIO pins), которые мы собираемся использовать в программе, могут выполнять другие функции. В этом случае во время исполнения программы мы будем получать предупреждения (warnings). Следующей командой мы укажем плате Raspberry Pi на то, чтобы она игнорировала эти предупреждения и продолжала исполнение программы.
1 |
IO.setwarnings(False) |
Мы можем обращаться к контактам ввода/вывода (GPIO pins) платы Raspberry Pi используя либо номер контакта на плате, либо его функциональный номер. В представленной выше распиновке контактов ввода/вывода можно увидеть, к примеру, что обозначение GPIO5 соответствует контакту PIN 29. То есть в зависимости от того, какой способ обращения к контактам мы выбрали, мы можем обращаться к рассмотренному контакту либо по номеру ‘29’, либо по номеру ‘5’. В данном проекте мы выберем способ обращения к контактам по их функциональным номерам, поэтому используем следующую команду:
1 |
IO.setmode (IO.BCM) |
Далее мы сконфигурируем контакты GPIO4, GPIO5 и GPIO6 в качестве цифровых выходов – с них будет осуществляться управление регистром сдвига.
1 2 3 |
IO.setup(4,IO.OUT) IO.setup(5,IO.OUT) IO.setup(6,IO.OUT) |
Далее запишем команду цикла, который будет исполняться 8 раз.
1 |
for y in range(8): |
Также в программе мы будем использовать команду «While 1:» – она будет формировать бесконечный цикл. Внутри этого цикла все команды будут исполняться непрерывно.
Исходный код программы
Программа снабжена подробными комментариями.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
import RPi.GPIO as IO # подключение библиотеки для работы с контактами ввода/вывода import time # подключение библиотеки для работы с задержками IO.setwarnings(False) # отключаем показ любых предупреждений x=1 IO.setmode (IO.BCM) # мы будем программировать контакты GPIO по их функциональным номерам (BCM) (то есть PIN29 будет у нас‘GPIO5’) IO.setup(4,IO.OUT) # инициализируем GPIO4 в качестве цифрового выхода IO.setup(5,IO.OUT) IO.setup(6,IO.OUT) while 1: # бесконечный цикл for y in range(8): # цикл, который исполняется 8 раз IO.output(4,1) # последовательно передаем на data pin каждый бит time.sleep(0.1) # задержка на 100ms IO.output(5,1) # подаем на CLOCK уровень high time.sleep(0.1) IO.output(5,0) # подаем на CLOCK pin напряжение низкого уровня, to send a rising edge IO.output(4,0) # очищаем DATA pin IO.output(6,1) # подаем на SHIFT pin уровень high чтобы 8 бит данных выдать на выход в параллельном виде time.sleep(0.1) IO.output(6,0) # подаем на SHIFT pin напряжение низкого уровня for y in range(8): # цикл, который исполняется 8 раз IO.output(4,0) # очищаем DATA pin, передаем на него 0 time.sleep(0.1) # задержка на 100ms IO.output(5,1) # подаем на CLOCK pin уровень high time.sleep(0.1) IO.output(5,0) # подаем на CLOCK pin напряжение низкого уровня, to send a rising edge IO.output(4,0) # продолжаем удерживать на DATA bit уровень low чтобы продолжать счет вниз IO.output(6,1) # подаем на SHIFT pin уровень high чтобы 8 бит данных выдать на выход в параллельном виде time.sleep(0.1) IO.output(6,0) |