مقدمة
تبدأ القصة بحقيقة أنه قبل نصف عام اشتريت مضخم صوت Yamaha A-S501.

وشملت كان جهاز التحكم عن بعد التي يمكن التحكم في كل من مكبر للصوت ومشغل الأقراص المدمجة ياماها ، وهو ما لم يكن لدي بطبيعة الحال. لذلك ، لم يتم استخدام معظم الأزرار الموجودة على جهاز التحكم عن بُعد. وبشكل عام ، لم تكن وحدة التحكم نفسها ضرورية ، وكانت دائمًا على الرف.
ومع ذلك ، نظرت إليه ، كنت مسكونًا بفكرة استخدام جهاز التحكم عن بُعد إلى أقصى حد. على سبيل المثال ، قد يكون من المناسب الاستلقاء على الأريكة ومشاهدة فيلم ، والرجوع بحركة سريعة لليد ، وإيقافه مؤقتًا ، إلخ. بالطبع ، لهذه الأغراض ، كنت أستخدم التطبيقات على هاتفي الذكي للتحكم في برامج MPC-HC و Foobar2000 ، لكن جهاز التحكم عن بعد سيكون أسرع وأكثر ملاءمة.
كما يقولون ، عيون خائفة ، والأيدي تفعل. مع اختيار التكنولوجيا ، كان كل شيء واضحًا على الفور. اردوينو - أردت منذ فترة طويلة اللعب معها ، وهذه مجرد فرصة رائعة. بالنسبة لمعالج الأزرار ، Node.js ، لأن أنا متخصص في جافا سكريبت ، ولم أرغب في تبديل السياق.
وهكذا ، دعنا نذهب ...
حلول جاهزة
واحدة من نظائرها الموجودة التي يمكن أن أجدها هي Flirc . باستخدامه ، يمكنك محاكاة ضغطات المفاتيح على لوحة المفاتيح الفعلية للكمبيوتر.

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





كنت بحاجة:
- في الواقع ، فإن مجلس اردوينو أونو نفسه. تجدر الإشارة إلى أن هذه ليست اللوحة الأصلية ، ولكن نوع من استنساخ البولندية. وفقا لوصف - أنها تشبه تماما الأصلي. (27.90 ذل)
- مستقبل الأشعة تحت الحمراء VS1838B HX1838 (الجهد: 3.3–5 فولت ، التردد: 38 كيلو هرتز ، الزاوية: 90 درجة) (1.30 ذل)
- نماذج مجلس + الأسلاك (13.90 ذل)
- لوحة فارغة لحام كل شيء (2.10 ذل)
- موصلات لوحات التوصيل (2،51 ذل)
المجموع: 47،71 ذل (≈ 14 دولار)
البرمجيات
أثناء انتظار التسليم ، بدأت في كتابة "برنامج تشغيل" ، والذي يجب أن يقرأ البيانات من المنفذ التسلسلي من Arduino ويقوم بتنفيذ إجراءات معينة للضغط على الزر الموجود في جهاز التحكم عن بُعد.
كانت الفكرة أن تكون قادرًا على تخصيص كل شيء وكل شيء. يمكن تعيين كل زر على جهاز التحكم عن بعد إجراءات معينة من عدة أنواع:
{ "key": "space" }
- تشغيل برنامج تعسفي مع المعلمات:
{ "exec": ["c:\\Program Files (x86)\\foobar2000\\foobar2000.exe", "/play"] }
{ "if": { "running": "mpc-hc.exe" }, "then": [ ... ], "else": [ ... ] }
كل نوع له معالج خاص به ، والذي له نفس واجهة برمجة التطبيقات ، وبالتالي كان من الممكن تقسيم كل شيء إلى حلقة بسيطة تبدأ كل المعالجات في التسلسل.
const runHandlers = require('./handlers') module.exports = async function run(actions) { if (!Array.isArray(actions)) { actions = [actions] } for (const act of actions) { await runHandlers(act) } }
بدلاً من ألف كلمة توثيق ، تخبرك الاختبارات بكل شيء:
run when "exec" action √ executes the specified file without args (as array) (4ms) √ executes the specified file without args (as string) (1ms) √ executes the specified file with args √ rejects if "exec" has wrong type (5ms) when "key" action √ sends the specified key press if passed string (1ms) √ sends the specified key combination if passed array √ rejects if "key" has wrong type (1ms) when "if" action √ rejects if no "then" (1ms) √ rejects if operator is not supported when operator if "running" √ runs "then" actions if the condition is true (1ms) √ runs "else" actions if the condition is false √ does not run anything if the condition is false and no "else" statement (1ms) when multiple actions √ executes all actions (1ms) when multiple actions are mixed into one √ runs only first one alphabetically
يبقى أن ننتظر التفاصيل العزيزة.
حديد
أعترف ، لم أخترع شيئًا جديدًا ، لقد تم كل شيء بالفعل. أنا فقط استخدم الرسم التخطيطي الجاهز من المقال كيفية إعداد جهاز تحكم عن بعد IR وجهاز استقبال على Arduino .
المخطط بسيط للغاية:

في الممارسة العملية:


إدراج
أنا أيضا استعارت بصراحة البرامج الثابتة من هذه المقالة ، لأنها ستحتاج إلى مكتبة IRremote Arduino .
لقد استبدلت رموز الأزرار بالكود الفعلي من جهاز التحكم عن بُعد:
void loop() { if (irrecv.decode(&results)) { if (results.value == 0xFFFFFFFF) { results.value = key_value; } switch (results.value) { case 0x9E6140BF: Serial.println("play"); break; case 0x9E61AA55: Serial.println("pause"); break; case 0x5EA1A857: Serial.println("cd"); break; default: Serial.println(results.value, HEX); break; } key_value = results.value; irrecv.resume(); } }

بمجرد ظهور أسماء الأزرار المضغوطة في نافذة Monitor Monitor (منفذ الشاشة) في Arduino IDE ، كان من الضروري إضافة مكون للعمل مع المنفذ التسلسلي إلى برنامج التشغيل.
كانت النتيجة عبارة عن غلاف على مكتبة المنفذ التسلسلي ، وفي الواقع ، دفق البيانات من المنفذ:
const SerialPort = require('serialport') module.exports = class SerialPortReader { constructor(port) { const serialPort = new SerialPort(port) this.lineStream = serialPort.pipe(new SerialPort.parsers.Readline()) } start(handler) { this.lineStream.on('readable', () => { const data = this.lineStream.read().trim() handler(data) }) } }
في وقت لاحق ، كانت هناك حاجة لتحويل المعالجات إلى وظيفة "ارتداد" ، لأن جهاز التحكم عن بُعد يتلقى إشارة متكررة بسرعة ، والتي حتى مع الضغط على الزر ، يمكن أن تنفجر عدة مرات. ومع ذلك ، فإن إزالة مثل هذا الخيار لجميع الأزرار أيضًا غير مناسب تمامًا ، على سبيل المثال ، لوحدة التخزين.
يبدو الرمز النهائي كالتالي:
const debounce = require('debounce') const settings = require('./lib/settings') const run = require('./lib/run') const SerialPortReader = require('./lib/SerialPortReader') const simpleHandle = async button => { const actions = settings.mappings[button] if (!actions) { console.warn(`Action not found for remote control button "${button}"`) return } try { await run(actions) } catch (e) { console.error(e.message) process.exit(1) } } const debouncedHandle = debounce(simpleHandle, settings.debounceDelay, true) const callHandleFn = button => { return (settings.noDebounce.includes(button) ? simpleHandle : debouncedHandle)(button) } const reader = new SerialPortReader(settings.serialPort) reader.start(callHandleFn)
إنشاء مجلس مستقل
بعد التأكد من عمل النموذج الأولي ، شرعت في إنشاء لوحة. تجدر الإشارة إلى أن هذه هي أول تجربة لي في مثل هذه الأمور. لم يكن لدي مكواة لحام مناسبة مع إبرة صغيرة - فقط السوفييت الكبير القديم بسلك مشدود.
مع الحزن في النصف ، تمكنت من لحام "الساقين" (من الموصلات الكبيرة من 8 دبابيس ، نجا فقط 2 دبابيس). كل شيء آخر كان أسهل.

(ملتوية. على الأرجح بسبب استنساخ اردوينو. الأعشاش غير متكافئة بالنسبة لبعضها البعض.)

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


نتيجة لذلك: جهاز يعمل بشكل كامل وبرنامج مقابل 14 دولارًا أمريكيًا. الخبرة المكتسبة وفرحة العمل المنجز والنتيجة لا تقدر بثمن! :-)
شكرا لاهتمامكم!
التجريبي:
المصادر في جيثب .
سكرتير خاص شكرا ramanchik 'u للتشاور :)