КОРЗИНА
магазина
8 (499) 500-14-56 | ПН. - ПТ. 12:00-18:00
ЛЕСНОРЯДСКИЙ ПЕРЕУЛОК, 18С2, БЦ "ДМ-ПРЕСС"

Клавиатуры, FLASH-I2C, подключаем к Raspberry

Общие сведения:

Модуль - Клавиатура, 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()  # Получить номер светодиодной анимации.

Ссылки:




Обсуждение

Гарантии и возврат Используя сайт Вы соглашаетесь с условями