Оглавление:

Осу! Клавиатура: 8 шагов (с изображениями)
Осу! Клавиатура: 8 шагов (с изображениями)

Видео: Осу! Клавиатура: 8 шагов (с изображениями)

Видео: Осу! Клавиатура: 8 шагов (с изображениями)
Видео: КАК БЫСТРО НАУЧИТЬСЯ ИГРАТЬ В OSU! И СТАТЬ ЛУЧШИМ??? 2024, Ноябрь
Anonim
Осу! Клавиатура
Осу! Клавиатура

Недавно я начал играть в ритм-игру под названием osu! и после просмотра видео коммерческой мини-клавиатуры я подумал, что было бы забавно спроектировать ее самостоятельно. Вскоре после этого я решил, что было бы неплохо поместить его в инструкции в качестве моего первого проекта.

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

Примечание 1: используются SMD-компоненты (небольшая электроника), поэтому, если вы копируете этот проект, требуются навыки пайки. возможно, будет добавлена версия, которую легко припаять, но эти светодиоды не поставляются в упаковке с отверстиями

Примечание 2: я обновлял код несколько раз, и теперь я до версии 3ish. Я оставлю весь код онлайн, но рекомендую вам использовать последнюю версию. В настоящее время он не имеет функциональных возможностей, но должен быть наиболее эффективным.

Шаг 1: материалы и пояснения

Материалы и пояснения
Материалы и пояснения

В зависимости от того, как вы делаете свой проект, вам могут понадобиться разные компоненты, но я использовал именно эти компоненты. Если у вас есть время и вы хотите сэкономить, закажите форму aliexpress и не заказывайте печатную плату.

1 кабель Arduino pro micro + USB

3 красных переключателя Kailh BOX

3 резистора 10к (0805 SMD)

3 конденсатора 100 нФ (0805 SMD)

4 светодиода APA102 RGB (5050 SMD)

3 колпачки

1 Печатная плата (PCB), представленная в этом проекте

1 футляр, напечатанный на 3D-принтере, предоставленный в этом проекте

Почему я использую Arduino Pro Micro?

Большинство плат Arduino, таких как Uno (Atmega328), не имеют встроенной поддержки USB-связи. Да, вы можете очень легко запрограммировать их через USB, и я думаю, что есть обходные пути, но я предпочитаю, чтобы это было просто, когда дело доходит до USB-связи, и я не знаю, насколько эффективны обходные пути. Эти платы используют внешний чип, чтобы сделать возможной связь по USB, тогда как в Arduino pro micro (Atmega32U4) он встроен.

Переключатели

Вы можете использовать множество механических переключателей. Линейный, тактильный или щелкающий от Kailh или Cherry MX. Выбирайте то, что вам нравится. Я использовал переключатели Kailh, потому что они были дешевы на Ailexpress. Если вы решите использовать печатную плату, вам понадобятся переключатели Kailh BOX. Цвет определяет ощущение.

Электронные компоненты

В этой главе нечего объяснять о них, но если вы не используете печатную плату, я бы порекомендовал только обычные компоненты со сквозным отверстием для облегчения пайки. К сожалению, используемые светодиоды не доступны в корпусах со сквозными отверстиями. Я бы также не рекомендовал использовать провода на SMD-корпусах, если вы не очень уверены в своих навыках пайки. Даже для SMD на печатной плате требуются «продвинутые» навыки пайки.

Жилье

Я предоставляю жилье в этом проекте, но на данный момент оно некорректно. Необходимы модификации для установки болтов, отверстия для светодиодов не оптимальны, ардуино обнажено, и необходимо вырезать часть, чтобы USB поместился. В будущем возможно добавление нового жилья. Если у вас есть 3D-принтер, распечатайте его, но, пожалуйста, не старайтесь распечатать этот дефектный футляр, если у вас его нет, и просто используйте какую-то коробку для проекта.

Шаг 2: Схема

Схема
Схема

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

Переключить подключения к Arduino

Переключатели подключены к контактам 0, 2 и 3 Arduino, потому что эти контакты могут использоваться как внешние прерывания. Это более подробно объясняется в разделе кода.

Схема устранения дребезга

В левой части схемы изображена схема, скопированная 3 раза. Эта схема используется для дребезга переключателя. Чтобы знать, что такое дребезг, вам нужно понимать дребезг переключателя, и это нетрудно понять.

Сначала посмотрите на эту симуляцию, чтобы нарисовать первое изображение (быстро нажмите переключатель и посмотрите на сигнал ниже)

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

Эта схема устранения дребезга замедлит спад сигнала. Сигнал на Arduino не сможет измениться так быстро, как происходит отскок, поэтому он будет считан одним нажатием. Не беспокойтесь о том, что он замедлится для следующего настоящего пресса, потому что так и будет.

Передовой:

Atmaga32U4 считывает цифровой низкий уровень при 0,2 В постоянного тока - 0,1 В = 0,9 В. Напряжение конденсатора в любой момент его разряда равно Vcc * e ^ (- t / RC). Если вы измеряете другое время дребезга на вашем коммутаторе, вы можете рассчитать номиналы резистора и конденсатора.

формула

Светодиоды

Светодиоды RGB представляют собой светодиоды APA102, которые адресуются индивидуально с помощью тактовой частоты и линии передачи данных. Для их работы не нужны внешние компоненты. Для многих светодиодов вы должны использовать конденсатор, параллельный 5 В и земле, но всего с 4 светодиодами он вам не нужен.

Шаг 3: Дизайн платы

Дизайн доски
Дизайн доски

Печатная плата была разработана в JLCPCB. Они меня не спонсируют, но для дешевых прототипов они делают отличные печатные платы. За 2 доллара вы получите 10 таких же плат, но для меня доставка обошлась примерно в 11 долларов. Если вам не обязательно нужна RGB-подсветка и вы планируете сделать только одну, вам следует подумать о том, чтобы сделать свою клавиатуру без печатной платы.

Дизайн платы был довольно простым. Мне нужно было только добавить компонент для переключателей, но, посмотрев видео, я понял. Единственный недостаток, который я понял, - это расположение отверстий слишком близко к переключателям.

Чтобы заказать печатную плату, перейдите на https://jlcpcb.com/ и выберите двухслойный вариант. Он попросит у вас файл Gerber. загрузите файл «.zip» и перетащите его в окно. Распаковывать его не нужно. Настройки должны быть в порядке, и вы можете продолжить и завершить заказ.

Шаг 4. Советы по дизайну и сборке корпуса

Советы по дизайну и сборке корпуса
Советы по дизайну и сборке корпуса
Советы по дизайну и сборке корпуса
Советы по дизайну и сборке корпуса
Советы по дизайну и сборке корпуса
Советы по дизайну и сборке корпуса
Советы по дизайну и сборке корпуса
Советы по дизайну и сборке корпуса

Дизайн

Как отмечалось ранее, мой дизайн небезупречен, но вы все равно можете его распечатать, если хотите. дизайн был выполнен в Fusion 360. Это бесплатное программное обеспечение для 3D-моделирования, и с моим опытом работы с изобретателем и solidworks с ним было довольно легко работать. Кружки по углам корпуса предназначены для предотвращения отслаивания печатной формы.

Если вы излагаете свои собственные аргументы, действительно важно только одно. Ваши переключатели должны быть надежно закреплены и не должны двигаться. Я предоставил изображения квадратных вырезов с размерами, чтобы вы могли использовать их для своего собственного дизайна, предполагая, что вы используете переключатели Kailh BOX.

сборка

Теперь у вас есть все компоненты, необходимые для сборки. Есть заказ на сборку этой первой версии, потому что переключатели распаяны.

1. Припаяйте компоненты SMD. это резисторы, конденсаторы и светодиоды.

2. Припаяйте Arduino pro micro.

3. Поместите 3 переключателя в напечатанную на 3D-принтере крышку перед пайкой. Крышку нельзя снять после пайки переключателей. Демонтаж переключателей не рекомендуется, так как это может привести к их повреждению.

4. Теперь припаяйте переключатели на место. Сделайте это как можно быстрее, потому что пластиковые переключатели могут расплавиться и разрушить их или резко уменьшить количество щелчков.

5. Поместите собранную крышку в корпус, напечатанный на 3D-принтере, и закрепите лентой или используйте болты, если они не задевают колпачки клавиш.

6. Поместите колпачки на переключатели, и все готово.

Рекомендации

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

Также несколько ножек на дне удобны для предотвращения скольжения и пропускают свет RGB.

Шаг 5: Код V1 (аппаратное устранение дребезга)

Код V1 (аппаратное устранение дребезга)
Код V1 (аппаратное устранение дребезга)
Код V1 (аппаратное устранение дребезга)
Код V1 (аппаратное устранение дребезга)

Код этого проекта не подходит для новичков, поэтому, если вы только начинаете программировать на Arduino, этот код, возможно, вас немного напугает. Однако я постараюсь объяснить, что происходит, как можно лучше. Некоторые вещи будут объяснены позже в этом тексте, поэтому, если у вас есть вопросы, пожалуйста, сначала прочтите все это целиком.

Загрузка кода

Сначала загрузите все 3 файла с расширением.ino и поместите их в одну папку. Если у вас нет Arduino IDE, просто скачайте ее бесплатно на официальном сайте arduino.

Подключите ваш Arduino к компьютеру и откройте «OSU_Keyboard_code_V1.ino». На панели инструментов выберите «Arduino / Genuino Micro». Также в Tools выберите правильный COM-порт. Иногда это может измениться. Чтобы загрузить код в Arduino, просто нажмите на стрелку в верхнем левом углу экрана и подождите, пока в левом нижнем углу не появится сообщение о завершении.

OSU_Keyboard_code_V1

Включая и определяя

Сначала вам нужно включить библиотеку Keyboard. Это позволяет использовать Arduino в качестве клавиатуры.

Далее я определяю некоторые ценности. Define похож на переменные, но они не могут быть изменены во время работы программы. Первые 9 предназначены для символа клавиатуры, номера пина Arduino и битов порта.

Затем биты порта светодиодных данных и часов.

Также определяется количество светодиодов и переменная для угла цветового круга.

Настраивать

Эта часть кода будет выполнена только один раз при подключении Arduino.

Сначала контакты синхронизации и данных светодиодов устанавливаются как выходы, а контакты переключателя - как входы. Это расширенная версия pinMode (). Если вас интересует, ищите "прямое манипулирование портами".

Keyboard.begin () просто запускает USB-соединение как клавиатуру.

Следующие 3 прерывания связаны с контактами переключателя. Каждый раз, когда на контакте переключателя обнаруживается изменение, будет выполняться крошечная программа. Эта небольшая программа будет сделана дальше.

Петля

Эта часть будет постоянно повторяться, пока Arduino находится под напряжением.

Я использую его только для изменения и обновления цвета светодиодов.

Прерывания

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

Сначала он проверяет, нажата ли кнопка или отпущена, и отправляет правильную команду клавиатуры.

Светодиод (объяснение в другом порядке)

Если вам интересно, как управляются светодиоды, вам следует взглянуть на таблицу данных APA102.

Один бит

Это снова версия цифровой записи с прямым манипулированием портами.

Сначала он проверяет, должен ли он послать 0 или 1, и соответственно подтягивает вывод данных к низкому или высокому уровню. Затем он записывает тактовый вывод в высокий уровень очень коротким и снова записывает в низкий.

OneByte

Это повторяется oneBit 8 раз с циклом for. Он считывает первый бит байта и передает его значение функции oneBit и делает то же самое для следующих 7 бит.

LedData

Это повторяется один байт 4 раза, чтобы предоставить данные, необходимые для одного светодиода. Первый байт начинается с 111xxxxx и 5-битного значения яркости вместо xxxxx. Яркость можно установить от 0 до 31 (2 ^ 5 = 32 уровня).

Следующие 3 байта предназначены для значений синего, зеленого и красного цветов. По одному байту для каждого цвета.

ColorWheelThisLed

Эта функция вызывает ledData и дает ей цвета rgb в зависимости от угла в цветовом круге.

16-битное значение делится на 6 равноотстоящих частей по 60 градусов. Просмотр изображений может помочь вам лучше понять.

(также предоставляется 8-битная версия, но она закомментирована, потому что она слишком мерцающая)

StartEndFrame

Начальный кадр необходимо использовать каждый раз, когда вы хотите отправить новые цвета на светодиоды и хотите обновить фактический цвет светодиодов.

Я использую только начальный кадр, потому что он не нужен. Начальный кадр - 4 байта из 0. Конечный кадр - 4 байта из 255 (11111111).

Шаг 6: Код V2 (программное обеспечение для устранения дребезга с помощью таймеров)

Код V2 (программное обеспечение для устранения дребезга с помощью таймеров)
Код V2 (программное обеспечение для устранения дребезга с помощью таймеров)

Через некоторое время игры я заметил некоторые проблемы с двойным нажатием на аппаратный дребезг. Это можно исправить с помощью резисторов или конденсаторов другого номинала, но, поскольку кнопки и крышка не снимаются, я подумал, что устранение неполадок программного обеспечения было бы хорошим решением. Устранение неполадок программного обеспечения должно работать независимо от того, реализован ли устранение неполадок оборудования или нет. В моей текущей настройке я не мог снимать крышку, поэтому я просто оставил резисторы и конденсаторы на месте.

Я не буду объяснять код так подробно, как в предыдущей версии, потому что его немного сложнее объяснить.

По сути, большая часть кода работает одинаково, а светодиодный код остается нетронутым. что изменилось, так это то, что внешние прерывания больше не используют функции Arduino. Теперь он работает в чистом коде C. А теперь добавлено программное прерывание. Для этого я использовал таймеры AVR, чтобы подождать определенное время, пока подпрыгивание не прекратится. Поскольку таймеры основаны на прерываниях, на время восстановления не влияет что-либо происходящее в цикле.

Единственный недостаток, который я могу придумать, - это то, что функции задержки Arduino больше не могут использоваться. Поскольку функции задержки используют таймер 0, а эта программа использует таймер 0 для устранения дребезга.

На изображении вы можете увидеть, как примерно работает код. Бит mem указывает, работает ли таймер. Что не показано, так это случай, когда в конце нажатия кнопки входной сигнал низкий. В этом случае будет отправлено только нажатие клавиши, когда кнопка уже отпущена. Это означает, что клавиша будет удерживаться, насколько это возможно для компьютера. Для этого редкого исключения проверка будет выполнена по истечении таймера. Если по окончании таймера кнопка не будет нажата, будет отправлена команда отпускания клавиши.

Шаг 7: Код V3 (программное обеспечение для устранения дребезга с вертикальным счетчиком) (рекомендуется) (без светодиода)

Код V3 (программное обеспечение для устранения дребезга с помощью вертикального счетчика) (рекомендуется) (без светодиода)
Код V3 (программное обеспечение для устранения дребезга с помощью вертикального счетчика) (рекомендуется) (без светодиода)

У этого кода ТАКЖЕ есть версия, в которой вам не нужны понижающие резисторы. Убедитесь, что вы подключили каждую кнопку к входу и ЗАЗЕМЛЕНИЮ! Используется встроенное подтягивание

Я также испытал несколько незарегистрированных нажатий в коде V2. Я думаю, что код стал слишком сложным из-за таймера и внешнего прерывания, и, возможно, я пропустил некоторые исключения. По этой причине я начал с нуля поиски в Интернете методов устранения неполадок программного обеспечения.

(честно говоря, по крайней мере половина этого проекта на данный момент превратилась в отбойку кнопок)

После некоторого поиска я наткнулся на этот пост:

www.compuphase.com/electronics/debouncing….

Честно говоря, мне потребовалось некоторое время, чтобы полностью понять, как это работает. Он включает в себя довольно сложные битовые манипуляции, но я постараюсь сделать это как можно проще. Однако мои объяснения будут только дополнением к публикации, поэтому вы должны хотя бы прочитать «вертикальные счетчики», «аннотированную реализацию» и «уменьшение задержки».

Мое объяснение

Временная диаграмма (сделанная в WaveDrom), которую я добавил, должна сделать эту математику труднее для понимания, по крайней мере, немного более понятной. Обратите внимание, что изображение имеет 2 бита счетчика, а мой код - 3. Это означает более длительное время устранения дребезга.

Один бит на значение

Благодаря реализации вертикального счетчика можно одновременно заблокировать несколько кнопок одновременно. Все значения относятся к типу Byte (uint8_t) и состоят из 8 бит. нас не интересует, какое значение содержит какой-либо из этих байтов, а нас интересуют сами биты. Каждый блокируемый бит использует только один бит каждого байта. Первая кнопка использует только первый бит каждого байта, вторая кнопка использует второй бит и т. Д.

Все одновременно

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

Таким образом, с 8-битным типом данных можно сделать это для 8 кнопок. Использование более крупных типов данных позволяет одновременно устранять больше проблем.

Дебаунс

Процедура устранения дребезга выполняется каждые 1 миллисекунду с прерыванием по таймеру.

когда кнопка нажата, buttonState, который является дебаунтированным состоянием, явно понижается, указывая на нажатие кнопки. Чтобы обнаружить отпускание, кнопка должна находиться достаточно долго, что означает, что она не отскакивала в течение определенного времени. Переключатель используется для обозначения изменения кнопки. Биты счетчика используются для…. подсчитывая, как долго не было отказов.

Дельта указывает разницу между входом и состоянием противодействия. Только когда есть разница, счетчик будет считать. счетчик будет сброшен при обнаружении дребезга (дельта равна 0).

Шаг 8: результат

Image
Image

Если все прошло хорошо, у вас теперь должна быть рабочая клавиатура для игры в Осу! на. Лично я вообще никакой задержки не заметил. Если да, пожалуйста, дайте мне знать. Также, если есть какие-либо вопросы, не стесняйтесь спрашивать.

Предыдущие упоминания о V2 не являются обещанием, поэтому не откладывайте этот проект, потому что вы хотите дождаться V2.

Надеюсь, вам понравится ваша клавиатура!

Осу! имя: Thomazzz3

Исправление проблем

Если вы считаете, что у вас проблемы с клавиатурой, сначала откройте текстовый редактор и кратковременно нажмите каждую клавишу по одному разу.

Один или несколько ключей не работают?

Возможно, во время пайки вы сломали выключатель изнутри. Если у вас есть мультиметр, включите непрерывность / звуковой сигнал, поместите его параллельно переключателю, пока Arduino не подключен, и нажмите кнопку. Должен пищать.

Соответствуют ли набранные вами символы клавишам, которые вы настроили в Osu! ?

Измените символы в коде Arduino в первых 3 #Defines ('' не требуется!).

Или смени свою Осу! настройки для использования настроенных ключей.

Один или несколько ключей повторяются несколько раз?

Схема защиты от дребезга, вероятно, не работает с вашими переключателями или неправильно припаяна. Проверьте свои паяные соединения. Если это все еще происходит, попробуйте установить конденсатор емкостью 1 мкФ. Это будет очень сложно для пользователей печатных плат.

Если у вас проблемы со светодиодами

Светодиоды мерцают?

Паяное соединение может быть неплотным. Если вы используете печатную плату, убедитесь, что паяльное олово действительно стекало по контактной площадке на отпечатке.

Ни один из светодиодов не работает или от определенного количества светодиодов перестают работать?

Проверьте, нет ли короткого замыкания между соединениями первого светодиода (следуйте дорожкам) и проверьте, хорошо ли подключена олово на выходах Arduino и снова на первом светодиоде. В случае подтверждения правильности и по-прежнему неисправности может потребоваться замена первого светодиода.

Если это поможет, при необходимости повторите для следующих светодиодов.

Рекомендуемые: