Kami mengembangkan firmware pedal untuk belajar memainkan balalaika

Saya sangat suka tutorial video. Untuk beberapa alasan, saya pribadi merasakan informasi dari teks sangat, sangat buruk. Tetapi ada hal-hal di mana tidak banyak informasi di atas kertas. Ambil, misalnya, pelajaran memainkan balalaika: di YouTube ada diskusi indah tentang cara memainkan melodi ini atau itu (yang tertarik, kami mencari "Sergey Vorontsov"), tetapi sulit untuk mengulang dan menghafal urutan dari video streaming. Penting untuk menulis di atas kertas (menilai dari komentar di bawah pelajaran, beberapa melakukannya), atau untuk membeli bahan tambahan (tapi saya tidak serakah, tetapi jelek).



Secara umum, dalam kasus balalaika saya, dan dengan banyak yang lain, saya harus pergi dengan cara ini: Saya melihat fragmen itu, menghentikannya, mengulanginya beberapa kali di belakang penulis, dan terus menonton. Jika ada sesuatu yang tidak jelas - ulang, lihat lebih dekat. Tapi bagaimana cara menggerakkannya jika tangan Anda sibuk? Selain itu, dalam kasus saya mereka sibuk, jika tidak dengan akordeon tombol besar, tetapi masih ada beberapa, tetapi dengan balalaika. Jadi, Anda harus bekerja dengan kaki Anda.

Bertahun-tahun yang lalu, ketika semua manusia progresif menggunakan keyboard PS / 2, mereka membawa kami puluhan keyboard USB untuk proyek tersebut. Tentu saja, kami menghubungkan mereka ke satu mesin, menekan Ctrl pada salah satu dari mereka, Alt pada yang kedua, dan Del pada yang ketiga. Efeknya telah tercapai. Sejak itu, saya tahu bahwa keyboard USB berfungsi sepenuhnya secara paralel, sehingga Anda dapat menghubungkan yang lain untuk membantu yang utama, yang akan mengirim beberapa kode sebagai gantinya.

Maka lahirlah ide untuk membuat pedal yang berpura-pura menjadi keyboard dan mengirimkan kode kontrol pemain. Sebagai pemain, saya awalnya memilih VLC Player, karena memiliki tombol kontrol yang terdokumentasi dengan baik, tetapi kemudian ternyata kode yang saya pilih memiliki tujuan yang persis sama ketika menonton video di YouTube dalam mode layar penuh. Ini bagus, karena dengan beberapa tampilan daring, untuk tayangan iklan, ada sesuatu yang sepertinya masuk dalam pikiran penulis. Menonton yang diunduh tidak akan etis.

Jadi, kami mulai merancang perangkat.

Logika kerja


Awalnya saya ingin membuat beberapa pedal, masing-masing untuk fungsinya sendiri. Awalnya, saya menghitung 3-4 dari fungsi-fungsi ini: on, off, wind there, wind back. Tetapi kemudian saya menemukan berapa banyak plastik yang dibutuhkan, ditambah - bagaimana saya akan memahami pedal dengan sentuhan, dan sedih. Oleh karena itu, diputuskan untuk secara radikal merevisi seluruh logika. Fitur apa yang dibutuhkan sama sekali? Start-stop, tetapi sering kali tergantung pada tombol yang sama, biasanya pada spasi. Dan memutar. VLC Player memiliki "Shift + Kiri". YouTube, ternyata juga. Dan, jika Anda berpikir demikian, tidak ada lagi fungsi.

Hebat! Mari kita membuat pedal sebentar menggunakan fungsi "Start-Stop", dan panjang - oleh fungsi "Putar balik".

Di masa depan, Anda dapat memperluas fungsionalitas. Anda dapat melatih pedal untuk mengenali kode morse. Istri saya, setelah mempelajari ide itu, menyarankan impuls kontrol kode menggunakan elemen tarian Irlandia ... Secara umum, Anda dapat memperluas fungsionalitas sesuai keinginan. Tapi satu hal yang jelas: satu pedal sudah cukup. Nah, sekarang kita akan melakukan pengakuan terhadap pers yang panjang dan pendek.

Mekaniknya


Bagi mereka yang berjalan di rumah dengan sandal, ada solusi yang sangat sederhana (saya menemukannya di situs web Thingiverse). Kami mengambil tombol dengan diameter lebih dari satu sentimeter, memasukkannya ke objek berbentuk kotak, kami mendapatkan pedal. Masalahnya adalah saya tidak suka sandal, jadi opsi ini tidak cocok untuk saya. Saya membutuhkan permukaan yang lebih besar agar kaki tidak sakit.

Pedal dalam jumlah besar dijual di Ali Express, Anda harus mencari kata Foot Switch. Harga di sana mulai dari 30 rubel, tetapi pada harga ini, biaya pengiriman bisa sekitar empat ratus rubel. Setelah mencari, saya menemukan bahwa sangat mungkin untuk menemukan pedal yang jumlah "harga plus pengiriman" akan menjadi 150 rubel. Tetapi Anda harus menunggu rata-rata beberapa bulan (saya baru-baru ini menunggu di sini untuk kartu SD selama tiga bulan).

Jadi saya melangkah lebih cepat: mengayuh pedal pada printer 3D. Pengalaman pribadi (dan semua opsi dengan Thingiverse) menunjukkan bahwa sumbu harus terbuat dari logam, jika tidak semuanya akan cepat rusak. Saya mengambil baut furnitur M6x60 yang saya miliki dengan mur yang melekat padanya, serta tombol (PSW-13), yang berada di Bagian Radio tetangga, dan melingkari mereka sekitar plastik yang saya bisa. Ini adalah bagaimana bahan sumber terlihat:



Inilah mereka, dimasukkan ke bagian bawah. Seperti yang Anda lihat, fitur desain utamanya adalah dinding, setebal empat milimeter. Dengan parameter ini, bahkan proto-typer yang lembut pun menjadi cukup tahan lama. Tombol dipasang tanpa mur, karena kekosongan di bawahnya akan menyebabkan terputusnya plastik, dan itu menjaga cukup baik.



Ini adalah versi yang hampir dikompilasi:



Dan inilah perakitan pedal:



Pada prinsipnya, saya akan melampirkan file STL, tetapi solusinya tidak sempurna. Namun demikian, siapa pun dapat mengulanginya (jika ia menemukan baut M6x60 dengan mur yang sesuai dan tombol PSW-13). Cukup untuk pertama kalinya, dan kemudian - Anda dapat mencap mekanik dan memesan dengan ALI.

Perangkat USB


Meskipun saya telah secara aktif mempromosikan PSoC akhir-akhir ini, menggunakannya pada pedal adalah hal yang tidak pernah terjadi. Saya menganggap solusi terbaik papan tempat memotong roti berdasarkan STM32F103C8T6, yang sekarang dapat dipesan di ALI Express untuk sekitar 120 rubel (termasuk pengiriman).



Tentu saja, kita dapat berspekulasi bahwa ada papan yang lebih murah berdasarkan AVR, tetapi perbedaan harga tidak signifikan di sana, dan STM32 memiliki waktu pengembangan yang lebih sedikit karena debugging melalui JTAG. Satu jam waktu (bahkan di rumah) - itu juga membutuhkan biaya. Jadi, menurut kriteria total "harga perangkat + biaya tenaga kerja", STM32F103 adalah opsi terbaik untuk tugas ini. Selain itu, saya memiliki satu setengah lusin mock-up di toko untuk kasus seperti itu, sehingga waktu tunggu pengiriman sekarang sama dengan nol untuk saya.

Saya menjelajahi internet untuk keyboard USB yang sudah jadi berdasarkan chip ini. Saya menemukan artikel tentang Habr cara membuat mouse USB. Tapi saya butuh keyboard. Pada topik keyboard, saya menemukan banyak tips cerdas di forum (tapi saya ingin sesuatu yang siap) dan beberapa proyek yang sudah jadi, tetapi kompleks di GitHub (tapi saya ingin sesuatu yang jelas). Tetapi dia yang mencari akan selalu menemukan. Berikut ini adalah artikel yang luar biasa di mana ada semua yang diperlukan (walaupun ada satu di dalam kode, saya tidak takut pada kata non-Rusia ini, DeadLock potensial, tetapi saya akan menulis kode saya sendiri). Hal utama adalah bahwa semua langkah dijelaskan dengan jelas di dalamnya, cara mendapatkan keyboard USB dari "ikan" jadi yang dibuat di Cube MX. Satu-satunya hal yang penulis tidak lakukan adalah tidak menerbitkan kode kunci. Tambahkan di sini:



Lalat dalam salep adalah bahwa dalam versi modern Cube MX, nama-nama file, fungsi dan bahkan konstanta sedikit berbeda dari yang ditentukan dalam artikel itu, tetapi dengan analogi semuanya cepat ditemukan. Saya bisa menulis versi teks yang baru, tetapi di mana jaminan bahwa pengembang tidak akan mengubah semuanya lagi? Mereka suka melakukannya. Secara umum, Anda dapat melihat analog dalam contoh saya.

Jadi Saya membuat proyek dasar di Cube MX, membuat semua perubahan yang direkomendasikan oleh artikel yang disebutkan di atas. Apa selanjutnya Selanjutnya, tambahkan deskripsi port tombol. Saya memilih PB12 (murni karena kontak yang sesuai terletak di sudut papan tempat memotong roti). Karena saya selalu bekerja dengan besi melalui pustaka mcucpp Konstantin Chizhov, kami menghapus definisi makro “-C99” di properti proyek, ganti nama main.c ke main.cpp , dan kemudian tambahkan deklarasi:

typedef Mcucpp::IO::Pb12 pedal1; 

Kami menambahkan inisialisasi port ke fungsi utama () (mengaktifkan porting jam, mengatur arah kaki, menyalakan suspender):

 pedal1::ConfigPort::Enable(); pedal1::SetDirRead(); pedal1::SetPullUp (pedal1::Port::PullUp); 

Sebenarnya, semuanya diinisialisasi. Saya memutuskan untuk membangun bagian utama dalam gambar proses Verilog. Saya tidak tahu mengapa, saya hanya ingin. Proses ini biasanya disebut pada pulsa jam. Saya memutuskan bahwa kutu sistem dianggap sebagai kutu. Oleh karena itu, fungsi reguler dari penanda centang sistem dalam file stm32f1xx_it.c ditambahkan sebagai berikut:



Teks yang sama:
 void SysTick_Handler(void) { /* USER CODE BEGIN SysTick_IRQn 0 */ /* USER CODE END SysTick_IRQn 0 */ HAL_IncTick(); HAL_SYSTICK_IRQHandler(); /* USER CODE BEGIN SysTick_IRQn 1 */ TickProcess(); /* USER CODE END SysTick_IRQn 1 */ } 


Saya menempatkan fungsi TickProcess () sendiri di main. cpp . Pertama, pertimbangkan secara keseluruhan, lalu sebagian.

Inilah fungsi lengkapnya:
 uint8_t report [8] = {0,0,0,0,0,0,0,0}; uint32_t* pReport = (uint32_t*)report; extern "C" void TickProcess() { //      20!!! static const int shortTime = 700; //      static const int longTime = 2000; //    static int localTick = 0; static int tickDuringButton = 0; static bool bButtonStatePrev; bool bButtonState = pedal1::IsSet(); //     if ((!bButtonState) && bButtonStatePrev) { tickDuringButton = 0; } //     if (bButtonState && (!bButtonStatePrev)) { //       //  ,  50  () if ((tickDuringButton >100)&&(tickDuringButton < shortTime)) { //    report [2] = 0x2C; } } //    if ((!bButtonState) && (!bButtonStatePrev)) { if ((tickDuringButton == shortTime)||(tickDuringButton > longTime)) { //  Shift+ report [0] = 2; // Shift report [2] = 0x50; //  } } //    bButtonStatePrev = bButtonState; tickDuringButton += 1; if (localTick++ % 20 == 0) { USBD_HID_SendReport (&hUsbDeviceFS,report,sizeof(report)); pReport [0] = 0; pReport [1] = 0; } } 


Tugas pertama yang diimplementasikan dalam handler ini sederhana. Setiap 20 milidetik kami mengirim laporan yang berisi informasi tentang tombol-tombol yang ditekan (jika tidak ada tombol, kami tetap mengirim, hanya dengan nol). Karena fungsi dipanggil setiap milidetik, laporan harus dikirim ke salah satu dari dua puluh panggilannya. Untuk melakukan ini, ada variabel di awal fungsi:

  static int localTick = 0; 

dan kode di akhir (kami mengirim data, setelah itu kami menghapus buffer sehingga mulai mengirim nol dari sesi berikutnya):

  if (localTick++ % 20 == 0) { USBD_HID_SendReport (&hUsbDeviceFS,report,sizeof(report)); pReport [0] = 0; pReport [1] = 0; } 

Tugas kedua lebih rumit. Ini melacak sifat menekan pedal dan mengisi laporan untuk pengiriman berikutnya. Mengapa saya mengatakan bahwa ideologi seperti Verilog? Karena saya selalu menangkap perbedaan dalam bahasa itu: Saya memiliki variabel di mana keadaan tombol saat ini ditempatkan:

  bool bButtonState = pedal1::IsSet(); 

dan ada variabel di mana keadaan sebelumnya disimpan (seperti yang kita ingat, keadaan sebelumnya adalah keadaan tombol selama pemrosesan interupsi sebelumnya dari timer 1 ms):

  static bool bButtonStatePrev; 

Tombol yang ditekan memberikan nilai yang salah , tombol yang ditekan - benar . Dengan demikian, kita selalu dapat menyimpulkan tentang keadaan dinamis tombol:

bButtonStatebButtonStatePrevKetentuan
benarbenarSudah lama dirilis
benarsalahDirilis pada ukuran sebelumnya
salahbenarDitekan pada ukuran sebelumnya
salahsalahLama ditekan

Kami memperkenalkan dua konstanta. Satu mengatur waktu pers singkat. Jika pers berlangsung kurang dari 700 ms, maka itu berumur pendek. Yang kedua mengatur waktu ketika auto-repeat dihidupkan. Jika hanya setelah tujuh ratus milidetik Anda mulai mengirim kode kunci, pemain akan mulai angin terlalu cepat. Ini diidentifikasi secara empiris. Oleh karena itu, logika kerjanya adalah sebagai berikut: setelah 700 ms, satu kode "Shift + Kiri" dikirim, setelah itu pengguna diberi kesempatan untuk melepaskan pedal. Jika pedal terus ditahan, maka dari detik kedua pengiriman kode ini secara konstan sudah dimulai sampai pedal dilepaskan.

  const int shortTime = 700; //      const int longTime = 2000; //    

Waktu selama tombol ditekan disimpan dalam variabel:

  static int tickDuringButton = 0; 

Jika tombol baru saja ditekan, kami nolkan variabel ini, mulai mengukur periode waktu baru:

  //     if ((!bButtonState) && bButtonStatePrev) { tickDuringButton = 0; } 

Jika tombol baru saja dilepaskan, maka kami memeriksa berapa banyak yang ditekan. Jika hanya sedikit (sekarang dikatakan "kurang dari 100 ms") - ini adalah obrolan. Ini tidak masuk hitungan. Abaikan klik ini. Jika kita melakukan tidak lebih dari durasi pers singkat, pers lama diproses di bawah ini. Jika, dalam pers singkat, kami membuat laporan dalam buffer dengan spasi (yang akan dikirim ketika saatnya tiba untuk ini):

  //     if (bButtonState && (!bButtonStatePrev)) { //       //  ,  100  () if ((tickDuringButton >100)&&(tickDuringButton < shortTime)) { //    report [2] = 0x2C; } } 

Jika tombol telah ditekan untuk waktu yang lama, maka kami mengirim "Shift + Kiri" dalam dua kasus:

  • tombol ini dipegang tepat 700 ms (paket tunggal);
  • tombol ditahan selama lebih dari 2 detik (mengirimkan setiap laporan berikutnya sampai tombol dilepaskan).

  //    if ((!bButtonState) && (!bButtonStatePrev)) { if ((tickDuringButton == shortTime)||(tickDuringButton > longTime)) { //  Shift+ report [0] = 2; // Shift report [2] = 0x50; //  } } 

Faktanya, itu saja. Kode ini tidak berbeda dengan "ikan" yang dibuat oleh Cube MX kepada kami. Kami berkumpul, mem-flash ... Tidak, tidak mungkin tanpa kesalahan (di sini mereka semua ketahuan, tapi saya awalnya tidak bisa melakukannya tanpa mereka), kami mengidentifikasi mereka dalam 10 menit melalui debug JTAG (halo ke AVR), kami menjahit, kami senang ...

Desain alternatif


Secara umum, hal-hal seperti itu berguna tanpa balalaika (atau menonton video tutorial lainnya). Secara khusus, saya suka membaca berita, berbaring di tempat tidur, dengan laptop di perutku. Untuk menggulir teks, Anda harus selalu menekuk tangan kanan, dan ini menyebabkan sakit pada siku. Karena itu, saya telah lama memimpikan tombol merah besar yang dapat menggulir halaman tanpa menekuk lengan saya. Sebenarnya, itu bisa dibuat dari komponen yang sama seperti pedal, menggantikan baut furnitur dengan sedikit lem panas. Total: Tombol PSW13, papan tempat memotong roti STM32F103C8T6, plastik untuk printer 3D, perekat lelehan panas. Nah, di "firmware" saya mengganti kode dengan "PgDn" dengan menekan sebentar dan "Naik" dengan panjang.





Kesimpulan


Anda dapat menggunakan kaki Anda untuk mengontrol tampilan tutorial video saat tangan Anda sibuk. Untuk melakukan ini, cukup satu pedal yang mensimulasikan pengoperasian keyboard-USB. Satu pedal dapat mengirim beberapa kode kunci, memilihnya berdasarkan berbagai jenis penekanan tombol. Artikel ini mempertimbangkan pedal yang mem-parsing dua jenis (tekan pendek dan panjang).

Mekanika dapat ditemukan di Ali Express di bawah kata Foot Switch atau dapat dicetak pada printer 3D. Sebagai elektronik, papan tempat memotong roti STM32F103C8T6 dapat digunakan. "Firmware" dilakukan dalam waktu kurang dari satu jam berdasarkan "ikan" yang dibuat oleh Cube MX dari produsen pengendali STM32. Kode tambahan menempati beberapa layar teks (untuk resolusi 2K - satu layar).

Secara umum, seluruh perangkat (mekanik + "firmware") sepenuhnya dirancang dalam satu malam, plus butuh sekitar empat jam untuk mencetak mekanik pada printer 3D.

File STL siap untuk pencetakan pedal dapat diunduh di sini (diinginkan untuk menurunkan elemen Top oleh 0,4 mm untuk menghindari sejumlah besar dukungan: permukaan ternyata sedikit membulat, menurunkan model, kami akan membuat bagian yang dicetak rata).

File STL dari "tombol merah besar" dapat diunduh di sini .

File sumber siap pakai untuk proyek dan file HEX untuk firmware dapat diunduh di sini .

Tanggal publikasi artikel ini tidak dipilih secara kebetulan. Dewan memutuskan bahwa lebih baik menerbitkan artikel tentang hal-hal seperti itu di situs yang serius pada hari itu. Tetapi pada kenyataannya, jika Anda melihat video yang ditemukan pada frasa "Alexey Arkhipovsky", "Dmitry Kalinin", "Cranberry Show", "Alexey Kodenko", menjadi jelas bahwa balalaika akademik seperti perakit. Baik di sana maupun di sana, disatukan kesederhanaan mutlak dan kekuatan ekspresif panik. Dan dengan frasa "Sergey Vorontsov" Anda dapat memahami cara mempelajari cara menggunakan alat ini.

Selain itu


Setelah 8 bulan beroperasi, tombol PSW-13 mulai berfungsi sekali dari banyak, dan hanya dengan tekanan yang sangat kuat. Saat mencoba mengganti, ternyata detail yang sangat menarik. Tombol baru, dibeli pada waktu yang sama dengan yang sebelumnya, memiliki cadangan daya yang sama sekali berbeda dan bekerja di posisi yang sama sekali berbeda. Akibatnya, dia selalu tertekan di pedal saya. Saya harus menggilingnya dengan dremel. Siapa yang akan mengulangi mekanika saya - ingatlah. Anda mungkin harus memodifikasi tombol dengan file atau sebaliknya - memahat pita listrik untuk menambahnya. Pengulangan bagian plastik tombol ini tidak terlalu. Tetapi secara umum - setelah revisi seperti itu, semuanya bekerja lagi.

Source: https://habr.com/ru/post/id445160/


All Articles