نحن نعلم في المكاتب ومراكز التسوق وفي العديد من الأماكن الأخرى حيث يُسمح فقط للشخص الذي يحمل بطاقة تفويض بالدخول إلى الغرفة. تستخدم هذه الأنظمة نظام اتصالات RFID. يتم استخدام RFID في مراكز التسوق لوقف السرقة حيث يتم تمييز المنتجات بشريحة RFID وعندما يغادر شخص ما المبنى بشريحة RFID ، يتم إصدار إنذار تلقائيًا. تم تصميم علامة RFID لتكون صغيرة كجزء من الرمال. أنظمة مصادقة RFID سهلة التصميم ورخيصة الثمن. تستخدم بعض المدارس والكليات في الوقت الحاضر أنظمة الحضور القائمة على RFID.
سنقوم في هذا المشروع بتصميم نظام لتحصيل الرسوم يعتمد على RFID لأغراض أمنية. لذلك يفتح هذا النظام البوابات ويسمح فقط للأشخاص الذين يحملون بطاقات RFID المعتمدة. يتم برمجة معرف حامل العلامات المصرح به في متحكم ATMEGA ولا يُسمح إلا لهؤلاء الحاملين بمغادرة المبنى أو دخوله.
المكونات مطلوبة
الأجهزة: متحكم ATmega32 ، مصدر طاقة (5 فولت) ، مبرمج AVR-ISP ، JHD_162ALCD (وحدة LCD 16 × 2) ، مكثف 100 فائق التوهج (متصل عبر مزود الطاقة) ، زر ، مقاوم 10KΩ ، مكثف 100nF ، LED (قطعتين) ، EM-18 (وحدة قارئ RFID) ، محرك L293D IC ، محرك 5V DC.
البرنامج: Atmel studio 6.1، progisp or flash magic.
مخطط الدائرة وشرح العمل
في دائرة نظام جمع رسوم RFID الموضحة أعلاه ، يتم توصيل PORTA الخاص بـ ATMEGA32 بمنفذ بيانات شاشة LCD. هنا يجب أن نتذكر تعطيل اتصال JTAG في PORTC إلى ATMEGA عن طريق تغيير بايتات المصهر ، إذا أردنا استخدام PORTC كمنفذ اتصال عادي. في شاشة LCD مقاس 16 × 2 ، يوجد 16 دبوسًا في الكل إذا كان هناك ضوء خلفي ، وإذا لم يكن هناك ضوء خلفي ، فسيكون هناك 14 دبوسًا. يمكننا تشغيل أو ترك دبابيس الضوء الخلفي. يوجد الآن في 14 دبابيس 8 دبابيس بيانات (7-14 أو D0-D7) ، 2 دبابيس إمداد الطاقة (1 & 2 أو VSS & VDD أو gnd & + 5v) ، 3 دبوس rd للتحكم في التباين (يتحكم VEE في مدى سماكة يجب إظهار الأحرف) ، 3 دبابيس تحكم (RS & RW & E).
في الدائرة ، يمكنك ملاحظة أنني أخذت دبابيس تحكم فقط. هذا يعطي مرونة لفهم أفضل. لا يتم استخدام بت التباين والقراءة / الكتابة في كثير من الأحيان حتى يمكن تقصيرها إلى الأرض. هذا يضع LCD في أعلى وضع التباين والقراءة نحتاج فقط إلى التحكم في دبابيس ENABLE و RS لإرسال الأحرف والبيانات وفقًا لذلك.
فيما يلي التوصيلات التي تم إجراؤها من أجل LCD:
PIN1 أو VSS على الأرض
PIN2 أو VDD أو VCC إلى + 5 فولت
PIN3 أو VEE على الأرض (يعطي أقصى تباين أفضل للمبتدئين)
PIN4 أو RS (اختيار التسجيل) إلى PD6 من MCU
PIN5 أو RW (قراءة / كتابة) على الأرض (يؤدي وضع شاشة LCD في وضع القراءة إلى تسهيل الاتصال للمستخدم)
PIN6 أو E (تمكين) إلى PD5 لوحدة التحكم الدقيقة
PIN7 أو D0 إلى PA0
PIN8 أو D1 إلى PA1
PIN9 أو D2 إلى PA2
PIN10 أو D3 إلى PA3
PIN11 أو D4 إلى PA4
PIN12 أو D5 إلى PA5
PIN13 أو D6 إلى PA6
PIN14 أو D7 إلى PA7
في الدائرة ، يمكنك أن ترى أننا استخدمنا اتصال 8 بت (D0-D7). ومع ذلك ، هذا ليس إلزاميًا ويمكننا استخدام اتصال 4 بت (D4-D7) ولكن مع برنامج اتصال 4 بت يصبح معقدًا بعض الشيء ، لذلك فضلت الاتصال 8 بت.
لذلك من مجرد ملاحظة الجدول أعلاه ، نقوم بتوصيل 10 دبابيس من شاشة LCD بوحدة التحكم ، حيث تكون 8 دبابيس عبارة عن دبابيس بيانات و 2 دبابيس للتحكم.
قبل المضي قدمًا ، نحتاج إلى فهم الاتصال التسلسلي. ترسل وحدة RFID هنا البيانات إلى وحدة التحكم بالتسلسل. لديها طريقة اتصال أخرى ولكن لسهولة الاتصال نحن نختار RS232. يتم توصيل دبوس RS232 من الوحدة بدبوس RXD الخاص بـ ATMEGA.
البيانات التي ترسلها وحدة RFID هي:
الآن بالنسبة لواجهة وحدة RFID ، فإن الميزات التالية مطلوبة:
1. يجب تمكين دبوس RXD (ميزة استقبال البيانات) لوحدة التحكم.
2. نظرًا لأن الاتصال تسلسلي ، نحتاج إلى معرفة متى يتم استلام البيانات ، حتى نتمكن من إيقاف البرنامج حتى يتم استلام البايت الكامل. يتم ذلك عن طريق تمكين تلقي البيانات مقاطعة كاملة.
3. يرسل RFID البيانات إلى وحدة التحكم في وضع 8 بت. لذلك سيتم إرسال حرفين إلى وحدة التحكم في كل مرة. هذا موضح في الشكل أعلاه.
4. من الشكل أعلاه ، لا توجد بتات تكافؤ ، بت توقف واحد في البيانات المرسلة بواسطة الوحدة.
يتم تعيين الميزات المذكورة أعلاه في سجلات وحدة التحكم ؛ سنناقشها بإيجاز ،
RED (RXEN): يمثل هذا البت ميزة استقبال البيانات. يجب تعيين هذا البت للبيانات من الوحدة ليتم استلامها بواسطة وحدة التحكم. كما أنها تمكن دبوس RXD من وحدة التحكم.
BROWN (RXCIE): يجب تعيين هذا البت للحصول على مقاطعة بعد استقبال البيانات بنجاح. من خلال تمكين هذا الشيء ، نتعرف بعد تلقي بيانات 8 بت مباشرة.
PINK (URSEL): يجب تعيين هذا البت قبل تمكين وحدات البت الأخرى في UCSRC. بعد الضبط ، يجب تعطيل البتات الأخرى المطلوبة في UCSRC ، أو URSEL أو وضع الصفر.
YELLOW (UCSZ0، UCSZ1، UCSZ2): تُستخدم هذه البتات الثلاثة لاختيار عدد بتات البيانات التي نتلقاها أو نرسلها دفعة واحدة.
نظرًا لأن البيانات المرسلة بواسطة وحدة RFID هي نوع بيانات 8 بت ، يتعين علينا تعيين UCSZ0 و UCSZ1 على واحد و UCSZ2 إلى الصفر.
ORANGE (UMSEL): يتم تعيين هذا البت بناءً على ما إذا كان النظام يتصل بشكل غير متزامن (كلاهما يستخدم ساعة مختلفة) أو بشكل متزامن (كلاهما يستخدم نفس الساعة).
نظرًا لأن الوحدة النمطية ووحدة التحكم تستخدمان ساعة مختلفة ، فيجب ضبط هذا البت على الصفر أو تركه بمفرده حيث يتم ضبطهما جميعًا على صفر افتراضيًا.
GREEN (UPM1، UPM0): يتم ضبط هاتين البتتين بناءً على تكافؤ البت الذي نستخدمه في الاتصال.
نظرًا لأن وحدة RFID ترسل البيانات بدون تكافؤ ، فقد قمنا بتعيين كل من UPM1 و UPM0 على الصفر أو يمكن تركها بمفردها حيث يتم ضبط جميع وحدات البت في أي سجلات على صفر افتراضيًا.
BLUE (USBS): يستخدم هذا البت لاختيار عدد بتات التوقف التي نستخدمها أثناء الاتصال.
نظرًا لأن وحدة RFID ترسل البيانات بتوقف واحد ، علينا فقط ترك USBS بت بمفرده.
الآن أخيرًا نحتاج إلى ضبط معدل البث بالباود ، من الواضح من الشكل أعلاه أن وحدة RFID ترسل البيانات إلى وحدة التحكم بمعدل باود يبلغ 9600 بت في الثانية (بت في الثانية).
يتم تعيين معدل البث بالباود في وحدة التحكم عن طريق اختيار UBRRH المناسب.
يتم اختيار قيمة UBRRH من خلال معدل البث بالباود المتقاطع وتردد وحدة المعالجة المركزية ، لذلك من خلال المرجع التبادلي ، يُنظر إلى قيمة UBRR على أنها "6" ، وبالتالي يتم تعيين معدل البث بالباود.
الآن كما هو موضح في الشكل ، يذهب دبابيسان من وحدة التحكم إلى L293D ، وهو H-BRIDGE يستخدم للتحكم في سرعة واتجاه الدوران لمحركات التيار المستمر منخفضة الطاقة.
L293D هو H-BRIDGE IC مصمم لقيادة محركات DC منخفضة الطاقة ويظهر في الشكل ، ويتكون هذا IC من جسرين على شكل حرف h وبالتالي يمكنه قيادة محركي تيار مستمر. لذلك يمكن استخدام هذا IC لقيادة محركات الروبوت من إشارات متحكم.
الآن كما تمت مناقشته من قبل هذا IC لديه القدرة على تغيير اتجاه دوران محرك التيار المستمر. يتم تحقيق ذلك من خلال التحكم في مستويات الجهد عند INPUT1 و INPUT2.
تمكين دبوس |
إدخال دبوس 1 |
إدخال دبوس 2 |
اتجاه المحرك |
عالي |
منخفض |
عالي |
انعطف يمينا |
عالي |
عالي |
منخفض |
انعطف لليسار |
عالي |
منخفض |
منخفض |
قف |
عالي |
عالي |
عالي |
قف |
لذلك كما هو موضح في الجدول أعلاه ، يجب أن يكون الدوران على مدار الساعة 2A مرتفعًا ويجب أن يكون 1A منخفضًا. وبالمثل بالنسبة لعكس اتجاه عقارب الساعة ، يجب أن تكون 1A عالية ويجب أن تكون 2A منخفضة.
عندما يتم إحضار بطاقة معتمدة بالقرب من الوحدة ، تتم برمجة المحرك للتحرك في اتجاه عقارب الساعة لمدة ثانية ، لإظهار فتح بوابة التعرفة بعد ثانية ، وعودتها ، وإبلاغ بوابة الرسوم مغلقة. من الأفضل شرح عمل ساحة الرسوم خطوة بخطوة من كود C الوارد أدناه.
شرح البرمجة
يوجد أدناه شرح من سطر إلى سطر لرمز نظام جمع رسوم RFID. يمكنك فهم مفهوم وعمل هذا المشروع من خلال قراءة الكود أدناه. للتنزيل أو النسخ ، يمكنك العثور على الشفرة الكاملة في أسفل الصفحة.
#include // header لتمكين التحكم في تدفق البيانات عبر المسامير
#define F_CPU 1000000 // إخبار وحدة التحكم بتردد الكريستال المرفق
#تضمن
#define E 5 // إعطاء اسم "تمكين" للدبوس الخامس من PORTD ، نظرًا لأنه متصل بدبوس تمكين LCD
#define RS 6 // إعطاء اسم "اختيار التسجيل" للدبوس السادس من PORTD ، نظرًا لأنه متصل بدبوس LCD RS
send_a_command باطلة (أمر char غير الموقع) ؛
send_a_character باطلة (حرف char غير موقع) ؛
send_a_string باطلة (char * string_of_characters) ؛
int main (باطل)
{
DDRA = 0xFF ؛ // وضع بورتا كدبابيس إخراج
DDRD = 0b11111110 ؛
_delay_ms (50) ؛ // إعطاء تأخير قدره 50 مللي ثانية
DDRB = 0b11110000 ؛ // أخذ بعض دبابيس portB كمدخلات.
UCSRB - = (1 <
UCSRC - = (1 <
UCSRC & = ~ (1 <
UBRRH & = ~ (1 <
UBRRL = 6 ؛ // تعيين معدل البث بالباود // يحتوي التالي على معرف العلامات ، ويجب تغييرها لعلامات مختلفة ، ويجب تحديثها حتى يعمل المشروع
/ * بعد إغراق البرنامج في وحدة التحكم يجب أخذ البطاقات التي يجب أن تكون مخولة والحصول على هوية الوسم يتم الحصول عليها عن طريق وضع العلامة بالقرب من وحدة RFID وسيظهر المعرف على الشاشة. بعد الحصول على المعرفات ، يجب تحديث البرنامج عن طريق استبدال أرقام المعرفات أدناه بأرقام معرفات جديدة.
char ADMIT = {{(0x97) ، (0xa1) ، (0x90) ، (0x92)} ، {(0x97) ، (0xa1) ، (0x90) ، (0x93)} ، {(0x97) ، (0xa1) ، (0x90) ، (0x94)} ، {(0x97) ، (0xa1) ، (0x90) ، (0x95)} ، {(0x97) ، (0xa1) ، (0x90) ، (0x96)}} ؛ |
الآن في ما سبق ، نعتمد خمس بطاقات فقط ، ويمكن تغييرها إلى أي رقم.
على سبيل المثال ، ضع في اعتبارك أن البرنامج الافتراضي تم إلقاؤه في وحدة التحكم ، واحصل على البطاقات التي يجب اعتمادها. ضع واحدًا تلو الآخر بالقرب من الوحدة ، ستحصل على المعرف لكل واحد مثل xxxxxxxx (907a4F87) ،
إذا كان لدينا 7 علامات ، فسيكون لدينا 7 معرفات ثمانية بت. * /
// الآن لسبع بطاقات ستصبح // char ADMIT = {{(0x90)، (0x7a)، (0x4F)، (0x87)} ،؛ // تخصيص الذاكرة لإظهار الهوية المرسلة حسب الوحدة كثافة العمليات أنا = 0 ؛ تصويت int = 0 ؛ كثافة العمليات ك = 0 ؛ send_a_command (0x01) ؛ // مسح الشاشة 0x01 = 00000001 _delay_ms (50) ؛ send_a_command (0x38) ؛ // إخبار شاشات الكريستال السائل أننا نستخدم وضع قيادة / بيانات 8 بت _delay_ms (50) ؛ send_a_command (0b00001111) ؛ // LCD SCREEN ON ووميض العداد شار ميم // تخصيص الذاكرة لتخزين المعرف الكامل للعلامة send_a_string ("رقم RFID") ؛ // إرسال سلسلة send_a_command (0x80 + 0x40 + 0) ؛ // الانتقال إلى السطر الثاني بينما (1) { بينما (! (UCSRA & (1 <
{ } كونتا = UDR ؛ // يخزن UDR البيانات الثمانية بتات المستلمة ويتم أخذها في عدد صحيح. MEM = COUNTA ؛ // يتم تحديث أول حرفين إلى الذاكرة إيتوا (كونتا ، شوا ، 16) ؛ // الأمر لوضع رقم متغير في شاشة LCD (رقم متغير ، في أي حرف يتم استبداله ، أي قاعدة متغيرة (عشرة هنا لأننا نحسب الرقم في base10)) send_a_string (SHOWA) ، / / إخبار الشاشة بإظهار شخصية (تم استبدالها برقم متغير) للشخص الثاني بعد وضع أداة التسجيل على شاشة LCD بينما (! (UCSRA & (1 <
{ } كونتا = UDR ؛ إيتوا (كونتا ، شوا ، 16) ؛ send_a_string (SHOWA) ، MEM = COUNTA ؛ // يتم تحديث الأحرف الثالثة والرابعة إلى الذاكرة بينما (! (UCSRA & (1 <
{ } كونتا = UDR ؛ إيتوا (كونتا ، شوا ، 16) ؛ send_a_string (SHOWA) ، MEM = COUNTA ؛ يتم تحديث الأحرف الخامسة والسادسة إلى الذاكرة بينما (! (UCSRA & (1 <
{ } كونتا = UDR ؛ إيتوا (كونتا ، شوا ، 16) ؛ send_a_string (SHOWA) ، MEM = COUNTA ؛ يتم تحديث الأحرف السابعة والثمانية إلى الذاكرة send_a_string ("") ؛ send_a_command (0x80 + 0x40 + 0) ؛ UCSRB & = ~ (1 <
لـ (i = 0 ؛ i <5 ؛ i ++) { إذا ((MEM == ADMIT) & (MEM == ADMIT) & (MEM == ADMIT) & (MEM == ADMIT)) {// التحقق من إذن شراء مقارنة بين حرفين في وقت واحد مع الأحرف الموجودة في الذاكرة بورتب - = (1 <
PORTB & = ~ (1 <
_delay_ms (220) ؛ // تأخير _delay_ms (220) ؛ _delay_ms (220) ؛ _delay_ms (220) ؛ _delay_ms (220) ؛ _delay_ms (220) ؛ بورتب - = (1 <
PORTB & = ~ (1 <
_delay_ms (220) ؛ _delay_ms (220) ؛ _delay_ms (220) ؛ _delay_ms (220) ؛ _delay_ms (220) ؛ _delay_ms (220) ؛ PORTB & = ~ (1 <
بورتب - = (1 <
} } UCSRB - = (1 <
} } send_a_command باطل (أمر char غير موقّع) { PORTA = أمر ؛ PORTD & = ~ (1 <
PORTD - = 1 <
_delay_ms (50) ؛ PORTD & = ~ 1 <
PORTA = 0 ؛ } send_a_character باطلة (حرف char غير موقع) { PORTA = حرف ؛ PORTD - = 1 <
PORTD - = 1 <
_delay_ms (50) ؛ PORTD & = ~ 1 <
PORTA = 0 ؛ } Send_a_string باطل (char * string_of_characters) { بينما (* string_of_characters> 0) { send_a_character (* string_of_characters ++) ؛ } } |