Плата Raspberry Pi Zero W является новой усовершенствованной платой семейства Raspberry Pi Zero. Ранее на нашем сайте мы уже рассмотрели первоначальную настройку данной платы, мигание светодиодом с ее помощью и подключение к ней TFT ЖК дисплея с диагональю 3,5 дюйма. В этой же статье мы рассмотрим подключение к плате Raspberry Pi Zero W ЖК дисплея 16x2 с интерфейсом I2C и клавиатуры (клавишной панели) 4x4. Мы будем выводить на экран ЖК дисплея символы, печатаемые на клавиатуре 4x4.
Необходимые компоненты
- Плата Raspberry Pi Zero W (купить на AliExpress).
- ЖК дисплей 16x2 с интерфейсом I2C (купить на AliExpress).
- Клавиатура (клавишная панель) 4x4 (купить на AliExpress).
- Соединительные провода.
Схема проекта
Схема подключения к плате Raspberry Pi Zero W ЖК дисплея с интерфейсом I2C и клавиатуры 4x4 представлена на следующем рисунке.
Используемая в нашем проекте клавиатура 4x4 имеет 4 столбца и 4 строки кнопок. Контакты в подобной клавиатуре могут быть подключены к любым цифровым контактам общего назначения платы Raspberry Pi Zero W, в нашем случае контакты строк (ROWS) клавиатуры мы подключили к контактам 5, 16, 20, 21 платы, а контакты столбцов (COLUMNS) клавиатуры – к контактам 6, 13, 19, 26 платы. Внешний вид клавиатуры 4x4 показан на следующем рисунке.
При нажатии произвольной кнопки на клавиатуре, относящейся к конкретной строке, на контакт которой подано напряжение высокого уровня, на контакте столбца клавиатуры, к которому относится данная кнопка, также появляется напряжение высокого уровня. Поскольку клавиатура не требует подачи на нее напряжения питания ее можно подключить к любым 8 цифровым контактам общего назначения платы Raspberry Pi Zero W.
Если вы хотите более подробно разобраться с технологией мультиплексирования, используемой в подобной клавиатуре для идентификации нажатия клавиш, то вы это можете прочитать в статье про подключение клавиатуры 4x4 к микроконтроллеру AVR, также на нашем сайте рассматривалось подключение подобной клавиатуры к плате Arduino.
ЖК дисплей 16x2 в настоящее время является одним из самых распространённых типов дисплеев, используемых в современной электронике. Обычный модуль подобного дисплея имеет 16 контактов и может подключаться к современным микроконтроллерам (микроконтроллерным платам) либо по 8-битной схеме, либо по 4-битной. Однако для сокращения числа используемых контактов микроконтроллера (платы) подобный ЖК дисплей 16x2 часто дополняют модулем интерфейса I2C и тогда его можно подключать к микроконтроллерам (платам) используя всего 2 контакта интерфейса I2C (ну и +2 контакта для подачи питания, разумеется). Внешний вид ЖК дисплея 16x2 с интерфейсом I2C показан на следующих рисунках.
Таким образом, модуль интерфейса I2C, припаянный к тыльной стороне ЖК дисплея, преобразует последовательный поток данных с интерфейса I2C в параллельный 8-битовый поток данных, и обратно. По умолчанию, I2C адрес данного модуля равен 0x27. Контакт земли (ground terminal) ЖК дисплея подключен к контакту земли платы Raspberry Pi Zero W, а контакт Vcc подключен к контакту 5V платы (красный провод). Контакты данных интерфейса I2C SDA и SCL подключены к контактам 3 и 5 платы.
Внешний вид собранной схемы проекта показан на следующем рисунке.
Настройка платы Raspberry Pi Zero W для работы с ЖК дисплеем с интерфейсом I2C и клавиатурой 4x4
После сборки схемы проекта и подачи питания на плату Raspberry Pi Zero W откройте окно терминала платы. В данном проекте для удаленного управления платой по протоколу SSH мы будем использовать программу MobaXterm, но вы можете использовать программу putty или любую другую аналогичную программу, с которой вы привыкли работать.
Для начала нам необходимо включить использование (enable) интерфейса I2C в плате Raspberry Pi Zero W. Для входа в меню настроек платы введите в окне терминала команду sudo raspi-config. Далее в меню настроек выберите настройки подключения (‘Interface options’), а в них выберите настройки интерфейса I2C (‘I2C option’). Затем нажмите кнопку yes для включения использования интерфейса I2C в плате.
Объяснение программы для Raspberry Pi Zero W
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
Прежде чем переходить к программированию платы для данного проекта нам необходимо установить на плату библиотеку для работы с ЖК дисплеем по интерфейсу I2C. Для установки данной библиотеки мы создадим файл используя команду nano RPi_I2C_driver.py, затем вставим в этот файл код библиотеки, который можно скачать по этой ссылке, после этого сохраним файл. После этого запустим код программы на выполнение с помощью команды python RPi_I2C_driver.py. После этого можно приступать к написанию кода для данного проекта.
В нашем проекте мы будем использовать библиотеку RPi_I2C_driver для установления связи с ЖК дисплеем по интерфейсу I2C. Библиотека RPi.GPIO будет использоваться для работы с контактами GPIO платы Raspberry Pi zero W. Библиотека time будет использоваться для организации временных задержек в программе.
Команда RPi_I2C_driver.lcd() будет использоваться для создания объекта "mylcd", с помощью которого мы и будем работать с ЖК дисплеем, использую функции библиотеки RPi_I2C_driver. Функция mylcd.backlight(1) будет использоваться для включения фоновой подсветки ЖК дисплея. Чтобы отключить использование фоновой подсветки ЖК дисплея эту функцию следует вызывать с параметром "0" вместо "1". Для очистки экрана ЖК дисплея мы будем использовать функцию mylcd.lcd_clear(). Функция time.sleep() будет использоваться для формирования задержки в программе, время задержки в данной функции указывается в секундах.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import RPi_I2C_driver import RPi.GPIO as GPIO import time mylcd = RPi_I2C_driver.lcd() mylcd.backlight(1) mylcd.lcd_clear() time.sleep(1) L1 = 16 L2 = 20 L3 = 21 L4 = 5 C1 = 6 C2 = 13 C3 = 19 C4 = 26 |
Функция GPIO.setwarnings(False) используется для отключения любых предупреждений во время работы с программой. Функция GPIO.setmode(GPIO.BCM) устанавливает режим работы с контактами по их функциональным (логическим) номерам. Если вы хотите использовать не логические, а физические номера контактов на плате, то тогда вам вместо параметра "GPIO.BCM" в этой функции необходимо указать параметр "GPIO.BOARD". Функция GPIO.setup() используется для инициализации контакта GPIO при помощи указания параметра GPIO.OUT (контакт будет использоваться в качестве цифрового выхода) или GPIO.IN (контакт будет использоваться в качестве цифрового входа).
1 2 3 4 5 6 7 8 9 10 |
GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) GPIO.setup(L1, GPIO.OUT) GPIO.setup(L2, GPIO.OUT) GPIO.setup(L3, GPIO.OUT) GPIO.setup(L4, GPIO.OUT) GPIO.setup(C1, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) GPIO.setup(C2, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) GPIO.setup(C3, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) GPIO.setup(C4, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) |
Функция readLine() используется для считывания контактов GPIO, которые подключены к столбцам клавиатуры. Эта функция содержит два параметра – "line" и "characters". В результате выполнения данной функции мы считываем информацию с каждого столбца клавиатуры (KeyPad) и если на каком-нибудь контакте мы обнаруживаем сигнал высокого уровня, мы отображаем на экране дисплея соответствующий символ, который мы получаем из списка "characters". В цикле while мы осуществляем поочередный опрос всех строк клавиатуры с помощью функций readLine() и отображаем нажатый символ на экране ЖК дисплея.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
def readLine(line, characters): GPIO.output(line, GPIO.HIGH) if(GPIO.input(C1) == 1): mylcd.lcd_write_char(ord(characters[0])) if(GPIO.input(C2) == 1): mylcd.lcd_write_char(ord(characters[1])) if(GPIO.input(C3) == 1): mylcd.lcd_write_char(ord(characters[2])) if(GPIO.input(C4) == 1): mylcd.lcd_write_char(ord(characters[3])) GPIO.output(line, GPIO.LOW) try: while True: readLine(L1, ["1","2","3","A"]) readLine(L2, ["4","5","6","B"]) readLine(L3, ["7","8","9","C"]) readLine(L4, ["*","0","#","D"]) time.sleep(0.3) except KeyboardInterrupt: print("\nProgram is stopped") |
Мы сохраним нашу программу в файл с именем example.py, но вы можете использовать любое другое имя файла по своему усмотрению.
На этом подключение ЖК дисплея с интерфейсом I2C и клавиатуры 4x4 к плате Raspberry Pi Zero W будет завершено. На следующем рисунке показан пример работы нашего проекта.
Исходный код программы на Python
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
import RPi_I2C_driver import RPi.GPIO as GPIO import time mylcd = RPi_I2C_driver.lcd() mylcd.backlight(1) mylcd.lcd_clear() time.sleep(1) L1 = 16 L2 = 20 L3 = 21 L4 = 5 C1 = 6 C2 = 13 C3 = 19 C4 = 26 GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) GPIO.setup(L1, GPIO.OUT) GPIO.setup(L2, GPIO.OUT) GPIO.setup(L3, GPIO.OUT) GPIO.setup(L4, GPIO.OUT) GPIO.setup(C1, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) GPIO.setup(C2, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) GPIO.setup(C3, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) GPIO.setup(C4, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) def readLine(line, characters): GPIO.output(line, GPIO.HIGH) if(GPIO.input(C1) == 1): mylcd.lcd_write_char(ord(characters[0])) if(GPIO.input(C2) == 1): mylcd.lcd_write_char(ord(characters[1])) if(GPIO.input(C3) == 1): mylcd.lcd_write_char(ord(characters[2])) if(GPIO.input(C4) == 1): mylcd.lcd_write_char(ord(characters[3])) GPIO.output(line, GPIO.LOW) try: while True: readLine(L1, ["1","2","3","A"]) readLine(L2, ["4","5","6","B"]) readLine(L3, ["7","8","9","C"]) readLine(L4, ["*","0","#","D"]) time.sleep(0.3) except KeyboardInterrupt: print("\nProgram is stopped") |