**Сварка клавиатуры вручную**

Здесь рассказывается, как вручную спаять клавиатуру и реализовать 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`.