- PVSM.RU - https://www.pvsm.ru -

KeeBee. Изготовление с нуля собственной USB-клавиатуры

Несколько месяцев назад завершился мой проект по изготовлению USB-клавиатуры. Среди прочего, я выполнил дизайн электронных схем, спроектировал печатную плат, запрограммировал прошивку, сделал макет в CAD и произвёл сборку устройства. В результате получилась удобная клавиатура, которую я использую ежедневно и ласково называю KeeBee:

KeeBee. Изготовление с нуля собственной USB-клавиатуры - 1 [1]
Клавиатура KeeBee в окончательном виде

Несколько целей проекта:

  1. Самостоятельное создание схемы.
  2. Написание прошивки клавиатуры.
  3. Узнать, как работает протокол USB.


На работе я в основном разрабатываю программное обеспечение для облачных сервисов, где отсутствует много слоёв реального оборудования. Поэтому очень приятно избавиться от некоторых абстракций и опуститься на аппаратный уровень: здесь реальные электронные устройства, которые можно потрогать и использовать.

Исследование и макет CAD

Мне очень нравятся минималистичные клавиатуры в стиле OLKB [2] Planck и Preonic, которые за счёт ортолинейного расположения клавиш получаются очень компактными. Ещё я сразу знал, что хочу использовать переключатели Cherry MX Brown. Имея виду эти два компонента дизайна, я начал играть с ключевыми макетами в OpenSCAD [3]. Это отличный инструмент с открытым исходным кодом, который работает скорее как язык программирования, чем WYSIWYG-интерфейс для мышки.

Взяв размеры элементов из документации Cherry MX, я сделал макет верхней пластины [4], затем добавил переключатели и клавиши, чтобы получить представление о том, как будет выглядеть окончательный результат. Верхняя пластина находится над печатной платой клавиатуры и служит хорошим стабилизатором для переключателей.

Дизайн верхней пластины:

KeeBee. Изготовление с нуля собственной USB-клавиатуры - 2

После добавления клавиш:

KeeBee. Изготовление с нуля собственной USB-клавиатуры - 3

KeeBee. Изготовление с нуля собственной USB-клавиатуры - 4

Прототипирование платы и проектирование прошивки

В качестве основного микроконтроллера я выбрал STM32F042K6T6 [5]. Это около трёх долларов за чип, если брать от одной штуки. У него достаточно контактов для матрицы сканирования [6] 69 клавиш (всего 32 контакта). Он работает на процессоре ARM Cortex M0 и содержит специальную USB-периферию для отправки USB-сигнала, не загружая этой задачей основной процессор. Я купил dev-плату Nucleo для прототипирования [7] с этим чипом, прежде чем интегрировать его в дизайн своей печатной платы. Nucleo очень удобно легла на макетную плату и запиталась по USB.

Я разместил на макетной плате маленькую цепь на четыре клавиши, чтобы протестировать диодный контур [8], который я изучал. Игнорируя USB-сторону уравнения, на первом шаге требовалось заставить переключатели Cherry надёжно включать и выключать четыре соответствующих светодиода при нажатии кнопок.

KeeBee. Изготовление с нуля собственной USB-клавиатуры - 5

Матрица сканирования — это такая техника, которую нужно использовать, когда у вас больше переключателей, контактов на микроконтроллере.

Когда матрица удовлетворительно заработала [9], пришло время поработать над USB.

Встроенный цикл прошивки по сути такой:

  1. Просканировать все клавиши в матрице.
  2. Сопоставить расположение кнопок с соответствующими символами в выбранной раскладке (QWERTY, Dvorak и т. д.).
  3. Взять результат сопоставления, сгенерировать пакеты USB HID Report и отправить на периферийное устройство USB.
  4. Включить светодиод на клавиатуре, если клавиша нажата, выключить — если нет.

Из main.cc [10]:

static void scan_and_update() {
    scan_matrix.Scan(key_scans, row_count, column_count);
    keyboard.SendReport(
        key_pipeline.MapKeyScans(key_scans, key_count));
    update_key_press_status();
}

int main() {
    Init();

    status_led.SetOk(true);
    while (true) {
        scan_and_update();
    }
}

Компонент keyboard.SendReport фактически передаёт пакеты USB-хосту. Я упорно пытался заставить USB правильно работать. В этом протоколе много нетривиальных слоёв, которые требуют точного тайминга и правильной идентификации устройства [11]. В итоге пришлось запустить Wireshark, чтобы прослушать все USB-пакеты, поступающие на мой ноутбук Linux и выяснить, где что потерялось. Поиск в интернете практически ничего не дал, на большинство вопросов отвечают примерно так: «Вероятно, ваше USB-устройство сломалось, нужно купить новое». Если вы на самом деле пытаетесь сконструировать USB-устройство, такие ответы не очень полезны. Мне оставалось только погрузиться в объёмные спецификации USB с большим количеством незнакомой терминологии.

Повозившись некоторое время, я всё-таки заставил клавиатуру с четырьмя клавишами корректно идентифицировать себя как USB HID (Human Interface Device) и все нажатия правильно передавались на ноутбук:

KeeBee. Изготовление с нуля собственной USB-клавиатуры - 6

Регистрация в качестве USB-вендора и получение официального device id дорого стоит [12]. Если у вас просто любительский проект, то придётся захватить идентификатор какого-нибудь похожего устройства [13]. Я подумал, что “Gear Head” звучит круто, тем более они выпускают клавиатуры, поэтому выбрал их.

KeeBee. Изготовление с нуля собственной USB-клавиатуры - 7

Схема и печатная плата

Получив более-менее работающую прошивку и рабочий прототип, пришло время составить схему и дизайн печатной платы в KiCAD [14] и сделать реальную печатную плату. Когда я добился, что схема для 4 кнопок работает, осталась относительно простая задача соединить всё вместе:

KeeBee. Изготовление с нуля собственной USB-клавиатуры - 8

После разработки схему и установки площадок для компонентов нужно произвести макет реальной печатной платы:

KeeBee. Изготовление с нуля собственной USB-клавиатуры - 9

KiCAD умеет красиво рендерить будущую плату в 3D:

KeeBee. Изготовление с нуля собственной USB-клавиатуры - 10

KeeBee. Изготовление с нуля собственной USB-клавиатуры - 11

Есть много отличных учебников по KiCAD. Я начал с отличной видеосерии Getting to Blinkey 4.0 [15] от Криса Гэммела, где он подробно разъясняет все этапы создания схемы светодиодного юлинкера в KiCAD от начала до конца.

Заказ печатной платы и компонентов

Доведя схему и дизайн печатной платы [16] до удовлетворительного уровня, я начал размещать кучу заказов:

  1. Все компоненты из списка материалов [17]: переключатели, светодиоды, диоды, микроконтроллеры и т. д. Я обычно заказываю такие штуки на DigiKey [18].
  2. Сама печатная плата. Довольно много сервисов готовы недорого изготовить вам пррототип. У меня отличный опыт работы с OshPark [19] и JLCPCB [20]. Для этого проекта я выбрал JLCPCB из-за цены на такой размер, а ещё потому что они разрешили выбрать синее покрытие.
  3. Все остальные детали: крышки и прочее. Для этого проекта мой шурин помог лазером вырезать верхнюю и нижнюю клавиатурные пластины из 1/4” акриловых листов. Для остальных частей можно использовать онлайновые сервисы лазерной резки и 3D-печати, если нет доступа к оборудованию.

День, когда пришла посылка с платой, самый лучший:

KeeBee. Изготовление с нуля собственной USB-клавиатуры - 12

KeeBee. Изготовление с нуля собственной USB-клавиатуры - 13

JLCPCB очень доступный сервис. Этот дизайн с доставкой DHL из Китая обошёлся менее чем в $30, а весь процесс от загрузки файлов до прихода посылки занял чуть больше недели.

Шурин взял DXF-файлы [21] из OpenSCAD и забросил их в лазерный резак:

KeeBee. Изготовление с нуля собственной USB-клавиатуры - 14

Окончательная сборка

Получив все детали, я начал сборку. Первый шаг — сборка компонентов печатной платы: паяльник для больших электронных компонентов и паяльная станция [22] для поверхностного монтажа маленьких компонентов, таких как микроконтроллер STM32.

Общее время сборки платы составило около трёх часов — большую часть заняла пайка 70 диодов и переключателей.

Я добавил хедер для JTAG-отладки, через который подключил JLINK Edu mini [23] для прошивки микроконтроллера с помощью OpenOCD [24].

Затем пришло время окончательного тестирования и финальной сборки:

KeeBee. Изготовление с нуля собственной USB-клавиатуры - 15

KeeBee. Изготовление с нуля собственной USB-клавиатуры - 16

KeeBee. Изготовление с нуля собственной USB-клавиатуры - 17

Сын решил, что это отличный поезд для его животных:

KeeBee. Изготовление с нуля собственной USB-клавиатуры - 18

KeeBee. Изготовление с нуля собственной USB-клавиатуры - 19

Итоги

От первоначальной идеи до окончательной сборки проект занял около трёх месяцев. Было исключительно полезно в качестве хобби сделать то, что я до сих пор ежедневно использую на работе.

Все файлы проекта опубликованы на GitHub [25], в том числе исходники прошивки, схемы печатных плат, список материалов и модели CAD.

Спасибо за чтение и приятных хаков!

Автор: m1rko

Источник [26]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/diy-ili-sdelaj-sam/309421

Ссылки в тексте:

[1] Image: https://habrastorage.org/webt/hd/_x/i0/hd_xi0-n8_624hokpbszp1wm2ku.jpeg

[2] OLKB: https://olkb.com/

[3] OpenSCAD: http://www.openscad.org/

[4] сделал макет верхней пластины: https://github.com/blakesmith/embedded/blob/master/keebee/hardware/keyboard.scad

[5] STM32F042K6T6: https://www.digikey.com/product-detail/en/stmicroelectronics/STM32F042K6T6/497-14647-ND/4815294

[6] матрицы сканирования: https://en.wikipedia.org/wiki/Keyboard_matrix_circuit

[7] dev-плату Nucleo для прототипирования: https://www.digikey.com/product-detail/en/NUCLEO-F042K6/497-15980-ND/5428804

[8] диодный контур: https://habr.com/ru/post/394585/

[9] удовлетворительно заработала: https://github.com/blakesmith/embedded/blob/master/drivers/stm32/scan_matrix.cc

[10] main.cc: https://github.com/blakesmith/embedded/blob/master/keebee/src/main.cc#L85

[11] идентификации устройства: https://github.com/blakesmith/embedded/blob/master/keebee/src/usb_keyboard.cc#L12

[12] дорого стоит: https://www.usb.org/getting-vendor-id

[13] захватить идентификатор какого-нибудь похожего устройства: http://www.linux-usb.org/usb.ids

[14] KiCAD: http://kicad-pcb.org/

[15] Getting to Blinkey 4.0: https://www.youtube.com/watch?v=JN_Y93RTdSo&list=PLy2022BX6Eso532xqrUxDT1u2p4VVsg-q

[16] схему и дизайн печатной платы: https://github.com/blakesmith/embedded/tree/master/keebee/hardware

[17] списка материалов: https://github.com/blakesmith/embedded/blob/master/keebee/bom.org

[18] DigiKey: https://www.digikey.com/

[19] OshPark: https://oshpark.com/

[20] JLCPCB: https://jlcpcb.com/

[21] DXF-файлы: https://github.com/blakesmith/embedded/blob/master/keebee/hardware/top_plate.dxf

[22] паяльная станция: https://learn.sparkfun.com/tutorials/how-to-use-a-hot-air-rework-station/all

[23] JLINK Edu mini: https://www.adafruit.com/product/3571

[24] OpenOCD: http://openocd.org/

[25] опубликованы на GitHub: https://github.com/blakesmith/embedded/tree/master/keebee

[26] Источник: https://habr.com/ru/post/441032/?utm_source=habrahabr&utm_medium=rss&utm_campaign=441032