أنا حقا أحب دروس الفيديو. لسبب ما ، أرى شخصيا المعلومات الواردة في النص بشكل سيء للغاية. ولكن هناك أشياء لا توجد فيها معلومات كثيرة على الورق. خذ على سبيل المثال ، دروس لعب balalaika: على YouTube ، توجد مناقشات رائعة حول كيفية تشغيل هذا أو ذاك اللحن (من المهتمين ، نحن نبحث عن "Sergey Vorontsov") ، ولكن من الصعب تكرار وحفظ التسلسل من دفق الفيديو. من الضروري إما الكتابة على الورق (وفقًا للتعليقات الواردة في الدروس ، والبعض الآخر يفعل ذلك) ، أو شراء مواد إضافية (لكنني لست جشعًا ، لكنني محلي الصنع).

بشكل عام ، في حالة balalaika ، ومع العديد من الحالات الأخرى ، يجب أن أذهب هكذا: نظرت إلى الشظية ، وأوقفته مؤقتًا ، وكررت ذلك عدة مرات خلف المؤلف ، واستمرت في المشاهدة. إذا كان هناك شيء غير واضح - إعادة لف ، بدا عن كثب. لكن كيف تخلص من كل شيء إذا كانت يديك مشغولة؟ علاوة على ذلك ، في حالتي ، فإنهم مشغولون ، إن لم يكن مع الأكورديون الضخم ، ولكن لا يزال البعض ، ولكن مع balalaika. لذلك ، تحتاج إلى العمل مع ساقيك.
منذ سنوات عديدة مضت ، عندما استخدمت جميع البشرية التقدمية لوحات مفاتيح PS / 2 ، أحضروا إلينا العشرات من لوحات مفاتيح USB للمشروع. بالطبع ، قمنا بتوصيلها بجهاز واحد ، وضغطنا على Ctrl على أحدهما ، و Alt في الثانية ، و Del في الثالث. لقد تحقق التأثير. منذ ذلك الحين ، أعرف أن لوحات مفاتيح USB تعمل بشكل متوازٍ تمامًا ، وذلك لمساعدة اللوحة الرئيسية التي يمكنك توصيل لوحة مفاتيح أخرى سترسل بعض الرموز بدلاً منها.
لذلك ولدت الفكرة لإنشاء دواسة تتظاهر بأنها لوحة مفاتيح وترسل رموز تحكم المشغل. كلاعب ، اخترت في البداية مشغل VLC ، لأنه يحتوي على أزرار تحكم موثقة جيدًا ، ولكن تبين فيما بعد أن الرموز التي حددتها لها نفس الغرض تمامًا عند مشاهدة مقاطع الفيديو على YouTube في وضع ملء الشاشة. هذا أمر جيد ، لأنه نظرًا لوجود مشاهدات متعددة عبر الإنترنت ، بالنسبة إلى ظهور الإعلان ، يبدو أن شيئًا ما يقع في عقل المؤلف. مشاهدة تحميلها لن تكون أخلاقية جدا.
لذلك ، نبدأ في تصميم الجهاز.
منطق العمل
في البداية كنت أرغب في عمل عدة دواسات ، كل منها من أجل وظيفتها الخاصة. في البداية ، لقد عدت 3-4 من هذه الوظائف: تشغيل ، إيقاف ، ريح هناك ، عودة الرياح. لكنني اكتشفت بعد ذلك كمية البلاستيك التي ستستغرقها ، بالإضافة إلى - كيف أفهم الدواسات باللمس ، وكنت حزينًا. لذلك ، تقرر إعادة النظر بشكل كامل في المنطق كله. ما هي الميزات المطلوبة على الإطلاق؟ بدء التشغيل ، لكنه غالبًا ما يكون معلقًا على نفس المفتاح ، عادةً على مسافة. واللف. VLC Player لديه "Shift + Left". يوتيوب ، كما اتضح ، أيضا. وإذا كنت تعتقد ذلك ، لا توجد وظائف أخرى.
عظيم! لنجعل الدواسة تستخدم لفترة وجيزة وظيفة "البدء - الإيقاف" ، وطويلًا - من خلال وظيفة "الترجيع".
في المستقبل ، يمكنك توسيع الوظيفة. يمكنك تدريب الدواسة على التعرف على رمز مورس. اقترحت زوجتي ، بعد أن تعلمت عن الفكرة ، نبضات التحكم في الترميز باستخدام عناصر من الرقصات الأيرلندية ... عمومًا ، يمكنك توسيع الوظيفة كما تريد. ولكن هناك شيء واحد واضح: دواسة واحدة كافية. حسنا ، الآن سنفعل الاعتراف المطابع الطويلة والقصيرة.
الميكانيكا
بالنسبة لأولئك الذين يمشون في المنزل في النعال ، هناك حل بسيط للغاية (لقد وجدت ذلك على موقع Thingiverse). نأخذ زرًا يبلغ قطره أكثر من سنتيمتر ، ونلصقه في أي جسم على شكل مربع ، نحصل على دواسة. المشكلة هي أنني لا أحب النعال ، لذلك هذا الخيار لا يناسبني شخصياً. أحتاج إلى سطح أكبر حتى لا تؤذي القدم.
تباع الدواسات بكميات كبيرة على Ali Express ، يجب عليك البحث عن كلمة Foot Switch. الأسعار هناك تبدأ من 30 روبل ، ولكن عند هذا السعر ، يمكن أن تكون تكلفة التسليم حوالي أربعمائة روبل. بعد البحث ، وجدت أنه من الممكن تمامًا العثور على دواسة يكون مجموع "السعر بالإضافة إلى تسليمها" 150 روبل. لكن سيتعين عليك الانتظار لمدة شهرين في المتوسط (كنت أنتظر هنا مؤخرًا للحصول على بطاقة SD طوال الثلاثة أشهر).
لذلك ذهبت أسرع: صنعت دواسة على طابعة ثلاثية الأبعاد. تُظهر التجربة الشخصية (وجميع الخيارات مع Thingiverse) أن المحور يجب أن يكون معدنًا ، وإلا فسيتم كسر كل شيء بسرعة. أخذت مسمار الأثاث M6x60 الذي كان يحمله مع الجوز المتصل به ، وكذلك الزر (PSW-13) ، الذي كان في أجزاء الراديو المجاورة ، ودوران حولهما كما لو كنت أستطيع. هكذا بدا مصدر المواد:

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

إليك نسخة مجمعة تقريبًا:

وهنا مجموعة الدواسة:

من حيث المبدأ ، سوف أرفق ملفات STL ، لكن الحل لم يكن مثاليًا. ومع ذلك ، يمكن لأي شخص أن يكررها (إذا وجد الترباس M6x60 مع الجوز المقابل وزر PSW-13). يكفي لأول مرة ، وبعد ذلك - يمكنك ختم الميكانيكا والنظام مع ALI.
جهاز USB
على الرغم من أنني كنت أقوم بنشاط بترويج PSoC مؤخرًا ، إلا أن استخدامه على الدواسات يعد أمرًا غير معروف. أنا أعتبر أن الحل الأمثل هو لوح قائم على STM32F103C8T6 ، والذي يمكن طلبه الآن على ALI Express لحوالي 120 روبل (بما في ذلك التسليم).

بالطبع ، يمكننا التكهن بأن هناك لوحات أرخص تعتمد على AVR ، لكن فرق السعر ليس كبيراً هناك ، و STM32 لديه وقت تطوير أقل بكثير بسبب تصحيح الأخطاء عبر JTAG. ساعة من الوقت (حتى في المنزل) - كما يكلف شيئا. لذلك ، وفقًا للمعايير الكلية "سعر الجهاز + تكاليف العمالة" ، STM32F103 هو الخيار الأفضل لهذه المهمة. علاوة على ذلك ، لديّ ما يزيد عن نصف دزينة من هذه النماذج في متجر لمثل هذه الحالة ، وبالتالي فإن وقت انتظار التسليم يساوي الآن صفرًا بالنسبة لي.
لقد سافرت عبر الإنترنت لألواح مفاتيح USB الجاهزة على أساس هذه الشريحة. لقد وجدت مقالا عن هبر كيفية صنع ماوس USB. لكنني بحاجة إلى لوحة مفاتيح. فيما يتعلق بموضوع لوحات المفاتيح ، وجدت الكثير من النصائح الذكية في المنتديات (لكنني أردت شيئًا ما جاهزًا) واثنين من بعض المشاريع الجاهزة ، لكن المعقدة على GitHub (لكنني أردت شيئًا واضحًا). لكن الذي يسعى سيجده دائمًا. إليك
مقالة رائعة تحتوي على كل ما هو مطلوب (على الرغم من وجود
مقال في الكود ، لا أخاف من هذه الكلمة غير الروسية ، وهي DeadLock محتملة ، لكنني سأكتب الكود الخاص بي). الشيء الرئيسي هو أن جميع الخطوات موضحة بوضوح ، وكيفية الحصول على لوحة مفاتيح USB من "سمكة" منتهية في Cube MX. الشيء الوحيد الذي لم يفعله المؤلف هو عدم نشر رموز المفاتيح. أضفهم هنا:

إن السبب في ذلك هو أنه في الإصدار الحديث من Cube MX ، تختلف أسماء الملفات والوظائف وحتى الثوابت اختلافًا طفيفًا عن تلك المحددة في هذه المقالة ، ولكن من خلال القياس ، يتم العثور على كل شيء سريعًا. يمكنني كتابة نسخة جديدة من النص ، ولكن أين يوجد ضمان بأن المطورين لن يغيروا كل شيء مرة أخرى؟ يحبون القيام بذلك. بشكل عام ، يمكنك رؤية النظير في مثالي.
هكذا. لقد أنشأت مشروعًا أساسيًا في Cube MX ، وأجرت جميع التغييرات الموصى بها في المقالة المذكورة أعلاه. ما التالي؟ بعد ذلك ، أضف وصفًا لمنفذ الزر. اخترت PB12 (فقط لأن جهة الاتصال المقابلة تقع في زاوية اللوح). نظرًا لأنني دائمًا ما أعمل بالحديد من خلال مكتبة mcucpp في Konstantin Chizhov ، نزيل تعريف الماكرو "-C99" في خصائص المشروع ،
ونعيد تسمية
main.c إلى
main.cpp ، ثم نضيف الإعلان:
typedef Mcucpp::IO::Pb12 pedal1;
نضيف تهيئة المنفذ إلى الوظيفة
الرئيسية () (تمكين تسجيل المنفذ ، ضبط اتجاه الساق ، تشغيل جهاز التعليق):
pedal1::ConfigPort::Enable(); pedal1::SetDirRead(); pedal1::SetPullUp (pedal1::Port::PullUp);
في الواقع ، يتم تهيئة كل شيء. قررت بناء الجسم الرئيسي في صورة عملية فيريلوج. لا أعرف لماذا ، أردت فقط. وعادة ما تسمى هذه العملية على نبضات الساعة. قررت أن يتم وضع علامة نظام القراد تماما كما القراد. لذلك ، تمت إضافة الوظيفة العادية لمعالج
التجزئة في نظام
stm32f1xx_it.c كما يلي:

نفس النص: 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 */ }
أضع الدالة
TickProcess () نفسها في
الرئيسية. حزب الشعب الكمبودي . أولاً ، فكر في الأمر برمته ، ثم في أجزاء.
هذه هي الوظيفة الكاملة: 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; } }
المهمة الأولى التي يتم تنفيذها في هذا المعالج بسيطة. كل 20 ميلي ثانية نرسل تقريرا يحتوي على معلومات حول الأزرار الضغط (إذا لم يكن هناك أزرار ، نرسل على أي حال ، فقط مع الأصفار). نظرًا لأن الوظيفة تسمى كل ميلي ثانية ، يجب إرسال التقرير إلى واحد من عشرين مكالمة. للقيام بذلك ، هناك متغير في بداية الوظيفة:
static int localTick = 0;
والرمز في النهاية (نرسل البيانات ، وبعد ذلك نقوم بمسح المخزن المؤقت حتى نبدأ في إرسال الأصفار من الجلسة التالية):
if (localTick++ % 20 == 0) { USBD_HID_SendReport (&hUsbDeviceFS,report,sizeof(report)); pReport [0] = 0; pReport [1] = 0; }
المهمة الثانية هي أكثر تعقيدا. يتتبع طبيعة الضغط على دواسة ويملأ التقرير لتقديمه في وقت لاحق. لماذا قلت أن الأيديولوجية تشبه فيريلوج؟ لأنني دائمًا ما أجد الاختلافات في تلك اللغة: لدي متغير يتم فيه وضع الحالة الحالية للزر:
bool bButtonState = pedal1::IsSet();
وهناك متغير يتم فيه تخزين حالته السابقة (كما نتذكر ، الحالة السابقة هي حالة الزر أثناء معالجة المقاطعة السابقة من مؤقت 1 مللي ثانية):
static bool bButtonStatePrev;
الزر المضغوط يعطي القيمة
false ، الزر المضغوط -
true . وبالتالي ، يمكننا دائمًا الاستنتاج حول الحالة الديناميكية للزر:
نقدم اثنين من الثوابت. واحد يحدد الوقت الصحافة قصيرة. إذا استمرت الصحافة لمدة تقل عن 700 مللي ثانية ، فستكون قصيرة الأجل. الثاني يحدد الوقت الذي يتم فيه تشغيل التكرار التلقائي. إذا بدأت بعد 700 ميلي ثانية فقط في إرسال رمز المفتاح ، فسيبدأ المشغل في الريح فجأة. يتم تحديد هذا تجريبيا. لذلك ، يكون منطق العمل كما يلي: بعد 700 مللي ثانية ، يتم إرسال رمز واحد "Shift + Left" ، وبعد ذلك يتم إعطاء المستخدم الفرصة لتحرير الدواسة. إذا استمر الدواسة في الإمساك بها ، فسيبدأ الإرسال الثابت لهذا الرمز من الثانية الثانية حتى يتم تحرير الدواسة.
const int shortTime = 700; // const int longTime = 2000; //
يتم تخزين الوقت الذي يتم فيه الضغط على الزر في متغير:
static int tickDuringButton = 0;
إذا تم الضغط على الزر للتو ، فإننا نضع صفرا لهذا المتغير ، ونبدأ في قياس فترة زمنية جديدة:
// if ((!bButtonState) && bButtonStatePrev) { tickDuringButton = 0; }
إذا تم إطلاق الزر للتو ، فإننا نتحقق من الوقت الذي تم فيه الضغط عليه. إذا كان قليلاً فقط (الآن تقول "أقل من 100 مللي ثانية") - فهذه هي الثرثرة. هذا لا يهم. تجاهل هذه النقرة. إذا لم نفعل أكثر من فترة الضغط القصير ، فستتم معالجة المطابع الطويلة أدناه. إذا قمنا ، في غضون فترة قصيرة ، بإنشاء تقرير في المخزن المؤقت بمسافة (سيتم إرساله عندما يحين الوقت لذلك):
// if (bButtonState && (!bButtonStatePrev)) { // // , 100 () if ((tickDuringButton >100)&&(tickDuringButton < shortTime)) { // report [2] = 0x2C; } }
إذا تم الضغط على الزر لفترة طويلة ، فإننا نرسل "Shift + Left" في حالتين:
- يتم الاحتفاظ الزر بالضبط 700 مللي ثانية (حزمة واحدة) ؛
- يتم الاحتفاظ الزر لأكثر من ثانيتين (إرسال في كل تقرير لاحق حتى يتم تحرير الزر).
// if ((!bButtonState) && (!bButtonStatePrev)) { if ((tickDuringButton == shortTime)||(tickDuringButton > longTime)) { // Shift+ report [0] = 2; // Shift report [2] = 0x50; // } }
هذا ، في الواقع ، هو كل شيء. لا يعد هذا الرمز مختلفًا عن "السمك" الذي قدمه لنا Cube MX. نقوم بالتجميع ، الفلاش ... لا ، هذا مستحيل بدون أخطاء (هنا يتم القبض عليهم جميعًا ، لكن لا يمكنني الاستغناء عنها مبدئيًا) ، فنحن نتعرف عليهم في 10 دقائق عبر تصحيح JTAG (مرحبًا بـ AVR) ، ونخيط ، نسعد ...
تصميم بديل
بشكل عام ، تكون مثل هذه الأشياء مفيدة دون balalaika (أو عرض آخر من دروس الفيديو). على وجه الخصوص ، أحب قراءة الأخبار ، مستلقيا على السرير ، مع جهاز كمبيوتر محمول على بطني. للتمرير النص ، عليك أن تبقي يدك اليمنى عازمة طوال الوقت ، وهذا يؤدي إلى ألم في المرفق. لذلك ، حلمت منذ فترة طويلة بزر أحمر كبير يمكنه تمرير الصفحات دون ثني ذراعي. في الواقع ، يمكن تصنيعها من نفس المكونات مثل الدواسة ، لتحل محل الترباس الأثاث مع كمية صغيرة من الغراء الساخن. المجموع: زر PSW13 ، لوح STM32F103C8T6 ، بلاستيك للطابعة ثلاثية الأبعاد ، مادة لاصقة تذوب الساخنة. حسنًا ، في "البرامج الثابتة" ، استبدلت الرموز بـ "PgDn" بضغطة قصيرة و "Up" بمدة طويلة.


استنتاج
يمكنك استخدام ساقيك للتحكم في عرض دروس الفيديو عندما تكون يديك مشغولة. للقيام بذلك ، فقط دواسة واحدة تحاكي تشغيل لوحة مفاتيح USB. يمكن لدواسة واحدة إرسال رموز مفاتيح متعددة ، واختيارها بناءً على أنواع مختلفة من ضغطات المفاتيح. تعتبر المقالة دواسة تقوم بتوزيع نوعين (الضغط القصير والطويل).
يمكن العثور على الميكانيكا على Ali Express تحت كلمة Foot Switch أو يمكن طباعتها على طابعة ثلاثية الأبعاد. كإلكترونيات ، يمكن استخدام اللوح STM32F103C8T6. تتم "البرامج الثابتة" في أقل من ساعة على أساس "الأسماك" التي أنشأتها Cube MX من الشركة المصنعة للتحكم STM32. يحتل الرمز الإضافي عدة شاشات نصية (بدقة 2K - شاشة واحدة).
بشكل عام ، تم تصميم الجهاز بالكامل (mechanics + "firmware") بالكامل في إحدى الأمسيات ، بالإضافة إلى أنه استغرق حوالي أربع ساعات لطباعة الميكانيكا على طابعة ثلاثية الأبعاد.
يمكن
تنزيل ملفات STL الجاهزة لطباعة الدواسة
هنا (من المرغوب فيه خفض العنصر العلوي بمقدار 0.4 مم لتجنب عدد كبير من الدعامات: اتضح أن السطح مستدير بعض الشيء ، مما يقلل النموذج ، وسنعمل على جعل الجزء المطبوع مسطحًا).
يمكن
تنزيل ملفات STL الخاصة بـ "الزر الأحمر الكبير"
هنا .
يمكن
تنزيل الملفات المصدر الجاهزة للمشروع وملف HEX الخاص بالبرامج الثابتة من
هنا .
لم يتم اختيار تاريخ نشر هذه المقالة عن طريق الصدفة. قرر المجلس أنه من الأفضل نشر مقال عن مثل هذه الأشياء على موقع جاد في ذلك اليوم. لكن في الواقع ، إذا نظرت إلى مقاطع الفيديو الموجودة على جمل "Alexey Arkhipovsky" ، و "Dmitry Kalinin" ، و "Cranberry Show" ، و "Alexey Kodenko" ، يصبح من الواضح أن balalaika الأكاديمي يشبه المجمع. يتم الجمع بين البساطة المطلقة والقوة التعبيرية المحمومة. وبعبارة "سيرجي فورونتسوف" ، يمكنك فهم كيفية تعلم كيفية استخدام هذه الأداة.
إضافة
بعد 8 أشهر من التشغيل ، بدأ زر PSW-13 في العمل مرة واحدة خارج الكثيرين ، وفقط مع ضغط قوي للغاية. عند محاولة استبدال ، اتضح تفاصيل مثيرة للاهتمام للغاية. يحتوي الزر الجديد ، الذي تم شراؤه في نفس الوقت مثل الزر السابق ، على احتياطي طاقة مختلف تمامًا ويعمل في وضع مختلف تمامًا. ونتيجة لذلك ، كانت دائمًا ما تعاني من الاكتئاب على دواسة بلدي. اضطررت لطحنها مع دريميل. الذي سيكرر ميكانيكي - ضع في اعتبارك. قد تضطر إلى تعديل الزر مع ملف أو العكس - نحت شريطًا كهربائيًا عليه لزيادةه. التكرار للجزء البلاستيكي من هذا الزر لم يكن للغاية. ولكن بشكل عام - بعد مثل هذه المراجعة ، كل شيء يعمل مرة أخرى.