نظام تصويت إلكتروني باستخدام الأردوينو
وصف المشروع
تتكون الدائرة من لوحة أردوينو ومجموعة أزرار Push buttons وشاشة LCD للعرض، وتقوم لوحة الأردوينو بعملية التحكم الكاملة فى الدائرة بداية من قراءة الأوامر من الأزرار وحساب نسب التصويت والمقارنة للحصول على أعلى قيمة وإرسال النتيجة إلى الشاشة للعرض، حيث لدينا إمكانية للعب عدد 4 أشخاص كل شخص له زر Push button ويوجد زر خامس لإظهار النتيجة، كل فرد يقوم بالضغط على الزر الخاص به يقوم الأردوينو بحساب نقطة زيادة فى رصيده واظهار ذلك على الشاشة، وعند الضغط على الزر الخامس يظهر الأردوينو اسم الشخص الأعلى نسبة تصويت على الشاشة كما سنرى فى التجربة العملية.
جدول المكونات
العدد | النوع | |
1 | لوحة أردوينو أونو | Arduino Uno board |
1 | شاشة 2 × 16 | LCD 2×16 |
2 | مقاومة 1 كيلو أوم | Resistor 1 k ohm |
5 | أزرار | Push buttons |
1 | لوحة اختبار | Bread board |
مجموعة | أسلاك توصيل | connecting wires |
توصيل الدائرة
شرح المكونات
لوحة Arduino Uno
نستخدمها في التحكم فى الدائرة، استقبال وإرسال الإشارات بتوقيت معين وكيفية معينة نختارها طبقاً لعمل الدائرة وبواسطة الكود الذى سيتم شرحه لاحقاً.
يرجى تثبيت البرنامج الخاص بالأردوينو من هنا والذي سنستخدمه في كتابة الكود وعمل compiling ورفعه إلى لوحة الأردوينو عن طريق كابل USB، ولمعرفة كيفية تثبيت البيئة التطويرية المتكاملة لأردوينو (Arduino IDE) من هنا.
لتحميل ورقة البيانات datasheet الخاصة بلوحة الأردوينو أونو Arduino Uno اضغط هنا، ولتحميل نسخة أخرى اضغط هنا، ويوجد هنا في موقع الصناع العرب مواضيع مفصله عن الأردوينو وكيفية تنصيب البرنامج، وللمزيد يمكنك زيارة الموقع الخاص به من هنا.
شاشة LCD 2×16
رمزها : HD44780
هي شاشة LCD صغيرة بها مساحة لعرض صفين كل صف به مساحة لعرض 16 حرف/رقم لهذا تسمى 2×16 .
أطراف التوصيل وعددها 16:
1) GND وهذا الطرف يوصل بالأرضي لمصدر التغذية (Ground)
2) Vcc لتشغيل الشاشة وهذا الطرف يوصل بالطرف الموجب لمصدر التغذية (5 volt)
3) Vee الخاص بمستوى إضاءة الشاشة Contrast ويوصل بمقاومة 1 كيلو أوم (Resistor 1 k ohm) ثم إلى الطرف الأرضي GND ويمكنك توصيل مقاومة متغيرة للتحكم بدرجة إضاءة الشاشة حسب رغبتك (طرفها الأول بالجهد الموجب والأخير بالأرضي والأوسط يوصل ب Vee)
4) RS وهو اختصار Reset ويوصل هذا الطرف بالأردوينو (طرف رقم D2)
5) R/W وهو اختصار Read/write ويوصل هذا الطرف بالأرضي دائماً (GND) لأننا سنستعمل خاصية الكتابة فقط وليست القراءة.
6) EN وهو اختصار Enable ويوصل هذا الطرف بالأردوينو (طرف رقم D3)
7-14) DB0:DB7 نستخدم هنا فقط الأربعة أطراف الأخيرة 4 – 5 – 6 – 7 لإرسال البيانات من الأردوينو إلى الشاشة وتوصل بالأردوينو بالترتيب: (D4 وحتى D7)
15) Led+ يستخدم للإضاءة الخلفية للشاشة ويوصل بمقاومة 1 كيلو أوم ثم إلى الجهد الموجب (5 volt) لتقليل شدة إضاءة الشاشة الخلفية.
16) Led- يستخدم للإضاءة الخلفية للشاشة ويوصل بالأرضي (GND)
قم بتوصيل الأطراف كما بالرسم الموضح في البداية.
المقاومات Resistors
المقاومة هي عنصر كهربى فائدته إعاقة مرور التيار بقدر معين يتناسب مع قيمة المقاومة، فالتيار المار في مقاومة 100 أوم يكون أكبر من التيار المار في مقاومة 10 كيلو أوم عند تطبيق نفس قيمة الجهد عليهما.
تقاس المقاومة بوحدة الأوم (ohm) ويرمز له بهذا الرمز: وشكل المقاومة في الدوائر كالتالي:أووللمقاومة ألوان يتم من خلال ترتيب الألوان هذه تحديد قيمة كل مقاومة، والجدول التالى يوضح القيم الخاصة بكل لون:نحتاج في الدائرة عدد 2 مقاومات كل منها 1 كيلو أوم (بهذا اللون)من خلال هذا الرابط يمكنك حساب قيمة المقاومة بالألوان أو من هذا الرابط، وللمزيد من الشرح فى هذا الرابط.المفتاح push button
أنواع المفاتيح push buttons (أشهر الانواع المستخدمة وليس الكل):
1- SPSTمفتوح (الصورة بالأعلى)مغلق (الصورة بالأسفل)Single Pole Single Through أي أحادي القطب أحادي النهاية، فيكون له طرفان اثنان فقط وله حالتان إما أن يتصل الطرفان (دائرة مغلقة) أو ينفصلا (دائرة مفتوحة).2- SPDTSingle Pole Double Through أي أحادي القطب ثنائي النهاية، فيكون له ثلاثة أطراف، أحدهم القطب وهو الطرف المشترك (common) ويتبادل التوصيل مع الطرفان الآخران، فيكون له حالتان إما متصل مع الطرف الأول أو متصل مع الطرف الثاني.والصورة التالية توضح الفرق بين النوعين السابقين:3- DPSTDouble Pole Single Through أي ثنائي القطب أحادي النهاية، أي أن كل قطب له طرف واحد فقط يتصل به أو ينفصل عنه.4- DPDTDouble Pole Double Through أي ثنائي القطب ثنائي النهاية، فيكون له ستة أطراف، وهو يمثل مفتاحين من نوع SPDT لكن يعملان سوياً، فعندما يتصل القطب الأول بطرفه الأول يتصل القطب الثاني بطرفه الأول فى نفس الوقت كما يوضحه الرسم.وهناك تقسيم آخر للمفاتيح حسب طبيعة التوصيل فمثلاً هناك:1- NO : Normally Open أي أن المفتاح بطبيعته مفتوح (الأطراف غير متصلة ببعضها) وعند الضغط عليه تتصل الأطراف.2- NC : Normally Close أي أن المفتاح بطبيعته مغلق (الأطراف متصلة ببعضها) وعند الضغط عليه ينفصل الأطراف.المفتاح المناسب للإستخدام فى هذه الدائرة هو SPST بهذا الشكل:وعليك تحديد الأطراف أولاً قبل التوصيل، وفي هذا الرابط تجد شرح مفصل حول المفاتيح بأنواعها.لوحة اختبار الدوائر Bread board
هذه اللوحة مفيدة جداً في التجارب، يمكنك توصيل عناصر دائرتك عليه للتأكد من عملها بالشكل السليم وعمل التعديلات عليها قبل صناعتها على لوحة نحاسية مطبوعة، أو لمجرد التجربة فقط وذلك لسهولة التوصيلات كما سنرى.
تحتوي معظم اللوحات هذه على صفين على الجوانب أحدهما أحمر والآخر أزرق كما بالصورة بالأسفل (A و D)، وكل النقاط فى طول هذا الصف متصلة ببعض.
باقي النقاط فى المنتصف يمين ويسار الفراغ المنتصف (B و C) مقسمة طولياً وليس أفقياً كما بالأحمر والأزرق، والصورة التالية توضح لك النقاط المتصلة ببعضها:
ويتم تركيب العناصر بإدخال الأطراف المعدنية في الفراغات، والعناصر المراد توصيلها معاً يتم إدخال الأطراف في نفس العمود (حيث كل 4 نقاط رأسية متصلة ببعض).
ملحوظة: الصفين الموجب يمين ويسار اللوحة غير متصلين ببعض، والصفين الأرضي أيضاً لذا عليك توصيلهم بهذا الشكل:
وهذه الصورة توضح كيفية تغذية اللوحة بمصدر الجهد والأرضي من الأردوينو:
يمكنك تتبع الصورة في بداية الشرح لإتمام توصيل العناصر ببعضها، وللمزيد عن كيفية استخدام لوح التجارب (Breadboard) اضغط هنا.
مجموعة أسلاك التوصيل Connecting wires
ينصح بالحصول على مجموعة أسلاك للتوصيل مثل التي بالصورة وتستخدم في توصيل العناصر ببعضها أو التوصيل بأجزاء خارجية مثل لوحة الأردوينو والحساسات وغيرها.
الكود البرمجي وتجربة وتشغيل الدائرة:
#include
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
#define sw1 19 //pin numbers for player switches
#define sw2 18
#define sw3 17
#define sw4 16
#define sw5 15
int vote1 = 0; //variables to store the players results
int vote2 = 0;
int vote3 = 0;
int vote4 = 0;
void setup()
{
pinMode(sw1, INPUT); // switches as inputs
pinMode(sw2, INPUT);
pinMode(sw3, INPUT);
pinMode(sw4, INPUT);
pinMode(sw5, INPUT);
lcd.begin(16, 2);
lcd.print(" Voting Machine");
lcd.setCursor(0, 1);
lcd.print(" ARABS MAKERS");
delay(3000);
digitalWrite(sw1, HIGH);
digitalWrite(sw2, HIGH);
digitalWrite(sw3, HIGH);
digitalWrite(sw4, HIGH);
digitalWrite(sw5, HIGH);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Ali");
lcd.setCursor(4, 0);
lcd.print("Bdr");
lcd.setCursor(8, 0);
lcd.print("Amr");
lcd.setCursor(12, 0);
lcd.print("Nor");
}
void loop()
{
lcd.setCursor(0, 0);
lcd.print("Ali"); //print player 1 name
lcd.setCursor(1, 1);
lcd.print(vote1); // print player 1 score
lcd.setCursor(4, 0);
lcd.print("Bdr");
lcd.setCursor(5, 1);
lcd.print(vote2);
lcd.setCursor(8, 0);
lcd.print("Amr");
lcd.setCursor(9, 1);
lcd.print(vote3);
lcd.setCursor(12, 0);
lcd.print("Nor");
lcd.setCursor(13, 1);
lcd.print(vote4);
if (digitalRead(sw1) == 0) // if player 1 press his button
vote1++; // add 1 point to his score
while (digitalRead(sw1) == 0); //wait while player 1 is still press his button
if (digitalRead(sw2) == 0)
vote2++;
while (digitalRead(sw2) == 0);
if (digitalRead(sw3) == 0)
vote3++;
while (digitalRead(sw3) == 0);
if (digitalRead(sw4) == 0)
vote4++;
while (digitalRead(sw4) == 0);
if (digitalRead(sw5) == 0)
{
int vote = vote1 + vote2 + vote3 + vote4;
if (vote) //determine the high score
{ //comparison between each scores
if ((vote1 > vote2 && vote1 > vote3 && vote1 > vote4))
{
lcd.clear();
lcd.print("Ali Wins");
delay(2000);
lcd.clear();
}
else if ((vote2 > vote1 && vote2 > vote3 && vote2 > vote4))
{
lcd.clear();
lcd.print("Bdr Wins");
delay(2000);
lcd.clear();
}
else if ((vote3 > vote1 && vote3 > vote2 && vote3 > vote4))
{
lcd.clear();
lcd.print("Amr Wins");
delay(2000);
lcd.clear();
}
else if (vote4 > vote1 && vote4 > vote2 && vote4 > vote3)
{
lcd.setCursor(0, 0);
lcd.clear();
lcd.print("Nor Wins");
delay(2000);
lcd.clear();
}
else
{
lcd.clear();
lcd.print(" Tie Up Or ");
lcd.setCursor(0, 1);
lcd.print(" No Result ");
delay(1000);
lcd.clear();
}
}
else
{
lcd.clear();
lcd.print("No Voting....");
delay(1000);
lcd.clear();
}
vote1 = 0; vote2 = 0; vote3 = 0; vote4 = 0, vote = 0; //reset the score for new test
lcd.clear();
}
}
قم بإنشاء ملف مشروع جديد بالاسم الذي تريده واكتب الكود السابق فيه واحفظه عندك على جهازك، قم بتوصيل لوحة الأردوينو بالكمبيوتر لديك وارفع الكود إلى لوحة الأردوينو (upload).
يمكنك تجربة محاكاة الدائرة من هنا، وفى هذا الرابط ستجد الدائرة مرسومة كما هو مُوضح بالأعلى، للتشغيل اضغط على زرStart Simulation لبدء المحاكاة.
ولتحميل برنامج Fritzing المجاني من خلال الموقع الخاص به اضغط هنا.
ويمكنك أيضاً البحث فى موقع Fritzing وموقع المحاكاة circuits.io عن تصميمات ورسومات لدوائر مختلفة واسعة المجال وتطبيقات متنوعة ورائعة (جربها الآن).
أتمنى أن يكون الدرس مفيداً لكم.
تعليقات
إرسال تعليق