Съдържание:

Осу! Клавиатура: 8 стъпки (със снимки)
Осу! Клавиатура: 8 стъпки (със снимки)

Видео: Осу! Клавиатура: 8 стъпки (със снимки)

Видео: Осу! Клавиатура: 8 стъпки (със снимки)
Видео: Шершень укусил за глаз Аллергия. 2024, Юли
Anonim
Осу! Клавиатура
Осу! Клавиатура

Наскоро започнах да играя ритмична игра, наречена osu! и след като видях видео на комерсиална мини клавиатура, си помислих, че ще бъде забавен проект да проектирам сама. Не след дълго реших, че би било добра идея да го сложа на инструктажи като мой първи проект.

Ако искате да повторите този проект точно до последната инструкция, тогава бъдете мой гост, но някои от решенията, които направих, не се основават на най -ниска цена или най -добро качество. Някои компоненти са избрани почти чисто, защото ги оставих да лежат наоколо. Ако можете да се справите, бих ви насърчил да персонализирате проекта си.

Забележка 1: Използват се SMD компоненти (малка електроника), така че ако повторите този проект, са необходими умения за запояване. може би ще бъде добавена лесна за запояване версия, но тези светодиоди не идват в пакет с отвори

Забележка 2: Актуализирах кода няколко пъти и сега съм до версия 3ish. Ще оставя целия код онлайн, но препоръчвам да използвате последната версия. Понастоящем няма функционалност за светодиоди, но трябва да е най -ефективната.

Стъпка 1: Материали и обяснения

Материали и обяснения
Материали и обяснения

В зависимост от начина, по който правите проекта си, може да се нуждаете от различни компоненти, но тези компоненти са тези, които използвах. Ако имате време и искате да спестите пари, поръчайте формуляр aliexpress и не поръчвайте печатната платка.

1 Arduino pro micro + USB кабел

3 червени превключвателя Kailh BOX

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

3 100nF кондензатор (0805 SMD)

4 APA102 rgb LED (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 на печатни платки се усъвършенстват "усъвършенствани" умения за запояване.

Жилището

Осигурявам жилище в този проект, но в този момент той е недостатъчен. Необходими са модификации, за да се монтират болтове, отворите за светодиодите не са оптимални, arduino е изложен и част трябва да бъде изрязана, за да може USB да се побере. В бъдеще може да се добави ново жилище. Ако имате 3D принтер, отпечатайте го, но не се старайте да отпечатате този дефектен калъф, ако нямате и просто използвайте някакъв вид кутия за проекти.

Стъпка 2: Схемата

Схемата
Схемата

Схемата за този проект е доста проста, но искам да обясня компонентите за хората, които се интересуват и не знаят това изпълнение.

Превключете връзките към Arduino

Превключвателите са свързани към пинове 0, 2 и 3 на Arduino, тъй като тези щифтове могат да се използват като външни прекъсвания. Това е допълнително обяснено в раздела за кодове.

Веригата за извеждане

От лявата страна на схемата има верига, която се копира 3 пъти. Тази схема се използва за премахване на превключвателя. За да знаете какво е премахването, трябва да разберете подскачането на превключвателя и не е трудно да го разберете.

Първо погледнете тази симулация, за да нарисувате първа картина (щракнете бързо върху превключвателя и погледнете сигнала по -долу)

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

Тази верига за отстраняване ще забави падащия ръб на сигнала. Сигналът към Arduino няма да може да се промени толкова бързо, колкото се случи подскачането, така че ще се чете като едно натискане. Не се притеснявайте, че ще падне бавно за следващата истинска преса, защото така ще стане.

Разширено:

Atmaga32U4 отчита цифрово ниско ниво при 0.2Vcc - 0.1V = 0.9 волта. Напрежението на кондензатора по всяко време при неговото разреждане е Vcc * e^(-t/RC). Ако измервате различно време на отстраняване на превключвателя, можете да изчислите стойностите на резистора и кондензатора.

формула

Светодиодите

Светодиодите rgb са светодиоди APA102, които са индивидуално адресируеми с помощта на часовник и линия за данни. Не са необходими външни компоненти, за да работят. За много светодиоди трябва да използвате кондензатор, паралелен на 5 волта и земя, но само с 4 светодиода нямате нужда от него.

Стъпка 3: Дизайн на дъската

Дизайнът на дъската
Дизайнът на дъската

ПХБ е проектирана в JLCPCB. Не съм спонсориран от тях, но за евтини прототипи те правят отлични печатни платки. За 2 долара получавате 10 от същия борд, но доставката беше около 11 долара за мен. Ако не искате непременно rgb осветление и планирате да направите само едно, трябва да помислите как да направите клавиатурата си без печатна платка.

Дизайнът на дъската беше доста прав. Трябваше само да добавя компонент за превключвателите, но след като изгледах някои видеоклипове, се ориентирах. Единственият недостатък, който осъзнах, е поставянето на дупките малко прекалено близо до ключовете.

За да поръчате печатната платка, отидете на https://jlcpcb.com/ и изберете опцията на 2 слоя. Той ще ви поиска файл на 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“. Също така в Инструменти изберете десния COM порт. Понякога това може да се промени. За да качите кода на вашия Arduino, просто кликнете върху стрелката в горния ляв ъгъл на екрана и изчакайте, докато ви каже, че е завършен в долния ляв ъгъл.

OSU_Keyboard_code_V1

Включително и определящо

Първо трябва да включите библиотеката Keyboard. Това прави възможно използването на Arduino като клавиатура.

След това определям някои стойности. Дефинирането е точно като променлива, но те не могат да се променят, докато програмата работи. Първите 9 са за символа на клавиатурата, номера на пина на arduino и битовете за порт.

След това битовете на порта на LED данни и часовник.

Определен е и броят на светодиодите и променлива за ъгъла на цветното колело.

Настройвам

Тази част от кода ще бъде изпълнена само веднъж, когато arduino е включен.

Първо тактовете и щифтовете за данни на светодиодите се задават като изходи, а щифтовете за превключване като входове. Това е усъвършенстваната версия на pinMode (). Ако се интересувате, потърсете „директна манипулация на порта“.

Keyboard.begin () просто стартира USB връзката като клавиатура.

Следващите 3 прекъсвания са свързани към щифтовете за превключване. Всеки път, когато се установи промяна на щифта на превключвателя, ще се изпълни малка програма. Тази малка програма ще бъде направена по -нататък.

Цикъл

Тази част ще се повтаря непрекъснато, докато arduino се захранва.

Използвам го само за промяна и актуализиране на цвета на светодиодите.

Прекъсва

Тук се правят малките програми, които ще се изпълняват само когато се установи промяна на щифтовете за превключване. Те са идентични, с изключение на кой щифт реагират.

Първо проверява дали бутонът е натиснат или освободен и изпраща правилната команда от клавиатурата.

LED (обяснено в различен ред)

Ако сте любопитни как се управляват светодиодите, трябва да погледнете листа с данни APA102.

OneBit

Това отново е версията за директно манипулиране на портове за цифрово записване.

Първо проверява дали трябва да изпрати 0 или 1 и съответно издърпва пина за данни ниско или високо. След това извежда пина на часовника високо много кратко и го записва отново ниско.

OneByte

Това повтаря oneBit 8 пъти с цикъл "за". Той чете първия бит в байт и предава стойността му на функцията oneBit и прави същото за следващите 7 бита.

LedData

Това се повтаря oneByte 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 (софтуер Debounce With Timers)

Кодът V2 (софтуер Debounce With Timers)
Кодът V2 (софтуер Debounce With Timers)

След известно време на игра забелязах някои проблеми с двойното докосване с хардуерното представяне. Това може да се поправи с някои други резистори или кондензатори на стойност, но тъй като бутоните и капакът не са подвижни, мислех, че софтуерното отстраняване ще бъде хубаво решение. Деблокирането на софтуер трябва да работи независимо дали хардуерното деблокиране е внедрено или не. В сегашната ми настройка не мога да махна капака, така че просто оставих резисторите и кондензаторите на място.

Няма да обяснявам кода толкова подробно, колкото предишната версия, защото е малко по -трудно да се обясни.

По принцип повечето от кода работят по същия начин и светодиодният код остава недокоснат. това, което се промени, е, че външните прекъсвания вече не използват функциите на arduino. Сега работи в чист C код. И сега добавеното е прекъсване на софтуера. За това използвах AVR таймерите, за да изчакам известно време, докато подскачането спре. Тъй като таймерите се прекъсват въз основа на времето за декупация не се влияе от нищо, което се случва в цикъла.

Единственият недостатък, който мога да измисля, е, че функциите за забавяне на arduino вече не могат да се използват. Тъй като функциите за забавяне използват Timer 0 и тази програма използва Timer 0 за отстраняване.

На изображението можете да видите как кодът работи приблизително. Mem битът показва дали работи таймер. Това, което не е изобразено, е случаят, че в края на натискането на бутона входът е нисък. В този случай ще бъде изпратено само натискане на клавиш, докато бутонът вече е освободен. Което означава, че ключът ще бъде задържан, що се отнася до компютъра. За това рядко изключение ще се извърши проверка, когато таймерът изтече. Ако в края на таймера бутонът не е натиснат, ще бъде изпратена команда за освобождаване на клавиш.

Стъпка 7: Кодът V3 (софтуерно отстраняване с вертикален брояч) (препоръчително) (без светодиод)

Код V3 (софтуерно отстраняване с вертикален брояч) (препоръчително) (без светодиод)
Код V3 (софтуерно отстраняване с вертикален брояч) (препоръчително) (без светодиод)

Този код СЪЩО има версия, при която не се нуждаете от дърпащи резистори. Уверете се, че сте свързали всеки бутон към входа и GROUND! Използва се вграденото издърпване

Също така преживях някои нерегистрирани преси в кода V2. Мисля, че кодът просто стана твърде сложен с таймера и външното прекъсване и може би съм пропуснал някои изключения. Поради тази причина започнах от нулата с търсене в интернет за методи за деблокиране на софтуер.

(честно казано, поне половината от този проект е станал отказ от бутони в този момент)

След известно търсене попаднах на този пост:

www.compuphase.com/electronics/debouncing….

Честно казано, отне ми доста време, за да разбера напълно как точно работи. Това включва някои доста сложни битови манипулации, но ще се опитам да го направя възможно най -лесно. Обясненията ми обаче ще бъдат само допълнение към публикацията, така че поне трябва да прочетете „вертикалните броячи“, „анотираната реализация“и „намаляването на латентността“.

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

Графиката на времето (направена във WaveDrom), която добавих, би трябвало да направи тази трудно разбираема битова математика поне малко по -разбираема. Обърнете внимание, че изображението има 2 броя бита, но моят код има 3. Това означава по -дълго време за деблокиране.

Един бит на стойност

С реализацията на вертикален брояч е възможно паралелно да се отстранят няколко бутона едновременно. Всички стойности са от тип байт (uint8_t) и се състоят от 8 бита. не се интересуваме каква стойност съдържа някой от тези байтове, а по -скоро се интересуваме от битовете сами по себе си. Всеки бутон, който трябва да бъде премахнат, използва само един бит от всеки байт. Първият бутон използва само първия бит от всеки байт, вторият бутон използва втория бит и т.н.

Всички едновременно

С помощта на битова математика е възможно паралелно да се изпълняват тези изкривявания. И въпреки че битовата математика е доста сложна, тя е много ефективна за процесора.

По този начин с 8 -битов тип данни е възможно да направите това за 8 бутона. Използването на по -големи типове данни позволява повече дебаунди наведнъж.

Разкриването

Процедурата за отстраняване се извършва на всеки 1 милисекунда с прекъсване на таймера.

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

Делта показва разлика между входното и развенчаното състояние. Броячът ще се брои само когато има разлика. броячът ще бъде нулиран, когато бъде открит отскок (делтата е 0).

Стъпка 8: Резултатът

Image
Image

Ако всичко вървеше добре, сега трябва да имате работеща клавиатура, за да играете Osu! На. Аз лично изобщо не съм забелязал никакво латентност. Ако го направите, моля, уведомете ме. Също така, ако имате въпроси, не се колебайте да попитате нещо.

Предишните споменавания за V2 не са обещание, така че не отлагайте този проект, защото искате да изчакате V2.

Надявам се да ви хареса клавиатурата!

Осу! име: Thomazzz3

Отстраняване на неизправности

Ако мислите, че имате проблеми с клавиатурата, първо отворете текстов редактор и натиснете всеки клавиш веднъж за кратко.

Един или няколко ключа не работят?

Възможно е да сте унищожили превключвател вътрешно по време на запояване. Ако имате мултицет, включете го на непрекъснатост/звуков сигнал, поставете го успоредно на превключвателя, докато Arduino не е свързан, и натиснете клавиша. Трябва да издава звуков сигнал.

Съвпадат ли символите, които току -що въведохте, с клавишите, които сте конфигурирали в Osu! ?

Променете знаците в кода на arduino в първите 3 #Defines ('' не е задължително!).

Или сменете Osu! настройки за използване на конфигурираните клавиши.

Повтаря ли се един или няколко клавиша няколко пъти?

Вероятно веригата за отстраняване не работи за вашите ключове или не е запоена правилно. Проверете връзките за запояване. Ако все пак се появи, опитайте стойност на кондензатор от 1uF. Това ще бъде много трудно за потребителите на печатни платки.

Ако имате проблеми с вашите светодиоди

Светодиодите мигат ли?

Възможно е връзката за запояване да е разхлабена. Ако използвате печатна платка, потвърдете, че спояващата калай наистина тече върху подложката върху отпечатъка.

Никой от светодиодите не работи или от определен брой светодиоди спира да работи?

Проверете за къси връзки между връзките на първия светодиод (следвайте следите) и проверете за добре свързана калай на изходите на Arduino и отново първия светодиод. Ако се потвърди правилно и все още е дефектен, може да се наложи да смените първия светодиод.

Ако това поправи, повторете за следващите светодиоди, ако е необходимо.

Препоръчано: