FLProg + RemoteXY = Keyboard nirkabel untuk komputer di ponsel Anda

Saya memiliki situasi yang menarik di rumah. TV di kamar tidur terhubung ke komputer yang terletak di ruangan lain, dan agar istri saya menonton episode seri berikutnya (walaupun saya memiliki set-top box android, yang di sebelah TV, dia lebih suka menonton dari komputer), saya harus melakukan banyak usaha. Karena kehadiran anak-anak, mouse dan keyboard nirkabel tidak berakar di sini. Untuk waktu yang lama saya melihat dengan minat pada kemampuan Arduino Leonardo berpura-pura menjadi mouse dan keyboard, dan ketika forum ini datang kepada saya, saya menyadari peluang ini dalam program FLProg versi 2.2. Bersama dengan kemampuan proyek RevoteXY, hal yang sangat menarik ternyata. Untuk memulai video dari perangkat yang dihasilkan.



Pertama-tama, sebuah proyek dibuat di situs web RemoteXY. Keunikan dari proyek ini adalah bahwa antarmuka yang Anda buat tidak perlu dimuat ke telepon. Sudah cukup memiliki program RemoteXY di telepon, dan semua antarmuka yang dibuat disimpan dalam firmware Arduino. Ketika terhubung, deskripsi antarmuka ditransmisikan ke ponsel, dan terbuka di program.

Sekarang di situs web RemoteXY ada kesempatan untuk berbagi proyek mereka, dan di sini ada tautan ke proyek saya untuk perangkat yang dibahas dalam pelajaran ini. Proyek ini terdiri dari empat layar.

Layar pertama adalah kontrol mouse.



Gunakan joystick untuk mengontrol pergerakan mouse. Kontrol dengannya sangat mirip dengan kontrol dengan bantuan benda yang menjulur di tengah keyboard pada ThinkPad T41 yang terkenal.



Saya sudah memiliki ini sejak lama, jadi saya memiliki pengalaman. Para pengembang proyek RemoteXY berjanji untuk membuat elemen baru - "Touch Panel", dengan bantuan yang memungkinkan untuk mensimulasikan sepenuhnya touchpad laptop. Ketika ini terjadi dalam proyek ini, saya akan mengganti joystick dengannya. Slider di sisi kanan layar mensimulasikan roda gulir. Semakin kuat pergeserannya dari pusat, semakin cepat roda mouse virtual akan berputar.

Tiga kolom tombol di sisi kiri layar mensimulasikan klik berbeda pada tombol mouse virtual. Setiap kolom bertanggung jawab atas tombolnya - kiri, tengah, dan kanan, masing-masing. Baris atas tombol (dengan simbol "P") mensimulasikan pers yang normal. Artinya, ketika Anda mengklik tombol ini, tombol yang sesuai dari mouse virtual akan ditekan, ketika dirilis, itu dilepaskan. Baris kedua (dengan simbol "PF") - mensimulasikan klik dengan kait. Pertama kali Anda menekan tombol ini, tombol mouse virtual akan ditekan, dan yang kedua dilepaskan. Ini berguna saat menyeret windows misalnya. Arahkan mouse ke judul jendela, klik tombol "PF" (perbaiki jendela ke mouse), seret jendela, klik lagi "PF" (lepaskan jendela). Nah, baris ketiga (dengan simbol "C") adalah klik pada tombol yang sesuai dari mouse virtual.

Layar kedua adalah keyboard bahasa Inggris.



Tidak ada yang perlu dijelaskan. Tombol "Caps" memungkinkan karakter huruf besar, tombol "Shft" termasuk karakter huruf besar per karakter. Setelah memasukkan satu karakter, itu diatur ulang.

Layar ketiga adalah keyboard Rusia



. Semuanya jelas di sini. Tombol "Caps" dan "Shift" berfungsi sama seperti pada layar sebelumnya.

Layar terakhir - angka dan karakter khusus



Ada sedikit kehalusan. Ada bug kecil di editor online RemoteXY. Jika simbol "\" digunakan dalam judul tombol, proyek tidak disimpan dan tidak diproses. Karena itu, untuk tombol simbol ini, saya menggunakan tulisan "tidak /". Ya, saya tidak menemukan yang lebih baik.

Setelah membuat proyek di situs web RemoteXY, Anda perlu mendapatkan kode untuk mengunduh ke blok "RemoteXY" di proyek FLProg. Untuk melakukan ini, dalam properti proyek RemoteXY, pilih lingkungan pemrograman - FLProg.



Kode yang diperoleh di situs RemoteXY untuk pelajaran ini
REMOTEXY_MODE__SOFTSERIAL
REMOTEXY_SERIAL_RX 8
REMOTEXY_SERIAL_TX 9
REMOTEXY_SERIAL_SPEED 9600
[128,5,144,5,6,8,4,5,32,41
,11,47,47,7,1,4,48,92,11,7
,50,7,1,1,1,1,18,12,12,7
,1,80,0,1,1,14,18,12,12,7
,1,80,0,1,1,27,18,12,12,7
,1,80,0,1,1,1,32,12,12,7
,1,80,70,0,1,1,14,32,12,12
,7,1,80,70,0,1,1,27,32,12
,12,7,1,80,70,0,1,1,1,47
,12,12,7,1,67,0,1,1,14,47
,12,12,7,1,67,0,1,1,27,47
,12,12,7,1,67,0,1,1,1,22
,8,8,6,2,81,0,1,1,10,22
,8,8,6,2,87,0,1,1,19,22
,8,8,6,2,69,0,1,1,28,22
,8,8,6,2,82,0,1,1,37,22
,8,8,6,2,84,0,1,1,46,22
,8,8,6,2,89,0,1,1,55,22
,8,8,6,2,85,0,1,1,64,22
,8,8,6,2,73,0,1,1,73,22
,8,8,6,2,79,0,1,1,82,22
,8,8,6,2,80,0,1,1,1,31
,8,8,6,2,65,0,1,1,10,31
,8,8,6,2,83,0,1,1,19,31
,8,8,6,2,68,0,1,1,28,31
,8,8,6,2,70,0,1,1,37,31
,8,8,6,2,71,0,1,1,46,31
,8,8,6,2,72,0,1,1,55,31
,8,8,6,2,74,0,1,1,64,31
,8,8,6,2,75,0,1,1,1,40
,8,8,6,2,90,0,1,1,10,40
,8,8,6,2,88,0,1,1,19,40
,8,8,6,2,67,0,1,1,28,40
,8,8,6,2,86,0,1,1,37,40
,8,8,6,2,66,0,1,1,46,40
,8,8,6,2,78,0,1,1,55,40
,8,8,6,2,77,0,1,1,1,49
,98,13,6,2,0,1,1,73,31,8
,8,6,2,76,0,1,1,91,22,8
,8,6,2,60,0,1,1,82,31,17
,17,6,2,69,110,116,101,114,0,1
,1,64,40,8,8,6,2,44,0,1
,1,73,40,8,8,6,2,46,0,1
,1,1,16,17,5,6,2,83,104,105
,102,116,0,1,1,7,10,11,5,6
,2,67,97,112,115,0,1,1,1,25
,7,7,0,3,208,153,0,1,1,8
,25,7,7,0,3,208,166,0,1,1
,15,25,7,7,0,3,208,163,0,1
,1,22,25,7,7,0,3,208,154,0
,1,1,29,25,7,7,0,3,208,149
,0,1,1,43,25,7,7,0,3,208
,147,0,1,1,57,25,7,7,0,3
,208,169,0,1,1,78,25,7,7,0
,3,208,170,0,1,1,36,25,7,7
,0,3,208,157,0,1,1,64,25,7
,7,0,3,208,151,0,1,1,71,25
,7,7,0,3,208,165,0,1,1,50
,25,7,7,0,3,208,168,0,1,1
,86,25,13,7,0,3,60,0,1,1
,1,49,98,13,0,3,0,1,1,1
,41,7,7,0,3,208,175,0,1,1
,9,41,7,7,0,3,208,167,0,1
,1,17,41,7,7,0,3,208,161,0
,1,1,25,41,7,7,0,3,208,156
,0,1,1,33,41,7,7,0,3,208
,152,0,1,1,41,41,7,7,0,3
,208,162,0,1,1,49,41,7,7,0
,3,208,172,0,1,1,57,41,7,7
,0,3,208,145,0,1,1,65,41,7
,7,0,3,208,174,0,1,1,1,33
,7,7,0,3,208,164,0,1,1,9
,33,7,7,0,3,208,171,0,1,1
,17,33,7,7,0,3,208,146,0,1
,1,25,33,7,7,0,3,208,144,0
,1,1,33,33,7,7,0,3,208,159
,0,1,1,41,33,7,7,0,3,208
,160,0,1,1,49,33,7,7,0,3
,208,158,0,1,1,57,33,7,7,0
,3,208,155,0,1,1,65,33,7,7
,0,3,208,148,0,1,1,73,33,7
,7,0,3,208,150,0,1,1,81,33
,7,7,0,3,208,173,0,1,1,73
,41,7,7,0,3,44,0,1,1,81
,41,7,7,0,3,46,0,1,1,89
,33,10,15,0,3,69,110,116,101,114
,0,1,1,7,13,11,5,0,3,67
,97,112,115,0,1,1,1,19,17,5
,0,3,83,104,105,102,116,0,1,1
,1,13,9,8,5,4,49,0,1,1
,11,13,9,8,5,4,50,0,1,1
,21,13,9,8,5,4,51,0,1,1
,41,13,9,8,5,4,53,0,1,1
,51,13,9,8,5,4,54,0,1,1
,61,13,9,8,5,4,55,0,1,1
,91,13,9,8,5,4,48,0,1,1
,81,13,9,8,5,4,57,0,1,1
,71,13,9,8,5,4,56,0,1,1
,31,13,9,8,5,4,52,0,1,1
,32,49,68,13,5,4,0,1,1,51
,40,9,8,5,4,60,0,1,1,61
,40,9,8,5,4,39,0,1,1,71
,40,9,8,5,4,34,0,1,1,1
,31,9,8,5,4,95,0,1,1,91
,22,9,8,5,4,60,60,0,1,1
,41,40,9,8,5,4,62,0,1,1
,31,40,9,8,5,4,125,0,1,1
,21,40,9,8,5,4,123,0,1,1
,11,40,9,8,5,4,93,0,1,1
,1,40,9,8,5,4,91,0,1,1
,51,22,9,8,5,4,38,0,1,1
,61,31,9,8,5,4,124,0,1,1
,51,31,9,8,5,4,110,111,116,47
,0,1,1,41,31,9,8,5,4,47
,0,1,1,31,31,9,8,5,4,61
,0,1,1,21,31,9,8,5,4,45
,0,1,1,11,31,9,8,5,4,43
,0,1,1,71,31,9,8,5,4,63
,0,1,1,1,22,9,8,5,4,33
,0,1,1,11,22,9,8,5,4,64
,0,1,1,21,22,9,8,5,4,35
,0,1,1,31,22,9,8,5,4,36
,0,1,1,41,22,9,8,5,4,94
,0,1,1,61,22,9,8,5,4,42
,0,1,1,71,22,9,8,5,4,40
,0,1,1,81,22,9,8,5,4,41
,0,1,1,81,40,9,8,5,4,44
,0,1,1,91,40,9,8,5,4,46
,0,1,1,91,31,9,8,5,4,69
,110,116,101,114,0,1,1,81,31,9
,8,5,4,37,0,1,1,1,49,9
,8,5,4,58,0,1,1,11,49,9
,8,5,4,59,0,1,1,21,49,9
,8,5,4,126,0,65,10,1,10,5
,5,2,2,65,10,1,13,5,5,2
,3,65,9,1,1,5,5,2,2,65
,9,1,1,5,5,2,3,65,9,1
,1,5,5,2,4,131,1,82,1,17
,6,7,1,77,111,117,115,101,0,131
,0,64,1,17,6,6,2,69,110,0
,131,0,46,1,17,6,0,3,208,160
,209,131,209,129,0,131,0,28,1,17
,6,5,4,49,46,46,57,0];
input signed char joystick_1_x; /* =-100..100 x */
input signed char joystick_1_y; /* =-100..100 y */
input signed char slider_1; /* =-100..100 */
input unsigned char pressL; /* =1 , =0 */
input unsigned char PressM; /* =1 , =0 */
input unsigned char PressR; /* =1 , =0 */
input unsigned char pressLF; /* =1 , =0 */
input unsigned char pressMF; /* =1 , =0 */
input unsigned char pressRF; /* =1 , =0 */
input unsigned char ClickL; /* =1 , =0 */
input unsigned char ClickM; /* =1 , =0 */
input unsigned char ClickR; /* =1 , =0 */
input unsigned char bQ; /* =1 , =0 */
input unsigned char bW; /* =1 , =0 */
input unsigned char bE; /* =1 , =0 */
input unsigned char bR; /* =1 , =0 */
input unsigned char bT; /* =1 , =0 */
input unsigned char bY; /* =1 , =0 */
input unsigned char bU; /* =1 , =0 */
input unsigned char bI; /* =1 , =0 */
input unsigned char bO; /* =1 , =0 */
input unsigned char bP; /* =1 , =0 */
input unsigned char bA; /* =1 , =0 */
input unsigned char bS; /* =1 , =0 */
input unsigned char bD; /* =1 , =0 */
input unsigned char bF; /* =1 , =0 */
input unsigned char bG; /* =1 , =0 */
input unsigned char bH; /* =1 , =0 */
input unsigned char bJ; /* =1 , =0 */
input unsigned char bK; /* =1 , =0 */
input unsigned char bZ; /* =1 , =0 */
input unsigned char bX; /* =1 , =0 */
input unsigned char bC; /* =1 , =0 */
input unsigned char bV; /* =1 , =0 */
input unsigned char bB; /* =1 , =0 */
input unsigned char bN; /* =1 , =0 */
input unsigned char bM; /* =1 , =0 */
input unsigned char bSpace; /* =1 , =0 */
input unsigned char bL; /* =1 , =0 */
input unsigned char bBacspace; /* =1 , =0 */
input unsigned char bEnter; /* =1 , =0 */
input unsigned char bZap; /* =1 , =0 */
input unsigned char bTochka; /* =1 , =0 */
input unsigned char ShiftEn; /* =1 , =0 */
input unsigned char CapsEn; /* =1 , =0 */
input unsigned char bQR; /* =1 , =0 */
input unsigned char bWR; /* =1 , =0 */
input unsigned char bER; /* =1 , =0 */
input unsigned char bRR; /* =1 , =0 */
input unsigned char bTR; /* =1 , =0 */
input unsigned char bUR; /* =1 , =0 */
input unsigned char bOR; /* =1 , =0 */
input unsigned char bTverdR; /* =1 , =0 */
input unsigned char bYR; /* =1 , =0 */
input unsigned char bPR; /* =1 , =0 */
input unsigned char bXXR; /* =1 , =0 */
input unsigned char bIR; /* =1 , =0 */
input unsigned char bBacspaceR; /* =1 , =0 */
input unsigned char bSpaceR; /* =1 , =0 */
input unsigned char bZR; /* =1 , =0 */
input unsigned char bXR; /* =1 , =0 */
input unsigned char bCR; /* =1 , =0 */
input unsigned char bVR; /* =1 , =0 */
input unsigned char bBR; /* =1 , =0 */
input unsigned char bNR; /* =1 , =0 */
input unsigned char bMR; /* =1 , =0 */
input unsigned char bRusBR; /* =1 , =0 */
input unsigned char bRusUR; /* =1 , =0 */
input unsigned char bAR; /* =1 , =0 */
input unsigned char bSR; /* =1 , =0 */
input unsigned char bDR; /* =1 , =0 */
input unsigned char bFR; /* =1 , =0 */
input unsigned char bGR; /* =1 , =0 */
input unsigned char bHR; /* =1 , =0 */
input unsigned char bJR; /* =1 , =0 */
input unsigned char bKR; /* =1 , =0 */
input unsigned char bLR; /* =1 , =0 */
input unsigned char bRusGR; /* =1 , =0 */
input unsigned char bRusER; /* =1 , =0 */
input unsigned char bZapR; /* =1 , =0 */
input unsigned char bTochkaR; /* =1 , =0 */
input unsigned char bEnterR; /* =1 , =0 */
input unsigned char CapsRus; /* =1 , =0 */
input unsigned char ShiftRus; /* =1 , =0 */
input unsigned char bNum1; /* =1 , =0 */
input unsigned char bNum2; /* =1 , =0 */
input unsigned char bNum3; /* =1 , =0 */
input unsigned char bNum5; /* =1 , =0 */
input unsigned char bNum6; /* =1 , =0 */
input unsigned char bNum7; /* =1 , =0 */
input unsigned char bNum0; /* =1 , =0 */
input unsigned char bNum9; /* =1 , =0 */
input unsigned char bNum8; /* =1 , =0 */
input unsigned char bNum4; /* =1 , =0 */
input unsigned char bSpaceSim; /* =1 , =0 */
input unsigned char bSim24; /* =1 , =0 */
input unsigned char bSim25; /* =1 , =0 */
input unsigned char bSim26; /* =1 , =0 */
input unsigned char bSim10; /* =1 , =0 */
input unsigned char bBacspaceSim; /* =1 , =0 */
input unsigned char bSim23; /* =1 , =0 */
input unsigned char bSim22; /* =1 , =0 */
input unsigned char bSim21; /* =1 , =0 */
input unsigned char bSim20; /* =1 , =0 */
input unsigned char bSim19; /* =1 , =0 */
input unsigned char bSim6; /* =1 , =0 */
input unsigned char bSim16; /* =1 , =0 */
input unsigned char bSim15; /* =1 , =0 */
input unsigned char bSim14; /* =1 , =0 */
input unsigned char bSim13; /* =1 , =0 */
input unsigned char bSim12; /* =1 , =0 */
input unsigned char bSim11; /* =1 , =0 */
input unsigned char bSim17; /* =1 , =0 */
input unsigned char bSim1; /* =1 , =0 */
input unsigned char bSim2; /* =1 , =0 */
input unsigned char bSim3; /* =1 , =0 */
input unsigned char bSim4; /* =1 , =0 */
input unsigned char bSim5; /* =1 , =0 */
input unsigned char bSim7; /* =1 , =0 */
input unsigned char bSim8; /* =1 , =0 */
input unsigned char bSim9; /* =1 , =0 */
input unsigned char bSim27; /* =1 , =0 */
input unsigned char bSim28; /* =1 , =0 */
input unsigned char bEnterSim; /* =1 , =0 */
input unsigned char bSim18; /* =1 , =0 */
input unsigned char bSim29; /* =1 , =0 */
input unsigned char bSim30; /* =1 , =0 */
input unsigned char bSim31; /* =1 , =0 */
output unsigned char IsShiftEn_g; /* =0..255 */
output unsigned char IsShiftRus_g; /* =0..255 */
output unsigned char hasEngSim_b; /* =0..255 */
output unsigned char hasRusSim_b; /* =0..255 */
output unsigned char hasSpecSim_b; /* =0..255 */

Kami selesai dengan situs web RemoteXY. Kami lolos ke proyek di FLProg.

Kontroler Arduino Leonardo (dicentang), Arduino DUE (dukungan untuk kontroler ini muncul dari versi 2.3 - dicentang), dan Arduino Micro (secara teoritis, belum tiba, saya menunggu untuk memeriksa) dapat berpura-pura menjadi standar (yaitu, tidak memerlukan driver khusus) mouse dan keyboard; .

Proyek FLProg untuk pelajaran ini dapat diunduh di sini . Modul bluetooth HC-05 digunakan sebagai perangkat komunikasi dengan telepon. Terhubung sesuai dengan tabel.
Modul HC-051Arduino leonardo
Vcc+ 5V
GNDGND
TXDD0 (RX1)
RXDD1 (TX1)

Pertimbangkan proyeknya:



Ada unit "RemoteXY" yang sangat besar yang menyediakan komunikasi dengan telepon. Untuk mengkonfigurasinya, Anda perlu mengunduh kode yang diterima dari situs proyek RemoteXY ke dalamnya. Proses memuat dijelaskan secara rinci dalam informasi untuk blok (blok properti -> tab "Informasi"), oleh karena itu kami tidak akan menduplikasi di sini. Saya perhatikan hanya untuk mereka yang bekerja di versi FLProg 2.3 dan sebelumnya. Ada bug kecil di versi ini. Jika, ketika membuat proyek di situs web RemoteXY, dalam pengaturan, pilih port yang tidak ada atau sibuk dalam proyek di mana deskripsi akan dimuat, maka program akan macet saat memuat. Untuk menghindari ini, Anda harus PERTAMA memilih port gratis di pengaturan blok, dan kemudian memuat deskripsi. Di versi FLProg yang lebih baru, kesalahan ini diperbaiki.

Blok CD (encoder) digunakan untuk menentukan jumlah tombol yang ditekan. Mereka memberikan pada output mereka nomor input yang muncul logis 1. Dengan tidak adanya log. 1 pada semua input, pada output dari blok ini 0.



Di sini, dari data yang diterima dari telepon, kami mendeteksi arah pergerakan mouse dan roda. Saya memilih 5 unit deadband (dengan perubahan maksimum pada sinyal dari joystick dan slider 0-100 di setiap arah). Pada prinsipnya, untuk meningkatkan kerja dengan mouse, nilai ini dapat dimainkan. Ukuran langkah juga ditentukan di sini (kecepatan gerakan mouse atau pengguliran). Parameter blok "Scale" juga dapat dimainkan untuk kontrol mouse yang lebih nyaman.



Di sini kami langsung mengirim perintah untuk memindahkan mouse virtual. Untuk melakukan ini, gunakan blok "Mouse move" yang baru. Masing-masing blok mengirimkan perintah untuk menggerakkan mouse ke arah tertentu setiap 10 ms (diatur dalam pengaturan blok), dengan langkah yang dihitung di papan sebelumnya jika ada tingkat tinggi pada input "Kirim".



Blok "Mouse wheel" yang baru juga digunakan di sini. Blok itu mengirimkan perintah untuk memutar roda gulir mouse virtual. Di sini, untuk mencapai efek halus, prinsip yang berbeda (berbeda dari menggerakkan mouse) digunakan. Jika ada level tinggi pada input “Send”, unit mengirimkan perintah ke mouse virtual untuk memutar roda gulir satu langkah, tetapi dengan frekuensi yang dihitung di papan 2. Frekuensi ini tergantung pada posisi slider pada ponsel dan berubah dari 200 milidetik menjadi 5 milidetik ketika nilainya berubah diterima dari slider dari 5 (zona mati) hingga 100 (posisi ekstrem).



Blok "MousePressKey" digunakan di sini. Pada tingkat tinggi pada input "Kirim", ia menahan tombol mouse virtual yang dipilih dalam pengaturan, pada level rendah ia melepaskannya. Untuk menyadari efek menekan dengan fiksasi, pemicu TT (penghitung pemicu) digunakan. Di tepi depan pertama di pintu masuk mereka, mereka menerjemahkan output mereka ke dalam status log. 1 dan di detik mereka menjatuhkannya ke 0. Dan dalam lingkaran.



Di sini kita menggunakan blok "MouseClickKey", yang, di sisi atas input "Kirim", membuat klik singkat pada tombol mouse virtual yang dipilih dalam pengaturan blok.



Di sini, blok "KeyboardStatus" dan "MouseStatus" digunakan yang, ketika input Status tinggi, nyalakan masing-masing keyboard dan mouse virtual, dan matikan ketika level rendah. Dalam skema ini, untuk mengontrol on dan off, sinyal adalah adanya koneksi telepon dengan Arduino. Itu dibentuk pada "CS" output dari blok "RemoteXY" (papan 1). Selain itu, jika ada koneksi, kami menyalakan LED yang terpasang di papan arduino (pin 13).



Di sini, fakta menekan tombol pada salah satu keyboard dalam aplikasi pada telepon ditentukan, dan pada keyboard mana tombol ditekan - Rusia atau Inggris. Selain itu, sinyal dihasilkan untuk pengapian LED yang terletak di sudut kanan atas masing-masing keyboard aplikasi pada ponsel. LED ini menunjukkan bahwa sinyal tekan tombol telah mencapai controller. Saya menggunakannya selama pengaturan, tetapi memutuskan untuk meninggalkannya di versi final aplikasi.



Ini menentukan apakah akan memasukkan karakter kapital. Tepi terkemuka dari penekanan tombol "Shift" pada aplikasi di telepon akan mengatur pemicu SR ke status log.1. Setelah akhir input karakter (ujung trailing dari sinyal keberadaan karakter yang ditekan), pelatuk diatur ulang ke 0.
Setiap penekanan tombol “Caps” dalam aplikasi di telepon membalikkan pengoperasian tombol “Shift”. Artinya, pada posisi awal, status input utama adalah huruf kecil, dan ketika Anda menekan tombol "Shift", satu huruf besar dimasukkan, lalu setelah menekan tombol "Caps" sekali, mode berubah. Huruf besar menjadi yang utama, dan ketika Anda menekan tombol "Shift", satu huruf kecil dimasukkan. Ketika tombol "Caps" ditekan lagi, input beralih ke mode utama. Selain itu, sinyal dihasilkan untuk menyalakan indikator "Shift" di aplikasi pada telepon.



Di sini, dari nomor yang ditekan pada keyboard dalam aplikasi di telepon tombol, kode simbol tombol ini terbentuk. Ini dilakukan dengan menggunakan blok "Tabel kode". Blok ini menghasilkan kode pada output "Q", yang nomornya dalam tabel yang dimuat di blok sesuai dengan nilai pada input "I".

Tabel kode dimuat ke blok "Tabel kode" di papan ini.
113q
119w
101e
114r
116t
121y
117u
105i
111o
112p
97a
115s
100d
102f
103g
104h
106j
107k
108l
122z
120x
99c
118v
98b
110n
109m
91[
93]
59
39'
44,
46.


Harap dicatat bahwa karakter Rusia dan Inggris menggunakan tabel kode yang sama. Faktanya adalah bahwa perpustakaan Keybord hanya memahami kode byte tunggal, dan benar-benar menekan tombol pada keyboard virtual di mana simbol ditulis dengan kode yang diteruskan ke sana. Untuk memasukkan karakter Rusia, metode input di komputer secara paksa beralih ke bahasa Rusia ketika dimasukkan. Kami akan mempertimbangkan bagaimana hal ini dilakukan pada papan berikutnya.



Dua blok "SequenceKeybord" digunakan di sini. Blok-blok ini di tepi yang menanjak pada input "Kirim" menjalankan skrip aksi keyboard yang dikonfigurasi ketika blok dikonfigurasi. Dengan blok ini kita dapat mengkonfigurasi input karakter Rusia atau Inggris, serta beralih karakter huruf kecil atau huruf besar. Tetapi ini juga memerlukan beberapa konfigurasi komputer yang terhubung dengan perangkat kita. Anda perlu mengonfigurasi pintasan keyboard untuk mengaktifkan tata letak Rusia dan Angdian. Ini dilakukan di panel kontrol komputer.







Untuk perangkat ini, saya mengkonfigurasi penyertaan bahasa Inggris menggunakan tombol CTRL + 1 dan Rusia CTRL + 0. Kombinasi inilah yang digunakan dalam blok skrip.
Pertimbangkan skenario blok teratas.



Script dieksekusi dalam langkah-langkah dari atas ke bawah pada tepi yang meninggi pada input "Kirim" (ketika sinyal kehadiran karakter yang ditekan pada keyboard aplikasi di telepon muncul). Pada langkah pertama, tombol CTRL ditekan dan ditahan di keyboard virtual. Pada langkah kedua, tekan sebentar tombol dibuat, kode diumpankan ke input "Kode Langkah 2". Jika tombol itu ditekan pada keyboard Rusia itu akan menjadi 48 (kode karakter 1) dan jika dalam bahasa Inggris - 49 (kode karakter 0). Pada langkah ketiga, tombol CTRL dilepaskan. Jadi, kami mengalihkan bahasa input ke bahasa yang kami perlukan untuk memasukkan karakter ini.

Langkah selanjutnya tergantung pada input "Aktivitas Langkah 4" tingkat tinggi. Ini terjadi ketika mode kapitalisasi aktif. Dalam hal ini, langkah 4 dilakukan, dan tombol "Shift" pada keyboard virtual ditekan dan ditahan. Dengan cara ini, karakter huruf besar dimasukkan.

Nah, pada langkah terakhir, tombol keyboard virtual ditekan dan ditahan, kode yang masuk ke input "Code Step 5" (kode tombol yang kami tekan pada keyboard di aplikasi di telepon).

Jika sinyal bahwa sebuah tombol ditekan pada keyboard di aplikasi pada telepon menghilang karena pembalikan pada input dari blok skrip yang lebih rendah, skrip yang dikonfigurasikan di dalamnya dijalankan.



Pertama, kami lepaskan tombol simbol yang sebelumnya ditekan, dan kemudian lepaskan tombol "Shift"



Di sini, mirip dengan papan 10, kami menghasilkan sinyal tentang keberadaan tombol yang ditekan pada keyboard untuk karakter dan angka khusus dalam aplikasi pada telepon, dan kode untuk tombol ini.

Tabel kode dimuat ke blok "Tabel kode" di papan ini.
44,
44,
46.
46.
178BACKSPACE
178BACKSPACE
178BACKSPACE
32«»
32«»
32«»
176RETURN
176RETURN
176RETURN
491
502
513
524
535
546
557
568
579
480
33!
64@
35#
36$
94^
38&
42*
40(
41)
95_
43+
45-
61=
47/
92\
124|
63?
37%
91[
93]
123{
125}
62>
60<
39'
34"
44,
46.
58:
59
126~




Ketika sinyal muncul bahwa tombol khusus ditekan pada keyboard dalam aplikasi di telepon, skrip yang dikonfigurasi dalam blok "SequenceKeyboard" dijalankan. Di dalamnya, pertama-tama kita menerjemahkan metode input ke dalam bahasa Inggris (menekan tombol “CTRL” → menekan tombol “1” → melepaskan kunci “CTRL”), dan kemudian menekan tombol karakter yang diinginkan. Jika keberadaan tombol yang ditekan menghilang, unit paparan tunggal ke keyboard "OneKeyboard" dijalankan, yang melakukan satu tindakan yang diprogram dalam pengaturan. Dalam hal ini, lepaskan tombol karakter khusus yang sebelumnya ditekan.

Setelah dikompilasi, proyek ini memakan sedikit lebih dari setengah memori kontroler Arduino Leonardo, yang memungkinkan untuk berbagai modifikasi proyek ini.
Semoga beruntung dengan kreativitas Anda.

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


All Articles