Daftar Isi:

Osu! Keyboard: 8 Langkah (dengan Gambar)
Osu! Keyboard: 8 Langkah (dengan Gambar)

Video: Osu! Keyboard: 8 Langkah (dengan Gambar)

Video: Osu! Keyboard: 8 Langkah (dengan Gambar)
Video: I played osu! on a low spec laptop using touchpad and a ballpoint pen for aim guide #osu 2024, November
Anonim
Osu! Papan ketik
Osu! Papan ketik

Saya baru-baru ini mulai memainkan permainan ritme bernama osu! dan setelah melihat video keyboard mini komersial, saya pikir ini akan menjadi proyek yang menyenangkan untuk mendesain sendiri. Tidak lama setelah itu saya memutuskan akan menjadi ide yang baik untuk meletakkannya di instruksi sebagai proyek pertama saya.

Jika Anda ingin meniru proyek ini persis dengan instruksi terakhir maka jadilah tamu saya, tetapi beberapa keputusan yang saya buat tidak didasarkan pada harga terendah atau kualitas terbaik. Beberapa komponen dipilih hampir murni karena saya memilikinya. Jika Anda dapat mengatasinya, saya akan mendorong Anda untuk menyesuaikan proyek Anda.

Catatan 1: Komponen SMD (elektronik kecil) digunakan jadi jika Anda meniru proyek ini, keterampilan menyolder diperlukan. mungkin versi solder yang mudah akan ditambahkan tetapi led ini tidak datang dalam paket lubang palung

Catatan 2: Saya telah memperbarui kode beberapa kali dan saya telah mencapai versi 3ish sekarang. Saya akan membiarkan semua kode online tetapi saya sarankan Anda menggunakan versi terakhir. Saat ini tidak memiliki fungsi yang dipimpin tetapi itu harus menjadi yang berkinerja terbaik.

Langkah 1: Bahan dan Penjelasan

Bahan dan Penjelasan
Bahan dan Penjelasan

Tergantung pada bagaimana Anda membuat proyek Anda, Anda mungkin memerlukan komponen yang berbeda, tetapi komponen ini adalah komponen yang saya gunakan. Jika Anda punya waktu dan ingin menghemat uang, pesan formulir aliexpress dan jangan pesan PCB.

1 Arduino pro mikro + kabel USB

3 sakelar merah Kailh BOX

3 resistor 10k (0805 SMD)

3 kapasitor 100nF (0805 SMD)

4 APA102 rgb LED (5050 SMD)

3 Keycaps

1 Papan sirkuit tercetak (PCB) disediakan dalam proyek ini

1 kasing cetak 3D disediakan dalam proyek ini

Mengapa saya menggunakan mikro Arduino pro?

Kebanyakan papan arduino seperti Uno (Atmega328) tidak memiliki dukungan asli untuk komunikasi USB. Ya, Anda dapat memprogramnya melalui USB dengan sangat mudah dan saya pikir ada solusinya, tetapi saya ingin membuatnya tetap sederhana dalam hal komunikasi USB dan saya tidak tahu apakah solusinya sama responsifnya. Papan tersebut menggunakan chip eksternal untuk memungkinkan komunikasi USB sedangkan Arduino pro mikro (Atmega32U4) memilikinya.

Sakelar

Ada banyak sakelar mekanis yang dapat Anda gunakan. Linear, taktil atau clicky dari Kailh atau Cherry MX. Pilih mana yang Anda suka. Saya menggunakan sakelar Kailh karena harganya murah di Ailexpress. Jika Anda memilih untuk menggunakan PCB, Anda memerlukan sakelar Kailh BOX. Warna menentukan perasaan.

Komponen elektronik

Tidak banyak yang bisa dijelaskan tentang mereka dalam bab ini, tetapi jika Anda tidak menggunakan PCB, saya akan merekomendasikan hanya komponen lubang biasa untuk kemudahan penyolderan. Sayangnya led yang digunakan tidak tersedia dalam paket lubang palung. Saya juga tidak akan merekomendasikan untuk menggunakan kabel pada paket SMD kecuali Anda sangat yakin dengan keterampilan menyolder Anda. Bahkan untuk SMD pada PCB, keterampilan menyolder "lanjutan" diperlukan.

Perumahan

Saya memang menyediakan perumahan dalam proyek ini, tetapi pada saat ini cacat. Perlu modifikasi agar pas dengan baut, bukaan untuk led kurang maksimal, arduino terbuka dan ada part yang perlu digunting agar USB pas. Di masa depan perumahan baru dapat ditambahkan. Jika Anda memiliki printer 3D, silakan dan cetak, tapi tolong jangan keluar dari cara Anda untuk mencetak kasus cacat ini jika Anda tidak dan hanya menggunakan semacam kotak proyek.

Langkah 2: Skema

Skema
Skema

Skema untuk proyek ini agak sederhana, tetapi saya ingin menjelaskan komponen-komponennya untuk orang-orang yang tertarik dan tidak tahu implementasi ini.

Beralih koneksi ke Arduino

Sakelar terhubung ke pin Arduino 0, 2 dan 3 karena pin tersebut dapat digunakan sebagai interupsi eksternal. Ini dijelaskan lebih lanjut di bagian kode.

Sirkuit debounce

Di sisi kiri skema adalah sirkuit yang disalin 3 kali. Sirkuit ini digunakan untuk mendebounce sakelar. Untuk mengetahui apa itu debouncing, Anda perlu memahami switch bouncing dan itu tidak sulit untuk dipahami.

Pertama lihat simulasi ini untuk melukis gambar pertama (klik tombol cepat dan lihat sinyal di bawah)

Saat Anda menekan atau melepaskan sakelar, sakelar itu memantul dan sinyal Anda bergantian antara tinggi dan rendah beberapa kali selama beberapa milidetik. Arduino sangat cepat dan membaca setiap tinggi dan rendah dalam waktu singkat ini. Program akan mengirimkan penekanan tombol atau pelepasan setiap kali tinggi atau rendah dibaca sehingga dengan setiap penekanan, komputer Anda akan menerima beberapa penekanan tombol. Tidak ideal untuk permainan ritme.

Sirkuit debounce ini akan memperlambat tepi jatuh sinyal. Sinyal ke Arduino tidak akan bisa berubah secepat bouncing terjadi sehingga akan dibaca sekali tekan. Jangan khawatir tentang itu akan menjadi lambat untuk pers nyata berikutnya karena itu akan terjadi.

Canggih:

Atmaga32U4 membaca digital rendah pada 0.2Vcc - 0.1V = 0.9 volt. Tegangan kapasitor setiap saat dalam pelepasannya adalah Vcc * e^(-t/RC). Jika Anda mengukur waktu debounce yang berbeda pada sakelar Anda, Anda dapat menghitung nilai resistor dan kapasitor Anda.

formulir rumus

LED

LED rgb adalah LED APA102 yang dapat dialamatkan secara individual menggunakan jam dan jalur data. Tidak ada komponen eksternal yang diperlukan untuk membuatnya bekerja. Untuk banyak LED Anda harus menggunakan kapasitor paralel dengan 5 volt dan ground tetapi hanya dengan 4 LED Anda tidak membutuhkannya.

Langkah 3: Desain Papan

Desain Papan
Desain Papan

PCB dirancang di JLCPCB. Saya tidak disponsori oleh mereka tetapi untuk prototipe murah mereka membuat PCB yang sangat baik. Untuk 2 dolar Anda mendapatkan 10 papan yang sama, tetapi pengirimannya sekitar 11 dolar untuk saya. Jika Anda tidak menginginkan pencahayaan rgb dan berencana membuat hanya satu, Anda harus mempertimbangkan untuk membuat keyboard Anda tanpa PCB.

Desain papan cukup lurus ke depan. Saya hanya perlu menambahkan komponen untuk sakelar, tetapi setelah menonton beberapa video, saya memahaminya. Satu-satunya kekurangan yang saya sadari adalah penempatan lubangnya agak terlalu dekat dengan sakelar.

Untuk memesan PCB, buka https://jlcpcb.com/ dan pilih opsi 2 lapis. Ini akan meminta Anda untuk file Gerber. unduh file ".zip" dan seret ke jendela. Anda tidak perlu membuka ritsletingnya. Pengaturannya akan baik-baik saja dan Anda dapat melanjutkan dan menyelesaikan pesanan.

Langkah 4: Desain Casing dan Tip Perakitan

Tip Desain dan Perakitan Casing
Tip Desain dan Perakitan Casing
Tip Desain dan Perakitan Casing
Tip Desain dan Perakitan Casing
Tip Desain dan Perakitan Casing
Tip Desain dan Perakitan Casing
Tip Desain dan Perakitan Casing
Tip Desain dan Perakitan Casing

Desain

Seperti yang disebutkan sebelumnya, desain saya cacat tetapi Anda masih dapat mencetaknya jika Anda mau. desainnya dibuat di Fusion 360. Ini adalah perangkat lunak pemodelan 3D gratis dan dengan pengalaman saya dari penemu dan solidworks, itu cukup mudah untuk dikerjakan. Lingkaran di sudut kasing adalah untuk mencegah terkelupas dari alas cetak.

Jika Anda membuat kasus Anda sendiri, hanya satu hal yang benar-benar penting. Sakelar Anda harus ditempatkan dengan kuat dan tidak dapat bergerak. Saya telah memberikan gambar potongan persegi dengan dimensi sehingga Anda dapat menggunakannya untuk desain Anda sendiri dengan asumsi Anda menggunakan sakelar Kailh BOX.

perakitan

Sekarang Anda memiliki semua komponen yang diperlukan untuk dirakit. Ada pesanan untuk merakit versi pertama ini karena sakelar disolder.

1. Solder komponen SMD. ini adalah resistor, kapasitor dan LED.

2. Solder Arduino pro mikro.

3. Tempatkan 3 sakelar di pelat penutup yang dicetak 3D sebelum menyolder. Pelat penutup tidak dapat dilepas setelah menyolder sakelar. Pematrian sakelar tidak disarankan dan dapat merusaknya.

4. Sekarang solder sakelar di tempatnya. Lakukan ini secepat mungkin karena sakelar plastik dapat meleleh dan merusaknya atau secara drastis mengurangi jumlah kliknya.

5. Tempatkan pelat penutup yang telah dirakit ke dalam wadah cetakan 3D dan kencangkan dengan selotip atau gunakan baut jika tidak mengganggu tutup tombol.

6. Tempatkan keyCaps pada sakelar dan selesai.

Rekomendasi

Desolder atau sembunyikan LED pada arduino setelah mengunggah kode Anda. Led bagus untuk dimiliki jika kode Anda tidak diunggah tetapi tidak bagus untuk dilihat sebagai produk jadi. Keterampilan dan pinset runcing diperlukan.

Juga beberapa kaki pegangan di bagian bawah bagus untuk anti slip dan membiarkan cahaya rgb bersinar.

Langkah 5: Kode V1 (Debounce perangkat keras)

Kode V1 (Debounce perangkat keras)
Kode V1 (Debounce perangkat keras)
Kode V1 (Debounce perangkat keras)
Kode V1 (Debounce perangkat keras)

Kode untuk proyek ini tidak ramah pemula jadi jika Anda baru memulai memprogram di arduino maka kode ini mungkin akan membuat Anda sedikit takut. Namun saya akan mencoba menjelaskan apa yang terjadi sebaik mungkin. Beberapa hal akan dijelaskan nanti dalam teks ini jadi jika Anda memiliki pertanyaan, silakan baca semuanya terlebih dahulu.

Mengunggah kode

Pertama download semua 3 file ".ino" dan taruh dalam satu folder. Jika Anda tidak memiliki Arduino IDE, unduh saja secara gratis di situs resmi arduino.

Hubungkan Arduino Anda ke PC Anda dan buka "OSU_Keyboard_code_V1.ino". Di Papan Alat pilih "Arduino/Genuino Micro". Juga di Alat pilih port COM yang tepat. Ini terkadang bisa berubah. Untuk mengunggah kode ke Arduino Anda cukup klik panah di kiri atas layar dan tunggu sampai memberitahu Anda bahwa itu selesai di kiri bawah.

OSU_Keyboard_code_V1

Termasuk dan mendefinisikan

Pertama, Anda perlu menyertakan perpustakaan Keyboard. Hal ini memungkinkan untuk menggunakan Arduino sebagai keyboard.

Selanjutnya saya mendefinisikan beberapa nilai. Definisikan seperti variabel tetapi mereka tidak dapat berubah saat program sedang berjalan. 9 yang pertama adalah untuk karakter keyboard, nomor pin arduino dan bit port.

Kemudian bit port dari data dan jam LED.

Juga jumlah led ditentukan dan variabel untuk sudut roda warna.

Mempersiapkan

Bagian kode ini hanya akan dieksekusi sekali ketika arduino dicolokkan.

Pertama jam dan pin data LED ditetapkan sebagai output dan pin sakelar sebagai input. Ini adalah versi lanjutan dari pinMode(). Jika Anda tertarik mencari "manipulasi port langsung".

Keyboard.begin() cukup memulai koneksi usb sebagai keyboard.

3 interupsi berikutnya dihubungkan ke pin sakelar. Setiap kali perubahan terdeteksi pada pin sakelar, program kecil akan dieksekusi. Program kecil ini akan dibuat lebih lanjut.

Lingkaran

Bagian ini akan terus berulang saat arduino dihidupkan.

Saya hanya menggunakannya untuk mengubah dan memperbarui warna LED.

Interupsi

Di sini program kecil, yang hanya akan dijalankan ketika perubahan terdeteksi pada pin sakelar, dibuat. Mereka identik kecuali untuk pin mana mereka bereaksi.

Pertama ia memeriksa apakah tombol ditekan atau dilepaskan dan mengirimkan perintah keyboard yang benar.

LED (dijelaskan dalam urutan yang berbeda)

Jika Anda penasaran bagaimana LED dikendalikan, Anda harus melihat lembar data APA102.

OneBit

Sekali lagi ini adalah versi manipulasi port langsung dari penulisan digital.

Pertama ia memeriksa apakah ia harus mengirim 0 atau 1 dan masing-masing menarik pin data rendah atau tinggi. Kemudian ia menulis pin jam tinggi sangat pendek dan menulisnya rendah lagi.

SatuByte

Ini mengulangi oneBit 8 kali dengan loop "untuk". Ia membaca bit pertama dalam satu byte dan meneruskan nilainya ke fungsi oneBit dan melakukan hal yang sama untuk 7 bit berikutnya.

LedData

Ini mengulangi oneByte 4 kali untuk menyediakan data yang dibutuhkan untuk satu led. Byte pertama dimulai dengan 111xxxxx dan nilai kecerahan 5 bit menggantikan xxxxx. Kecerahan dapat diatur dari 0 hingga 31 (2^5 = 32 level).

3 byte berikutnya adalah untuk nilai biru, hijau dan merah. Satu byte untuk setiap warna.

WarnaRodaIniLed

Fungsi ini memanggil ledData memberikan warna rgb tergantung pada sudut di roda warna.

Nilai 16 bit adalah dividen dalam 6 bagian dengan jarak 60 derajat yang sama. Melihat gambar mungkin membantu Anda memahami lebih baik.

(versi 8 bit juga disediakan tetapi dikomentari karena terlalu berkedip)

StartEndFrame

Bingkai awal perlu digunakan setiap kali Anda ingin mengirim warna baru ke leds dan ingin memperbarui warna led yang sebenarnya

Saya hanya menggunakan bingkai awal karena bingkai akhir tidak diperlukan. Bingkai awal adalah 4 byte dari 0. Bingkai akhir adalah 4 byte dari 255 (11111111).

Langkah 6: Kode V2 (perangkat lunak Debounce Dengan Timer)

Kode V2 (perangkat lunak Debounce Dengan Timer)
Kode V2 (perangkat lunak Debounce Dengan Timer)

Setelah beberapa saat bermain, saya melihat beberapa masalah penyadapan ganda dengan debounce perangkat keras. Ini dapat diperbaiki dengan beberapa resistor atau kapasitor nilai lain, tetapi karena tombol dan tutupnya tidak dapat dilepas, saya pikir debouncing perangkat lunak akan menjadi solusi yang bagus. Debounce perangkat lunak harus berfungsi apakah debounce perangkat keras diterapkan atau tidak. Dalam pengaturan saya saat ini, saya tidak dapat melepas tutupnya, jadi saya hanya meninggalkan resistor dan kapasitor di tempatnya.

Saya tidak akan menjelaskan kode secara ekstensif seperti versi sebelumnya karena sedikit lebih sulit untuk dijelaskan.

Pada dasarnya sebagian besar kode berfungsi sama dan kode led dibiarkan tidak tersentuh. yang berubah adalah interupsi eksternal tidak menggunakan fungsi arduino lagi. Sekarang berfungsi dalam kode C murni. Dan sekarang yang ditambahkan adalah interupsi perangkat lunak. Untuk ini saya menggunakan penghitung waktu AVR untuk menunggu beberapa waktu hingga pemantulan berhenti. Karena penghitung waktu didasarkan pada interupsi, waktu dekounce tidak dipengaruhi oleh apa pun yang terjadi di loop.

Satu-satunya downside yang dapat saya temukan adalah bahwa fungsi penundaan arduino tidak dapat digunakan lagi. Karena fungsi delay menggunakan Timer 0 dan program ini menggunakan Timer 0 untuk melakukan debounce.

Pada gambar Anda dapat melihat cara kerja kode secara kasar. Bit mem menunjukkan jika timer sedang berjalan. Apa yang tidak digambarkan adalah kasus bahwa pada akhir tombol tekan input rendah. Dalam hal ini hanya penekanan tombol yang akan dikirim saat tombol sudah dilepaskan. Yang berarti kuncinya akan ditekan sejauh menyangkut komputer. Untuk pengecualian langka ini, cek akan dibuat sebelumnya saat pengatur waktu berakhir. Jika pada akhir penghitung waktu tombol tidak ditekan, perintah pelepas tombol akan dikirim.

Langkah 7: Kode V3 (perangkat lunak Debounce Dengan Penghitung Vertikal) (disarankan) (tanpa LED)

Kode V3 (perangkat lunak Debounce Dengan Penghitung Vertikal) (disarankan) (tanpa LED)
Kode V3 (perangkat lunak Debounce Dengan Penghitung Vertikal) (disarankan) (tanpa LED)

Kode ini JUGA memiliki versi di mana Anda tidak perlu resistor pull down. Pastikan Anda menghubungkan setiap tombol ke input dan GROUND! Build-in pull-up digunakan

Saya juga mengalami beberapa penekanan yang tidak terdaftar dalam kode V2. Saya pikir kodenya menjadi terlalu rumit dengan penghitung waktu dan interupsi eksternal dan saya mungkin melewatkan beberapa pengecualian. Untuk alasan ini saya memulai dari awal dengan mencari di internet untuk metode debounce perangkat lunak.

(jujur, setidaknya setengah dari proyek ini telah menjadi tombol debouncing pada saat ini)

Setelah beberapa pencarian saya menemukan posting ini:

www.compuphase.com/electronics/debouncing….

Sejujurnya, saya butuh beberapa waktu untuk sepenuhnya memahami cara kerjanya. Ini melibatkan beberapa manipulasi bit yang agak rumit, tetapi saya akan mencoba membuatnya semudah mungkin. Namun penjelasan saya hanya akan menjadi tambahan untuk posting sehingga Anda setidaknya harus membaca "penghitung vertikal", "implementasi beranotasi" dan "mengurangi latensi".

penjelasan saya

Diagram pengaturan waktu (dibuat di WaveDrom) yang saya tambahkan akan membuat matematika ini sulit dipahami setidaknya sedikit lebih mudah dipahami. Perhatikan gambar memiliki 2 bit penghitung, tetapi kode saya memiliki 3. Ini berarti waktu debounce yang lebih lama.

Satu bit per nilai

Dengan implementasi penghitung vertikal, dimungkinkan untuk melakukan debounce beberapa tombol secara bersamaan, secara paralel. Semua nilai bertipe Byte(uint8_t) dan terdiri dari 8 bit. kita tidak mempermasalahkan nilai apa dari byte ini, tetapi kita lebih tertarik pada bitnya sendiri. Setiap buton yang akan di-debounce hanya menggunakan satu bit dari setiap byte. Tombol pertama hanya menggunakan bit pertama dari setiap byte, tombol kedua menggunakan bit kedua, dll.

Semua di waktu yang sama

Dengan menggunakan matematika bit, dimungkinkan untuk mengeksekusi pin ini secara paralel. Dan, meskipun matematika bit cukup rumit, ini sangat efisien untuk prosesor.

Dengan tipe data 8 bit memungkinkan untuk melakukan ini untuk 8 tombol. Menggunakan tipe data yang lebih besar memungkinkan lebih banyak debounce sekaligus.

yang terpental

Rutinitas debounce dijalankan setiap 1 milidetik dengan interupsi timer.

saat tombol ditekan, keadaan tombol, yang merupakan keadaan terdepantul, akan segera turun, menunjukkan penekanan tombol. Untuk mendeteksi pelepasan, tombol harus cukup tinggi untuk waktu yang lama, yang menunjukkan bahwa tombol tidak memantul selama waktu tertentu. Toggle digunakan untuk menunjukkan perubahan tombol. Bit penghitung digunakan untuk …. menghitung berapa lama belum ada pantulan.

Delta menunjukkan perbedaan antara input dan status debounce. Hanya ketika ada perbedaan, penghitung akan menghitung. penghitung akan direset ketika bouncing terdeteksi (delta adalah 0).

Langkah 8: Hasilnya

Image
Image

Jika semuanya berjalan dengan baik, Anda sekarang harus memiliki keyboard yang berfungsi untuk memainkan Osu! pada. Saya pribadi tidak melihat adanya latency sama sekali. Jika Anda melakukannya, beri tahu saya. Juga jika ada pertanyaan jangan ragu untuk bertanya apa pun.

Penyebutan sebelumnya tentang V2 tidak dimaksudkan sebagai janji jadi jangan tunda proyek ini karena ingin menunggu V2.

Saya harap Anda menikmati keyboard Anda!

Osu! nama: Thomaszz3

Penyelesaian masalah

Jika Anda merasa mengalami masalah dengan keyboard Anda, pertama buka editor teks dan tekan setiap tombol sekali untuk waktu yang singkat.

Apakah satu atau beberapa tombol tidak berfungsi?

Ada kemungkinan Anda menghancurkan sakelar secara internal saat menyolder. Jika Anda memiliki multimeter, letakkan pada kontinuitas/bip, letakkan sejajar dengan sakelar saat Arduino tidak terhubung dan tekan tombol. Itu harus berbunyi.

Apakah karakter yang baru saja Anda ketik cocok dengan tombol yang Anda konfigurasikan di Osu! ?

Ubah karakter dalam kode arduino di 3 #Defines pertama (' ' perlu!).

Atau ganti Osu Anda! pengaturan untuk menggunakan kunci yang dikonfigurasi.

Apakah satu atau beberapa kunci diulang beberapa kali?

Sirkuit debounce mungkin tidak berfungsi untuk sakelar Anda atau tidak disolder dengan benar. Periksa koneksi solder Anda. Jika masih terjadi coba nilai kapasitor 1uF. Ini akan sangat sulit bagi pengguna PCB.

Jika Anda mengalami masalah dengan LED Anda

Apakah LED berkedip?

Sambungan solder mungkin longgar. Jika Anda menggunakan PCB, pastikan timah solder benar-benar mengalir pada bantalan pada cetakan.

Apakah tidak ada led yang berfungsi atau dari sejumlah LED tertentu yang berhenti bekerja?

Periksa hubungan pendek antara koneksi LED pertama (ikuti trek) dan periksa timah yang terhubung dengan baik pada output Arduino dan lagi LED pertama. Jika dikonfirmasi benar dan masih cacat, Anda mungkin perlu mengganti LED pertama.

Jika ini diperbaiki, ulangi untuk LED berikutnya jika diperlukan.

Direkomendasikan: