Подключение USB-клавиатуры Stm32
Обновлено: 24.11.2024
Здравствуйте, я попытался подключить клавиатуру PS2 Blue Pill, но у меня не получилось.
Теперь я пытаюсь использовать USB-клавиатуру. Плата Arduino Due будет напрямую поддерживать USB-клавиатуру, но ядро stm32 dunio не поддерживает библиотеку USB-клавиатуры Arduino.
В примерах Arduino STM32 USB-клавиатура не подходит.
PS2 показывает разъем 5 В; bluepill — это логика 3,3 В.
Я использовал сдвиг логического напряжения с 5 В на 3,3 В для клавиатуры PS2.
Процессор Atmel SAM3X8E ARM Cortex-M3. б/у плата Arduino Due. Второй USB-порт может быть подключен к периферийным устройствам, таким как USB-клавиатура или мышь без экрана.
STM32 • Синяя таблетка с 32-разрядным процессором ARM® Cortex®-M3 с портом USB, поэтому ее можно использовать для клавиатуры или других периферийных устройств?
У меня не было четкого понимания того, что USB-порт с синей таблеткой — это только загрузка программ или последовательный монитор? .
я следил за :
Если я ошибаюсь, поправьте меня, почему мой показывает половину примеров st32 duino (полные примеры отсутствуют), как показано на рисунке.
HID не для новичков, и вы выбрали для сборки HID (клавиатура и мышь)?
Обратите внимание, что после того, как вы выберете это, вы потеряете свой «CDC (общий« Серийный »заменяет U (S) ART)».
Вы можете иметь только одно или другое, но не оба.
USB HID — это не просто «мигание светодиода» и даже не «запуск ЖК-дисплея». Это самостоятельный домен.
USB (HID) — это отдельный мир.
предупреждение: все еще требуется большая очистка и улучшенная документация
Это прошивка для дешевого микроконтроллера STM32F103xxx, позволяющая использовать оригинальную клавиатуру Commodore Amiga в качестве USB HID-устройства. Промежуточное программное обеспечение HAL было создано с помощью STM32CubeMX, протокол был реализован в соответствии с оригинальным справочным руководством по оборудованию Amiga, в котором довольно прямо описывается рукопожатие.
Вот изображение пользовательской раскладки немецкой клавиатуры A500:
(Он должен работать с любой раскладкой клавиатуры Amiga, реализация не зависит от фактической международной версии)
Вы можете войти в режим USB-мыши, нажав Help-m. Теперь клавиши Del и Справка становятся левой и правой кнопками мыши, а клавиши управления курсором позволяют управлять указателем мыши.
- Клавиатура минус уменьшит скорость указателя
- Keypad Plus увеличит скорость указателя
- Умножение с помощью клавиатуры выходит из режима мыши
Расширенные функциональные клавиши
Нажав и удерживая Help-функциональную клавишу, вы получите функциональные клавиши с F11 по F20. Альтернативную функцию можно переключать с помощью Help-Del, тогда у вас будут мультимедийные клавиши, как показано на изображении:
- F1 : перемотка назад.
- F2 : стоп
- F3 : пауза/воспроизведение
- F4 : вперед
- F5 : извлечь
- F8 : отключить звук
- F9 : уменьшить громкость
- F10 : увеличить громкость
(Я задействую контакт GPIO, чтобы вы могли иметь собственный светодиодный индикатор для режима)
Поменять местами Alt и Ctrl
Поскольку я не люблю CAPS-LOCK, я использую его совсем для другого: поменять местами клавиши alt и ctrl. Если CAPS-LOCK включен, следующие клавиши будут переназначены в соответствии с современной клавиатурой:
- Левый Ctrl становится левым Alt
- Левый Alt становится левым Control
- Правая Amiga становится Alt Gr
- Правый Alt становится правым элементом управления. При отключении CAPS-LOCK возвращается исходное обозначение.
Help-j войдет в своего рода режим геймпада. Это был просто тест, в настоящее время назначено 16 кнопок (клавиши a,b,x,y,shifts,ctrls,alts,enter,space,escape,del,help. ) и клавиши курсора как аналоговый джойстик. Вот еще пытаюсь. Основная идея состоит в том, чтобы открыть сразу два джойстика, чтобы два игрока могли позже играть на одной клавиатуре с клавишами wasd и курсора, как на двух настоящих USB-геймпадах. Не уверен, что это имеет смысл, посмотрим позже.
- вы можете выполнить программный сброс клавиатуры, отправив команду ctrl-amiga-amiga. CAPS-LOCK кратковременно замигает.
- USB vid/pid — чистая фантазия (6666:6666)
- если вы подключаете последовательные контакты UART к компьютеру, вы получаете отладочные сообщения с клавиатуры
Как построить и собрать
- Купите свой любимый микроконтроллер STM32. Я использую очень дешевую отладочную плату STM32F103C6T8 менее чем за 2 доллара США.
- подключите DATA, CLOCK, RESET, 5V и GND к микроконтроллеру.
- все делается в файле main.c и выдерживает повторную генерацию с помощью генератора кода STM32CubeMX, но в коде есть две модификации, которые будут перезаписаны:
- usbd_hid.c:USBD_HID_SendReport() был изменен, чтобы фактически возвращать состояние успеха
- HID_CUSTOM_ReportDesc был изменен на дескриптор мышь+клавиатура
Есть простой Makefile, для которого не требуется ничего, кроме набора инструментов arm-none-eabi. Просто установите его и «сделайте». После этого вам нужно прошить его на ваш микроконтроллер; вы можете сделать это с помощью простой последовательной проводки, ST link или любого другого (профессионального) решения. Поищите в Интернете, я не буду объяснять это здесь.
Поддержка светодиодов клавиатуры Amiga через отчет о выходе HID
Мой STM32 недостаточно силен для управления светодиодами и потребует дополнительных схем. Или добавлю еще несколько современных светодиодов и цветов
встроенный виртуальный последовательный порт
это позволит всегда иметь доступ к последовательной консоли для клавиатуры и без дополнительных кабелей. Пользователь просто открывал новый COM-порт и мог видеть отладочные сообщения и настраивать его, т.е. текстовую консоль с командами настройки
добавить модуль обработки движения
они еще и дешевые и вдруг в клавиатуре есть ускорение, магнитоскоп, гироскоп, . и вы могли бы раскачивать его, как контроллер для игры на мечах.
cat lock, а не caps lock.
У меня нет кота, но какое-нибудь волшебное нажатие клавиши должно позволить вам полностью игнорировать все вводимые данные, кроме волшебного нажатия клавиши разблокировки. Или даже в качестве защиты ребенка/младенца: проглотите все клавиши, которые могут сделать что-то плохое, например сброс, клавишу Windows, Alt-Tab и т. д. — тогда ваш ребенок сможет печатать все, что захочет, но никаких случайных выходов больше не будет
файловая система конфигурации
Зарегистрируйтесь в качестве USB-накопителя и откройте файл CONFIG.TXT, который можно изменить, чтобы изменить конфигурацию клавиатуры во время выполнения. Может быть, Help-u, чтобы вставить / извлечь устройство хранения. Тогда виртуальный последовательный порт не понадобится.
Вместо светодиодов можно использовать дешевый OLED-дисплей для отображения состояния клавиатуры (число/scr/caps/режим блокировки).
Удачи!
О нас
Простая прошивка для микроконтроллеров STM32, позволяющая использовать старую клавиатуру Amiga в качестве клавиатуры, совместимой с USB HID, на компьютере.
Несколько месяцев назад я завершил проект по сборке USB-клавиатуры с нуля. Это включало проектирование электронных схем, проектирование печатных плат, кодирование прошивки, проектирование САПР, сборку и использование. Конечным результатом стала моя клавиатура для ежедневной работы с водителем, которую я ласково называю «KeeBee»:
Несколько целей проекта:
- Сам реализовать схему
- Записать прошивку клавиатуры
- Узнайте, как работает протокол USB.
В своей повседневной работе я трачу большую часть своего времени на создание облачного программного обеспечения, в котором удалено много слоев от реального работающего оборудования. Чрезвычайно приятно отказаться от некоторых абстракций и приблизиться «к металлу», создавая настоящие электронные устройства, которые я могу физически потрогать и использовать.
Исследования и проектирование в САПР
Я знал, что мне очень нравятся доски OLKB Planck и Preonic. Они имеют красивую минимальную орто-линейную компоновку, которая очень компактна. Я также знал, что хочу использовать переключатели Cherry MX Brown. Помня об этих двух компонентах дизайна, я начал экспериментировать с ключевыми макетами в OpenSCAD. OpenSCAD — отличный инструмент проектирования САПР с открытым исходным кодом, который больше похож на язык программирования, чем на WYSIWYG-инструмент САПР «наведи и щелкни мышью».
Используя размеры из технического описания Cherry MX, я разработал дизайн клавиатуры, а затем добавил переключатели и колпачки клавиш, чтобы понять, как будет выглядеть раскладка. Верхняя пластина находится над печатной платой клавиатуры и служит хорошим стабилизатором переключателя.
Дизайн верхней пластины:
С добавленными колпачками клавиш:
Разработка прототипа схемы и прошивки
В качестве основного микроконтроллера клавиатуры я выбрал STM32F042K6T6. Он стоит около 3 долларов за чип в отдельных количествах и имеет достаточно контактов для реализации матрицы сканирования с 69 ключами (всего 32 контакта).Он оснащен процессором ARM Cortex M0 и имеет специальное периферийное устройство USB для отправки битов USB без привязки основного процессора к передаче сигналов USB. Я купил плату для разработки прототипа этого чипа Nucleo для экспериментов с чипом, прежде чем интегрировать его в дизайн своей печатной платы. Nucleo было легко использовать на макетной плате и питать напрямую от USB.
Я макетировал небольшую схему с 4 ключами, чтобы протестировать исследованную мной схему на основе диодов. Игнорируя USB-сторону уравнения, первым шагом было просто заставить переключатели Cherry надежно включать и выключать 4 соответствующих светодиода при нажатии кнопки.
Схемы Keyscan Matrix — это метод, который можно использовать, когда у вас больше переключателей, чем контактов на микроконтроллере.
После того, как мне понравилась реализация матрицы сканирования ключей, пришло время поработать над USB-частью уравнения.
Внутренний цикл прошивки в основном следующий:
- Сканировать все клавиши в матрице сканирования кнопок.
- Сопоставьте расположение кнопок с соответствующими символами клавиш, используя текущую выбранную раскладку (QWERTY, Дворжак и т. д.)
- Выполните сопоставления, создайте пакеты отчетов USB HID и отправьте их на периферийное устройство USB.
- Включите светодиод на клавиатуре, если клавиша нажата, и выключите, если нет.
Компонент keyboard.SendReport — это часть, которая фактически отправляет USB-пакеты на хост. Я много боролся, чтобы заставить USB работать правильно. В протоколе USB есть много сложных уровней, которые требуют точной синхронизации и правильной идентификации устройства. В итоге мне пришлось запустить Wireshark, чтобы перехватывать USB-пакеты, идущие туда и обратно на мой ноутбук с Linux, чтобы отладить, где что-то теряется в сети. Большая часть моего гугления была довольно бесполезной в этой части сборки: предложения, которые я нашел, содержали такие предложения, как «Возможно, у вас неисправное USB-устройство, вы должны получить новое». Когда вы на самом деле пытаетесь создать USB-устройство, это не очень полезно. Мне пришлось читать очень большие спецификации USB, содержащие много терминологии, которая была мне совершенно незнакома.
Некоторое время повозившись, я смог заставить 4-клавишную клавиатуру правильно идентифицировать себя как USB HID (Human Interface Device) для моего ноутбука и убедиться, что все нажатия клавиш правильно сопоставляются с машиной:
Чтобы получить поставщика USB и идентификатор устройства, нужно заплатить приличную сумму денег, поэтому, если вы просто занимаетесь чем-то в качестве хобби, вам потребуется украсть аналогичный идентификатор устройства. Я подумал, что "Gear Head" звучит круто, и они делают клавишные, поэтому я выбрал его.
Схема и дизайн печатной платы
После того, как у рабочего прототипа есть рабочая прошивка, пришло время поместить схему и дизайн печатной платы в KiCAD и изготовить настоящую печатную плату. Теперь, когда я убедился, что схема работает, было относительно просто соединить все вместе по схеме:
После построения схемы и выбора посадочных мест деталей нам необходимо выполнить компоновку фактической физической платы:
KiCAD имеет удобную функцию, позволяющую предварительно просмотреть печатную плату в 3D:
Существует множество отличных руководств по использованию KiCAD. Я начал с отличной серии YouTube «Getting to Blinkey 4.0» Криса Гэммелла, где он проведет вас через сборку печатной платы светодиодного мигателя в KiCAD от начала до конца.
Заказ печатных плат и компонентов
После того, как я был достаточно удовлетворен схемой и дизайном печатной платы, я начал размещать множество заказов:
- Все компоненты платы из списка материалов клавиатуры: переключатели, светодиоды, диоды, микроконтроллеры и т. д. Мне нравится использовать DigiKey для большинства моих электронных компонентов.
- Сама плата. Существует множество действительно отличных услуг по изготовлению прототипов печатных плат, которые будут производить небольшие партии печатных плат по очень низкой цене. У меня большой опыт работы с OshPark и JLCPCB.Для этого проекта я выбрал JLCPCB из-за стоимости размера платы и потому, что они позволили мне выбрать синюю плату с паяльной маской.
- Любые другие чехлы и т. д. Для этого проекта моему шурину удалось вырезать лазером верхнюю и нижнюю пластины клавиатуры из акриловых листов толщиной 1/4 дюйма. Есть и другие отличные онлайн-сервисы лазерной резки и 3D-печати компонентов корпуса, если у вас нет доступа к оборудованию.
День прибытия печатных плат самый лучший:
JLCPCB очень доступен по цене. Этот дизайн стоил меньше 30 долларов США и был доставлен DHL из Китая, а его доставка заняла немногим более недели после того, как мои файлы gerber были отправлены для заказа.
Мой зять взял мои DXF-файлы из OpenSCAD и бросил их в лазерный резак:
Окончательная сборка
После того, как все детали были заказаны и изготовлены, пришло время собрать окончательную клавиатуру. Я начал со сборки компонентов печатной платы: я использовал паяльник для крупных электронных компонентов и термовоздушную ремонтную станцию для небольших компонентов поверхностного монтажа, таких как микроконтроллер STM32.
Общее время сборки компонентов для платы составило примерно 3 часа, большая часть времени ушла на пайку 70 диодов и переключателей.
Я добавил к печатной плате контактный разъем отладчика JTAG, который использовал для подключения JLINK Edu mini для прошивки микроконтроллера прошивкой с помощью OpenOCD.
Оттуда были окончательные испытания и сборка пластины:
Мой сын подумал, что это отличный поезд для его животных:
Заключение
От первоначальной идеи до окончательной сборки этот проект занял около 3 месяцев. Было очень приятно сделать что-то, что я до сих пор использую каждый день на работе.
Все файлы проекта размещены на GitHub, включая исходный код встроенного ПО, схемы печатных плат, спецификации и модели САПР.
Аналоговая и цифровая электроника · Проекты Arduino · Макетные платы · DIY · Технологии
Мультимедийные USB-ключи на Arduino STM32
Опубликовано: Cornelius One Transistor Опубликовано: 14 марта 2020 г. Обновлено: 2020-03-14T19:26:53Z
Используйте bluepill STM32 для создания USB-устройства управления потребителями и отправки мультимедийных команд на компьютер. Загрузите библиотеку, которую можно использовать вместе с библиотекой клавиатуры.
Я перешел с клавиатуры с элементами управления мультимедиа на новую без такой функциональности. Потом я понял, что мне не хватает кнопок громкости и воспроизведения/паузы на старой клавиатуре. Но у меня есть несколько макетных плат, которые я мог бы использовать для управления медиа и громкостью ПК. Я видел некоторые проекты, использующие функциональность Bluetooth ESP32 для эмуляции клавиатуры. Но пока мне нужен проводной USB-интерфейс. Самая дешевая и наиболее подходящая плата для этой цели — STM32 «bluepill». Хотя рано или поздно я куплю другую клавиатуру с мультимедийными кнопками, сейчас буду программировать STM32.
Я думал, что это будет легко. Но есть несколько способов программирования этого микроконтроллера ARM. Это можно сделать с помощью STM32 HAL. Но мне было трудно разработать устройство USB HID. Я искал что-то полегче. С Arduino IDE у вас есть доступ к двум комплектам для разработки, одному от STmicroelectronics и другому от Роджера Кларка (который основан на libmaple). Я попытался использовать официальный пакет от ST, но их USB-библиотека поддерживает только базовую клавиатуру (такую же, как библиотека клавиатуры Arduino). Я обнаружил, что другой пакет от Роджера Кларка поддерживает USB Consumer HID. Хотя он основан на старом libmaple, он все еще работает. Однако я решил работать с официальным пакетом.
Мультимедийные USB-ключи с STM32 на макетной плате
MCU STM32F103 имеет встроенный порт USB. Поддержка ядра STM32 для Arduino поставляется со встроенными библиотеками клавиатуры и мыши. Я попробовал их, чтобы получить некоторую информацию о том, как они работают. К моему удивлению, при использовании каждого из них хост видит составное USB-устройство с функциями как клавиатуры, так и мыши. Я использовал Free Device Monitoring Studio, чтобы увидеть возможности устройства и контролировать передачу данных. Моя новая USB-клавиатура также представляет собой составное устройство со стандартной клавиатурой и потребительским устройством управления. Его единственные потребительские ключи — питание/сон/пробуждение, хотя, судя по его HID-дескриптору, он также поддерживает мультимедийные ключи. Зная его дескриптор, я попытался модифицировать бэкенд, используемый библиотекой клавиатуры и мыши STM32. Я заменил дескриптор мыши на дескриптор потребительского устройства управления. В итоге я получил библиотеку Arduino для STM32, которая создает составное USB-устройство, состоящее из клавиатуры и устройства управления потребителями (с поддержкой мультимедийных клавиш).
Это оказалось не так просто, как я думал, так как я обнаружил, что документация по USB довольно сложна для понимания. К счастью, есть несколько других подобных проектов, которые я мог бы адаптировать для своих целей. Библиотеки клавиатуры и мыши для STM32 ссылаются на функции из следующих источников для реализации этих USB-устройств:
Исходники C для STM32 USB HID
Я скопировал эти исходники и добавил их в новую библиотеку. Наиболее важной модификацией является дескриптор USB-устройства для потребительского устройства управления. Я заменил дескриптор мыши следующим:
Это взято из проекта HidKbd. Мне было довольно сложно понять официальную документацию по USB. Если вы хотите, вы можете создать свой собственный дескриптор HID. Здесь даже есть инструмент, очень старый, который может помочь вам создать дескрипторы USB. Вы можете определить наборы функций (только определенные команды, которые может выдавать устройство) или сообщить хосту, что устройство поддерживает все доступные команды. Приведенный выше дескриптор сообщает об одном «наборе» функций, которые позволяют использовать до 572 команд (я полагаю, что это общее количество существующих команд для потребительских устройств).
После замены всех экземпляров слова «мышь» на «потребитель» во всех необходимых источниках мне пришлось создать правильный отчет для отправки на хост. «Отчет» на самом деле представляет собой массив байтов, в котором хранятся нажатые клавиши. Я не знаю, сколько байтов я должен отправить и что они должны содержать конкретно. Благодаря исходникам HidKbd я обнаружил, что с приведенным выше дескриптором я должен отправить отчет размером 3 байта, первый из которых является идентификатором отчета 0x02, а следующий — кодом ключа. Последний байт должен быть установлен в 0x00. Чтобы имитировать выпуск ключа, я должен отправить отчет с 0x00 в качестве кода ключа.
Есть задержка перед отпусканием клавиши, иначе организатор может не принять отчет во внимание. Определены следующие медиа-ключи, но вы можете отправить любой другой код из документа HID Usage Tables [PDF] (см. стр. 75–85).
Библиотека, которую вы можете скачать в конце этого поста, совместима с ядрами STM32 для Arduino IDE. Я написал об установке пакета поддержки здесь. Прежде чем продолжить, следуйте инструкциям по установке пакета boards.
И последнее, прежде чем перейти к аппаратной части: если вы создаете USB-устройство, вы можете настроить его имя. По умолчанию устройство будет идентифицироваться как BLUEPILL_F103C8 HID в режиме FS. Это определение можно найти в файле usbd_desc.c в папке C:\Users\\AppData\Local\Arduino15\packages\STM32\hardware\stm32\1.8.0\cores\arduino\stm32\usb (найдите папку Arduino в домашней папке пользователя). в других операционных системах).
В целях тестирования я построил следующую схему на макетной плате. Поворотный регулятор используется для изменения громкости, а некоторые кнопки управляют воспроизведением мультимедиа, паузой, остановкой и переходом к предыдущему/следующему.
Читайте также: