FLProg + RemoteXY = لوحة مفاتيح لاسلكية للكمبيوتر الموجود على هاتفك

كان لدي وضع مثير للاهتمام في المنزل. التلفزيون في غرفة النوم متصل بجهاز كمبيوتر موجود في غرفة أخرى ، وحتى تتمكن زوجتي من مشاهدة الحلقة التالية من المسلسل (على الرغم من أن لدي جهاز فك التشفير android ، بجوار التلفزيون ، فهي تفضل المشاهدة من جهاز كمبيوتر) ، يجب أن أبذل الكثير من الجهد. نظرًا لوجود الأطفال ، لا تتأصل الفئران ولوحات المفاتيح اللاسلكية هنا. لقد كنت أراقب باهتمام لفترة طويلة قدرة Arduino Leonardo على التظاهر بأنك ماوس ولوحة مفاتيح ، وعندما وصلت إلي هذه اللوحة ، قمت بتنفيذ هذه الميزة في إصدار برنامج FLProg 2.2. جنبا إلى جنب مع قدرات مشروع RevoteXY ، ظهر شيء مثير للاهتمام. لبدء فيديو الجهاز الناتج.



بادئ ذي بدء ، يتم إنشاء مشروع على موقع RemoteXY. تكمن خصوصية هذا المشروع في أن الواجهة التي أنشأتها لا تحتاج إلى تحميلها على الهاتف. يكفي وجود برنامج RemoteXY على الهاتف ، ويتم تخزين جميع الواجهات التي تم إنشاؤها في برنامج Arduino الثابت. عند توصيله ، يتم نقل وصف الواجهة إلى الهاتف ، ويفتح في البرنامج.

الآن على موقع RemoteXY ، هناك فرصة لمشاركة مشاريعهم ، وهنا رابط لمشروعي للجهاز الذي تمت مناقشته في هذا الدرس. يتكون المشروع من أربع شاشات.

الشاشة الأولى هي التحكم بالماوس.



استخدم عصا التحكم للتحكم في حركة الماوس. التحكم به يشبه إلى حد كبير التحكم بمساعدة الشيء الذي تمسك به في منتصف لوحة المفاتيح على ThinkPad T41 الشهير.



لقد عانيت من هذا لفترة طويلة ، لذلك لدي خبرة. وعد مطورو مشروع RemoteXY بصنع عنصر جديد - "لوحة اللمس" ، والذي سيكون من الممكن بمساعدته محاكاة لوحة اللمس للكمبيوتر المحمول. عندما يحدث هذا في هذا المشروع ، سأستبدل عصا التحكم به. يحاكي شريط التمرير الموجود على الجانب الأيمن من الشاشة عجلة التمرير. كلما كان تحركه أقوى من المركز ، زادت سرعة دوران الماوس الافتراضي.

تحاكي ثلاثة أعمدة من الأزرار على الجانب الأيسر من الشاشة نقرات مختلفة على أزرار الماوس الافتراضية. كل عمود مسؤول عن الزر الخاص به - يسارًا ووسطًا ويمينًا على التوالي. الصف العلوي من الأزرار (مع الرمز "P") يحاكي الضغط العادي. أي عند النقر فوق هذا الزر ، سيتم الضغط على الزر المقابل للماوس الظاهري ، عند تحريره ، يتم تحريره. الصف الثاني (برمز "PF") - يحاكي نقرة بمزلاج. في المرة الأولى التي تضغط فيها على هذا الزر ، سيتم الضغط على زر الماوس الافتراضي ، ويتم تحرير الزر الثاني. هذا مفيد عند سحب النوافذ على سبيل المثال. أشر بالماوس إلى عنوان النافذة ، وانقر فوق الزر "PF" (أصلح النافذة بالماوس) ، واسحب النافذة ، وانقر فوق "PF" مرة أخرى (حرر النافذة). حسنًا ، الصف الثالث (برمز "C") هو نقرة على الزر المقابل للماوس الظاهري.

الشاشة الثانية هي لوحة المفاتيح الإنجليزية.



لا يوجد ما يفسر بشكل خاص. يمكّن زر "Caps" الأحرف الكبيرة ، بينما يشتمل زر "Shft" على أحرف كبيرة لكل حرف. بعد إدخال حرف واحد ، يتم إعادة تعيينه.

الشاشة الثالثة هي لوحة المفاتيح الروسية



، كل شيء واضح هنا. يعمل مفتاحا "Caps" و "Shift" كما هو الحال في الشاشة السابقة.

حسنًا ، الشاشة الأخيرة - أرقام وأحرف خاصة.



هناك دقة طفيفة. كان هناك خطأ صغير في محرر OnlineXY عبر الإنترنت. إذا تم استخدام الرمز "\" في شرح الزر ، فلن يتم حفظ المشروع ولا تتم معالجته. لذلك ، بالنسبة لزر هذا الرمز ، استخدمت النقش "not /". حسنًا ، لم أتوصل إلى أي شيء أفضل.

بعد إنشاء المشروع على موقع RemoteXY ، تحتاج إلى الحصول على الرمز لتنزيله إلى كتلة "RemoteXY" في مشروع FLProg. للقيام بذلك ، في خصائص مشروع RemoteXY ، حدد بيئة البرمجة - FLProg.



الرمز الذي تم الحصول عليه في موقع RemoteXY لهذا الدرس
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 */

لقد انتهينا من موقع RemoteXY. ننتقل إلى المشروع على FLProg.

وحدات تحكم Arduino Leonardo (محددة) ، و Arduino DUE (ظهر دعم وحدة التحكم هذه من الإصدار 2.3 - محدد) ، و Arduino Micro (نظريًا ، لم تصل بعد ، أنا في انتظار التحقق) يمكن أن يتظاهر بأنه قياسي (أي لا يتطلب برامج تشغيل خاصة) الماوس ولوحة المفاتيح ؛ .

يمكن تنزيل مشروع FLProg لهذا الدرس من هنا . يتم استخدام وحدة بلوتوث HC-05 كجهاز اتصال مع الهاتف. يتم توصيله وفقًا للجدول.
وحدة HC-051اردوينو ليوناردو
VCC+ 5 فولت
GNDGND
TXDD0 (RX1)
RXDD1 (TX1)

خذ بعين الاعتبار المشروع:



توجد وحدة "RemoteXY" كبيرة جدًا توفر الاتصال بالهاتف. لتكوينه ، تحتاج إلى تنزيل الرمز المستلم من موقع مشروع RemoteXY إليه. يتم وصف عملية التحميل بالتفصيل في المعلومات الخاصة بالكتلة (خصائص الكتلة -> علامة التبويب "معلومات") ، وبالتالي لن نكررها هنا. ألاحظ فقط لأولئك الذين يعملون في الإصدار FLProg 2.3 وما قبله. هناك خطأ صغير في هذه الإصدارات. إذا ، عند إنشاء مشروع على موقع RemoteXY على الويب ، في الإعدادات ، حدد منفذًا غائبًا أو مشغولًا في المشروع حيث سيتم تحميل الوصف ، فسوف يتعطل البرنامج عند التحميل. لتجنب ذلك ، يجب عليك أولاً تحديد منفذ مجاني في إعدادات الحظر ، ثم تحميل الوصف. في الإصدارات اللاحقة من FLProg ، تم إصلاح هذا الخطأ.

يتم استخدام القرص المضغوط (التشفير) لتحديد عدد الزر المضغوط. يعطون على ناتجهم رقم الإدخال الذي ظهر عليه المنطقي 1. في حالة عدم وجود سجل. 1 على جميع المدخلات ، عند إخراج هذه الكتلة 0.



هنا ، من البيانات الواردة من الهاتف ، نكتشف اتجاه حركة الماوس والعجلة. اخترت 5 وحدات من النطاق الترددي (مع أقصى تغيير في الإشارة من عصا التحكم والمنزلق 0-100 في كل اتجاه). من حيث المبدأ ، لتحسين العمل باستخدام الماوس ، يمكن لعب هذه القيمة حولها. يتم تحديد حجم الخطوة هنا أيضًا (سرعة حركة الماوس أو التمرير). يمكن أيضًا تشغيل معلمات كتلة "مقياس" للتحكم في الماوس بشكل أكثر راحة.



هنا نرسل أوامر مباشرة لتحريك الماوس الظاهري. للقيام بذلك ، استخدم كتلة "تحريك الماوس" الجديدة. ترسل كل من الكتل أمرًا لتحريك الماوس في اتجاه معين كل 10 مللي ثانية (يتم ضبطه في إعدادات الكتلة) ، بخطوة محسوبة في اللوحة السابقة إذا كان هناك مستوى عال عند إدخال "إرسال".



يتم استخدام كتلة "عجلة الماوس" الجديدة هنا أيضًا. يرسل هذا الحظر أمرًا لتدوير عجلة التمرير الخاصة بالماوس الظاهري. هنا ، لتحقيق تأثير سلس ، يتم استخدام مبدأ مختلف (مختلف عن تحريك الماوس). إذا كان هناك مستوى مرتفع عند إدخال "إرسال" ، ترسل الوحدة إلى الماوس الظاهري أمرًا لتحويل عجلة التمرير خطوة واحدة ، ولكن بتردد محسوب على اللوحة 2. يعتمد هذا التردد على موضع شريط التمرير على الهاتف ويتغير من 200 مللي ثانية إلى 5 مللي ثانية عندما تتغير القيمة تم استلامه من شريط التمرير من 5 (منطقة ميتة) إلى 100 (موضع متطرف).



يتم استخدام كتلة "MousePressKey" هنا. على مستوى عال عند إدخال "إرسال" ، فإنه يضغط باستمرار على زر الماوس الظاهري المحدد في الإعدادات ، على مستوى منخفض يطلقه. لتحقيق تأثير الضغط مع التثبيت ، يتم استخدام مشغلات TT (مشغلات العد). على الحافة الأولى عند مدخلهم ، يترجمون مخرجاتهم إلى حالة السجل. 1 وفي الثانية يسقطونه إلى 0. وهكذا في دائرة.



هنا نستخدم كتلة "MouseClickKey" ، والتي على الحافة الصاعدة لمدخلات "إرسال" ، تقوم بنقرة قصيرة على زر الماوس الافتراضي المحدد في إعدادات الكتلة.



هنا ، يتم استخدام كتل "KeyboardStatus" و "MouseStatus" والتي عندما يكون إدخال الحالة مرتفعًا ، قم بتشغيل لوحة المفاتيح والماوس الظاهريين على التوالي ، وقم بإيقاف تشغيلهما عندما يكون المستوى منخفضًا. في هذا المخطط ، للتحكم في التشغيل وإيقافه ، تكون الإشارة هي وجود اتصال هاتفي مع اردوينو. يتم تشكيلها عند إخراج "CS" من كتلة "RemoteXY" (لوحة 1). بالإضافة إلى ذلك ، إذا كان هناك اتصال ، نقوم بإضاءة LED المدمج في لوحة اردوينو (دبوس 13).



هنا ، يتم تحديد حقيقة الضغط على زر على إحدى لوحات المفاتيح في التطبيق على الهاتف ، وعلى أي لوحة مفاتيح معينة تم الضغط على الزر - الروسية أو الإنجليزية. بالإضافة إلى ذلك ، يتم إنشاء إشارات لإشعال LED الموجود في الزاوية العلوية اليمنى لكل من لوحات مفاتيح التطبيق على الهاتف. يشير مؤشر LED هذا إلى أن إشارة الضغط على الزر قد وصلت إلى وحدة التحكم. استخدمته أثناء الإعداد ، لكنني قررت تركه في الإصدار النهائي من التطبيق.



هذا يحدد ما إذا كان سيتم إدخال حرف كبير. تعمل الحافة الأمامية للضغط على زر "Shift" في التطبيق على الهاتف على ضبط مشغل SR على حالة log.1. بعد نهاية إدخال الحرف (الحافة الزائدة لإشارة وجود الحرف المضغوط) ، يتم إعادة تعيين المشغل إلى 0.
كل ضغطة على زر "Caps" في التطبيق على الهاتف تؤدي إلى تشغيل زر "Shift". أي ، في الوضع الأولي ، تكون حالة الإدخال الرئيسية هي أحرف صغيرة ، وعندما تضغط على زر "Shift" ، يتم إدخال حرف كبير ، ثم بعد الضغط على الزر "Caps" مرة واحدة ، يتغير الوضع. تصبح الأحرف الكبيرة هي الأحرف الرئيسية ، وعندما تضغط على زر "Shift" ، يتم إدخال حرف صغير. عند الضغط على زر "Caps" مرة أخرى ، يتحول الإدخال إلى الوضع الرئيسي. بالإضافة إلى ذلك ، يتم إنشاء إشارة لإضاءة مؤشر "Shift" في التطبيق على الهاتف.



هنا ، من الرقم الذي تم الضغط عليه على لوحة المفاتيح في التطبيق على هاتف الزر ، يتم تشكيل رمز الرمز لهذا الزر. يتم ذلك باستخدام كتلة "جدول الجدول" ، حيث تقوم هذه الكتلة بإنشاء رمز عند إخراج "Q" ، والذي يتوافق عدده في الجدول المحمل في الكتلة مع القيمة عند الإدخال "I".

يتم تحميل جدول التعليمات البرمجية في كتلة "جدول الرموز" على هذا المنتدى.
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.


يرجى ملاحظة أن كل من الأحرف الروسية والأحرف الإنجليزية تستخدم نفس جدول الرموز. والحقيقة هي أن مكتبة Keybord لا تفهم إلا الرموز أحادية البايت ، وتضغط في الواقع على زر على لوحة المفاتيح الافتراضية يتم كتابة الرمز عليه مع الرمز الذي تم تمريره إليها. لإدخال الأحرف الروسية ، تتحول طريقة الإدخال على الكمبيوتر بالقوة إلى الروسية عند إدخالها. سننظر في كيفية القيام بذلك في اللوحة التالية.



يتم استخدام كتلتين "SequenceKeybord" هنا. تقوم هذه الكتل الموجودة على الحافة الصاعدة عند إدخال "إرسال" بتنفيذ نص برمجي لإجراء لوحة المفاتيح تم تكوينه عندما تم تكوين الكتلة. من خلال هذه الكتلة يمكننا تكوين إدخال الأحرف الروسية أو الإنجليزية ، وكذلك تبديل الأحرف الصغيرة أو الأحرف الكبيرة. ولكن هذا يتطلب أيضًا بعض التكوين للكمبيوتر الذي يتصل به جهازنا. تحتاج إلى تكوين اختصار لوحة مفاتيح لتمكين التخطيطات الروسية والإنغدية. يتم ذلك في لوحة تحكم الكمبيوتر.







لهذا الجهاز ، قمت بتكوين تضمين اللغة الإنجليزية باستخدام المفاتيح CTRL + 1 والروسية CTRL + 0. هذه التركيبات التي يتم استخدامها في كتل البرنامج النصي.
النظر في سيناريو كتلة أعلى.



يتم تنفيذ البرنامج النصي بخطوات من أعلى إلى أسفل على الحافة الصاعدة عند إدخال "إرسال" (عندما تظهر إشارة وجود حرف مضغوط على لوحة مفاتيح التطبيق في الهاتف). في الخطوة الأولى ، يتم الضغط على زر CTRL مع الاستمرار على لوحة المفاتيح الافتراضية. في الخطوة الثانية ، يتم الضغط لفترة قصيرة على الزر ، ويتم تغذية الكود لإدخال "كود الخطوة 2". إذا تم الضغط على المفتاح على لوحة المفاتيح الروسية فسيكون 48 (رمز الحرف 1) وإذا كان باللغة الإنجليزية - 49 (رمز الحرف 0). في الخطوة الثالثة ، يتم تحرير زر CTRL. وبالتالي ، قمنا بتحويل لغة الإدخال إلى اللغة التي نحتاجها لإدخال هذا الحرف.

تعتمد الخطوة التالية على المستوى العالي لمدخلات "نشاط الخطوة 4". يحدث عندما يكون وضع الأحرف الكبيرة نشطًا. في هذه الحالة ، يتم تنفيذ الخطوة 4 ، ويتم الضغط مع الاستمرار على زر "Shift" الموجود على لوحة المفاتيح الافتراضية. بهذه الطريقة ، يتم إدخال الأحرف الكبيرة.

حسنًا ، في الخطوة الأخيرة ، يتم الضغط مع الاستمرار على زر لوحة المفاتيح الافتراضية ، وهو الرمز الذي يأتي إلى إدخال "Code Step 5" (رمز الزر الذي ضغطنا عليه على لوحة المفاتيح في التطبيق على الهاتف).

إذا اختفت إشارة الضغط على زر على لوحة المفاتيح في التطبيق على الهاتف بسبب الانعكاس عند إدخال الكتلة السفلية للنص البرمجي ، فسيتم تنفيذ النص البرمجي الموجود فيه.



أولاً ، نحرر زر الرمز الذي تم الضغط عليه مسبقًا ، ثم نطلق زر "Shift"



هنا ، على غرار اللوحة 10 ، ننشئ إشارة حول وجود زر مضغوط على لوحة المفاتيح للأحرف والأرقام الخاصة في التطبيق على الهاتف ، والرمز لهذا الزر.

يتم تحميل جدول التعليمات البرمجية في كتلة "جدول الرموز" على هذا المنتدى.
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~




عندما تظهر إشارة تفيد بالضغط على مفتاح خاص على لوحة المفاتيح في التطبيق على الهاتف ، يتم تنفيذ البرنامج النصي المكون في كتلة "SequenceKeyboard". في ذلك ، نقوم أولاً بترجمة طريقة الإدخال إلى اللغة الإنجليزية (بالضغط على مفتاح "CTRL" → الضغط على مفتاح "1" → تحرير مفتاح "CTRL") ، ثم الضغط على مفتاح الحرف المطلوب. إذا اختفى وجود الزر المضغوط ، يتم تنفيذ وحدة تعرض لمرة واحدة للوحة المفاتيح "OneKeyboard" والتي تقوم بإجراء واحد مبرمج في الإعدادات. في هذه الحالة ، يتم تحرير مفتاح الحرف الخاص الذي سبق الضغط عليه.

بعد التجميع ، يشغل هذا المشروع أكثر من نصف ذاكرة وحدة تحكم Arduino Leonardo بقليل ، مما يسمح بإجراء تعديلات مختلفة على هذا المشروع.
حظا سعيدا مع إبداعك.

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


All Articles