אנו יודעים במשרדים, בקניונים ובמקומות רבים אחרים שרק מי שיש לו כרטיס הרשאה רשאי להיכנס לחדר. מערכות אלו משתמשות במערכת תקשורת RFID. RFID משמש בקניונים כדי לעצור גניבה כאשר המוצרים מתויגים עם שבב RFID וכשאדם עוזב את הבניין עם שבב ה- RFID אזעקה מופעלת באופן אוטומטי. תג ה- RFID מתוכנן כחלק מחול. מערכות האימות של RFID קלות לתכנון וזולות בעלותן. כמה בתי ספר ומכללות משתמשים כיום במערכות נוכחות מבוססות RFID.
בפרויקט זה אנו מתכננים לעצב מערכת גביית אגרה מבוססת RFID למטרות אבטחה. אז מערכת זו פותחת שערים ומאפשרת לאנשים רק עם תגי ה- RFID המורשים. תעודות הזהות של בעל התגים המורשים מתוכנתות במיקרו בקר ATMEGA ורק המחזיקים רשאים לצאת או להיכנס לחצרים.
רכיבים נדרשים
חומרה: מיקרו-בקרה ATmega32, ספק כוח (5V), AVR-ISP מתכנת, JHD_162ALCD (מודול LCD 16x2), קבל 100uF (מחובר על פני ספק כוח), כפתור, נגד 10KΩ, קבל 100nF, LED (שני חלקים), EM-18 (מודול קורא RFID), נהג מנוע L293D IC, מנוע DC 5V.
תוכנה: Atmel studio 6.1, פרוגיספ או קסם פלאש.
תרשים מעגל והסבר עבודה
בשנות ה מעגל מערכת גבייה RFID המוצג לעיל, פורטה של ATMEGA32 מחובר ליציאת נתונים של LCD. כאן עלינו לזכור להשבית את תקשורת JTAG ב- PORTC ל- ATMEGA על ידי שינוי בתים הנתיכים, אם נרצה להשתמש ב- PORTC כיציאת תקשורת רגילה. ב 16x2 LCD, יש 16 פינים על כל אם יש תאורה אחורית, אם אין אור אחורי יהיו 14 פינים. אנחנו יכולים להפעיל או להשאיר את סיכות התאורה האחורית. עכשיו ב- 14 סיכות ישנם 8 פינים נתונים (7-14 או D0-D7), 2 סיכות אספקת החשמל (1 & 2 או VSS & VDD או GND & + 5V), 3 rd סיכה לבקרת ניגודיות (VEE-שולטת כמה עבה יש להציג תווים), 3 סיכות שליטה (RS & RW & E).
במעגל תוכלו לראות שלקחתי רק שתי סיכות בקרה. זה נותן את הגמישות של הבנה טובה יותר. ביט הניגודיות ו- READ / WRITE לא משמשים לעתים קרובות, כך שניתן לקצר אותם לקרקע. זה מכניס את LCD למצב הניגודיות והקריאה הגבוה ביותר. אנחנו רק צריכים לשלוט בסיכות ENABLE ו- RS כדי לשלוח תווים ונתונים בהתאם.
החיבורים המיוצרים עבור LCD מובאים להלן:
PIN1 או VSS לקרקע
PIN2 או VDD או VCC ל- + 5v כוח
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. מהאיור לעיל, אין ביטים זוגיים, ביט עצירה אחד בנתונים שנשלחו על ידי המודול.
התכונות לעיל מוגדרות ברשומות הבקר; אנחנו הולכים לדון בהם בקצרה,
אדום (RXEN): סיבית זו מייצגת את תכונת נתוני הקבלה. יש להגדיר ביט זה כדי שהנתונים מהמודול יתקבלו על ידי הבקר. זה גם מאפשר סיכת RXD של בקר.
BROWN (RXCIE): יש להגדיר סיבית זו לקבלת הפרעה לאחר קבלת נתונים מוצלחת. על ידי הפעלת סיבית זו אנו מכירים, מיד לאחר קבלת נתונים של 8 סיביות.
PINK (URSEL): יש להגדיר ביט זה לפני הפעלת ביטים אחרים ב- UCSRC. לאחר ההגדרה, יש להשבית ביטים נדרשים אחרים ב- UCSRC, URSEL או לאפס אותם.
צהוב (UCSZ0, UCSZ1, UCSZ2): שלוש סיביות אלה משמשות לבחירת מספר סיביות הנתונים שאנו מקבלים או שולחים בבת אחת.
מכיוון שהנתונים שנשלחים על ידי מודול RFID הם מסוג נתונים 8bit, עלינו להגדיר UCSZ0, UCSZ1 לאחד ו- UCSZ2 לאפס.
ORANGE (UMSEL): סיבית זו נקבעת על סמך אם המערכת מתקשרת בצורה אסינכרונית (שניהם משתמשים בשעון אחר) או באופן סינכרוני (שניהם משתמשים באותו שעון).
מכיוון שהמודול והבקר משתמשים בשעון שונה, יש להגדיר ביט זה לאפס או להשאיר אותו לבד מכיוון שכולם מוגדרים לאפס כברירת מחדל.
ירוק (UPM1, UPM0): שני סיביות אלה מותאמות על סמך זוגיות הסיביות בה אנו משתמשים בתקשורת.
מכיוון שמודול RFID שולח נתונים ללא זוגיות, הגדרנו את שניהם UPM1, UPM0 לאפס או שהם יכולים להישאר לבד מכיוון שכל הביטים בכל האגפים מוגדרים לאפס כברירת מחדל.
כחול (USBS): סיבית זו משמשת לבחירת מספר סיביות העצירה בהן אנו משתמשים במהלך התקשורת.
מכיוון שמודול ה- RFID שולח נתונים עם ביט עצירה אחד, עלינו פשוט להשאיר את ביט ה- USBS לבד.
כעת סוף סוף עלינו לקבוע את קצב השידור, מהאיור לעיל ברור שמודול ה- RFID שולח נתונים לבקר בקצב שידור של 9600bps (ביט לשנייה).
קצב השידור נקבע בבקר על ידי בחירת ה- UBRRH המתאים.
ערך UBRRH נבחר על ידי קצב שידור מצולב ותדר גביש מעבד, כך שעל ידי התייחסות צולבת ערך UBRR נתפס כ- '6', ולכן קצב השידור נקבע.
כעת, כפי שמוצג באיור, שני סיכות מהבקר עוברות ל- L293D, שהוא H-BRIDGE המשמש לבקרת מהירות וכיוון סיבוב עבור מנועי DC בעלי הספק נמוך.
L293D הוא IC של H-BRIDGE המיועד להנעת מנועי DC בעלי הספק נמוך ומוצג באיור, IC זה מורכב משני גשרי H וכך הוא יכול להניע שני מנועי DC. אז ניתן להשתמש ב- IC זה להנעת מנועי רובוט מאותות המיקרו-בקר.
כעת, כפי שנדון לפני כן, ל- IC זה יכולת לשנות את כיוון הסיבוב של מנוע DC. זה מושג על ידי שליטה על רמות המתח ב- INPUT1 ו- INPUT2.
אפשר סיכה |
סיכת קלט 1 |
סיכת קלט 2 |
כיוון מוטורי |
גָבוֹהַ |
נָמוּך |
גָבוֹהַ |
פנה ימינה |
גָבוֹהַ |
גָבוֹהַ |
נָמוּך |
פונה שמאלה |
גָבוֹהַ |
נָמוּך |
נָמוּך |
תפסיק |
גָבוֹהַ |
גָבוֹהַ |
גָבוֹהַ |
תפסיק |
אז כפי שמוצג בטבלה לעיל, לסיבוב השעון 2A צריך להיות גבוה ו- 1A צריך להיות נמוך. באופן דומה נגד השעון 1A צריך להיות גבוה ו- 2A צריך להיות נמוך.
בכל פעם שמתקרב כרטיס מורשה ליד המודול, המנוע מתוכנת לנוע בשעון בכיוון השעון כדי להראות ששער האגרה נפתח לאחר שנייה שהוא חוזר, ואומר ששער האגרה סגור. את העבודה על רחבת האגרה ניתן להסביר בצורה הטובה ביותר שלב אחר שלב של קוד C להלן.
הסבר על תכנות
להלן הסבר שורה לשורה עבור הקוד של מערכת גביית האגרה RFID. תוכל להבין את הרעיון והעבודה של פרויקט זה על ידי קריאת הקוד למטה. להורדה או העתקה תוכלו למצוא את הקוד השלם בתחתית העמוד.
#include // כותרת כדי לאפשר בקרת זרימת נתונים על פינים
#define F_CPU 1000000 // מדגיש תדר גביש לבקר
#לִכלוֹל
#define E 5 // מתן השם "לאפשר" כדי 5 th סיכה של PORTD, שכן היא מחוברת LCD לאפשר סיכה
RS #define 6 // מתן השם "registerselection" כדי 6 th סיכה של PORTD, שכן היא מחוברת סיכה RS LCD
בטל send_a_command (פקודת char לא חתומה);
בטל send_a_character (דמות char לא חתומה);
בטל send_a_string (char * string_of_characters);
int main (בטל)
{
DDRA = 0xFF; // הצבת פורטה כסיכות פלט
DDRD = 0b11111110;
_ Delay_ms (50); // מתן עיכוב של 50ms
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)},; // הקצאת זיכרון להצגת המזהה שנשלח באמצעות מודול int i = 0; הצבעה int = 0; int k = 0; send_a_command (0x01); // מסך נקה 0x01 = 00000001 _עיכוב_מס (50); send_a_command (0x38); // אומר ל- lcd שאנחנו משתמשים במצב פקודה / נתונים 8bit _עיכוב_מס (50); send_a_command (0b00001111); // מסך LCD מופעל ומהבהב הקורס MEM char; // הקצאת זיכרון לאחסון מזהה שלם של התג send_a_string ("מספר RFID"); // שליחת מחרוזת send_a_command (0x80 + 0x40 + 0); // העברת קורס לקו השני בעוד (1) { בעוד (! (UCSRA & (1 <
{ } COUNTA = UDR; // UDR מאחסן את נתוני שמונת הסיביות שהתקבלו ונלקח למספר שלם. MEM = COUNTA; // שתי התווים הראשונים מתעדכנים בזיכרון itoa (COUNTA, SHOWA, 16); // פקודה להכנסת מספר משתנה ב- LCD (מספר משתנה, באיזה תו להחליף, איזה בסיס משתנה (עשר כאן כפי שאנו סופרים מספר בבסיס 10)) send_a_string (SHOWA); // אומר לתצוגה להציג תו (מוחלף במספר משתנה) של אדם שני לאחר מיקום הקורס על גבי LCD בעוד (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // התווים השלישי והרביעי מתעדכנים בזיכרון בעוד (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // התווים החמישית והשישית מתעדכנים בזיכרון בעוד (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 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)) {// בדיקת אישור קנייה המשווה בין שתי תווים בכל פעם לתווים בזיכרון PORTB - = (1 <
PORTB & = ~ (1 <
_ Delay_ms (220); // עיכוב _עיכוב_מס (220); _עיכוב_מס (220); _עיכוב_מס (220); _עיכוב_מס (220); _עיכוב_מס (220); PORTB - = (1 <
PORTB & = ~ (1 <
_עיכוב_מס (220); _עיכוב_מס (220); _עיכוב_מס (220); _עיכוב_מס (220); _עיכוב_מס (220); _עיכוב_מס (220); PORTB & = ~ (1 <
PORTB - = (1 <
} } UCSRB - = (1 <
} } בטל send_a_command (פקודת char לא חתומה) { PORTA = פקודה; PORTD & = ~ (1 <
פורט - = 1 <
_עיכוב_מס (50); PORTD & = ~ 1 <
פורטה = 0; } בטל send_a_character (תו לא חתום) { PORTA = דמות; פורט - = 1 <
פורט - = 1 <
_עיכוב_מס (50); PORTD & = ~ 1 <
פורטה = 0; } בטל send_a_string (char * string_of_characters) { בעוד (* string_of_characters> 0) { send_a_character (* string_of_characters ++); } } |