لعبة الرماية باستخدام الاردوينو

مبتدئ

image_pdf

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

لعبة الرماية باستحدام الاردوينو

 

المواد والأدوات

اردوينو

X1 اردوينو

Full-size-breadboard-830-2-640x480

X1 لوحة تجارب 

شاشة عرض 7 مقاطع - 4أرقام

X1 سبعة مقاطع 4-أرقام

أسلاك توصيل

مجموعة أسلاك توصيل(M/M)

10 ohm resistors

X4 مقاومة 10 كيلو أوم 

مفتاح

X1 ضغاط التحكم 

لعبة الرماية باستحدام الاردوينو

X1 سلك أردوينو

زنبرك

X10 زنبرك

وحدة سبع مقاطع – أربع ارقام

تستخدم وحدات العرض في كثير من المشاريع التي تتطلب عرض معلومات رقمية مثل درجة الحرارة، والوقت. يوجد شاشات عرض مكونة من 7 وحدات لتشكل رقم واحد تحتوي على 10 دبابيس، 7 منها للقطاعات، وواحد للنقطة، و2 دبابيس لمصدر الطاقة إما GND أو VCC حسب نوع الشاشة – قطب موجب مشترك Common Anode أو قطب سالب مشترك Common Cathode-
من ناحية أخرى، لا تحتوي الشاشة المكونة من 4 أرقام على 40 دبوس، بل تحتوي على 12 دبوس فقط: 7 للمقاطع وواحد للنقطة ودبابيس اختيار مكونة من 4 أرقام تحدد الرقم الذي سيكون نشطًا لعرض الحرف الذي أرسله Arduino على دبابيس قطعة 7 + 1.
يتم ترتيب المقاطع السبعة بطريقتين: إما أن يتم تجميع كل قطب سالب في دبوس واحد (GND)، وهذا النوع يسمى سالب مشترك Common Cathode، أو يتم تجميع كل قطب موجب في دبوس واحد (Vcc)، وهذا النوع يسمى قطب موجب مشترك Common Anode. وبالمثل، فإن الأجزاء المكونة من 7 أرقام والمكونة من 4 أرقام هي إما قطب موجب مشترك Common Anode أو قطب سالب مشترك Common Cathode، وبالتالي توجد أربعة دبابيس مشتركة للأرقام الأربعة.

لعبة الرماية باستحدام الاردوينو

لعبة الرماية باستحدام الاردوينو

توصيل الدائرة

 

لعبة الرماية باستحدام الاردوينو

نهاية أطراف الأسلاك يتم توصيلها مع الحلقات في الهيكل بحيث تكون أصغر حلقة موصله مع A 0  والتي تليها مع A1  والأخيرة مع A2

الهيكل

فكرة المشروع وضع ثلاث حلقات مكونه من مادة موصلة على قاعدة، كل حلقة متصلة مع خط الطاقة 5 فولت بالاردوينو، تنفصل عنها 3 حلقات باستخدام الزنبرك موصلة مع منافذ الأردوينو

  إذا استطاع اللاعب إصابة الهدف تتلامس الحلقات ويتم حساب النقاط ومن ثم عرضها على شاشة السبع وحدات أربع أرقام

في هذا الشكل يظهر توزيع الزنبركات والحلقات المتصلة على القاعدة الأساسية

لعبة الرماية باستحدام الاردوينو

اذا كنت تمتلك طابعة ثلاثية الأبعاد قم بطباعة أداة القوس و السهم التي ستستخدمها لتصويب الأهداف من خلال الرابط

 

الكود البرمجي

#define aPin 2 
#define bPin 1 
#define cPin 4 
#define dPin 5 
#define ePin 6 
#define fPin 7 
#define gPin 8 

#define c1Pin 9 // Common pin for digit 1
#define c2Pin 10 // Common pin for digit 2
#define c3Pin 11 // Common pin for digit 3
#define c4Pin 12 // Common pin for digit 4

#define c1 A0
#define c2 A1
#define c3 A2
#define bt_reset A3
long Counter=0;
int flag1=0, flag2=0, flag3=0, timer=0;
int Common = 0; //<Common=1; for Common anode> <Common=0; for Common cathode>
int On, Off, Off_C; 
int DTime = 4; // Display timer

void setup(){ // put your setup code here, to run once

pinMode(c1, INPUT);
pinMode(c2, INPUT);
pinMode(c3, INPUT);
pinMode(bt_reset, INPUT);

pinMode(aPin, OUTPUT);
pinMode(bPin, OUTPUT);
pinMode(cPin, OUTPUT);
pinMode(dPin, OUTPUT);
pinMode(ePin, OUTPUT); 
pinMode(fPin, OUTPUT);
pinMode(gPin, OUTPUT);
pinMode(c1Pin, OUTPUT);
pinMode(c2Pin, OUTPUT);
pinMode(c3Pin, OUTPUT);
pinMode(c4Pin, OUTPUT);


if(Common==1){On=0, Off=1, Off_C=0;} //for Common anode
else{On=1, Off=0, Off_C=1;} //for Common cathode

// Indicate that system is ready
for (int i = 9; i >=0; i--) {
showNumber(i);
digitalWrite(c1Pin, Common);
digitalWrite(c2Pin, Common);
digitalWrite(c3Pin, Common);
digitalWrite(c4Pin, Common);
delay(1000); 
} 
}

void loop(){

if(digitalRead (c1) == 1){
if(flag1==0){ flag1=1;
Counter = Counter+30;
if(Counter>9999){Counter=0;} 
}}
else{flag1=0;}

if(digitalRead (c2) == 1){ 
if(flag2==0){ flag2=1;
Counter = Counter+20;
if(Counter<0){Counter=9999;} 
} 
}else{flag2=0;}
if(digitalRead (c3) == 1){ 
if(flag2==0){ flag2=1;
Counter = Counter+10;
if(Counter<0){Counter=9999;} 
} 
}else{flag3=0;}

if(digitalRead (bt_reset) == 1){ 
Counter=0;
if(timer<200){timer=timer+1;}
if(timer==200){

} 
}else{timer=0;}


showNumber((Counter/1000)%10);
digitalWrite(c1Pin, Common);
delay(DTime);
digitalWrite(c1Pin, Off_C);

showNumber((Counter/100)%10);
digitalWrite(c2Pin, Common);
delay(DTime);
digitalWrite(c2Pin, Off_C);

showNumber((Counter/10)%10);
digitalWrite(c3Pin, Common);
delay(DTime);
digitalWrite(c3Pin, Off_C);

showNumber(Counter%10);
digitalWrite(c4Pin, Common);
delay(DTime);
digitalWrite(c4Pin, Off_C);

}


void showNumber(int x){

switch(x){
case 1: one(); break;
case 2: two(); break;
case 3: three(); break;
case 4: four(); break;
case 5: five(); break;
case 6: six(); break;
case 7: seven(); break;
case 8: eight(); break;
case 9: nine(); break;
default: zero(); break;
}
}

void one(){
digitalWrite( aPin, Off); // 
digitalWrite( bPin, On); // |
digitalWrite( cPin, On); // |
digitalWrite( dPin, Off); // |
digitalWrite( ePin, Off); // |
digitalWrite( fPin, Off);
digitalWrite( gPin, Off);
}

void two(){
digitalWrite( aPin, On); // ____
digitalWrite( bPin, On); // | 
digitalWrite( cPin, Off); // ____|
digitalWrite( dPin, On); // | 
digitalWrite( ePin, On); // |____
digitalWrite( fPin, Off);
digitalWrite( gPin, On);
}

void three(){
digitalWrite( aPin, On); // ____
digitalWrite( bPin, On); // |
digitalWrite( cPin, On); // ____|
digitalWrite( dPin, On); // |
digitalWrite( ePin, Off); // ____|
digitalWrite( fPin, Off); 
digitalWrite( gPin, On);
}

void four(){
digitalWrite( aPin, Off); // 
digitalWrite( bPin, On); // | |
digitalWrite( cPin, On); // |____|
digitalWrite( dPin, Off); // |
digitalWrite( ePin, Off); // |
digitalWrite( fPin, On);
digitalWrite( gPin, On);
}

void five(){
digitalWrite( aPin, On); // ____
digitalWrite( bPin, Off); // |
digitalWrite( cPin, On); // |____
digitalWrite( dPin, On); // |
digitalWrite( ePin, Off); // ____|
digitalWrite( fPin, On); 
digitalWrite( gPin, On);
}

void six(){
digitalWrite( aPin, On); // ____
digitalWrite( bPin, Off); // |
digitalWrite( cPin, On); // |____
digitalWrite( dPin, On); // | |
digitalWrite( ePin, On); // |____|
digitalWrite( fPin, On);
digitalWrite( gPin, On);
}

void seven(){
digitalWrite( aPin, On); // ____
digitalWrite( bPin, On); // |
digitalWrite( cPin, On); // |
digitalWrite( dPin, Off); // |
digitalWrite( ePin, Off); // |
digitalWrite( fPin, Off);
digitalWrite( gPin, Off);
}

void eight(){
digitalWrite( aPin, On); // ____
digitalWrite( bPin, On); // | |
digitalWrite( cPin, On); // |____|
digitalWrite( dPin, On); // | |
digitalWrite( ePin, On); // |____|
digitalWrite( fPin, On); 
digitalWrite( gPin, On); 
}

void nine(){
digitalWrite( aPin, On); // ____
digitalWrite( bPin, On); // | |
digitalWrite( cPin, On); // |____|
digitalWrite( dPin, On); // |
digitalWrite( ePin, Off); // ____|
digitalWrite( fPin, On); 
digitalWrite( gPin, On);
}

void zero(){ 
digitalWrite( aPin, On); // ____
digitalWrite( bPin, On); // | |
digitalWrite( cPin, On); // | |
digitalWrite( dPin, On); // | |
digitalWrite( ePin, On); // |____|
digitalWrite( fPin, On); 
digitalWrite( gPin, Off); 
}

 شرح الكود البرمجي

نعرف منافذ شاشة السبع مقاطع اربع أرقام

#define aPin 2
#define bPin 1
#define cPin 4
#define dPin 5
#define ePin 6
#define fPin 7
#define gPin 8
#define c1Pin 9 // Common pin for digit 1
#define c2Pin 10 // Common pin for digit 2
#define c3Pin 11 // Common pin for digit 3
#define c4Pin 12 // Common pin for digit 4

نعرف الخطوط الثلاثة الخاسة بحلقات هدف الرماية

#define c1 A0
#define c2 A1
#define c3 A2

نعرف زر تصفير حساب النقط

#define bt_reset A3

نعرف متغير لحساب النقاط باسم counter

long Counter=0;

نعرف متغير باسم common نعطيه قيمة 1 اذا كان شاشة السبع مقاطع اربع أرقاب ذات قطب موجب مشترك و 0 اذا كانت ذات قطب سابي مشترك

int flag1=0, flag2=0, flag3=0, timer=0;
int Common = 0; //<Common=1; for Common anode> <Common=0; for Common cathode>
int On, Off, Off_C;
int DTime = 4; // Display timer

في دالة void setup نعرف منافذ الدخل والخرج

void setup(){ // put your setup code here, to run once

pinMode(c1, INPUT);
pinMode(c2, INPUT);
pinMode(c3, INPUT);
pinMode(bt_reset, INPUT);

pinMode(aPin, OUTPUT);
pinMode(bPin, OUTPUT);
pinMode(cPin, OUTPUT);
pinMode(dPin, OUTPUT);
pinMode(ePin, OUTPUT);
pinMode(fPin, OUTPUT);
pinMode(gPin, OUTPUT);
pinMode(c1Pin, OUTPUT);
pinMode(c2Pin, OUTPUT);
pinMode(c3Pin, OUTPUT);
pinMode(c4Pin, OUTPUT);


if(Common==1){On=0, Off=1, Off_C=0;} //for Common anode
else{On=1, Off=0, Off_C=1;} //for Common cathode

في بداية تشغيل البرنامج و للتأكد من أن جميع وحدات شاشة العرض في جميع الأرقام تعمل بشكل صحيح يتم اظهار عد تنازلي على الشاشة من 9 الى 0 على كل رقم

for (int i = 9; i >=0; i--) {
showNumber(i);
digitalWrite(c1Pin, Common);
digitalWrite(c2Pin, Common);
digitalWrite(c3Pin, Common);
digitalWrite(c4Pin, Common);
delay(1000);
}
}

في بداية دالة voide loop نحدد الشرط اذا قرأ الأردوينو المنفذ الخاص بالدائرة الداخلية على أنه 1 يتم اضافة قيمة 30 نقطة لمتغير النقاط counter

void loop(){

if(digitalRead (c1) == 1){
if(flag1==0){ flag1=1;
Counter = Counter+30;
if(Counter>9999){Counter=0;}
}}
else{flag1=0;}

اذا قرأ الأردوينو اشارة 1 من المنفذ A1 سيتم اضافة 20 نقطة

if(digitalRead (c2) == 1){
if(flag2==0){ flag2=1;
Counter = Counter+20;
if(Counter<0){Counter=9999;}
}

اذا قرأ الأردوينو اشارة 1 من المنفذ A2 سيتم اضافة 10 نقطة

}else{flag2=0;}
if(digitalRead (c3) == 1){
if(flag2==0){ flag2=1;
Counter = Counter+10;
if(Counter<0){Counter=9999;}
}
}else{flag3=0;}

اذا قرأ الأردوينو اشارة 1 من المنفذ A3 تصفير عداد النقاط أي عند الضغط على ضغاط التحكم

if(digitalRead (bt_reset) == 1){
Counter=0;
if(timer<200){timer=timer+1;}
if(timer==200){

}
}else{timer=0;}

الدوال التالية لتعريف الأرقام من 0- 9


void one(){
digitalWrite( aPin, Off); //
digitalWrite( bPin, On); // |
digitalWrite( cPin, On); // |
digitalWrite( dPin, Off); // |
digitalWrite( ePin, Off); // |
digitalWrite( fPin, Off);
digitalWrite( gPin, Off);
}

void two(){
digitalWrite( aPin, On); // ____
digitalWrite( bPin, On); // |
digitalWrite( cPin, Off); // ____|
digitalWrite( dPin, On); // |
digitalWrite( ePin, On); // |____
digitalWrite( fPin, Off);
digitalWrite( gPin, On);
}

void three(){
digitalWrite( aPin, On); // ____
digitalWrite( bPin, On); // |
digitalWrite( cPin, On); // ____|
digitalWrite( dPin, On); // |
digitalWrite( ePin, Off); // ____|
digitalWrite( fPin, Off);
digitalWrite( gPin, On);
}

void four(){
digitalWrite( aPin, Off); //
digitalWrite( bPin, On); // | |
digitalWrite( cPin, On); // |____|
digitalWrite( dPin, Off); // |
digitalWrite( ePin, Off); // |
digitalWrite( fPin, On);
digitalWrite( gPin, On);
}

void five(){
digitalWrite( aPin, On); // ____
digitalWrite( bPin, Off); // |
digitalWrite( cPin, On); // |____
digitalWrite( dPin, On); // |
digitalWrite( ePin, Off); // ____|
digitalWrite( fPin, On);
digitalWrite( gPin, On);
}

void six(){
digitalWrite( aPin, On); // ____
digitalWrite( bPin, Off); // |
digitalWrite( cPin, On); // |____
digitalWrite( dPin, On); // | |
digitalWrite( ePin, On); // |____|
digitalWrite( fPin, On);
digitalWrite( gPin, On);
}

void seven(){
digitalWrite( aPin, On); // ____
digitalWrite( bPin, On); // |
digitalWrite( cPin, On); // |
digitalWrite( dPin, Off); // |
digitalWrite( ePin, Off); // |
digitalWrite( fPin, Off);
digitalWrite( gPin, Off);
}

void eight(){
digitalWrite( aPin, On); // ____
digitalWrite( bPin, On); // | |
digitalWrite( cPin, On); // |____|
digitalWrite( dPin, On); // | |
digitalWrite( ePin, On); // |____|
digitalWrite( fPin, On);
digitalWrite( gPin, On);
}

void nine(){
digitalWrite( aPin, On); // ____
digitalWrite( bPin, On); // | |
digitalWrite( cPin, On); // |____|
digitalWrite( dPin, On); // |
digitalWrite( ePin, Off); // ____|
digitalWrite( fPin, On);
digitalWrite( gPin, On);
}

void zero(){
digitalWrite( aPin, On); // ____
digitalWrite( bPin, On); // | |
digitalWrite( cPin, On); // | |
digitalWrite( dPin, On); // | |
digitalWrite( ePin, On); // |____|
digitalWrite( fPin, On);
digitalWrite( gPin, Off);
}
X
تم إضافة المنتج إلى السلة بنجاح