4095 مصابيح LED وكل شيء الكلوالمثير للدهشة أن وحدة تحكم ATmega328 ، التي تكمن وراء Arduino Uno ، تتواءم مع إخراج الصورة على مثل هذه الشاشة. كل شيء تبين أنه وحدة تحكم "جيب" (تزن عدة كيلوغرامات) ، حيث تم خياطة لعبة تعتمد على Space Invaders. الخطط للخروج بشيء آخر ، لأن هناك الكثير من الذاكرة المتبقية.
تحت القطع يمكنك أن تقرأ عن كيفية ترتيب مثل هذه الشاشة وكيف يمكن التحكم بها.
في بعض الأحيان ، بدلاً من العثور على
أجهزة كمبيوتر قديمة في المجموعة ، أصنعها بنفسي من
مواد مرتجلة .
هذه المرة ، أردت أن أفعل شيئًا مضغوطًا بدقة على مستوى وحدات التحكم وأجهزة الكمبيوتر في أوائل الثمانينيات. صحيح أن شاشة 64 × 64 بكسل لا تصل إلى Atari 2600 ، ولكن بما يصل إلى 64 بكسل أكثر من شاشة Nokia 3310 ، حيث كانت هناك ألعاب أيضًا. لذلك كان يجب أن يكون كافيا مع هامش على الأقل للعب مريح من تتريس أو بونغ.
بالإضافة إلى الشاشة ، حصلت على لوحة متوافقة مع Arduino Uno ، وبدأت أفكر في كيفية الطيران مع كل هذه الأشياء.
تبيع
Adafruit مثل هذه الشاشات ويمكنك العثور على
أمثلة على استخدامها على موقعها على الإنترنت. كما يوجد رابط
للمكتبة للعمل معهم. تدعم المكتبة Arduino Uno و Arduino Mega.
تنظم هذه المكتبة ذاكرة الفيديو ، حيث تقوم بتخزين ألوان البكسل. يقوم برنامج المستخدم بإعادة طلاء وحدات البكسل هذه ، ويتم عرض الصورة في معالج مقاطعة المؤقت. مع الشاشات الصغيرة ، يعمل هذا بشكل جيد ، ولكن في حالتي هذه الطريقة ليست جيدة. حتى إذا تم تخصيص نصف بايت لكل بكسل (بت واحد لكل R ، G ، B وواحد إضافي) ، عندئذٍ بالنسبة لمصفوفة 64x64 ، ستكون هناك حاجة إلى 2 كيلوبايت من الذاكرة. وهذا كل ما لدى ATmega328P. يمكنك بالطبع أن تأخذ معالجًا أكثر قوة ، لكن هذه ليست طريقة Jedi.
بعد كل شيء ، من الذي يجبرنا على تخزين جميع خطوط الشاشة في وقت واحد؟ يمكنك إعادة حساب كل سطر قبل عرضه. بالنسبة للرسومات البدائية من العديد من النقوش المتحركة ، يجب ألا تستغرق هذه الحسابات الكثير من الوقت ، لذلك يجب أن يعمل كل شيء.
كان في
غابة مدرسة كمبيوتر صيفية ، وكان كسولًا للغاية للبحث عن وثائق حول الدوائر المصغرة وتتبع اللوحة لفهم ما كان متصلاً. لذلك ، اخترت الخوارزمية للعمل مع العرض من المكتبات التي تم تنزيلها مسبقًا:
- اضبط عنوان خط الإخراج عند مدخلات الشاشة
- املأ المصفوفة بألوان بكسل العفريت التي تتقاطع مع الصف الحالي.
- نبدل بدوره جميع وحدات البكسل في سجل المناوبات ، الذي يتحكم في مصابيح LED
- نضغط على البيانات المستلمة ونقدمها إلى مخرجات السجلات
ونتيجة لذلك ، يتم تحديد مصفوفة بحجم أربعة أسطر فقط من الشاشة لذاكرة الفيديو. لماذا أربعة؟ هذا لأنه في نفس الوقت ندفع البيانات في صفين - لأن المصفوفة تحتوي على مجموعتين من المدخلات: R1 / G1 / B1 و R2 / G2 / B2. يتحكمون في خطين متباعدين 16 بكسل.
ولكن لماذا لا خطين ، ولكن أربعة؟ اتضح أن مصفوفة 64x64 تتكون من مصفوفتين مستقلتين 32x64. سيكون من الممكن توصيل مخرجات المعالج المنفصلة بكل منها ، لكن ATmega328 ليس لديه ما يكفي. لحسن الحظ ، قدمت الشركة المصنعة رعاية لتتالي هذه المصفوفات - يمكن توصيل ناتج سجل المناوبة لإحدى المدخلات بمدخلات أخرى. ثم نحصل على المصفوفة المنطقية 32x128 ، والتي يتم عرضها فعليًا على أنها 64x64. أي أنه في كل مرحلة نحتاج إلى دفع خطين من 128 بكسل في السجلات - وهذا هو 4 خطوط من الشاشة المادية.

لقد صنعنا نموذجًا أوليًا لوحدة التحكم خلال مدرسة الكمبيوتر الصيفية. كانت اللعبة الأولى شيئًا يشبه عن بعد
غزاة الفضاء .
في الواقع ، أحرقت مصابيح LED عيونهم حقًا. من غير المحتمل أن تتمكن من ضبط سطوعها باستخدام PWM - ATmega ليس لديها سرعة كافية. نحن بحاجة إلى اتخاذ نوع من ARM أو FPGA.
النسخة النهائية التي صممتها في حالة خشبية. الشاشة محمية بواسطة زجاج شبكي رملي. بسبب تشتت الضوء ، لم تعد العيون محترقة ، ولكن الآن أصبح من الصعب تسجيل عمل وحدة التحكم على الفيديو - تصبح الصورة بأكملها غير واضحة.
يستخدم البرنامج بأكمله 1101 بايت (53٪) من ذاكرة الوصول العشوائي و 6432 (19٪) بايت من ROM. لا يزال هناك مجال لعمل العديد من الألعاب والقوائم لاختيارهم.
المراجع- مصادر المشروع: github.com/Dovgalyuk/BackspaceInvaders
- وصف المصفوفة على adafruit: learn.adafruit.com/32x16-32x32-rgb-led-matrix
- مكتبة إدارة مصفوفة Adafruit: github.com/adafruit/RGB-matrix-Panel
- مكتبة Adafruit لرسم البدائيين الرسم: github.com/adafruit/Adafruit-GFX-Library
- مشروع مماثل على معالج أكثر قوة: Learn.adafruit.com/ledgames-beaglebone-black-64x64-led-game/overview
- المقالة حول إدارة عرض أصغر: geektimes.ru/post/275548