**Сварка клавиатуры вручную** Здесь рассказывается, как вручную спаять клавиатуру и реализовать USB-Bluetooth-совместимую клавиатуру с более чем 100 строками кода Python. **Подготовка материалов** + Медный провод 5 метров (диаметр 0,8 мм), также можно использовать обычный провод, но медный выглядит круче. + Позиционная плата, выбрана 60%, потому что выбор большой, а клавиш ещё мало (например, позиционная плата из алюминиевого сплава для спутниковой оси спутниковых антенн). + Сбалансированная ось или спутниковая ось, поскольку без печатной платы можно выбрать только тип позиционной платы. + Оси 61 штука, чтобы хвастаться в офисе (можно получить удар), конечно, выбраны чёткие (раздражающие) оси с синим валом. + Диоды 61 штука — это защита от одновременного нажатия нескольких клавиш (Anti-ghost), если вы редко используете комбинации из трёх и более клавиш одновременно (например, Ctrl + Shift + C), то этот шаг можно пропустить (удобно купить на торговом центре Lida). + Также необходим главный контроллер с Bluetooth и USB, например, Pitaya Go, после чего Python будет работать на этой плате разработки. **Инструменты** + Паяльник, припой. + Плоскогубцы для резки медного провода. + Отвёртка. + Мультиметр, если у вас хорошее зрение, то его можно не использовать. **Ручная сварка клавиатуры** 1. Установите спутниковую ось. Установите спутниковую ось на позиционную плату, можно смазать её смазкой, чтобы уменьшить шум от нажатия клавиш, смазка представляет собой полутвёрдое вещество, а не масло. Также можно заменить сбалансированную ось на спутниковую. 2. Установите оси для клавиш. Поместите оси для клавиш на позиционную плату. 3. Припаяйте матрицу клавиатуры. Матрица клавиатуры делится на строки и столбцы, сначала используйте диоды для соединения одной ножки оси со строкой и хорошо припаяйте их, направление диодов может быть от строки к столбцу или от столбца к строке, но вся матрица должна сохранять одинаковое направление диодов. 4. Соедините строки и столбцы с портами ввода-вывода главного контроллера Pitaya Go. Здесь используется матрица клавиатуры с 5 строками и 14 столбцами, у Pitaya Go есть 20 доступных портов ввода-вывода, оставшийся порт ввода-вывода можно также использовать для подключения светодиода. После завершения пайки матрицы клавиатуры и главного контроллера лучше всего проверить мультиметром, нет ли короткого замыкания между строками и столбцами. **Запуск Python на клавиатуре** 1. Обратитесь к руководству по загрузке Pitaya Go (https://wiki.makerdiary.com/pitaya-go/programming/), чтобы обновить прошивку CircuitPython (https://gitee.com/makerdiary/python-keyboard/raw/master/circuitpython-5.3.0-for-pitaya-go.hex), после обновления прошивки Pitaya Go будет имитировать USB-накопитель и последовательный порт на компьютере под названием CIRCUITPY. 2. Загрузите две библиотеки CircuitPython — adafruit-ble (https://github.com/adafruit/Adafruit_CircuitPython_BLE) и adafruit-hid (https://github.com/adafruit/Adafruit_CircuitPython_HID), затем поместите их в каталог lib на накопителе CIRCUITPY, структура содержимого накопителя CIRCUITPY следующая: ``` CIRCUITPY ├───code.py └───lib ├───adafruit_ble └───adafruit_hid ``` 3. Скопируйте следующий код Python в code.py, после сохранения code.py он будет перезагружен и запущен, и тогда у вас будет USB + Bluetooth-совместимая клавиатура с двумя режимами. ```python import time from board import * import digitalio import usb_hid import adafruit_ble from adafruit_ble.advertising import Advertisement from adafruit_ble.advertising.standard import ProvideServicesAdvertisement from adafruit_ble.services.standard.hid import HIDService from adafruit_hid.keyboard import Keyboard from adafruit_hid.keycode import Keycode as _ ROWS = (P27, P13, P30, P20, P3) COLS = (P26, P31, P29, P28, P5, P4, P24, P25, P23, P22, P14, P15, P16, P17) KEYMAP = (_.ESCAPE, _.ONE, _.TWO, _.THREE, _.FOUR, _.FIVE, _.SIX, _.SEVEN, _.EIGHT, _.NINE, _.ZERO, _.MINUS, _.EQUALS, _.BACKSPACE, _.TAB, _.Q, _.W, _.E, _.R, _.T, _.Y, _.U, _.I, _.O, _.P, _.LEFT_BRACKET, _.RIGHT_BRACKET, _.BACKSLASH, _.CAPS_LOCK, _.A, _.S, _.D, _.F, _.G, _.H, _.J, _.K, _.L, _.SEMICOLON, _.QUOTE, None, _.ENTER, _.LEFT_SHIFT, _.Z, _.X, _.C, _.V, _.B, _.N, _.M, _.COMMA, _.PERIOD, _.FORWARD_SLASH, None, _.RIGHT_SHIFT, None, _.LEFT_CONTROL, _.LEFT_ALT, _.LEFT_GUI, None, None, _.SPACE, None, None, _.SPACE, _.APPLICATION, _.RIGHT_CONTROL, None, None) class Matrix: def __init__(self, rows=ROWS, cols=COLS): self.rows = [] for pin in rows: io = digitalio.DigitalInOut(pin) io.direction = digitalio.Direction.OUTPUT io.drive_mode = digitalio.DriveMode.PUSH_PULL io.value = 0 self.rows.append(io) self.cols = [] for pin in cols: io = digitalio.DigitalInOut(pin) io.direction = digitalio.Direction.INPUT io.pull = digitalio.Pull.DOWN self.cols.append(io) self.pressed_keys = [] def scan(self): new_keys = [] pressed_keys = [] released_keys = self.pressed_keys for r in range(len(self.rows)): self.rows[r].value = 1 for c in range(len(self.cols)): if self.cols[c].value: key = r * len(self.cols) + c pressed_keys.append(key) ``` ``` если ключ в released_keys: released_keys.remove(ключ) иначе: new_keys.append(ключ) self.rows[r].value = 0 self.pressed_keys = pressed_keys вернуть pressed_keys, released_keys, new_keys def main(): hid = HIDService() advertisement = ProvideServicesAdvertisement(hid) advertisement.appearance = 961 ble = adafruit_ble.BLERadio() если ble.connected: для c в ble.connections: c.disconnect() ble.start_advertising(advertisement) advertising = True ble_keyboard = Keyboard(hid.devices) matrix = Matrix() usb_keyboard = Keyboard(usb_hid.devices) пока верно: pressed_keys, released_keys, new_keys = matrix.scan() если released_keys: released_keycodes = список(карта(лямбда i: KEYMAP[i], released_keys)) print('выпущенные клавиши {}'.format(released_keycodes)) usb_keyboard.release(*released_keycodes) если ble.connected: advertising = False ble_keyboard.release(*released_keycodes) если new_keys: new_keycodes = список(карта(лямбда i: KEYMAP[i], new_keys)) print('новые клавиши {}'.format(new_keycodes)) usb_keyboard.press(*new_keycodes) если ble.connected: advertising = False ble_keyboard.press(*new_keys) если не ble.connected и не advertising: ble.start_advertising(advertisement) advertising = True time.sleep(0.001) main() ``` Если ваша клавиатура подключена к IO Pitaya Go по-другому, вам нужно изменить код в `ROWS` и `COLS`.