وحدة التحكم في الألعاب على الاردوينو. تطوير ألعاب لوحدة تحكم تعتمد على الاردوينو باستخدام Unity. وظائف الرسومات الأساسية

💖 هل يعجبك؟شارك الرابط مع أصدقائك

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

خطة عمل

1. التعامل مع المكتبة
2. قم بلحام لوحة إخراج الفيديو
3. اكتب الكود
4. قطع الجسم

العنصر الخارجي النهائي ليس مهما بشكل خاص في حالة مثل هذه المشاريع.

الخطوة 1. دعونا نكتشف ما هو

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

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

وظائف المكتبة المطلوبة

وظائف ضبط الوضع

وظيفة يبدأ()تهيئة إخراج الفيديو (دقة الشاشة الافتراضية 128 × 96).
بناء الجملة:
TVOut.begin(mode);
TVOut.begin(mode, x, y);

خيارات:
الوضع - إشارة الفيديو القياسية:
_PAL - وضع PAL؛
_NTSC – وضع NTSC.
قيمة الإرجاع:
0 - في حالة الاتصال الناجح، 4 - في حالة الفشل (لا توجد ذاكرة كافية للمخزن المؤقت للإخراج).

وظائف التأخير

وظيفة تأخير()يؤخر صورة الإخراج.
بناء الجملة:

TVOut.delay(ms);
خيارات:

ms - تأخير بالمللي ثانية بدقة: 20 مللي ثانية لـ PAL و16 مللي ثانية لـ NTSC.

تقوم الدالة Delay_frame() بتأخير الصورة المعروضة.
بناء الجملة:

TVOut.delay_frame(frames);
خيارات:

الإطارات - عدد الإطارات للتأخير...
تعد هذه الميزة مفيدة لتقليل أو إزالة وميض الشاشة الناتج عن تحديثات الشاشة.

وظائف للحصول على المعلمات

وظيفة ساعة ()إرجاع دقة الشاشة الأفقية.
بناء الجملة:

TVOut.hrs();
خيارات:

لا.
قيمة الإرجاع:

حرف غير موقع - دقة الشاشة الأفقية.

تقوم الدالة vres() بإرجاع الدقة الرأسية للشاشة.
بناء الجملة:

TVOut.vres();
خيارات:

لا.
قيمة الإرجاع:

حرف غير موقع - دقة الشاشة العمودية.

وظيفة char_line()تقوم بإرجاع الحد الأقصى لعدد الأحرف الممكنة في سطر واحد عند عرض معلومات نصية.
بناء الجملة:

انقطع التلفاز. char_line();
خيارات:

لا.
قيمة الإرجاع:

حرف غير موقع - عدد الأحرف.

وظائف الرسومات الأساسية

وظيفة set_pixel()يضبط لون بكسل الشاشة عند نقطة ذات إحداثيات معينة.
بناء الجملة:

TVOut.set_pixel(x,y,color);
خيارات:

س، ص - إحداثيات البكسل؛
اللون - لون البكسل:
0 - أسود؛
1 - أبيض.
2- عكس اللون .
وظيفة get_pixel()يحصل على لون بكسل الشاشة من نقطة ذات إحداثيات معينة.
بناء الجملة:

TVOut.get_pixel(x,y);
خيارات:

س، ص – إحداثيات بكسل.
قيمة الإرجاع:

اللون - لون البكسل:
0 - أسود؛
1 - أبيض.
2- عكس اللون .
تقوم الدالة fill() بملء الشاشة باللون المحدد.
بناء الجملة:

TVOut.fill(color);
خيارات:

اللون - لون التعبئة:
0 - أسود؛
1 - أبيض.
2- عكس اللون .
وظيفة شاشة واضحة()مسح الشاشة عن طريق ملئها باللون المحدد.
بناء الجملة:

TVOut.clear_screen(color);
خيارات:

اللون - لون التعبئة:
0 - أسود؛
1 - أبيض.
2- عكس اللون .

وظيفة عكس()يعكس محتوى الشاشة.
بناء الجملة:

TVOut.invert();
خيارات:

لا.
تعمل الدالة Shift_direction() على تغيير محتويات الشاشة.
بناء الجملة:

TVOut.shift_direction(distance, Direction);
خيارات:

المسافة - المسافة لتحويل محتوى الشاشة.
الاتجاه - اتجاه التحول:
أعلى=0 - أعلى؛
أسفل = 1 – أسفل؛
يسار = 2 - يسار؛
اليمين = 3 - إلى اليمين.

وظيفة ارسم خطا()يربط نقطتين على الشاشة بخط.
بناء الجملة:

TVOut.draw_line(x0,y0,x1,y1,color);
خيارات:

x0,y0 – إحداثيات النقطة الأولى؛
x1,y1 – إحداثيات النقطة الثانية؛
اللون - لون التعبئة:
0 - أسود؛
1 - أبيض.
2- عكس اللون .
وظيفة draw_row()تعبئة خط باللون المحدد بين نقطتين على الخط.
بناء الجملة:

TVOut.draw_row(row,x0,x1,color);
خيارات:

صف - الإحداثيات العمودية للصف؛
x1,x2 – الإحداثيات الأفقية لنقاط الخط؛
اللون - لون التعبئة:
0 - أسود؛
1 - أبيض.
2- عكس اللون .
تقوم الدالة draw_column() بملء صف باللون المحدد بين نقطتين في العمود.
بناء الجملة:

TVOut.draw_column(column,y0,y1,color);
خيارات:

العمود – الإحداثيات الأفقية للعمود؛
y1,y2 – الإحداثيات الرأسية لنقاط العمود؛
اللون - لون التعبئة:
0 - أسود؛
1 - أبيض.
2- عكس اللون .
وظيفة draw_rect()رسم مستطيل على الشاشة.
بناء الجملة:

TVOut.draw_rect(x,y,w,h,color);
TVOut.draw_rect(x,y,w,h,color,fillcolor);

خيارات:

x,y – إحداثيات النقطة العلوية اليسرى;
w,h - عرض وارتفاع المستطيل الذي يتم رسمه؛
اللون – لون حدود المستطيل:
0 - أسود؛
1 - أبيض.
2- عكس اللون .
fillcolor - لون تعبئة المستطيل:
0 - أسود؛
1 - أبيض.
2- عكس اللون .
وظيفة رسم دائرة()يرسم دائرة على الشاشة.
بناء الجملة:

TVOut.draw_circle(x,y,r,color);
TVOut.draw_circle(x,y,r,color,fillcolor);

خيارات:

x,y – إحداثيات مركز الدائرة;
ص - نصف قطر الدائرة؛
اللون - لون حدود الدائرة:
0 - أسود؛
1 - أبيض.
2- عكس اللون .
fillcolor – لون تعبئة الدائرة:
0 - أسود؛
1 - أبيض.
2- عكس اللون .
وظيفة الصورة النقطية ()يعرض صورة نقطية على الشاشة.
بناء الجملة:

TVOut.bitmap(x,y,bmp,w,h);
خيارات:

x,y – إحداثيات الزاوية اليسرى العليا لنقطة الإخراج;
bmp - مؤشر إلى مصفوفة الذاكرة حيث يتم تخزين الصورة؛
w,h – عرض وارتفاع الصورة المعروضة;
أدناه سنلقي نظرة على عملية إنشاء التعليمات البرمجية لإخراج الصور النقطية.

وظائف إخراج المعلومات النصية

لاستخدام وظائف إخراج المعلومات النصية، تحتاج إلى توصيل الملفات المضمنة في المكتبة أو الخطوط المخصصة. لتوصيل مجموعة مخصصة من الخطوط، تحتاج إلى تضمين ملف الرأس في الرسم:
#يشمل
تتضمن المكتبة مجموعات الخطوط التالية:

Font4x6;
Font6x8;
Font8x8;
Font8x8ext.
وظيفة حدد_الخط ()تحديد خط لعرض المعلومات النصية.
بناء الجملة:

TVOut.select_font(font);
خيارات:

الخط - الخط المضمن في الرسم.

تقوم الدالة print_char() بطباعة حرف على الشاشة.
بناء الجملة:

TVOut.print_char(x,y,char);
خيارات:

x,y - الموضع على الشاشة لعرض الرمز؛
شار – حرف من الخط الحالي.

وظيفة set_cursor()يضبط موضع المؤشر لعرض المعلومات النصية على الشاشة.
بناء الجملة:

TVOut.set_cursor(x,y);
خيارات:

x,y – إحداثيات المؤشر.
وظيفة مطبعة()يعرض سلسلة أو حرف أو رقم.
بناء الجملة:

TVOut.print(x,y,string);
TVOut.print(x,y,char,base);
TVOut.print(x,y,int,base).

خيارات:

س، ص – إحداثيات المؤشر.
قاعدة - تنسيق الإخراج:
بايت = 0؛
ديسمبر = 10 (افتراضي)؛
سداسي عشري = 16.

وظيفة برينتلن ()يعرض سلسلة أو حرفًا أو رقمًا متبوعًا بحرف السطر الجديد:
بناء الجملة:

TVOut.println(x,y,string);
TVOut.println(x,y,char,base);
TVOut.println(x,y,int,base).

خيارات:

س، ص – إحداثيات المؤشر.
قاعدة - تنسيق الإخراج:
بايت = 0؛
ديسمبر = 10 (افتراضي)؛
سداسي عشري = 16.

ميزات إخراج الصوت

تتيح لك وظائف إخراج الصوت إرسال إشارة تردد محددة إلى جهاز التلفزيون الخاص بك من خلال إخراج الصوت.
وظيفة نغمة()ينتج إشارة صوتية بتردد معين.
بناء الجملة:

TVOut.tone(التردد,المدة);
TVOut.tone (التردد).

خيارات:

التردد – تردد الإشارة الصوتية؛
المدة - مدة الإشارة.
وظيفة ليس واحد()يوقف إخراج الصوت.
بناء الجملة:

TVOut.noTone().

الخطوة 2. لحام إخراج الفيديو

أولاً، نحتاج إلى لحام لوحة معينة لإخراج إشارة فيديو من خلال مخرج AV مركب (RCA). نحن نلحم وفقًا للمخطط التالي:


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

الخطوة 3. اكتب الكود (اللعبة)

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

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

يبدأ. ارسم خطًا في منتصف الشاشة باستخدام TV.draw_line(60,0,60,96,1);. تظهر الكرة بالضبط في وسط الشاشة. دعونا نكتب وظيفة حركتها حركة الكرة الفارغة (int vel، int angle). التثبيت باستخدام TV.set_pixel(x,y,1);لقد قمت بتسمية المتغيرات بهذه الطريقة.

بعد ذلك، قبل التعامل مع الكرة، نحدد تحديث الشاشة، أو بالأحرى، بحيث لا "ترث" الكرة على الشاشة، لذلك عند الانتقال إلى الموضع التالي، تحتاج إلى طلاء الموضع السابق باللون الأسود. للقيام بذلك، علينا أن نكتب قبل كل شيء آخر TV.set_pixel(x,y,0);. بعد كل التغييرات في متغيرات الإحداثيات، تحتاج إلى تحديد إعداد الموضع وتأخير قصير - تأخير التلفزيون (50)؛. يجب أن يبدو مثل هذا:

حركة الكرة الفارغة (int vel، int angle) ( TV.set_pixel(x,y,0); // التلاعب بالإحداثيات TV.set_pixel(x,y,1); )

الآن حول الإحداثيات تتغير نفسها. مجموعها ثمانية اتجاهات (1-8) متغيرة زاوية كثافة العمليات. وبعد ذلك ببساطة، اعتمادًا على الدوران، نطرح أو نضيف إلى المتغيرات أي جزء منها سرعة كثافة العمليات. انا فعلت هذا:

إذا (الزاوية == 1) ( y -= السرعة؛ ) إذا (الزاوية == 3) ( x += السرعة؛ ) إذا (الزاوية == 5) ( y += السرعة؛ ) إذا (الزاوية == 7) ( x -= vel; ) if(angle == 2) ( x += round(vel/2); y -= round(vel/2); ) if(angle == 4) ( x += round(vel/ 2); y += round(vel/2); ) if(angle == 6) ( x -= round(vel/2); y += round(vel/2); ) if(angle == 8) ( س - = جولة (فيل / 2)؛ ص - = جولة (فيل / 2)؛ )

الآن حركات المضرب. وهنا توضيح مهم - لقد استخدمت الإحداثيات فقط وفقا ل ذ، حيث أن مواضع المضارب هي سلا تغير. نكتب الدالة التالية حركة المضارب الباطلة (). بعد ذلك نرسم المضارب والمتغيرات كثافة العمليات yb1, إنت yb2, TV.draw_line(10, سن1+8, 10, سن1-8, 1);و TV.draw_line(110, سن2+8, 110, سن2-8, 1);. تحديث الشاشة، أي "بدون أثر"، يشبه حالة الكرة.

يتم التحكم في المضارب باستخدام الأزرار. ربط الأزرار والدبابيس 2 و 3 - المضرب الأول، 4 و 5 - المضرب الثاني . نتحقق من الضغط على الزر ونغير الإحداثيات.

ها هي الوظيفة:

مضرب باطلة() ( TV.draw_line(10, yb1+8, 10, yb1-8, 0); TV.draw_line(110, yb2+8, 110, yb2-8, 0); if((yb1 - 8) > 1) ( if(digitalRead(2) == HIGH) ( yb1 -= 2;)) ) if((yb1 + 8)< 95) { if(digitalRead(3) == HIGH) {yb1 += 2;} } if((yb2 - 8) >1) ( if(digitalRead(4) == HIGH) (yb2 -= 2; ) ) if((yb2 + 8)< 95) { if(digitalRead(5) == HIGH) {yb2 += 2;} } TV.draw_line(10, yb1+8, 10, yb1-8, 1); TV.draw_line(110, yb2+8, 110, yb2-8, 1); }

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

زاوية الانعكاس تساوي زاوية السقوط

يمكن إجراء بعض الاستثناءات المادية لمناطق معينة من المضارب.

باطلة ballcol() ( إذا (x == 1 || x == 119 || (x == 10 && y< (yb1 + 3) && y > < (yb2 + 3) && y > < (yb1 - 3) && y >(yb1 - 8)) ( a = 2; ) if(x == 10 && y > (yb1 + 3) && y< (yb1 + 8)) { a = 4; } if(x == 110 && y < (yb2 - 3) && y >(yb2 - 8)) ( a = 8; ) if(x == 110 && y > (yb2 + 3) && y< (yb2 + 8)) { a = 6; } if(y == 95 || y == 1) { if(a==1){a=5;}else if(a==2){a=4;}else if(a==3){a=7;}else if(a==4){a=2;}else if(a==5){a=1;}else if(a==6){a=8;}else if(a==7){a=3;}else if(a==8){a=6;} } }

انتهى الجزء الأصعب، يمكنك التنفس بنجاح.

في الوقت الحالي، كل ما علينا فعله هو إنشاء نظام تسجيل ومؤقت وإعادة التشغيل.

لنبدأ مع الموقت. هناك متغير ثانية تعويم نهاية الخبر(يتم تخزينه على الاطلاق في كل وقت)، متغير كثافة العمليات تم(عدد الدقائق التي نحصل عليها من نهاية الخبر). قم بتعيين القيمة tmعملية تم = نهاية الخبر/60;. وعرض القيم على الشاشة، TV.print(81,1,tm); TV.print(97,1"،"); TV.print(100,1,int(ts-(tm*60)));.

فلنكمل. نحن نسمي وظيفة إعادة التشغيل إعادة تشغيل باطلة (). هنا نعيد القيم الأصلية للمتغيرات.

إعادة تشغيل باطلة () ( TV.clear_screen ()؛ x = 60؛ y = 48؛ yb1 = 48؛ yb2 = 48؛ a = 8؛ ts = 900.0؛ c1 = 0؛ c2 = 0؛ )

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

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

عدد الكرات الباطلة () ( إذا (x == 1) ( c2++؛ ) إذا (x == 119) ( c1++؛ ) إذا (c1 >< c2 && ts == 0) { TV.println(10, 45, "Player 2 won!"); delay(10000); restart(); } else if(c1 == c2 && ts == 0) { TV.println(10, 45, "You are equal"); delay(10000); restart(); }

هذا كل شيء، أيها الأصدقاء، لقد كتبنا رمز اللعبة بالكامل. اتضح أنه مضحك للغاية ويمكنك اللعب.


بالنسبة للكسالى، سأكتب فقط كل التعليمات البرمجية.

السيناريو الكامل

هناك 218 سطرًا في المجموع. #يشمل #يشمل تلفزيون TVout؛ int x, y, a, c1, c2, yb1, yb2, tm, tsh, s; تعويم نهاية الخبر. توقف منطقي مؤقتًا = خطأ؛ إعداد الفراغ () ( TV.begin (NTSC، 120، 96)؛ TV.clear_screen ()؛ TV.select_font (font6x8)؛ TV.println (0، 50، "مرحبًا بك في Shimo")؛ TV.delay (5000) ; "):") ؛ TV.print(26,1,c2);< 0) { ts = 0; } TV.draw_rect(81,1,38,10,0,0); TV.print(81,1,tm); TV.print(97,1,"."); TV.print(100,1,int(ts-(tm*60))); ballcol(); /*if(ts < 600) { s = 4; } if(ts < 300) { s = 6; }*/ ballmove(s, a); TV.delay(50); if(digitalRead(6) == HIGH) { paused = true; delay(1000); } } else { TV.println(40,4,"pause"); if(digitalRead(6) == HIGH) { paused = false; delay(1000); TV.clear_screen(); } } } void ballscount() { if(x == 1) { c2++; } if(x == 119) { c1++; } if(c1 >c2 && ts == 0) ( TV.println(10, 45, "فاز اللاعب 1!"); Delay(10000); Restart(); ) else if(c1< c2 && ts == 0) { TV.println(10, 45, "Player 2 won!"); delay(10000); restart(); } else if(c1 == c2 && ts == 0) { TV.println(10, 45, "You are equal"); delay(10000); restart(); } } void ballcol() { if(x == 1 || x == 119 || (x == 10 && y < (yb1 + 3) && y >(س١ - ٣)) || (س == 110 && ص< (yb2 + 3) && y >(yb2 - 3))) ( if(a==1)(a=5;)else if(a==2)(a=8;)else if(a==3)(a=7;)else إذا (أ == 4) (أ = 6؛) آخر إذا (أ == 5) (أ = 1؛) آخر إذا (أ == 6) (أ = 4؛) آخر إذا (أ == 7) ( a=3;)else if(a==8)(a=2;) ) if(x == 10 && y< (yb1 - 3) && y >(yb1 - 8)) ( a = 2; ) if(x == 10 && y > (yb1 + 3) && y< (yb1 + 8)) { a = 4; } if(x == 110 && y < (yb2 - 3) && y >(yb2 - 8)) ( a = 8; ) if(x == 110 && y > (yb2 + 3) && y< (yb2 + 8)) { a = 6; } if(y == 95 || y == 1) { if(a==1){a=5;}else if(a==2){a=4;}else if(a==3){a=7;}else if(a==4){a=2;}else if(a==5){a=1;}else if(a==6){a=8;}else if(a==7){a=3;}else if(a==8){a=6;} } } void racketsmove() { TV.draw_line(10, yb1+8, 10, yb1-8, 0); TV.draw_line(110, yb2+8, 110, yb2-8, 0); if((yb1 - 8) >1) ( if(digitalRead(2) == HIGH) ( yb1 -= 2; ) ) if((yb1 + 8)< 95) { if(digitalRead(3) == HIGH) { yb1 += 2; } } if((yb2 - 8) >1) ( if(digitalRead(4) == HIGH) ( yb2 -= 2; ) ) if((yb2 + 8)< 95) { if(digitalRead(5) == HIGH) { yb2 += 2; } } TV.draw_line(10, yb1+8, 10, yb1-8, 1); TV.draw_line(110, yb2+8, 110, yb2-8, 1); } void ballmove(int vel, int angle) { TV.set_pixel(x,y,0); if(angle == 1) { y -= vel; } if(angle == 3) { x += vel; } if(angle == 5) { y += vel; } if(angle == 7) { x -= vel; } if(angle == 2) { x += round(vel/2); y -= round(vel/2); } if(angle == 4) { x += round(vel/2); y += round(vel/2); } if(angle == 6) { x -= round(vel/2); y += round(vel/2); } if(angle == 8) { x -= round(vel/2); y -= round(vel/2); } TV.set_pixel(x,y,1); } void restart() { TV.clear_screen(); x = 60; y = 48; yb1 = 48; yb2 = 48; a = 8; ts = 900.0; c1 = 0; c2 = 0; }

الخطوة 4. قطع الجسم

قررت قطع الجسم باستخدام قاطعة ليزر (أو آلة طحن، لا أعرف على وجه اليقين) من الخشب الرقائقي مقاس 4 مم. لقد رسمتها في InkScape، وأفسدتها قليلًا وقمت بتحويلها إلى تنسيق آلة طحن.


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

خاتمة

في عملية العمل، تم إنشاء وحدة تحكم ألعاب تلفزيونية بسيطة للألعاب على Arduino باستخدام لعبة Ping Pong القياسية، مع لوحتي ألعاب يمكننا اللعب بها وحتى التورط فيها.

كلمة من المترجم:ذات مرة، عندما كانت البلاد والأشجار كبيرة، وكان مخيلتي لا حدود لها ببساطة، كان لدي حلم - القدرة على عرض الصور من الحاسبة الدقيقة القابلة للبرمجة إلكترونيات MK-61 (حسنًا، هناك جميع أنواع الرسوم البيانية والمنحنيات والصور) على شاشة التلفزيون. كانت تلك أوقاتًا جامحة في أواخر العصر السوفييتي، ولم تكن أجهزة الألعاب والكمبيوتر الشخصي الصغير (“Pravets 8D” أو “Specialist” أو “Siknkler”) فحسب، بل كانت أيضًا أجهزة تسجيل الفيديو أمرًا جديدًا. بشكل عام، طالب الناس بالمشهد، وأولئك الذين يتذكرون سلسلة المنشورات التعليمية والترفيهية للآلات الحاسبة القابلة للبرمجة تحت العنوان العام "الطريق إلى الأرض" (مجلة "التكنولوجيا - الشباب") سوف يفهمونني.

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

من ناحية أخرى، دعونا لا ننسى أنه حتى وحدات التحكم الدقيقة البدائية لعائلة Arduino هي متفوقة في الأداء من حيث الحجم ليس فقط على المعالجات الدقيقة للرائدات آنذاك - MK-52 وMK-61، ولكن أيضًا على قدرات الحوسبة لدى البعض وحدات تحكم ألعاب 8 بت في أوقات لاحقة (Atary 2600 وغيرها من أجهزة Rambos نعم يا سيدي).

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

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

الخطوةالاولى. الأجزاء والبرمجيات

سوف تحتاج:

الأجزاء والوحدات:

  1. اردوينو متحكم
  2. التلفاز (لا يمكنك الذهاب إلى أي مكان بدونه)
  3. لوحة التطوير أو الدرع لاردوينو
  4. 2 مقاومات بقيمة إسمية 470 أوم و 1 كوم
  5. 2 محولات تركيب ثنائية الدبوس من ذكر إلى ذكر
  6. كابل تلفزيون محمي مع زهرة التوليب في نهايته

برمجة:

  1. بيئة التطوير/البرامج الثابتة لاردوينو. الرابط الرسمي

الخطوة الثانية. حَشد

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

من الأفضل أن نشرح ماذا وأين وكيف يتم لحام مخطط الدائرة، والذي يتكون أيضًا من أجزاء قليلة فقط.


دبوس:

المزامنة - الدبوس الرقمي رقم 9 للمتحكم الدقيق

فيديو - الإخراج الرقمي 8 للمتحكم الدقيق

GND - دبوس GND للمتحكم الدقيق

الخطوة الثالثة. برمجة

الجزء الأكثر متعة هو البرمجة.

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

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

#يشمل تلفزيون TVout؛ شار غير موقعة x، y؛ إعداد باطل () ( TV.start_render(_NTSC); ) حلقة باطلة () ( TV.clear_screen (); TV.print_str (10, 10, "TVout FTW!!!"); TV.delay (60); )

من المفترض أنك تعرف المبادئ الأساسية لتشغيل وبرمجة Arduino - وحدات التحكم الدقيقة المشابهة، لذلك قرر المؤلف عدم التجول في الشجرة، وأوصى بالتعرف على أوامر المكتبة أدناه:

  • البدء (الوضع) يبدأ في عرض المعلومات على الشاشة. الدقة القياسية - 128x96
  • begin(mode,x,y) يبدأ في عرض المعلومات على الشاشة. يتم تحديد الدقة بواسطة المستخدم باستخدام الوسيطات x,y
  • end() مسح المخزن المؤقت للفيديو
  • force_vscale(sfactor) فرض عدد مرات عرض كل سطر.
  • force_outstart(time) فرض الوقت لبدء الإخراج على خط نشط.
  • force_linestart(line) فرض الخط لبدء الإخراج.
  • set_vbi_hook(func) قم بتعيين الوظيفة التي سيتم استدعاؤها مرة واحدة لكل فترة طمس رأسية.
  • set_hbi_hook(func) قم بتعيين الوظيفة المراد استدعاؤها مرة واحدة لكل فترة طمس أفقية.
  • hres () يقوم الأمر بإرجاع قيمة الدقة الأفقية،
  • vres () يقوم الأمر بإرجاع قيمة الدقة الرأسية،
  • char_line() يقوم الأمر بإرجاع عدد الأحرف التي تناسب السطر.
  • set_pixel(x,y,color) قم بتعيين لون البكسل عند الإحداثيات المحددة
  • get_pixel(x,y) يعين البكسل بالإحداثيات المحددة كنقطة مرجعية.
  • fill(color) يملأ الشاشة باللون المحدد.
  • Clear_screen() يمسح الشاشة.
  • invert() يقوم بعكس الصورة على الشاشة.
  • التحول (المسافة، الاتجاه) لتمرير الشاشة بمسافة محددة في أي من الاتجاهات الستة.
  • draw_line(x0,y0,x1,y1,color) ينشئ خطًا من الإحداثيات (x0,y0) إلى الإحداثيات (x1,y1).
  • draw_row(row,x0,x1,color) يملأ الصف بالإحداثيات من x0 إلى x1 باللون المحدد.
  • draw_column(column,y0,y1,color) يملأ العمود بالإحداثيات من y0 إلى y1 باللون المحدد.
  • draw_rect(x,y,w,h,color,fillcolor) يرسم مستطيلاً ذو أصل عند الإحداثيات (x,y) بأبعاد (h,w)، ويملأ باللون المحدد.
  • draw_rect(x,y,w,h,color) يرسم مستطيلاً ذو الأصل عند الإحداثيات (x,y) والأبعاد (h,w).
  • draw_circle(x,y,radius,color,fillcolor) يرسم دائرة مركزها الإحداثيات (x,y) مع نصف القطر (RADIUS) ويملأها بلون معين
  • draw_circle(x,y,radius,color) يرسم دائرة تتمركز في إحداثيات (x,y) مع نصف القطر (RADIUS).
  • الصورة النقطية (x,y,bmp,i,width,height) تعرض الصورة المحددة بالإحداثيات..
  • print_char(x,y,c) يطبع حرفًا عند الإحداثيات (x,y).
  • set_cursor(x,y) يضبط موضع عرض الحرف التالي.
  • Select_font(font) يضبط الخط لإخراج النص.
  • طباعة () طباعة النص.
  • println() يطبع سطرًا واحدًا.
  • printPGM() طباعة سطر من النص من ذاكرة البرنامج.
  • نغمة (تردد) نغمة ذات تردد محدد.
  • نغمة (التردد، المدة) إشارة النغمة للتردد والمدة المحددة.
  • noTone() يوقف إخراج النغمات.

الخطوة الرابعة. انتهاء

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

إليك وحدة التحكم في الألعاب حيث يتم استخدام هذه المكتبة

موقع المشروع http://nootropicdesign.com/hackvision/index.html
سعر اللوحة هو 43.95 دولارًا.

لنقم بإنشاء جهاز الاستقبال التلفزيوني الخاص بنا، والذي يتكون من لوحة Arduino وعصا التحكم X-Y، ونكتب لعبة بسيطة.
هنا عرض لوحدة التحكم الخاصة بنا

دعونا نتعرف على إمكانيات المكتبة ونكتب لعبة.
صفحة المكتبة - http://code.google.com/p/arduino-tvout
هنا يمكنك تنزيل المكتبة والاطلاع على وصف للوظائف.
تستخدم المكتبة دبابيس Arduino التالية

SYNC VIDEO AUDIO board Decimilia, Uno, Nano 9 7 11 ميجا 11 A7(D29) 10

دعونا نلقي نظرة على الوظائف الرئيسية للمكتبة.

وظائف ضبط الوضع

تقوم وظيفة begin() بتهيئة إخراج الفيديو (دقة الشاشة الافتراضية 128x96)
بناء الجملة:

  • TVOut.begin(mode);
  • TVOut.begin(mode, x, y);

خيارات:

  • الوضع - إشارة الفيديو القياسية:
  • _PAL - وضع PAL؛
  • _NTSC – وضع NTSC.

قيمة الإرجاع:

  • 0 - في حالة الاتصال الناجح، 4 - في حالة الفشل (لا توجد ذاكرة كافية للمخزن المؤقت للإخراج).

وظائف التأخير

تعمل وظيفة التأخير () على تأخير الصورة الناتجة.
بناء الجملة:

  • TVOut.delay(ms);

خيارات:

  • ms - تأخير بالمللي ثانية بدقة: 20 مللي ثانية لـ PAL و16 مللي ثانية لـ NTSC.

تقوم الدالة Delay_frame() بتأخير الصورة المعروضة.
بناء الجملة:

  • TVOut.delay_frame(frames);

خيارات:

  • الإطارات – عدد الإطارات للتأخير..

تعد هذه الميزة مفيدة لتقليل أو إزالة وميض الشاشة الناتج عن تحديثات الشاشة.

وظائف للحصول على المعلمات

تقوم الدالة hres() بإرجاع دقة الشاشة الأفقية.
بناء الجملة:

  • TVOut.hrs();

خيارات:

قيمة الإرجاع:

  • حرف غير موقع - دقة الشاشة الأفقية.

تقوم الدالة vres() بإرجاع الدقة الرأسية للشاشة.
بناء الجملة:

  • TVOut.vres();

خيارات:

قيمة الإرجاع:

  • حرف غير موقع - دقة الشاشة العمودية.

تقوم الدالة char_line() بإرجاع الحد الأقصى لعدد الأحرف الممكنة في سطر واحد عند عرض معلومات النص.
بناء الجملة:

  • انقطع التلفاز. char_line();

خيارات:

قيمة الإرجاع:

  • حرف غير موقع - عدد الأحرف.

وظائف الرسومات الأساسية

تقوم الدالة set_pixel()‎ بتعيين لون بكسل الشاشة عند نقطة ذات إحداثيات معينة.
بناء الجملة:

  • TVOut.set_pixel(x,y,color);

خيارات:

  • س، ص - إحداثيات البكسل؛
  • اللون - لون البكسل:
  • 0 - أسود؛
  • 1 - أبيض.
  • 2- عكس اللون .

تحصل الدالة get_pixel() على لون بكسل الشاشة من نقطة ذات إحداثيات معينة.
بناء الجملة:

  • TVOut.get_pixel(x,y);

خيارات:

  • س، ص – إحداثيات بكسل.

قيمة الإرجاع:

  • اللون - لون البكسل:
  • 0 - أسود؛
  • 1 - أبيض.
  • 2- عكس اللون .

تقوم الدالة fill() بملء الشاشة باللون المحدد.
بناء الجملة:

  • TVOut.fill(color);

خيارات:

  • اللون - لون التعبئة:
  • 0 - أسود؛
  • 1 - أبيض.
  • 2- عكس اللون .

تقوم الدالة Clear_screen() بمسح الشاشة عن طريق ملئها باللون المحدد.
بناء الجملة:

  • TVOut.clear_screen(color);

خيارات:

  • اللون - لون التعبئة:
  • 0 - أسود؛
  • 1 - أبيض.
  • 2- عكس اللون .

تعمل الدالة invert() على عكس محتويات الشاشة.
بناء الجملة:

  • TVOut.invert();

خيارات:

تعمل الدالة Shift_direction() على تغيير محتويات الشاشة.
بناء الجملة:

  • TVOut.shift_direction(distance, Direction);

خيارات:

  • المسافة - المسافة لتحويل محتوى الشاشة.
  • الاتجاه - اتجاه التحول:
  • أعلى=0 - أعلى؛
  • أسفل = 1 – أسفل؛
  • يسار = 2 - يسار؛
  • اليمين = 3 - إلى اليمين.

تقوم الدالة draw_line() بتوصيل نقطتين على الشاشة بخط.
بناء الجملة:

  • TVOut.draw_line(x0,y0,x1,y1,color);

خيارات:

  • x0,y0 – إحداثيات النقطة الأولى؛
  • x1,y1 – إحداثيات النقطة الثانية؛
  • اللون - لون التعبئة:
  • 0 - أسود؛
  • 1 - أبيض.
  • 2- عكس اللون .

تقوم الدالة draw_row() بملء صف باللون المحدد بين نقطتين في الصف.
بناء الجملة:

  • TVOut.draw_row(row,x0,x1,color);

خيارات:

  • صف - الإحداثيات العمودية للصف؛
  • x1,x2 – الإحداثيات الأفقية لنقاط الخط؛
  • اللون - لون التعبئة:
  • 0 - أسود؛
  • 1 - أبيض.
  • 2- عكس اللون .

تقوم الدالة draw_column() بملء صف باللون المحدد بين نقطتين في العمود.
بناء الجملة:

  • TVOut.draw_column(column,y0,y1,color);

خيارات:

  • العمود – الإحداثيات الأفقية للعمود؛
  • y1,y2 – الإحداثيات الرأسية لنقاط العمود؛
  • اللون - لون التعبئة:
  • 0 - أسود؛
  • 1 - أبيض.
  • 2- عكس اللون .

تقوم الدالة draw_rect() برسم مستطيل على الشاشة.
بناء الجملة:

  • TVOut.draw_rect(x,y,w,h,color);
  • TVOut.draw_rect(x,y,w,h,color,fillcolor);

خيارات:

  • x,y – إحداثيات النقطة العلوية اليسرى;
  • w,h - عرض وارتفاع المستطيل الذي يتم رسمه؛
  • اللون – لون حدود المستطيل:
  • 0 - أسود؛
  • 1 - أبيض.
  • 2- عكس اللون .
  • fillcolor - لون تعبئة المستطيل:
  • 0 - أسود؛
  • 1 - أبيض.
  • 2- عكس اللون .

تقوم الدالة draw_circle() برسم دائرة على الشاشة.
بناء الجملة:

  • TVOut.draw_circle(x,y,r,color);
  • TVOut.draw_circle(x,y,r,color,fillcolor);

خيارات:

  • x,y – إحداثيات مركز الدائرة;
  • ص - نصف قطر الدائرة؛
  • اللون - لون حدود الدائرة:
  • 0 - أسود؛
  • 1 - أبيض.
  • 2- عكس اللون .
  • fillcolor – لون تعبئة الدائرة:
  • 0 - أسود؛
  • 1 - أبيض.
  • 2- عكس اللون .

تعرض الدالة bitmap() صورة نقطية.
بناء الجملة:

  • TVOut.bitmap(x,y,bmp,w,h);

خيارات:

  • x,y – إحداثيات الزاوية اليسرى العليا لنقطة الإخراج;
  • bmp - مؤشر إلى مصفوفة الذاكرة حيث يتم تخزين الصورة؛
  • w,h – عرض وارتفاع الصورة المعروضة;

أدناه سنلقي نظرة على عملية إنشاء التعليمات البرمجية لإخراج الصور النقطية.

وظائف إخراج المعلومات النصية

لاستخدام وظائف إخراج المعلومات النصية، تحتاج إلى توصيل الملفات المضمنة في المكتبة أو الخطوط المخصصة. لتوصيل مجموعة مخصصة من الخطوط، تحتاج إلى تضمين ملف الرأس في الرسم:
#يشمل
تتضمن المكتبة مجموعات الخطوط التالية:

  • Font4x6;
  • Font6x8;
  • Font8x8;
  • Font8x8ext.

تقوم الدالة Select_font()‎ بتحديد خط لعرض المعلومات النصية.
بناء الجملة:

  • TVOut.select_font(font);

خيارات:

  • الخط - الخط المضمن في الرسم.

تقوم الدالة print_char() بطباعة حرف على الشاشة.
بناء الجملة:

  • TVOut.print_char(x,y,char);

خيارات:

  • x,y - الموضع على الشاشة لعرض الرمز؛
  • شار – حرف من الخط الحالي.

تقوم الدالة set_cursor() بتعيين موضع المؤشر لعرض المعلومات النصية على الشاشة.
بناء الجملة:

  • TVOut.set_cursor(x,y);

خيارات:

  • x,y – إحداثيات المؤشر.

تقوم الدالة print() بطباعة سلسلة أو حرف أو رقم على الشاشة.
بناء الجملة:

  • TVOut.print(x,y,string);
  • TVOut.print(x,y,char,base);
  • TVOut.print(x,y,int,base).

خيارات:

  • س، ص – إحداثيات المؤشر.
  • قاعدة - تنسيق الإخراج:
  • بايت = 0؛
  • ديسمبر = 10 (افتراضي)؛
  • سداسي عشري = 16.

تقوم الدالة println()‎ بطباعة سلسلة أو حرف أو رقم، متبوعًا بسطر جديد:
بناء الجملة:

  • TVOut.println(x,y,string);
  • TVOut.println(x,y,char,base);
  • TVOut.println(x,y,int,base).

خيارات:

  • س، ص – إحداثيات المؤشر.
  • قاعدة - تنسيق الإخراج:
  • بايت = 0؛
  • ديسمبر = 10 (افتراضي)؛
  • سداسي عشري = 16.

ميزات إخراج الصوت

تتيح لك وظائف إخراج الصوت إرسال إشارة تردد محددة إلى جهاز التلفزيون الخاص بك من خلال إخراج الصوت.
تنتج وظيفة النغمة () إشارة صوتية بتردد محدد.
بناء الجملة:

  • TVOut.tone(التردد,المدة);
  • TVOut.tone (التردد).

خيارات:

  • التردد – تردد الإشارة الصوتية؛
  • المدة - مدة الإشارة.

تتوقف الدالة noTone() عن إنتاج الصوت.
بناء الجملة:

  • TVOut.noTone().

إنشاء الخطوط الخاصة بك

دعونا نلقي نظرة على عملية إنشاء خطوط مخصصة لمكتبة TVOut.

تتيح لك المكتبة إنشاء الخطوط الخاصة بك.
هناك نوعان من الخطوط - العرض الثابت والمتغير. بالنسبة للخطوط ذات العرض الثابت، تحتوي البايتات الثلاثة الأولى من الصفيف على عرض الحرف (4) وارتفاع الحرف (6) والحرف الأول القابل للطباعة (32). ثم تأتي البيانات لكل حرف لاحق.

#include "myfont1.h" PROGMEM const unsigned char myfont1 = ( 4,6,32, // 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, // 0b01000000, 0 ب0 1000000، 0b01000000، 0b00000000، 0b01000000، 0b00000000، … …))؛

بالنسبة للخطوط ذات العرض المتغير، يحدد البايت الأول في وصف كل حرف عرض ذلك الحرف.

#include "myfont1.h" PROGMEM const unsigned char myfont1 = ( 4,6,32, // 2, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, // 3, 0, 0b01 000000, 0b01000000, 0b00000000, 0b01000000, 0b00000000, ……);

لنقم بإنشاء خط مخصص myfont1. بالنسبة للخط المخصص myfont1، قم بإنشاء ملفين في مجلد TVOutfonts: myfont1.h وmyfont1.cpp.
فيما يلي محتويات الملف myfont1.h

#ifndef MYFONT1_h #define MYFONT1_h #include extern const unsigned char myfont1; #إنهاء إذا

الآن لكي تستخدم مكتبة TVOut الخط المخصص لدينا myfont1 في الرسم، تحتاج إلى تضمين الملف

#تشمل "myfont1.h"

إنشاء البدائيات الرسومية.

تتيح لك مكتبة TVOut تحميل الصور النقطية على الشاشة. دعونا نلقي نظرة على إنشاء تعليمات برمجية لتحميل صورة نقطية باستخدام وظيفة bitmap() الخاصة بمكتبة TVOut.

تحتاج أولا إلى إنشاء صورة 1 بت (لونين)، على سبيل المثال في محرر الرسومات الرسام .

ثم نحتاج إلى برنامج Image2Code، الذي سيقوم بتحويل الكود من صورتنا. يمكن تنزيل البرنامج على . هذا هو الإصدار لنظام التشغيل Windows. تحميل وإطلاق.

انقر فوق الزر "تحويل" واحصل على مصفوفة.

# include # ifndef MYBITMAP1_H # تعريف MYBITMAP1_H extern const unsigned char MyBitmap1; #إنهاء إذا

بعد ذلك، قم بإنشاء الملف MyBitmap1.cpp، وانسخ بيانات التحويل إليه (في حقل البيانات الخاص بمصفوفة char MyBitmap1 غير الموقعة)، وإزالة الرموز "(" و ")"، وإدراج عرض الصورة وارتفاعها بالبكسل. في البداية.

#include "MyBitmap1.h" PROGMEM const unsigned char MyBitmap1 = ( 16,16, 0x73,0x8E, 0x8C,0x71, 0x00,0x00, 0x00,0x00, 0x00,0x00, 0x97,0x63, 0x94,0x55, , 0xD4,0x 67 ، 0x94,0x45, 0x00,0x00, 0x00,0x00, 0x00,0x00, 0xAA,0xAA, 0x55,0x55, 0x00,0x00 );

نقوم بحفظ الملفات MyBitmap1.h وmyBitmap.cpp في دليل الرسم الخاص بنا. لعرض صورتنا على شاشة التلفزيون، قم باستدعاء الدالة TVOut.bitmap():

#include "MyBitmap1.h" TVOut.bitmap(x,y,MyBitmap);

لقد تعرفنا على المكتبة، وتم تجميع وحدة التحكم في الألعاب - والآن يمكننا البدء في كتابة اللعبة.

وحدة التحكم في الألعاب على الاردوينو؟ حقيقي حقيقي. مع شاشة وأزرار وألعاب. وهذا ليس خيالا. كانت هناك (ولا تزال) العديد من المشاريع التي حاولت القيام بذلك، وسنحاول تنفيذ أحدها (Gamebuino) بأنفسنا.

وبما أن المشروع مفتوح، فإن جميع المخططات متاحة على ويكي، بالإضافة إلى روابط للبرامج والألعاب وغيرها من المعلومات المفيدة.

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

نظرًا لأن Gamebuino يستخدم تخطيطًا مناسبًا لوضع العناصر على اللوحة، فعندما نحاول توصيل العناصر من خلال أطراف Arduino القياسية نحصل على هذه الصورة:

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

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

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

يجب أن يكون لديك الآن أمثلة على Gamebuino تسمح لك باختبار الشاشة والأزرار وما إلى ذلك. وحتى بدء لعبة بونج. بالنسبة للوحة، "استخدم" Arduino UNO أو Leonardo القياسي (لم تختبره على الآخرين بعد).

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

لكن لم نفقد كل شيء - يمكنك تنزيل أكواد المصدر وفتحها في Arduino IDE وتحميلها على وحدة التحكم الخاصة بنا.

لقد قمت بفحص بعض الألعاب وهي... تعمل! يمكنك تنزيل الأرشيف الذي يحتوي على أكواد مصدر الألعاب من هنا، وفتحها في Arduino IDE وتجميعها وتنزيلها بنفسك. يمكنك تجربة بقية الألعاب بنفسك عن طريق تنزيل أكواد المصدر من Gamebuino Wiki.

إذن - أنجزت المهمة! لقد حصلنا على وحدة تحكم ألعاب مصغرة. الآن مهمتنا هي جعله متنقلاً :) وسنحاول القيام بذلك في المقالات التالية.

وهكذا يا أصدقائي، إذا كان لديكم بالفعل مجموعة بناء Arduino UNO R3 (مجموعة البداية) أو كنتم تشعرون بالملل، فمن الناحية الفنية، فنحن نرحب بكم. لدينا سلسلة كاملة من "الدروس" لاردوينو. أود أن أذكرك أنه من هذه المجموعة يمكنك صنع، إن لم يكن كل شيء، فكل شيء تقريبًا سيعمل أو يتحكم في شيء ما. وحدة تحكم في الألعاب، حسنًا، فكر في عصا التحكم للعب كرة الطاولة وهذا كل شيء. لا يزال لدى شخص ما جهاز كمبيوتر قديم به عصا تحكم قديمة غير عاملة، والآن كل هذا منطق يتم التحكم فيه من خلاله عدة اردوينو(http://arduinokit.ru/).

من أين تبدأ المشروع؟

لقد قمت بإنشاء وحدة تحكم ألعاب بسيطة يمكنها لعب كرة الطاولة وألعاب أخرى، تذكر، كما هو الحال على كمبيوتر Atari 2600 القديم، والذي يمكن الآن محاكاته بسهولة بواسطة Arduino R3. سيصبح Arduino مثل ذلك الكمبيوتر القديم، حيث يقرأ المدخلات والمخرجات من عصا التحكم المتصلة بالتلفزيون من خلال مكتبة TVout القياسية (لـ Arduino). لقد أنشأت هذا المشروع فقط لإثبات أن أي شخص (ليس لديه مهارات خاصة) يمكنه إنشاء وحدات التحكم المصغرة الخاصة به واللعب. أود أيضًا أن يتمكن كل من يقرأ هذه المقالة من استخدام هذه النصيحة مجانًا تمامًا.

ما الذي تحتاجه لوحدة تحكم ألعاب Arduino؟

5. الآن، للعب كرة الطاولة، نحتاج فقط إلى موصل ذي 4 سنون: للأمام (1)، للخلف (2)، للزر (6)، وللأرض (8). وبالنسبة لعصا التحكم الثانية، نحتاج فقط إلى المسامير 1 و2 و8 (يتم استخدام الزر "الرئيسي" فقط "لبدء اللعبة" نيابة عن المسؤول، ولهذا السبب يجب أن يكون لدى لاعب واحد فقط هذا الزر - التحكم).

6. إذا نظرت إلى الأطراف من الجانب، فقد قمت بتوصيل هؤلاء الجنود الأربعة بأسلاك بسيطة تذهب إلى Arduino (الأمام إلى السن 2، والعودة إلى السن 3، والتحكم إلى السن 4). فعلت الشيء نفسه بالنسبة للدبابيس الثلاثة الأخرى للاعب 2 (على عصا التحكم الثانية): "للأمام" للدبوس 7 و"للخلف" للدبوس 10). لا تنس توصيل كلا عصا التحكم Pin 8 بالأرضي (سلك الشاشة)!

7. الآن، قم بتحميل لعبة Ping-pong وتحقق من مدخلات عصا التحكم. أدخل Arduino UNO R3 وجميع الأسلاك في الموصلات المطلوبة (لقد استخدمت علبة خارجية مكسورة لمحرك أقراص ثابت قديم).

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

ملاحظة: أعتقد أن الشيء الوحيد الذي سأشاهده بشكل مختلف الآن هو حسنًا. حسنًا، على سبيل المثال، كنت سأأخذ خرطوشة من Sega أو Dandy وأصنع نوعًا من قارئ البطاقات. إليك وحدة تحكم ألعاب تلفزيونية DIY من أجلك. الشيء الرئيسي هو أن مشروعي قد تم تحجيمه، ويمكنك صنعه، إن لم يكن الروبوتات الطائرة، ثم وحدات التحكم في الألعاب بيديك. بالمناسبة، يمتلك أصدقاؤنا مكونات مختلفة لـ Arduino UNO R3 (مصممي Arduino). إذا كنت تريد حقا، يمكنك أن تفعل كل شيء بيديك. ويعمل!

أخبر الأصدقاء