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

لوحة تحكم صغيرة للفوتوشوب (اردوينو): 6 خطوات
لوحة تحكم صغيرة للفوتوشوب (اردوينو): 6 خطوات

فيديو: لوحة تحكم صغيرة للفوتوشوب (اردوينو): 6 خطوات

فيديو: لوحة تحكم صغيرة للفوتوشوب (اردوينو): 6 خطوات
فيديو: التحكم في مصابيح ليد بواسطة أردوينو + الكود البرمجي | اردوينو خطوة بخطوة للمبتدئين 2024, يوليو
Anonim
لوحة تحكم صغيرة للفوتوشوب (اردوينو)
لوحة تحكم صغيرة للفوتوشوب (اردوينو)

سأوضح لك هنا كيفية صنع أداة صغيرة لمساعدتك على العمل في Photoshop بشكل أسرع!

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

طريقة عملها بسيطة: لجعل المتحكم يتفاعل مع Photoshop ، نستفيد من الاختصارات الافتراضية. باستخدام لوحة يمكن للكمبيوتر قراءتها كلوحة مفاتيح / فأرة ، كل ما علينا فعله هو استخدام بعض الأسطر البسيطة من التعليمات البرمجية لإخبار الكمبيوتر بقراءة كل إدخال كمجموعة من الضغط على المفاتيح. الآن زر التراجع هو مجرد ضغطة زر!

هيا بنا نبدأ! لهذا المشروع سوف تحتاج:

  • 1 Sparkfun ProMicro (أو Arduino Leonardo ، غير مستحسن)
  • 1 محول micro-USB
  • 6 أزرار ضغط (أو أي رقم تريده)
  • مقاومات 10 كيلو أوم (1 لكل زر)
  • 1 مقياس الجهد
  • 1 جهاز تشفير دوار
  • الأسلاك ، اللوح ، لوحة الأداء ، اللحام ، دبابيس الرأس ، إلخ.

يمكنك استخدام Arduino Leonardo لهذا المشروع ، لكن ProMicro هو بديل أرخص بكثير يستخدم نفس شريحة atmega32u4 ، ويحتوي على المزيد من المسامير ويأتي في شكل أصغر بكثير ، مما يجعله مثاليًا للوحة المفاتيح.

لبرمجة ProMicro في Arduino IDE ، قد تحتاج إلى إعداد بعض الأشياء أولاً. يمكنك قراءة المزيد عنها في دليل SparkFun:

إذا واجه الكمبيوتر مشكلة في العثور على الجهاز ، فتأكد من أن micro-USB الذي تستخدمه ليس مزودًا بالطاقة فقط ويدعم نقل البيانات.

هذا هو أول مشروع لي في Arduino ، وهو مناسب للمبتدئين.

الخطوة 1: عمل نموذج أولي للوحة التحكم

عمل نماذج أولية للوحة التحكم
عمل نماذج أولية للوحة التحكم

أنصحك باختبار برنامجك على لوح التجارب أولاً قبل البدء في اللحام.

هنا يمكنك أن ترى بلدي التخطيطي.

سيكون الزران 1 و 2 هما التراجع والإعادة ، والزرين 3 إلى 5 لأدوات Brush و Eraser و Lasso ، والزر 6 هو زر حفظ سريع. جهاز التشفير ومقياس الضغط يتحكمان في الحجم والتعتيم على التوالي.

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

الخطوة الثانية: أزرار الضغط

أزرار الدفع
أزرار الدفع

الأزرار هي الأبسط في التنفيذ. دعنا نلقي نظرة على الكود:

#يشمل

أزرار const int = {2 ، 3 ، 4 ، 5 ، 6 ، 7 ، 8 ، 9} ؛ // مجموعة من كافة دبابيس الأزرار char ctrlKey = KEY_LEFT_GUI ؛ // استخدم هذا الخيار لنظامي التشغيل Windows و Linux: // char ctrlKey = KEY_LEFT_CTRL؛ char shiftKey = KEY_LEFT_SHIFT ، char altKey = KEY_LEFT_ALT ، إعداد باطل () {// ضع كود الإعداد هنا ، للتشغيل مرة واحدة: Serial.begin (9600)؛ Keyboard.begin () ، // الأزرار - قم بالتكرار خلال المصفوفة وتحقق من الضغط على (int i = أزرار [0] ؛ i <(sizeof (أزرار) / sizeof (أزرار [0])) + أزرار [0] ؛ ++ i) { pinMode (i ، INPUT) ؛ }} منطقي readButton (int pin) {// check and debounce أزرار if (digitalRead (pin) == HIGH) {delay (10)؛ if (digitalRead (pin) == HIGH) {إرجاع صحيح ؛ } } عودة كاذبة؛ } void doAction (int pin) {// Perform features switch (pin) {// ---- Shortcuts ---- // Undo case 4: Keyboard.press (ctrlKey)؛ Keyboard.print ('z') ؛ Serial.print ("الإدخال") ؛ Serial.println (دبوس) ؛ تأخير (200) ؛ Keyboard.releaseAll () ؛ استراحة؛ // إعادة الحالة 5: Keyboard.press (ctrlKey) ؛ Keyboard.print ('y') ؛ Serial.print ("الإدخال") ؛ Serial.println (دبوس) ؛ تأخير (200) ؛ Keyboard.releaseAll () ؛ استراحة؛ // حالة الفرشاة 6: Keyboard.press ('b') ؛ Serial.print ("الإدخال") ؛ Serial.println (دبوس) ؛ تأخير (200) ؛ Keyboard.releaseAll () ؛ استراحة؛ // حالة الممحاة 7: Keyboard.press ('e') ؛ Serial.print ("الإدخال") ؛ Serial.println (دبوس) ؛ تأخير (200) ؛ Keyboard.releaseAll () ؛ استراحة؛ // Lasso case 8: Keyboard.press ('l') ؛ Serial.print ("الإدخال") ؛ Serial.println (دبوس) ؛ تأخير (200) ؛ Keyboard.releaseAll () ؛ استراحة؛ // حفظ الحالة 9: Keyboard.press (ctrlKey) ؛ Keyboard.print ('s') ؛ Serial.print ("الإدخال") ؛ Serial.println (دبوس) ؛ تأخير (200) ؛ Keyboard.releaseAll () ؛ استراحة؛ الافتراضي: Keyboard.releaseAll () ؛ استراحة؛ }}

حلقة فارغة() {

// ضع الكود الرئيسي هنا ، للتشغيل بشكل متكرر:

لـ (int i = أزرار [0] ؛ i <sizeof (أزرار) / sizeof (أزرار [0]) + أزرار [0] ؛ ++ i) {if (readButton (i)) {doAction (i) ؛ }} // إعادة تعيين المعدلات Keyboard.releaseAll () ؛

}

إنها مباشرة إلى حد ما. لجعل الكمبيوتر يتعرف على الزر ، اضغط على مفتاح الضغط ، نستخدم ببساطة وظيفة Keyboard.press (). لتنشيط اختصار Undo (ctrl + z) ، نستخدم ببساطة Keyboard.press (ctrlKey) ثم Keyboard.press ('z'). تذكر أنك ستحتاج إلى تضمين Keyboard.h وتهيئة لوحة المفاتيح للوصول إلى هذه الوظائف.

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

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

إذا كنت تريد أن تقوم الأزرار بعمل أشياء مختلفة ، أو تريد إضافة المزيد من الأزرار ، فما عليك سوى تحرير محتويات وظيفة doAction!

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

فقط قم بتوصيل الأزرار الخاصة بك ببعض المقاومات 10k ، ويجب أن تكون ذهبيًا!

الخطوة 3: مقياس الجهد

مقياس الجهد
مقياس الجهد

الآن على مقياس الضغط:

#يشمل

طلب int0 = 0 ؛ إعداد باطل () {// ضع كود الإعداد هنا ، للتشغيل مرة واحدة: Serial.begin (9600)؛ Keyboard.begin () ، // Dials dial0 = analogRead (0) ؛ Dial0 = الخريطة (رقم الطلب 0 ، 0 ، 1023 ، 1 ، 20) ؛ } طلب فارغ (طلب داخلي ، int newVal ، int lastVal) {switch (dial) {// Opacity case 0: delay (200)؛ if (newVal! = lastVal) {int decim = ((newVal * 5) / 10) ؛ وحدة int = ((newVal * 5)٪ 10) ؛ إذا (newVal == 20) {Keyboard.write (48 + 0) ؛ Keyboard.write (48 + 0) ؛ Serial.println ("أقصى طلب 1") ؛ } else {decim = constrain (decim، 0، 9)؛ الوحدة = قيد (الوحدة ، 0 ، 9) ؛ Serial.println (newVal * 2) ؛ Keyboard.write (48 + ديسيم) ؛ لوحة المفاتيح والكتابة (48 + وحدة) ؛ }} dial0 = newVal ؛ استراحة؛ الافتراضي: كسر ؛ }} // ------------------ الحلقة الرئيسية ------------------------- باطلة loop () {// ضع الكود الرئيسي هنا ، للتشغيل بشكل متكرر: // Opacity // delay (500)؛ int val0 = analogRead (0) ؛ val0 = خريطة (val0 ، 0 ، 1023 ، 1 ، 20) ؛ //Serial.print ("dial0:") ؛ //Serial.println(val0) ؛ if (val0! = dial0) {// افعل شيئًا dialAction (0، val0، dial0) ؛ }}

يتبع مقياس الضغط نفس المنطق ، لكنه أصعب قليلاً.

دعنا أولاً نلقي نظرة على الطريقة التي نريد أن يعمل بها: يحتوي Photoshop على بعض الاختصارات المفيدة لتغيير عتامة الفرشاة. إذا ضغطت على أي مفتاح num ، فإن العتامة ستساوي هذا الرقم * 10. ولكن إذا ضغطت على رقمين ، فسيقرأ الرقم الثاني كوحدة ، مما يمنحك تحكمًا أكثر دقة.

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

هناك مشكلة أخرى سنواجهها وهي كيفية تحويل عملية إرجاع analogRead كمدخل. نظرًا لعدم وجود طريقة سهلة لتحويل int إلى سلسلة ، سيتعين علينا استخدام int نفسها. ومع ذلك ، إذا قمت ببساطة بكتابة Keyboard.press (int) ، فستلاحظ أن الإدخال لن يكون كما تريد ، وبدلاً من ذلك سيتم الضغط على مفتاح آخر.

هذا لأن مفاتيح لوحة المفاتيح الخاصة بك كلها مشفرة كأعداد صحيحة ، ولكل مفتاح فهرس خاص به. لاستخدام مفتاح num بشكل صحيح ، سيتعين عليك البحث عن فهرسهم في جدول ASCII:

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

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

لتوصيل مقياس الجهد ، ما عليك سوى توصيل سلك 5 فولت وسلك أرضي وسلك إدخال تناظري ولا ينبغي أن تكون هناك أي مشاكل.

حقيقة ممتعة: إذا استخدمت هذا الاختصار أثناء تحديد أداة مثل Lasso ، فسيؤدي ذلك إلى تغيير عتامة الطبقة بدلاً من ذلك. شيء لتدوينه.

الخطوة 4: جهاز التشفير الروتاري

التشفير الروتاري
التشفير الروتاري

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

#يشمل

// المشفر الدوراني # تعريف الإخراج A 15 # إخراج تحديد B 14 int العداد = 0 ؛ الدولة الدولية int aLastState؛ إعداد باطل () {// ضع كود الإعداد هنا ، للتشغيل مرة واحدة: // Rotary pinMode (outputA، INPUT)؛ pinMode (الإخراج ، المدخلات) ؛ // يقرأ الحالة الأولية للمخرجات aLastState = digitalRead (outputA) ؛ } void rotaryAction (int dir) {if (dir> 0) {Keyboard.press (']')؛ } else {Keyboard.press ('[')؛ } Keyboard.releaseAll () ، } // ------------------ الحلقة الرئيسية ------------------------- حلقة فارغة () {// ضع الكود الرئيسي هنا ، للتشغيل بشكل متكرر: // Size aState = digitalRead (outputA)؛ if (aState! = aLastState) {if (digitalRead (outputB)! = aState) {// counter ++؛ عمل دوار (1) ؛ } else {// counter -؛ عمل دوار (-1) ؛ } //Serial.print("Position: ")؛ //Serial.println(counter) ؛ } aLastState = دولة ؛ }

بشكل افتراضي ، تعمل اختصارات Photoshop] و [على زيادة حجم الفرشاة وتقليله. تمامًا كما كان من قبل ، نريد إدخالها كضغطات على المفاتيح. يرسل المشفر عددًا من المدخلات في كل دورة (والتي تعتمد على النموذج) ، ونريد زيادة / تقليل حجم الفرشاة لكل من هذه المدخلات ، حتى تتمكن من رفع أو خفض الطلب بسرعة كبيرة ، ولكن أيضًا تكون قادرًا على السيطرة عليها ببطء وبدقة كبيرة.

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

ثم بناءً على الاتجاه ، نضغط على المفتاح الصحيح.

طالما لم تكن لديك مشكلات في الاتصال ، فيجب أن تعمل.

الخطوة 5: وضع كل ذلك معًا

ضع كل شيء معا
ضع كل شيء معا
ضع كل شيء معا
ضع كل شيء معا
ضع كل شيء معا
ضع كل شيء معا

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

أخيرًا ، قد ترغب في تقديم حالة لطيفة لصديقك الجديد في Photoshop. واحد أفضل من لي ، على الأقل!

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

الخطوة 6: الرمز + العرض التوضيحي

Image
Image

تأكد من اختبار برنامج لوحة التحكم أثناء تقدمك في المشروع لتجنب المفاجآت!

إليك الكود الكامل:

شكرا جزيلا لقراءتك!

موصى به: