Общие сведения:
Модуль - Клавиатура, I2C-flash - является устройством ввода данных с подключением по шине I2С.
Модуль относится к серии «Flash», а значит к одной шине I2C можно подключить более 100 модулей, так как их адрес на шине I2C (по умолчанию 0x09), хранящийся в энергонезависимой памяти, можно менять программно.
Модуль можно использовать для ввода данных, управления роботами, механизмами, станками, для создания игр и многих других проектов.
Видео:
Редактируется ...
Спецификация:
- Напряжение питания: 3,3 В или 5 В (постоянного тока), поддерживаются оба напряжения.
- Потребляемый ток: до 10 мА (при включении всех светодиодов).
- Интерфейс: I2C.
- Скорость шины I2C: 100 кбит/с.
- Адрес на шине I2C: устанавливается программно (по умолчанию 0x09).
- Уровень логической 1 на линиях шины I2C: Vcc (толерантны к 5 В).
- Количество кнопок со светодиодами: зависит от типа модуля (на картинке 8 кнопок 4x2).
- Количество уровней яркости светодиодов: 7.
- Размер буфера FIFO: 255 байт (1 байт хранит код символа 1 кнопки).
- Рабочая температура: от -20 до +70 °С.
- Габариты: 78,74 х 39,37 мм (для модуля с 8 кнопками 4x2).
- Вес: 26 г (для модуля с 8 кнопками 4x2).
Подключение:
Перед подключением модуля ознакомьтесь с разделом "Смена адреса модуля на шине I2C" в данной статье.
С обратной стороны платы, по бокам, расположены разъемы для подключения клавиатуры к шине I2C. Шина подключается к любому разъему I2C, а второй разъем можно использовать для подключения следующей клавиатуры, или других устройств.
- SCL - вход/выход линии тактирования шины I2C.
- SDA - вход/выход линии данных шины I2C.
- Vcc - вход питания 3,3 или 5 В.
- GND - общий вывод питания.
Модуль удобно подключать 2 способами, в зависимости от ситуации:
Способ - 1: Используя провода и Raspberry Pi
Используя провода «Мама — Мама», подключаем напрямую к Raspberry Pi
В этом случае необходимо питать логическую часть модуля от 3,3 В Raspberry
Вывод Raspberry | Вывод модуля |
---|---|
GPIO 2 | SDA |
GPIO 3 | SCL |
3.3V | VCC |
GND | GND |
Способ - 2: Используя Trema+Expander Hat
Используя 4-х проводной шлейф, подключаем к Trema+Expander Hat.
Питание:
Входное напряжение питания модуля 3,3В или 5В постоянного тока (поддерживаются оба напряжения питания), подаётся на выводы Vcc и GND любого разъема.
Подробнее о модуле:
Модуль построен на базе микроконтроллера STM32F030F4 и снабжен собственным стабилизатором напряжения. Модуль самостоятельно опрашивает кнопки клавиатуры, обрабатывает полученные данные и по запросу выводит состояния кнопок, события совершённые с кнопками, а так же предоставляет возможность управлять светодиодами кнопок.
Модуль позволяет:
- Менять свой адрес на шине I2C.
- Управлять внутренней подтяжкой линий шины I2C (по умолчанию включена).
- Получать текущее состояние кнопок клавиатуры (нажата / отпущена / удерживается).
- Получать наличие событий кнопок клавиатуры (нажималась / отпускалась / изменилась).
- Получать время удержания или простоя кнопок клавиатуры.
- Управлять светодиодами кнопок (включить / выключить).
- Задавать яркость свечения светодиодов кнопок.
- Задавать режимы светодиодной анимации, при которых светодиоды будут самостоятельно реагировать на события или изменение состояний кнопок (доступно несколько режимов).
- Получать историю нажатий кнопок прочитав последовательности их нажатий из буфера FIFO.
- Определять количество данных в буфере FIFO или очистить буфер.
- Задавать время по которому коды удерживаемых кнопок будут попадать в буфер FIFO.
Специально для работы с модулем - Клавиатура, I2C-flash, нами разработана библиотека pyiArduinoI2Ckeyboard которая позволяет реализовать все функции модуля.
Для работы с модулем необходимо включить шину I2C.
Внимание! Для корректной работы модулей FLASH-I2C на Raspberry Pi под управлением Raspberry OS "Buster" необходимо выключить динамическое тактирование ядра (опция core_freq_min должна быть равна core_freq в /boot/config.txt
) Ссылка на подробное описание.
Для подключения библиотеки необходимо сначала её установить. Сделать это можно в менеджере модулей в Thonny Python IDE (тогда библиотека установится локально для этого IDE), в виртуальной среде командой pip3 install pyiArduinoI2Ckeyboard
или в терминале Raspberry (тогда библиотека будет системной) командой:
sudo pip3 install pyiArduinoI2Ckeyboard
Подробнее об установке библиотек можно узнать в этой статье.
Примеры:
В данном разделе раскрыты примеры работы с модулем по шине I2C с использованием библиотеки pyiArduinoI2Ckeyboard.
Все примеры приведены для клавиатуры, кнопки которой расположены в 2 ряда, по 4 кнопки в каждом ряду. Если у Вашей клавиатуры другое количество или расположение кнопок, просто укажите это при объявлении объекта:
kbd = pyiArduinoI2Ckeyboard( адрес, количество кнопок в ряду, количество рядов)
.
Смена адреса модуля на шине I2C:
- Пример для клавиатуры, кнопки которой расположены в 2 ряда, по 4 кнопки в каждом ряду, позволяет указать адрес модулю, даже если его текущий адрес Вам неизвестен.
# Подключаем библиотеку для работы с датчиком температуры и влажности from pyiArduinoI2Ckeyboard import * import sys # Объявляем объект module для работы с функциями и методами библиотеки pyiArduinoI2Ckeyboard. # Если при объявлении объекта указать адрес, например, module(0x0B), # то пример будет работать с тем модулем, адрес которого был указан. module = pyiArduinoI2Ckeyboard(None, 4, 2, NO_BEGIN) # Если сценарию не были переданы аргументы if len(sys.argv) < 2: # Назначаем модулю адрес (0x07 < адрес < 0x7F). newAddress = 0x09 # Иначе else: # Новый адрес - первый аргумент newAddress = int(sys.argv[1]) # Если датчик найден if module.begin(): print("Найден датчик %#.2x" % module.getAddress()) # Если адрес удалось изменить if module.changeAddress(newAddress): print("Адрес изменён на %#.2x" % module.getAddress()) else: print("Адрес не изменён!") else: print("модуль не найден!")
Для работы данного примера, на шине I2C должна быть только одна клавиатура.
Данный скрипт демонстрирует не только возможность смены адреса на указанный в переменной newAddress
, но и обнаружение, и вывод текущего адреса модуля на шине I2C.
Получение символов введённых с клавиатуры:
- Пример для клавиатуры, кнопки которой расположены в 2 ряда, по 4 кнопки в каждом ряду, позволяет присвоить символы клавишам и увидеть текст введённый с клавиатуры.
# Подключаем библиотеку для работы с клавиатурой I2C-flash. from pyiArduinoI2Ckeyboard import * # Объявляем объект kbd для работы с функциями и методами библиотеки # pyiArduinoI2Ckeyboard, указывая адрес модуля на шине I2C, количество # кнопок в линии, количество линий с кнопками. kbd = pyiArduinoI2Ckeyboard(0x09,4,2) # Если объявить объект без указания адреса (kbd = pyiArduinoI2Ckeyboard(None,4,2)), то адрес будет найден автоматически. # Присваиваем символы всем кнопкам клавиатуры. По умолчанию кнопкам присвоены символы "12345678". kbd.setEncoding("abcd0123") # Символ можно присвоить каждой кнопке по отдельности (присвоить 4 кнопке, в 1 ряду, символ 'f'). kbd.setEncoding(4,1,'f') # Символ можно присвоить каждой кнопке по отдельности (присвоить 4 кнопке, в 2 ряду, символ новой строки '\n'). kbd.setEncoding(4,2,'\n') while True: # Получаем и выводим символы с клавиатуры: # Если в буфере истории нажатий кнопок есть символы, то ... if kbd.available(): # Выводим очередной символ из буфера истории нажатий кнопок. print(kbd.readChar())
После запуска данного примера, в консоли будут появляться символы нажатых клавиш. Каждой клавише можно присвоить один символ, обратившись к функции setEncoding(). По умолчанию клавишам присвоены символы 1,2,3,4,5,6,7,8. Для клавиатур с 10 кнопками, по умолчанию, клавишам присвоены символы 1,2,3,4,5,6,7,8,9,0.
При нажатии клавиши, её код добавляется в буфер истории нажатых клавиш клавиатуры (буфер FIFO). При удержании клавиши, её код многократно добавляется в буфер. Количество кодов (байт) находящихся в буфере истории можно узнать функцией available()
. При чтении символа из буфера истории функцией readChar()
, прочитанный символ исчезает из буфера. Обратившись к функции flush()
можно очистить всю историю нажатых клавиш, но в приведённом примере эта функция ничего не делает, так как при подаче питания буфер пуст. Размер буфера позволяет хранить историю последних 255 нажатых клавиш.
Добавление светодиодной анимации:
- Пример для клавиатуры, кнопки которой расположены в 2 ряда, по 4 кнопки в каждом ряду, позволяет анимировать действия светодиодной подсветкой клавиш.
# Подключаем библиотеку для работы с клавиатурой I2C-flash. from pyiArduinoI2Ckeyboard import * # Объявляем объект kbd для работы с функциями и методами библиотеки pyiArduinoI2Ckeyboard, указывая адрес модуля на шине I2C, количество кнопок в линии, количество линий с кнопками. kbd = pyiArduinoI2Ckeyboard(0x09,4,2) # Если объявить объект без указания адреса (kbd = pyiArduinoI2Ckeyboard(None,4,2) ), то адрес будет найден автоматически. # Присваиваем символы всем кнопкам клавиатуры (последней кнопке # присваиваем символ новой строки '\n'). По умолчанию кнопкам # присвоены символы "12345678". kbd.setEncoding("abcdefg\n") # Включаем светодиодную анимацию № 7. Светодиоды информируют # о добавлении кода своей кнопки в буфер истории нажатых клавиш. kbd.setAnimation(7) while True: # Получаем и выводим символы с клавиатуры: # Если в буфере истории нажатий кнопок есть символы, то ... if kbd.available(): # Выводим очередной символ из буфера истории нажатий кнопок. print(kbd.readChar())
Данный пример, как и предыдущий, выводит символы нажатых кнопок в консоль. Обращением к функции setAnimation()
с параметром 7
, мы включаем светодиодную анимацию добавления кодов нажатых клавиш в буфер истории. Измените номер анимации с 7
на 1
-6
, для просмотра всех вариантов. Обращение к функции setAnimation()
с параметром 0
приводит к отключению светодиодной анимации.
Чтение состояний и событий кнопок клавиатуры:
- Пример для клавиатуры, кнопки которой расположены в 2 ряда, по 4 кнопки в каждом ряду, позволяет работать с клавиатурой как с набором отдельных кнопок.
# Подключаем библиотеку для работы с клавиатурой I2C-flash. from pyiArduinoI2Ckeyboard import * # Объявляем объект kbd для работы с функциями и методами библиотеки # pyiArduinoI2Ckeyboard, указывая адрес модуля на шине I2C, количество # кнопок в линии, количество линий с кнопками. kbd = pyiArduinoI2Ckeyboard(0x09,4,2) # Если объявить объект без указания адреса (pyiArduinoI2Ckeyboard kbd(None,4,2) ), то адрес будет найден автоматически. # Присваиваем 3 кнопке в 1 ряду символ 'f'. kbd.setEncoding(3,1,'f') while True: # Выполняем действия по событию нажатия клавиши: if kbd.getKey(1,1,KEY_PUSHED ): print("открыть" ) # Если 1 кнопка в 1 ряду нажимается, то выводим сообщение "открыть". if kbd.getKey(2,1,KEY_PUSHED ): print("включить" ) # Если 2 кнопка в 1 ряду нажимается, то выводим сообщение "включить". if kbd.getKey('f',KEY_PUSHED ): print("начать" ) # Если 3 кнопка в 1 ряду нажимается, то выводим сообщение "начать". К этой кнопке пожно обращаться не только по номеру и ряду, но и по символу присвоенному ей функцией setEncoding() if kbd.getKey(4,1,KEY_PUSHED ): print("вперёд" ) # Если 4 кнопка в 1 ряду нажимается, то выводим сообщение "вперёд". if kbd.getKey(1,2,KEY_PUSHED ): print("закрыть" ) # Если 1 кнопка в 2 ряду нажимается, то выводим сообщение "закрыть". if kbd.getKey(2,2,KEY_PUSHED ): print("выключить" ) # Если 2 кнопка в 2 ряду нажимается, то выводим сообщение "выключить". if kbd.getKey(3,2,KEY_RELEASED): print("остановить") # Эта строка кода реагирует не на нажатие 3 кнопки 2 ряда, а на её отпускание. if kbd.getKey(4,2,KEY_PUSHED ): print("назад" ) # Если 4 кнопка в 2 ряду нажимается, то выводим сообщение "назад".
После запуска данного примера, в консоли будут появляться сообщения, в зависимости от состояний и событий кнопок.
Событием является момент нажатия KEY_PUSHED
, отпускания KEY_RELEASED
, или изменения KEY_CHANGED
кнопки. События приводят к однократной реакции на них. Если два раза нажать на 1 кнопку в 1 ряду, то и в консоли появятся две надписи "открыть", вне зависимости от того как долго эта кнопка находилась в нажатом состоянии.
Состояния кнопки могут длиться неопределённое время. Например, состояние кнопки - нажата KEY_STATE
, будет продолжаться всё время пока кнопку удерживают в нажатом состоянии. Состояния приводят к многократной реакции на них. Если нажать и отпустить 3 кнопку во 2 ряду, то в консоли появятся столько надписей "остановить", сколько успеет вывести скрипт пока кнопка нажата.
Обратите внимание на то, что обращаться к кнопке можно не только по её номеру и ряду, но и по присвоенному ей символу, как это сделано в примере с 4 кнопкой 1 ряда. Если вместо номера и ряда, или символа, указать KEY_ALL
, то результатом будет число состоящее из флагов состояний или событий всех кнопок клавиатуры (см. следующий пример).
Чтение состояний и событий всех кнопок клавиатуры одним запросом:
- Пример для клавиатуры, кнопки которой расположены в 2 ряда, по 4 кнопки в каждом ряду.
# Подключаем библиотеку для работы с клавиатурой I2C-flash. from pyiArduinoI2Ckeyboard import * # Объявляем объект kbd для работы с функциями и методами библиотеки # pyiArduinoI2Ckeyboard, указывая адрес модуля на шине I2C, количество # кнопок в линии, количество линий с кнопками. kbd = pyiArduinoI2Ckeyboard(0x09, 4, 2) while True: # Выполняем действия по изменению состояния любой клавиши: # Если изменилось состояние хотя бы одной кнопки, то ... if kbd.getKey(KEY_ALL, KEY_CHANGED): # Получаем флаги текущего состояния кнопок. i = kbd.getKey(KEY_ALL, KEY_STATE ) # Выводим текст если установлен хотя бы 1 флаг. if i: print("Нажаты кнопки: ", end='') else: # Выводим текст если все флаги сброшены. print("Все кнопки отпущены.") if i & (1<<0): print("1,", end='') # Если установлен 0 бит (флаг состояния 1 кнопки 1 ряда), то выводим текст. if i & (1<<1): print("2,", end='') # Если установлен 1 бит (флаг состояния 2 кнопки 1 ряда), то выводим текст. if i & (1<<2): print("3,", end='') # Если установлен 2 бит (флаг состояния 3 кнопки 1 ряда), то выводим текст. if i & (1<<3): print("4,", end='') # Если установлен 3 бит (флаг состояния 4 кнопки 1 ряда), то выводим текст. if i & (1<<4): print("5,", end='') # Если установлен 4 бит (флаг состояния 1 кнопки 2 ряда), то выводим текст. if i & (1<<5): print("6,", end='') # Если установлен 5 бит (флаг состояния 2 кнопки 2 ряда), то выводим текст. if i & (1<<6): print("7,", end='') # Если установлен 6 бит (флаг состояния 3 кнопки 2 ряда), то выводим текст. if i & (1<<7): print("8,", end='') # Если установлен 7 бит (флаг состояния 4 кнопки 2 ряда), то выводим текст. print()
В данном примере используется та же функция getKey()
что и в предыдущем, но обращение к функции осуществляется с указанием параметра KEY_ALL
- прочитать флаги всех кнопок сразу.
Чтение состояний и событий всех кнопок одним запросом выполняется быстрее чем чтение состояний и событий каждой кнопки по отдельности (как в предыдущем примере).
Управление светодиодами клавиатуры:
- Пример для клавиатуры, кнопки которой расположены в 2 ряда, по 4 кнопки в каждом ряду.
from time import sleep # Подключаем библиотеку для работы с клавиатурой I2C-flash. from pyiArduinoI2Ckeyboard import * # Объявляем объект kbd для работы с функциями и методами библиотеки # pyiArduinoI2Ckeyboard, указывая адрес модуля на шине I2C, количество # кнопок в линии, количество линий с кнопками. kbd = pyiArduinoI2Ckeyboard(0x09,4,2) # Присваиваем 3 кнопке в 1 ряду символ 's'. kbd.setEncoding(3,1,'s') # while True: # # Выполняем действия независимо от состояния клавиш: # kbd.setLed(1,1,True), sleep(.5) # Включаем светодиод 1 кнопки в 1 ряду. kbd.setLed(2,2,True), kbd.setLed(1,1,False), sleep(.5) # Включаем светодиод 2 кнопки в 2 ряду и выключаем светодиод 1 кнопки в 1 ряду. kbd.setLed('s',True), kbd.setLed(2,2,False), sleep(.5) # Включаем светодиод 3 кнопки в 1 ряду и выключаем светодиод 2 кнопки в 2 ряду. kbd.setLed(4,2,True), kbd.setLed(3,1,False), sleep(.5) # Включаем светодиод 4 кнопки в 2 ряду и выключаем светодиод 3 кнопки в 1 ряду. kbd.setLed(4,2,False), sleep(.5) # выключаем светодиод 4 кнопки в 2 ряду. kbd.setLed(LED_ALL,0b10100101), sleep(.5) # Управляем всеми светодиодами. Биты 0-3 управляют светодиодами 1-4 в 1 ряду, см. пример getAllKeyState. kbd.setLed(LED_ALL,0b01011010), sleep(.5) # Управляем всеми светодиодами. Биты 4-7 управляют светодиодами 1-4 в 2 ряду, см. пример getAllKeyState. kbd.setLed(LED_ALL,0b00000000), sleep(.5) # Выключаем все светодиоды. kbd.setLed(LED_ALL,0b11111111), sleep(.5) # Включаем все светодиоды. kbd.setLed(LED_ALL,0b00000000), sleep(.5) # Выключаем все светодиоды.
После запуска данного примера, на клавиатуре, последовательно включатся по одному светодиоду «змейкой». Далее светодиоды дважды включатся в шахматном порядке, после чего все светодиоды выключатся, включатся и снова выключатся.
Так как управление светодиодами написано в теле функции loop()
, то описанные действия будут повторяться пока есть питание.
Обратите внимание на то, что обращаться к светодиодам можно так же как и к их кнопкам: по номеру и ряду, по присвоенному символу, или ко всем светодиодам сразу LED_ALL
.
Описание функций библиотеки:
В данном разделе описаны функции библиотеки pyiArduinoI2Ckeyboard для работы с модулем - Клавиатура, I2C-flash.
Данная библиотека может использовать как аппаратную, так и программную реализацию шины I2C. О том как выбрать тип шины I2C рассказано в статье Wiki - расширенные возможности библиотек iarduino для шины I2C.
Подключение библиотеки:
- Если адрес модуля известен (в примере используется адрес 0x09):
from pyiArduinoI2Ckeyboard import * # Подключаем библиотеку для работы с модулем. kbd = pyiArduinoI2Ckeyboard(0x09,4,2) # Создаём объект kbd для работы с функциями и методами библиотеки iarduino_I2C_Keyboard, указывая адрес модуля на шине I2C (0x09), количество кнопок в линии (4), количество линий с кнопками (2).
- Если адрес модуля неизвестен (адрес будет найден автоматически):
# Подключаем библиотеку для работы с модулем. from pyiArduinoI2Ckeyboard import * # Создаём объект kbd для работы с функциями и методами библиотеки pyiArduinoI2Ckeyboard, без адреса (None), но с указанием количества кнопок в линии (4), количества линий с кнопками (2). kbd = pyiArduinoI2Ckeyboard(None,4,2)
- При создании объекта без указания адреса, на шине должен находиться только один модуль.
- Последние два параметра, передаваемые при объявлении объекта, определяют количество кнопок в ряду и количество рядов с кнопками на клавиатуре.
- Примеры подключения библиотеки представленные выше, предназначены для клавиатуры 4x2 (по 4 кнопки в ряду, всего 2 ряда с кнопками).
Функция begin()
- Назначение: Инициализация работы с модулем.
- Синтаксис: begin()
- Параметры: Нет.
- Возвращаемое значение: - результат инициализации (True или False).
- Примечание:
- По результату инициализации можно определить наличие модуля на шине.
- Выполняется автоматически при создании объекта. Если нужно создать объект без инициализации модуля, то четвёртым параметром объекта должен быть
NO_BEGIN
. Например, `kbd = pyiArduinoI2Ckeyboard(None, None, None, NO_BEGIN). При таком создании объекта адрес будет найден автоматически при первом запуске этой функции, при этом объект будет создан для клавиатуры с пятью кнопками в линии и двумя рядами линий.
- Пример:
if kbd.begin(): print( "Модуль найден и инициирован!" ) else: print( "Модуль не найден на шине I2C" )
Функция reset()
- Назначение: Перезагрузка модуля.
- Синтаксис: reset()
- Параметры: Нет.
- Возвращаемое значение: - результат перезагрузки (True или False).
- Пример:
if kbd.reset(): print( "Модуль перезагружен" ) else: print( "Модуль не перезагружен" )
Функция changeAddress()
- Назначение: Смена адреса модуля на шине I2C.
- Синтаксис: changeAddress( АДРЕС )
- Параметр:
- АДРЕС - новый адрес модуля на шине I2C (целое число от 0x08 до 0x7E)
- Возвращаемое значение: - результат смены адреса (True или False).
- Примечание:
- Адрес модуля сохраняется в энергонезависимую память, а значит будет действовать и после отключения питания.
- Текущий адрес модуля можно узнать функцией getAddress().
- Пример:
if kbd.changeAddress(0x12): print( "Адрес модуля изменён на 0x12" ) else: print( "Не удалось изменить адрес" )
Функция getAddress()
- Назначение: Запрос текущего адреса модуля на шине I2C.
- Синтаксис: getAddress()
- Параметры: Нет.
- Возвращаемое значение: АДРЕС - текущий адрес модуля на шине I2C (от 0x08 до 0x7E)
- Примечание: Функция может понадобиться если адрес модуля не указан при создании объекта, а обнаружен библиотекой.
- Пример:
print( "Адрес модуля на шине I2C = 0x" ) print( kbd.getAddress(), HEX )
Функция getVersion()
- Назначение: Запрос версии прошивки модуля.
- Синтаксис: getVersion()
- Параметры: Нет
- Возвращаемое значение: ВЕРСИЯ - номер версии прошивки от 0 до 255.
- Пример:
print( "Версия прошивки модуля " ) print( kbd.getVersion() )
Функция setPullI2C()
- Назначение: Управление внутрисхемной подтяжкой линий шины I2C.
- Синтаксис: setPullI2C( [ФЛАГ] )
- Параметр:
- ФЛАГ требующий установить внутрисхемную подтяжку линий шины I2C (True или False).
- Возвращаемое значение:
- результат включения / отключения внутрисхемной подтяжки (True или False).
- Примечание:
- Вызов функции без параметра равносилен вызову функции с параметром True - установить.
- Флаг установки внутрисхемной подтяжки сохраняется в энергонезависимую память модуля, а значит будет действовать и после отключения питания.
- Внутрисхемная подтяжка линий шины I2C осуществляется до уровня 3,3 В, но допускает устанавливать внешние подтягивающие резисторы и иные модули с подтяжкой до уровня 3,3 В или 5 В, вне зависимости от состояния внутрисхемной подтяжки модуля.
- Пример:
if kbd.setPullI2C(True ): print( "Внутрисхемная подтяжка установлена." ) if kbd.setPullI2C(False): print( "Внутрисхемная подтяжка отключена." )
Функция getPullI2C()
- Назначение: Запрос состояния внутрисхемной подтяжки линий шины I2C.
- Синтаксис: getPullI2C()
- Параметры: Нет.
- Возвращаемое значение: - ФЛАГ включения внутрисхемной подтяжки (True или False).
- Пример:
if kbd.getPullI2C(): print( "Внутрисхемная подтяжка включена." ) else: print( "Внутрисхемная подтяжка отключена." )
Функция available()
- Назначение: Запрос количества кодов кнопок в буфере истории нажатий кнопок (FIFO).
- Синтаксис: available()
- Параметры: Нет.
- Возвращаемое значение: - КОЛИЧЕСТВО кодов нажатых кнопок (0-255) в буфере FIFO.
- Примечание:
- Данная функция схожа по назначению с одноимённой функцией библиотеки Servo.
- Пример:
print( "В буфере истории нажатых кнопок хранится " ) print( kbd.available() ) print( " символов." )
Функция readChar()
- Назначение: Чтение одного символа из буфера истории нажатых кнопок (FIFO).
- Синтаксис: readChar()
- Параметры: Нет.
- Возвращаемое значение: - СИМВОЛ код кнопки которого был прочитан из буфера.
- Примечание:
- Данная функция схожа по назначению с функцией read() библиотеки Servo.
- Функция читает из буфера код кнопки, возвращая символ ранее присвоенный этой кнопке.
- Символы присваиваются кнопкам функцией setEncoding().
- Если буфер истории нажатых кнопок пуст, то функция readChar() вернёт символ пробела.
- Пример:
if kbd.available(): # Если в буфере истории есть символы, то ... print( kbd.readChar() ) # Читаем 1 символ из буфера истории нажатий кнопок. }
Функция readString()
- Назначение: Чтение строки символов из буфера истории нажатых кнопок (FIFO).
- Синтаксис: readString( РАЗМЕР, [ФЛАГ] )
- Параметры:
- РАЗМЕР - ограничение количества получаемых символов за раз.
- ФЛАГ - добавления символа конца строки, после последнего прочитанного символа.
- Возвращаемое значение: - КОЛИЧЕСТВО прочитанных символов в строку получатель.
- Примечание:
- Если в буфере истории больше кодов кнопок, чем указано в параметре РАЗМЕР, то будет прочитано количество символов равное значению РАЗМЕР, а остальные символы можно прочитать из буфера историй позже.
- Если в буфере истории меньше кодов кнопок, чем указано в параметре РАЗМЕР, то будут прочитаны все символы кнопок, коды которых находятся в буфере.
- Если установлен флаг добавления символа конца строки, то значение РАЗМЕР должно быть на 1 символ меньше чем максимально допустимое число читаемых символов.
- Вызов функции без флага равносилен вызову функции с установленным флагом.
- Размер строки указанной в параметре СТРОКА должен быть равен или превышать значение РАЗМЕР.
- Возвращаемое функцией количество прочитанных символов не включает добавление символа конца строки.
- Пример:
if kbd.available(): # Если в буфере истории есть символы, то ... s, n = kbd.readString(9) # Читаем до 9 символов включительно в строку s, # n - количество прочитанных символов
Функция flush()
- Назначение: Очистка буфера истории нажатых кнопок (FIFO).
- Синтаксис: flush()
- Параметры: Нет.
- Возвращаемое значение: Нет.
- Пример:
kbd.flush()
Функция setEncoding()
- Назначение: Присвоение символа одной кнопке или символов всем кнопкам.
- Синтаксис: setEncoding( НОМЕР, РЯД, СИМВОЛ )
- Синтаксис: setEncoding( СТРОКА_СИМВОЛОВ )
- Параметры:
- НОМЕР - номер кнопки в ряду кнопок клавиатуры.
- РЯД - ряд клавиатуры в котором находится кнопка.
- СИМВОЛ - символ присваиваемый кнопке, номер и ряд которой был указан.
- СТРОКА_СИМВОЛОВ - строка, каждый символ которой присваивается кнопке.
- Возвращаемое значение: Нет.
- Примечание:
- Нажатие на любую кнопку приводит к записи кода нажатой кнопки в буфер истории нажатий кнопок. При чтении буфера, возвращаются не коды кнопок, а символы присвоенные им.
- По умолчанию кнопкам клавиатуры присвоены символы '1', '2', '3' ... '7', '8'.
- Если указан номер и ряд кнопки, то символ присваивается указанной кнопке.
- Если указана строка символов, то первый символ строки присваивается 1 кнопке 1 ряда, второй символ строки присваивается 2 кнопке 1 ряда и т.д. до последней кнопки последнего ряда.
- Допускается указывать строку символов типа String.
- Кнопкам можно присвоить только однобайтные символы, включая управляющие символы: '\r' - возврат каретки, '\n' - начало строки, '\t' - табуляция и т.д.
- Запрещается добавлять символ конца строки '\0' как часть строки символов присваиваемых кнопкам. Символ конца строки будет расценен как завершение самой строки символов, а кнопкам будут присвоены только те символы которые находятся до символа конца строки.
- Пример:
kbd.setEncoding("abc\r\n\t12") # Присваиваем символы всем кнопкам клавиатуры: 'a', 'b', 'c', '\r', '\n', '\t', '1', '2'. kbd.setEncoding(3, 1, 'f') # Присваиваем 3 кнопке 1 ряда символ 'f'.
Функция getEncoding()
- Назначение: Получение символа присвоенного кнопке.
- Синтаксис: getEncoding( НОМЕР, РЯД )
- Параметры:
- НОМЕР - номер кнопки в ряду кнопок клавиатуры.
- РЯД - ряд клавиатуры в котором находится кнопка.
- Возвращаемое значение: - СИМВОЛ присвоенный кнопке.
- Примечание:
- Если вызвать функцию указав, вместо номера и ряда кнопки, только один параметр - символ присвоенный кнопке, то функция вернёт не символ, а порядковый номер той кнопки, которой был присвоен указанный символ.
- Пример:
i = kbd.getEncoding(4,2) # Получить символ присвоенный 4 кнопке во 2 ряду. j = kbd.getEncoding('5') # Получить порядковый номер кнопки которой присвоен символ '5'.
Функция setDelay()
- Назначение: Установка времени задержки от нажатия на кнопку до принятия её удерживаемой для буфера истории нажатий кнопок.
- Синтаксис: setDelay( ВРЕМЯ )
- Параметр:
- ВРЕМЯ - значение от 100 до 25'500 мс.
- Возвращаемое значение: Нет.
- Примечание:
- Откройте на компьютере текстовый редактор, нажмите и не отпускайте любую символьную клавишу Вашей компьютерной клавиатуры. Вы увидите как символ нажатой кнопки, сначала однократно появился в окне, а через несколько долей секунд начал повторно появляться заполняя окно текстового редактора. Аналогичным образом код нажатой кнопки сначала однократно попадает в буфер истории, а если кнопка не отпускается, то через некоторое время буфер истории начинает заполняться кодом удерживаемой кнопки. Это время и есть время задержки.
- По умолчанию время задержки равно 500 мс = 0,5 сек.
- Установленное время сохраняется в энергонезависимую память модуля, а значит будет действовать и после отключения питания.
- Пример:
kbd.setDelay( 1000 ) # Начать заполнять буфер истории при удержании кнопки дольше 1000 мс.
Функция getDelay()
- Назначение: Запрос времени задержки от нажатия на кнопку до принятия её удерживаемой.
- Синтаксис: getDelay()
- Параметры: Нет.
- Возвращаемое значение: - ВРЕМЯ задержки от 100 до 25'500 мс.
- Примечание:
- Время задержки от нажатия на кнопку до принятия её удерживаемой хранится в энергонезависимой памяти модуля.
- Пример:
i = kbd.getDelay() # Получить время задержки до принятия кнопки удерживаемой.
Функция setPeriod()
- Назначение: Установка периода заполнения буфера историй кодом удерживаемой кнопки.
- Синтаксис: setPeriod( ПЕРИОД )
- Параметр:
- ПЕРИОД - время (от 10 до 2'550 мс.) частоты заполнения буфера истории нажатых кнопок, кодом удерживаемой кнопки.
- Возвращаемое значение: Нет.
- Примечание:
- Откройте на компьютере текстовый редактор, нажмите и не отпускайте любую символьную клавишу Вашей компьютерной клавиатуры. Вы увидите как символ нажатой кнопки, сначала однократно появился в окне, а через несколько долей секунд начал повторно появляться заполняя окно текстового редактора. Аналогичным образом код удерживаемой кнопки заполняет буфер истории. Период определяет с какой скоростью код удерживаемой кнопки попадает в буфер истории, чем меньше время периода, тем выше скорость.
- По умолчанию период (время между повторными записями кода в буфер) равен 50 мс.
- Установленный период сохраняется в энергонезависимую память модуля, а значит будет действовать и после отключения питания.
- Пример:
kbd.setPeriod( 100 ) # Добавлять код удерживаемой кнопки в буфер истории каждые 100 мс.
Функция getPeriod()
- Назначение: Запрос периода заполнения буфера историй кодом удерживаемой кнопки.
- Синтаксис: getPeriod()
- Параметры: Нет.
- Возвращаемое значение: - ПЕРИОД заполнения буфера кодом удерживаемой кнопки.
- Примечание:
- Период добавления кода удерживаемой кнопки в буфер FIFO истории хранится в энергонезависимой памяти модуля.
- Пример:
i = kbd.getPeriod() # Получить период заполнения буфера истории нажатых кнопок.
Функция getKey()
- Назначение: Запрос флага состояния, события или времени удержания кнопки.
- Синтаксис: getKey( НОМЕР, РЯД, ТИП )
- Синтаксис: getKey( СИМВОЛ, ТИП )
- Параметры:
- НОМЕР - номер кнопки в ряду кнопок клавиатуры.
- РЯД - ряд клавиатуры в котором находится кнопка.
- СИМВОЛ - символ присвоенный кнопке.
- ТИП - тип запрошенного состояния или события кнопки, представлен 1 из значений:
- KEY_PUSHED - запрос флага указывающего на то что кнопка нажималась.
- KEY_RELEASED - запрос флага указывающего на то что кнопка отпускалась.
- KEY_CHANGED - запрос флага указывающего что кнопка нажималась или отпускалась.
- KEY_STATE - запрос флага текущего состояния кнопки (True - нажата, False - свободна).
- KEY_TRIGGER - запрос флага триггера (переключателя). Флаг меняет свое состояние с каждым новым нажатием на кнопку.
- KEY_HOLD_05 - запрос времени удержания кнопки в 1/2 долях секунд.
Возвращаемое значение: зависит от указанного значения ТИП. Примечание:
- Определить кнопку к которой относится запрос можно указав её НОМЕР и РЯД, или указав СИМВОЛ ранее присвоенный кнопке функцией setEncoding().
- Если запрошен флаг (события или состояния), то возвращается значение True или False.
- Если запрошено время удержания кнопки в 1/2 долях секунд, то возвращается значение от 0 - кнопка не удерживается до 7 - кнопка удерживается 7*1/2 секунд. Более точное время удержания кнопки можно получить обратившись к функции getTime().
- Если вместо СИМВОЛА присвоенного кнопке указать значение KEY_ALL, то возвращается число состоящее из флагов запрошенных состояний или событий всех кнопок клавиатуры.
- Пример:
i = kbd.getKey(3,1, KEY_PUSHED ) # Узнать нажималась ли 3 кнопка в 1 ряду. j = kbd.getKey('s', KEY_PUSHED ) # Узнать нажималась ли кнопка которой был присвоен символ 's'. k = kbd.getKey(4,1, KEY_STATE ) # Узнать нажата ли 4 кнопка в 1 ряду. t = kbd.getKey(3,2, KEY_HOLD_05) # Узнать как долго удерживается 3 кнопка во 2 ряду (время возвращается в 1/2 секунд). n = kbd.getKey(KEY_ALL, KEY_STATE) # Узнать нажата ли каждая кнопка клавиатуры. Значение n содержит флаги состояния каждой кнопки клавиатуры.
Функция getTime()
- Назначение: Запрос времени удержания или простоя кнопки.
- Синтаксис: getTime( НОМЕР, РЯД, ТИП )
- Синтаксис: getTime( СИМВОЛ, ТИП )
- Параметры:
- НОМЕР - номер кнопки в ряду кнопок клавиатуры.
- РЯД - ряд клавиатуры в котором находится кнопка.
- СИМВОЛ - символ присвоенный кнопке.
- ТИП - тип запрошенного времени, представлен одним из значений:
- KEY_HOLD - запрошено время удержания кнопки.
- KEY_FREE - запрошено время простоя кнопки.
- Возвращаемое значение: - ВРЕМЯ удержания или простоя кнопки от 100 до 25'500 мс.
- Примечание:
- Определить кнопку к которой относится запрос можно указав её НОМЕР и РЯД, или указав СИМВОЛ ранее присвоенный кнопке функцией setEncoding().
- Если требуется получить время удержания кнопки до 3,5 секунд с точностью до 0,5 секунд, то лучше воспользоваться функцией getKey() указав тип запроса KEY_HOLD_05.
- Пример:
i = kbd.getTime(3,2, KEY_HOLD) # Узнать время удержания 3 кнопки во 2 ряду. j = kbd.getTime(4,2, KEY_FREE) # Узнать время простоя 4 кнопки во 2 ряду. k = kbd.getTime('d', KEY_FREE) # Узнать время простоя кнопки которой был присвоен символ 'd'.
Функция setLed()
- Назначение: Установка состояния светодиода.
- Синтаксис: setLed( НОМЕР, РЯД, ФЛАГ )
- Синтаксис: setLed( СИМВОЛ, ФЛАГ )
- Параметры:
- НОМЕР - номер светодиода в ряду светодиодов клавиатуры.
- РЯД - ряд клавиатуры в котором находится светодиод.
- СИМВОЛ - символ присвоенный кнопке светодиода.
- ФЛАГ - флаг устанавливаемого состояния (True - включён, False - выключен).
- Возвращаемое значение: Нет.
- Примечание:
- Определить светодиод которому задаётся состояние можно указав его НОМЕР и РЯД, или указав СИМВОЛ ранее присвоенный кнопке светодиода функцией setEncoding().
- Если вместо СИМВОЛА присвоенного кнопке светодиода указать значение LED_ALL, то можно установить состояние всех светодиодов клавиатуры, указав число биты которого являются флагами устанавливаемых состояний светодиодов.
- Пример:
kbd.setLed(3,2, True ) # Включить 3 светодиод во 2 ряду. kbd.setLed(4,2, False) # Выключить 4 светодиод во 2 ряду. kbd.setLed('f', False) # Выключить светодиод кнопке которого был присвоен символ 'f'. kbd.setLed(LED_ALL,0b10100101) # Включить светодиоды клавиатуры в шахматном порядке.
Функция getLed()
- Назначение: Запрос состояния светодиода.
- Синтаксис: getLed( НОМЕР, РЯД )
- Синтаксис: getLed( СИМВОЛ )
- Параметры:
- НОМЕР - номер светодиода в ряду светодиодов клавиатуры.
- РЯД - ряд клавиатуры в котором находится светодиод.
- СИМВОЛ - символ присвоенный кнопке светодиода.
- Возвращаемое значение: - ФЛАГ состояния светодиода (True - вкл, False - выкл).
- Примечание:
- Определить светодиод, состояние которого запрашивается, можно указав его НОМЕР и РЯД, или указав СИМВОЛ ранее присвоенный кнопке светодиода функцией setEncoding().
- Если вместо СИМВОЛА присвоенного кнопке светодиода указать значение LED_ALL, то возвращаемым значение будет число, биты которого являются флагами текущих состояний всех светодиодов.
- Пример:
i = kbd.getLed(4,2) # Узнать состояние 4 светодиода во 2 ряду. j = kbd.getLed('f') # Узнать состояние светодиода кнопке которого был присвоен символ 'f'. f = kbd.getLed(LED_ALL) # Получить число, биты которого являются флагами состояний светодиодов.
Функция setLight()
- Назначение: Установка яркости свечения светодиодов.
- Синтаксис: setLight( ЯРКОСТЬ [, ГРУППА] )
- Параметры:
- ЯРКОСТЬ - значение от 0 (выключены) до 7 (максимальная яркость).
- ГРУППА - определяет группу светодиодов для которой устанавливается яркость:
- 1 - применить яркость к 1 группе светодиодов.
- 2 - применить яркость ко 2 группе светодиодов.
- LED_ALL - применить яркость ко всем светодиодам клавиатуры.
- Возвращаемое значение: Нет.
- Примечание:
- Вызов функция без указания ГРУППЫ, равносилен вызову функции с указанием LED_ALL.
- Функция задаёт яркость но не включает светодиоды группы (не меняет их состояние).
- Для клавиатуры 4x2 светодиодами 1 группы являются все светодиоды верхней строки, а второй группы - светодиоды нижней строки.
- Установленная яркость сохраняется в энергонезависимую память модуля, а значит будет действовать и после отключения питания.
- Пример:
kbd.setLight(7) # установить максимальную яркость свечения для всех светодиодов. kbd.setLight(3,1) # установить среднюю яркость свечения для светодиодов 1 группы.
Функция getLight()
- Назначение: Запрос установленной яркости свечения светодиодов.
- Синтаксис: getLight( [ГРУППА] )
- Параметр:
- ГРУППА - определяет группу светодиодов яркость которой запрашивается:
- 1 - запросить яркость установленную для 1 группы светодиодов.
- 2 - запросить яркость установленную для 2 группы светодиодов.
- Возвращаемое значение: ЯРКОСТЬ - значение от 0 до 7.
- Примечание:
- Вызов функция без указания ГРУППЫ, равносилен получению яркости 1 группы.
- Для клавиатуры 4x2 светодиодами 1 группы являются все светодиоды верхней строки, а второй группы - светодиоды нижней строки.
- Яркость групп светодиодов хранится в энергонезависимой памяти модуля.
- Пример:
i = kbd.getLight(1) # Получить яркость установленную для 1 группы светодиодов. j = kbd.getLight(2) # Получить яркость установленную для 2 группы светодиодов.
Функция setAnimation()
- Назначение: Установка светодиодной анимации состояний и событий кнопок.
- Синтаксис: setAnimation( НОМЕР [, ВРЕМЯ] )
- Параметры:
- НОМЕР - значение от 1 до 7 определяет номер светодиодной анимации:
- 0 - отключить светодиодную анимацию.
- 1 - кратковременно включать светодиод при нажатии его кнопки.
- 2 - кратковременно включать светодиод при отпускании его кнопки.
- 3 - кратковременно включать светодиод при нажатии и отпускании его кнопки.
- 4 - включать светодиод пока его кнопка нажата.
- 5 - светодиод отражает состояние кнопки в режиме переключателя.
- 6 - включать светодиод если его кнопка удерживается нажатой дольше 0,5 сек.
- 7 - включать светодиод при каждом добавлении кода его кнопки в буфер FIFO.
- ВРЕМЯ - значение от 10 до 2'550 мс, определяет время свечения светодиодов при выполнении светодиодной анимации № 1-3.
- Примечание:
- Анимация выполняется на стороне клавиатуры, не задействуя ресурсы Arduino.
- По умолчанию время свечения светодиодов при выполнении анимации №1-3 равно 200 мс.
- В описании перечислены номера анимации для прошивки клавиатуры №4.
- Возвращаемое значение: Нет.
- Пример:
kbd.setAnimation(7) # Установить светодиодную анимацию №7. kbd.setAnimation(0) # Отключить светодиодную анимацию. kbd.setAnimation(3,100) # установить светодиодную анимацию №3 с временем свечения светодиодов = 100 мс..
Функция getAnimation()
- Назначение: Запрос номера установленной светодиодной анимации.
- Синтаксис: getAnimation()
- Параметры: Нет.
- Возвращаемое значение: НОМЕР - установленной светодиодной анимации.
- Пример:
i = kbd.getAnimation() # Получить номер светодиодной анимации.
Обсуждение