جدول المحتويات:

وحدة التحكم في الاختصارات المحمولة (لبرنامج Photoshop + المزيد) [Arduino]: 4 خطوات
وحدة التحكم في الاختصارات المحمولة (لبرنامج Photoshop + المزيد) [Arduino]: 4 خطوات

فيديو: وحدة التحكم في الاختصارات المحمولة (لبرنامج Photoshop + المزيد) [Arduino]: 4 خطوات

فيديو: وحدة التحكم في الاختصارات المحمولة (لبرنامج Photoshop + المزيد) [Arduino]: 4 خطوات
فيديو: #shorts ! برامج مهمة للويندوز هتسهل استخدامك للكومبيوتر 2024, شهر نوفمبر
Anonim
وحدة التحكم في الاختصارات المحمولة (لبرنامج Photoshop + المزيد) [Arduino]
وحدة التحكم في الاختصارات المحمولة (لبرنامج Photoshop + المزيد) [Arduino]

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

لذلك بدأت العمل على التكرار التالي للوحة التحكم ، واحد به المزيد من الأزرار والوظائف. لوحة تحكم واحدة للحكم عليهم جميعًا.

هذه ليست لوحة التحكم تلك. ولكن بطريقة ما قد يكون أفضل.

ماذا لو كان لديك الكثير من الاختصارات ، ولكن في حزمة فائقة الوزن وخفيفة الوزن يمكنك حملها بيدك أثناء الرسم دون انقطاع؟ … حسنًا ، يكفي هذا الإعلان.

تمت برمجة وحدة التحكم هذه بطريقة تتيح لك ، باستخدام 4 أزرار فقط ، تعيين ما يصل إلى 32 اختصارًا ممكنًا! يوجد الزر الخامس الإضافي للسماح لي باستخدام مفاتيح التعديل في أي مجموعة ، وهو أمر مفيد للعديد من البرامج (هل جربت من قبل مجموعة Alt-RMB في PS؟ إذا لم تقم بذلك ، فالرجاء القيام بذلك. إنه المنقذ). سأشرح النظام لاحقًا.

للقيام بكل هذا ، ستحتاج إلى:

  • 1 متحكم دقيق (لقد استخدمت Adafruit ItsyBitsy 32u4 ولكن أي منها يجب أن يفعل طالما أنه يحتوي على شريحة atmega32u4)
  • 1 محول micro-USB (البيانات ، وليس الطاقة فقط)
  • 5 أزرار انضغاطية (استخدمت أزرارًا ناعمة مثل هذه)
  • مقاومات 10 كيلو أوم (1 لكل زر)
  • الأسلاك ، اللوح ، مواد اللحام ، إلخ.
  • شيء لصنع غلاف به (طابعة ثلاثية الأبعاد ، إلخ)

هذا مشروع Arduino متوسط المستوى ، وأقترح النظر في البرنامج التعليمي السابق لفهم ما يجري بشكل أفضل ، لأن الكثير من هذا هو تكرار للأشياء التي شرحتها هناك.

حسنًا ، لنبدأ!

الخطوة 1: التخطيط

تخطيط
تخطيط

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

الفكرة وراء نظام التحكم هي أن كل زر يمكن أن يكون إما مجانيًا أو مضغوطًا أو محررًا أو مضغوطًا مع الاستمرار. الضغط والإفراج هو ما سينشط الاختصار بالفعل ، بينما يمنحنا الضغط باستمرار على الأزرار الوصول إلى اختصارات مختلفة. لذا ، إذا ضغطت فقط على الزر A ، فسوف تقوم بتنشيط الاختصار A ، ولكن إذا قمت بالضغط على B عند الضغط على الزر A ، فستحصل على اختصار مختلف. يمكنك الاحتفاظ بما يصل إلى 3 أزرار في وقت واحد أثناء الضغط ، لذلك عندما تقوم بتطبيق بعض التركيبات الأساسية ، سترى عدد التركيبات الممكنة مع هذا النظام!

بدا الزر الخامس الإضافي وكأنه إضافة طبيعية ، نظرًا لشكل الجهاز المحمول الذي توصلت إليه. قررت استخدامه للوصول إلى مفاتيح التعديل في Photoshop. تختلف طريقة عملها قليلاً عن الأزرار الأخرى: كلما تم الضغط على زر الإبهام ، سيتم استخدام المعدلات فقط. سيتم تنشيط هذه عندما يتم تعليقها ويمكن الضغط على أكثر من مرة. لذا ، إذا كان الزر A هو Shift ، والزر B هو Ctrl ، فعند الضغط باستمرار على A و B ، فسيكون ذلك مثل الضغط على Shift و Ctrl ، ولكن فقط طالما أن زر الإبهام مضغوط!

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

الخطوة 2: النموذج الأولي + الرمز

النموذج الأولي + كود
النموذج الأولي + كود

من الممارسات الجيدة اختبار الأزرار الموجودة على اللوح. الأمر بسيط جدًا ، ما عليك سوى توصيل الأزرار والمقاومات كما هو موضح. يمكنك اختباره باستخدام الكود هنا (بديل رابط لصق):

#يشمل

// استخدام خيار vthisv لنظام التشغيل MacOS:

// char ctrlKey = KEY_LEFT_GUI ؛

// استخدم خيار vthisv لنظامي التشغيل Windows و Linux:

حرف ctrlKey = KEY_LEFT_CTRL ، char shiftKey = KEY_LEFT_SHIFT ، char altKey = KEY_LEFT_ALT ،

// مفاتيح الوظائف هنا

حرف Fn1Key = KEY_F2 ؛ حرف Fn2Key = KEY_F3 ؛ char Fn3Key = KEY_F4 ؛ char Fn4Key = KEY_F5 ؛

دبابيس const int = {9 ، 10 ، 11 ، 12 ، 13} ؛ // مجموعة من كافة دبابيس الأزرار

//حساسية

const int THRESH_0 = 10 ؛ const int THRESH_1 = 20 ، const int THRESH_2 = 25 ؛ const int THRESH_3 = 50 ؛ const int THRESH_4 = 100 ؛ const int THRESH_5 = 200 ؛

const int BUTTON_NUM = 5 ؛

// تجميد الإطارات

CONST int DELAY = 0 ؛

تعداد الدول {تم تحريره ، ضغطه ، احتجازه ، تحريره} ؛

زر البنية {

دبوس int دولة الدولة ؛ وقت int } ؛ // الإبهام ، السبابة ، الوسط ، الخاتم ، الصغير ؛

أزرار الأزرار [BUTTON_NUM] = {} ؛

زر initButton (int p) {

زر ب ؛ pinMode (ع ، المدخلات) ؛ b.pin = ع ؛ b.state = الدول:: مُحررة ؛ ب الوقت عقد = 0 ؛ العودة ب ؛ }

الإعداد باطل() {

// ضع رمز الإعداد هنا ، للتشغيل مرة واحدة: Serial.begin (9600) ؛ Keyboard.begin () ،

بينما (! المسلسل) {} ؛

// أزرار لـ (int i = 0 ؛ i <(BUTTON_NUM) ؛ ++ i) {Serial.print ("زر ضبط") ؛ Serial.print (i) ؛ Serial.print ("at pin:") ؛ Serial.println (دبابيس ) ؛ //buttons.pin = 1 ؛ أزرار = initButton (دبابيس ) ؛ Serial.println (أزرار .pin) ؛ }

}

bool readButton (int pin) {

// تحقق وأزرار debounce if (digitalRead (pin) == HIGH) {delay (10)؛ if (digitalRead (pin) == HIGH) {إرجاع صحيح ؛ } } عودة كاذبة؛ }

int pintobin (int pin) {

إذا (دبوس == دبابيس [0]) قم بإرجاع 1 ؛ إذا (دبوس == دبابيس [1]) قم بإرجاع 10 ؛ إذا (دبوس == دبابيس [2]) قم بإرجاع 100 ؛ إذا (دبوس == دبابيس [3]) إرجاع 1000 ؛ إذا (دبوس == دبابيس [4]) إرجاع 10000 ؛ } buttonStateUpdate (زر ب) {

bool press = readButton (b.pin) ؛

switch (b.state) {حالة الحالة:: تم تحريره: b.timeHeld = 0 ؛ if (press) b.state = States:: pressed؛ استراحة؛ حالة الضغط: b.timeHeld + = 1 ؛ إذا (اضغط) {if (b.timeHeld> (THRESH_1 / (1 + DELAY))) {b.state = States:: عقد ؛ }} else {// if (b.timeHeld

int getButtonStateCode (الزر b)

{return b.state * pintobin (b.pin) ؛ }

int getCodeByButton (كود int ، فهرس int) {

كثافة العمليات r1 ، r2 ، r3 ، r4 ، r5 ؛ int opStep = BUTTON_NUM - (1 + فهرس) ؛

// العملية الأولى

إذا (opStep == 0) كود الإرجاع / 10000 ؛ r1 = كود٪ 10000 ؛

إذا (أوبستيب == 1)

عودة r1 / 1000 ؛ r2 = r1٪ 1000 ؛ إذا (opStep == 2) إرجاع r2 / 100 ؛ r3 = r2٪ 100 ؛ إذا (opStep == 3) إرجاع r3 / 10 ؛ r4 = r3٪ 10 ؛ إذا (opStep == 4) إرجاع r4 / 1 ؛ r5 = r4٪ 1 ؛ }

void completePress (int pin) {

// Serial.print ("الإدخال") ؛ // Serial.println (دبوس) ؛ تأخير (THRESH_3) ؛ Keyboard.releaseAll () ؛ }

doAction باطل (كود int) {

// Modifiers if (getCodeByButton (code، 0) == 2) {// Serial.println ("--- معدِّلات ----") ؛ if (getCodeByButton (code، 1)> 0) {Keyboard.press (altKey) ؛ // Serial.println ("------- alt ---------") ؛ } else Keyboard.release (altKey) ؛ if (getCodeByButton (code، 2)> 0) {Keyboard.press (ctrlKey) ؛ // Serial.println ("-------- ctrl ----------") ؛ } else Keyboard.release (ctrlKey) ؛ إذا (getCodeByButton (كود، 3)> 0) {Keyboard.press ('')؛ } else Keyboard.release ('') ؛ if (getCodeByButton (code، 4)> 0) {Keyboard.press (shiftKey) ؛ // Serial.println ("------ shift ------") ؛ } else Keyboard.release (shiftKey) ؛ } آخر {

// أداء المهام

التبديل (رمز) {الحالة 30: // --- | Brush Keyboard.press (shiftKey) ؛ Keyboard.print ('b') ؛ CompletePress (كود) ؛ استراحة؛ الحالة 300: // --- | ممحاة Keyboard.press (shiftKey) ؛ Keyboard.print ('e') ؛ CompletePress (كود) ؛ استراحة؛ القضية 3000: // --- | دلو Keyboard.press (shiftKey) ؛ Keyboard.print ("g") ؛ CompletePress (كود) ؛ استراحة؛ القضية 30000: // --- | Lasso Keyboard.press (shiftKey) ؛ Keyboard.print ('l') ؛ CompletePress (كود) ؛ استراحة؛ الحالة 320: // - | o تراجع عن Keyboard.press (ctrlKey) ؛ Keyboard.print ('z') ؛ CompletePress (كود) ؛ استراحة؛ الحالة 3020: // - | -o Redo Keyboard.press (ctrlKey) ؛ Keyboard.print ('y') ؛ CompletePress (كود) ؛ استراحة؛ الحالة 30020: // | --o History Keyboard.press (shiftKey) ؛ Keyboard.print ('y') ؛ CompletePress (كود) ؛ استراحة؛ الحالة 230: // - o | حفظ Keyboard.press (ctrlKey) ؛ Keyboard.print ('s') ؛ CompletePress (كود) ؛ استراحة؛ الحالة 3200: // - | o- Quick-p.webp

int buttonCode = 0 ؛

لـ (int i = 0 ؛ i <BUTTON_NUM ؛ ++ i) {أزرار = buttonStateUpdate (أزرار ) ؛ buttonCode + = getButtonStateCode (أزرار ) ؛ }

إذا (buttonCode! = 0) {

Serial.print ("رمز الزر:") ؛ Serial.println (buttonCode) ؛ }

doAction (buttonCode) ؛

// ضع الكود الرئيسي هنا ، للتشغيل بشكل متكرر: // لـ (int i = أزرار [0] ؛ i <sizeof (أزرار) / sizeof (أزرار [0]) + أزرار [0] ؛ ++ i) {/ / // if (readButton (i)) {// doAction (i) ؛ //} //}

إذا (getCodeByButton (buttonCode، 0)! = 2)

Keyboard.releaseAll () ؛

تأخير (تأخير) ؛

}

لا يوجد الكثير ليقوله عن المنطق لأنه مشابه لمنطق آخر وحدة تحكم لدي ، مع اختلافين ملحوظين:

  1. الأزرار مبنية بأجهزة الدولة الخاصة بهم
  2. يتم جمع الحالات معًا لإنشاء رمز يحدد الإجراء

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

كما ترى ، لم أقم بتعيين كل مجموعة ممكنة. لقد أضفت فقط عددًا قليلاً من الاختصارات المفضلة لدي ، وأترك الأمر متروكًا لك لملء الباقي بالطريقة التي تراها مناسبة ؛)

الخطوة 3: الغلاف

الغلاف
الغلاف
الغلاف
الغلاف
الغلاف
الغلاف

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

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

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

قم بتوصيل كل شيء كما هو موضح وقم بتوصيل كبل USB ، ويجب أن يتناسب كل شيء في مكانه (بمساعدة بعض الغراء)!

الخطوة 4: النتيجة والتحسينات الممكنة

النتيجة والتحسينات الممكنة
النتيجة والتحسينات الممكنة
النتيجة والتحسينات الممكنة
النتيجة والتحسينات الممكنة
النتيجة والتحسينات الممكنة
النتيجة والتحسينات الممكنة

ها أنت ذا! وحدة تحكم محمولة يمكنك استخدامها للوصول إلى جميع الاختصارات المهمة بيد واحدة!

يتطلب الأمر بعض الذاكرة العضلية لاستخدامها ، لكنها متعددة الاستخدامات حقًا!

بالطبع إنها ليست مثالية ، والآن أفكر في بعض الطرق لتحسينها. بصرف النظر عن تحسين الغلاف وإضافة الاختصارات ، أعتقد أنني سأكون ممتعًا لدعم تطبيقات متعددة باختصارات مختلفة. أفكر في وجود مجموعة أزرار للتبديل بين أنظمة التحكم ، مثل الضغط على 4 أزرار في نفس الوقت للتبديل بين مكتبة اختصارات Photoshop إلى مكتبة مصممة خصيصًا لـ Maya.

فقط بعض الأفكار.

شكرا للقراءة ، حتى المرة القادمة!

موصى به: