Знамо у канцеларијама, тржним центрима и на многим другим местима где само особа са ауторизационом картицом сме да уђе у собу. Ови системи користе РФИД комуникациони систем. РФИД се користи у тржним центрима за заустављање крађе јер су производи означени РФИД чипом, а када особа напусти зграду са РФИД чипом аутоматски се укључује аларм. РФИД ознака дизајнирана је тако мала као део песка. РФИД системи за потврду идентитета лако се пројектују и јефтини су. Неке школе и факултети данас користе РФИД системе похађања наставе.
У овом пројекту ћемо дизајнирати машину за гласање која броји само потврђене гласове. То се постиже коришћењем РФИД (Радио Фрекуенци Идентифицатион) ознака. Овде ћемо написати програм за АТМЕГА који омогућава да гласају само овлашћени власници РФИД ознака. (Погледајте и овај једноставни пројекат машине за гласање)
Компоненте потребне
Хардвер: АТМЕГА32, напајање (5в), АВР-ИСП ПРОГРАМЕР, ЈХД_162АЛЦД (16к2ЛЦД), кондензатор 100уФ (повезан преко извора напајања), дугме (пет комада), отпорник 10КΩ (пет комада), кондензатор 100нФ (пет комада), ЛЕД (два дела), ЕМ-18 (РФИД модул читача).
Софтвер: Атмел студио 6.1, прогисп или фласх магиц.
Шема и објашњење
У колу ПОРТА од АТМЕГА32 повезан је на дата порт ЛЦД-а. Овде треба имати на уму да онемогућите ЈТАГ комуникацију у ПОРТЦ-у у АТМЕГА променом бајтова осигурача, ако желите да ПОРТЦ користите као нормалан комуникациони порт. На ЛЦД екрану од 16к2 има укупно 16 пинова ако постоји црно светло, ако нема позадинског светла биће 14 пинова. Може се напајати или оставити игле задњег светла. Сада у 14 пинова постоји 8 пинова за податке (7-14 или Д0-Д7), 2 пина за напајање (1 и 2 или ВСС & ВДД или гнд & + 5в), трећи пин за контролу контраста (ВЕЕ - контролише колико дебели знакови треба да буду приказано), 3 контролна пина (РС & РВ & Е)
У кругу можете приметити да сам узео само два контролна пина, што даје флексибилност бољег разумевања, контрастни бит и РЕАД / ВРИТЕ се не користе често, тако да могу бити кратко спојени на масу. Ово ЛЦД поставља у највећи контраст и режим читања. Само треба да контролишемо ЕНАБЛЕ и РС пинове да би у складу са тим слали знакове и податке.
Конекције које се раде за ЛЦД дате су у наставку:
ПИН1 или ВСС на масу
ПИН2 или ВДД или ВЦЦ до + 5в снаге
ПИН3 или ВЕЕ на земљу (даје максимални контраст најбољи за почетнике)
ПИН4 или РС (Избор регистра) на ПД6 од уЦ
ПИН5 или РВ (читање / писање) на масу (ставља ЛЦД у режим читања олакшава комуникацију за корисника)
ПИН6 или Е (Омогући) на ПД5 од уЦ
ПИН7 или Д0 до ПА0 од уЦ
ПИН8 или Д1 до ПА1 од уЦ
ПИН9 или Д2 до ПА2 од уЦ
ПИН10 или Д3 до ПА3 од уЦ
ПИН11 или Д4 до ПА4 од уЦ
ПИН12 или Д5 до ПА5 од уЦ
ПИН13 или Д6 до ПА6 од уЦ
ПИН14 или Д7 до ПА7 од уЦ
У кругу видите да смо користили 8-битну комуникацију (Д0-Д7). Међутим, ово није обавезно и можемо користити 4-битну комуникацију (Д4-Д7), али са 4-битним комуникацијским програмом постаје помало сложен, па сам више волео 8-битну комуникацију.
Тако из пуког посматрања горње табеле повезујемо 10 пинова ЛЦД-а на контролер у којем су 8 пинова пинови за податке и 2 пина за контролу.
Пре него што кренемо напред, морамо да разумемо серијску комуникацију. РФИД модул овде серијски шаље податке контролору. Има и други начин комуникације, али за лакшу комуникацију бирамо РС232. РС232 пин модула је повезан са РКСД пином АТМЕГА.
Подаци које РФИД модул шаље:
Сада су за интерфејс РФИД модула потребне следеће функције:
1. РКСД пин (функција пријема података) контролера мора бити омогућен.
2. Будући да је комуникација серијска, морамо знати сваки пут када се прими дата бие, како бисмо могли зауставити програм док се не прими комплетан бајт. То се постиже омогућавањем да подаци примају потпуни прекид.
3. РФИД шаље податке контролору у 8-битном режиму. Дакле, два знака ће се истовремено слати контролору. Ово је приказано у блоку на слици 3
4. На слици 3 нема битова паритета, један зауставни бит у подацима које шаље модул.
Горе наведене карактеристике постављене су у регистре контролера; разговараћемо о њима укратко,
ЦРВЕНА (РКСЕН): Овај бит представља функцију пријема података, овај бит мора бити подешен да би подаци из модула примали контролер, такође омогућава РКСД пин контролера.
СМЕЂА (РКСЦИЕ): Овај бит мора бити подешен за добијање прекида након успешног пријема података. Омогућавањем овог бита упознајемо се одмах након пријема 8-битних података.
ПИНК (УРСЕЛ): Овај бит мора бити постављен пре омогућавања осталих битова у УЦСРЦ, након подешавања осталих потребних битова у УЦСРЦ; УРСЕЛ мора бити онемогућен или постављен на нулу.
ЖУТА (УЦСЗ0, УЦСЗ1, УЦСЗ2): Ова три бита се користе за одабир броја битова података које примамо или шаљемо у једном потезу.
Будући да подаци које шаље РФИД модул имају 8-битни тип података (СЛИКА3), морамо поставити УЦСЗ0, УЦСЗ1 на један, а УЦСЗ2 на нулу.
НАРАНЧАСТА (УМСЕЛ): Овај бит се поставља на основу тога да ли систем комуницира асинхроно (оба користе другачији сат) или синхроно (оба користе исти сат),
Будући да модул и контролер користе другачији сат, овај бит мора бити постављен на нулу или остављен сам јер су сви подразумевано подешени на нулу.
ЗЕЛЕНО (УПМ1, УПМ0): Ова два бита су прилагођена на основу паритета битова који користимо у комуникацији.
Будући да РФИД модул шаље податке без паритета (СЛИКА3), поставили смо и УПМ1, УПМ0 на нулу или их можемо оставити саме јер су сви битови у било којем регистру подразумевано постављени на нулу.
ПЛАВО (УСБС): Овај бит се користи за одабир броја зауставних битова које користимо током комуникације.
Будући да РФИД модул шаље податке једним зауставним битом (слика3), само морамо да оставимо УСБС бит на миру.
Сада коначно треба да подесимо брзину преноса, са слике 3 је јасно да РФИД модул шаље податке контролору са брзином преноса од 9600 бпс (бита у секунди).
Брзина преноса података подешава се у контролеру избором одговарајућег УБРРХ,
Вредност УБРРХ се бира брзином преноса података и фреквенцијом кристала ЦПУ,
Дакле, унакрсном референцом вредност УБРР се види као '6', и тако је постављена брзина преноса.
Овде је присутно пет тастера, четири за повећање гласова кандидата и пето за ресетовање гласова кандидата на нулу. Овде присутни кондензатори служе за поништавање ефекта одбијања тастера. Ако се уклоне, контролер може бројати више од сваког пута када се притисне дугме.
Отпорници повезани за пинове служе за ограничавање струје када се притисне дугме за спуштање клина на земљу. Кад год се притисне дугме, одговарајући пин регулатора се сруши на земљу и самим тим контролер препознаје да се притиска одређено дугме и предузима одговарајућа радња, то може бити повећање гласова кандидата или ресетовање гласова у зависности од притиснутог дугмета.
Када се притисне дугме које представља одговарајућу особу, контролер га бира и увећава одговарајући број особе у својој меморији, након повећања приказује резултат одговарајућих особа на ЛЦД екрану 16к2.
Рад гласачке машине најбоље је објаснити корак по корак Ц кода датог у наставку:
Објашњење кода
#инцлуде // заглавље да би се омогућила контрола протока података над пиновима
#дефине Ф_ЦПУ 1000000 // припојена кристална фреквенција контролера
#инцлуде
#дефине Е 5 // давање имена „енабле“ петом пину ПОРТД-а, јер је повезан на пин за омогућавање ЛЦД-а
#дефине РС-6 // даје име "регистерселецтион" до 6 тх пин на ПОРТД, јер је повезан са пин ЛЦД РС
воид сенд_а_цомманд (непотписана наредба цхар);
воид сенд_а_цхарацтер (непотписани знак карактера);
воид сенд_а_стринг (цхар * стринг_оф_цхарацтерс);
инт маин (воид)
{
ДДРА = 0кФФ; // стављање порта као излазних пинова
ДДРД = 0б11111110;
_делаи_мс (50); // давање кашњења од 50мс
ДДРБ = 0б11110000; // Узимање неких портБ пинова као улаза.
УЦСРБ - = (1 <
// омогућавање података прима потпуни прекид, омогућавање примања података пин
УЦСРЦ - = (1 <
// промена осталих битова прво подешавањем УРСЕЛ-а, подешавањем 8-битне комуникације
УЦСРЦ & = ~ (1 <
УБРРХ & = ~ (1 <
УБРРЛ = 6; // подешавање брзине преноса
инт16_т ВОТЕА = 0; // гласови персон1 чувају меморију
цхар А; // персон1 гласови који приказују карактер на ЛЦД-у
инт16_т ВОТЕБ = 0;; // персон2 гласови који чувају меморију
цхар Б; // персон2 гласови који приказују карактер на ЛЦД-у
инт16_т ВОТЕЦ = 0;; // персон3 гласови који чувају меморију
цхар Ц; // глас 3 особе приказује карактер на ЛЦД-у
инт16_т ГЛАСАЛО = 0;; // особа4 гласа чувају меморију
цхар Д; / / персон4 гласови који приказују карактер на ЛЦД-у
// Следеће садржи ИД ознака, оне се морају променити за различите ознаке. Морају се ажурирати да би пројекат функционисао
// Након избацивања програма у контролер потребно је узети картице које морају бити ауторизоване и добити ИД ознака, оне се добијају стављањем ознаке близу РФИД модула и ИД ће бити приказан на екрану. Након добијања ИД-а, програм се мора ажурирати заменом доле наведених ИД бројева новим ИД бројевима.
цхар АДМИТ = {{(0к97), (0ка1), (0к90), (0к92)}, {(0к97), (0ка1), (0к90), (0к93)}, {(0к97), (0ка1), (0к90), (0к94)}, {(0к97), (0ка1), (0к90), (0к95)}, {(0к97), (0ка1), (0к90), (0к96)}}; |
Сада горе одобравамо само пет карата, које се могу променити у било који број, На пример, узмите у обзир да је задати програм бачен у контролер, узмите картице које треба одобрити, ставите једну за другом у близини модула, за сваку ћете добити ИД као кккккккк (907а4Ф87)
Ако имамо 7 ознака које имамо, тада ћемо имати 7 осмобитних ИД-а.
// сада за седам карата то иде као // цхар АДМИТ = {{(0к90), (0к7а), (0к4Ф), (0к87)},; // додељивање меморије за приказ ИД-а који шаље модул инт и = 0; инт глас = 0; инт к = 0; сенд_а_цомманд (0к01); // Обриши екран 0к01 = 00000001 _делаи_мс (50); сенд_а_цомманд (0к38); // кажемо лцд-у да користимо 8-битни режим команди / података _делаи_мс (50); сенд_а_цомманд (0б00001111); // ЛЦД ЕКРАН УКЉУЧЕН и индикатор трепери цхар МЕМ; // додељивање меморије за чување комплетног ИД ознаке сенд_а_стринг ("РФИД БРОЈ"); // стринг за слање сенд_а_цомманд (0к80 + 0к40 + 0); // померање курсора у други ред док (1) { вхиле (! (УЦСРА & (1 <
{ } ЦОУНТА = УДР; // УДР чува примљене осмобитне податке и узима се у цео број. МЕМ = ЦОУНТА; // прва два знака се ажурирају у меморију итоа (ЦОУНТА, СХОВА, 16); // наредба за стављање променљивог броја у ЛЦД (променљиви број, који знак треба заменити, која је основа променљива (овде десет, јер рачунамо број у басе10)) сенд_а_стринг (СХОВА); // казивање дисплеју да покаже карактер (замењен променљивим бројем) друге особе након постављања курсора на ЛЦД вхиле (! (УЦСРА & (1 <
{ } ТАЧКА = УДР; итоа (ЦОУНТА, СХОВА, 16); сенд_а_стринг (СХОВА); МЕМ = ТАЧКА; // трећи и четврти знак се ажурирају у меморију вхиле (! (УЦСРА & (1 <
{ } ТАЧКА = УДР; итоа (ЦОУНТА, СХОВА, 16); сенд_а_стринг (СХОВА); МЕМ = ЦОУНТА; // пети и шести знак се ажурирају у меморију вхиле (! (УЦСРА & (1 <
{ } ТАЧКА = УДР; итоа (ЦОУНТА, СХОВА, 16); сенд_а_стринг (СХОВА); МЕМ = ЦОУНТА; // седми и осам знакова се ажурирају у меморију сенд_а_стринг (""); сенд_а_цомманд (0к80 + 0к40 + 0); УЦСРБ & = ~ (1 <
за (и = 0; и <5; и ++) { ако је ((МЕМ == ДОДАТИ) & (МЕМ == ДОПУСТИТИ) & (МЕМ == ДОПУСТИТИ) & (МЕМ == ДОПУСТИТИ)) {// провера ауторизације купујем упоређујући два знака истовремено са знаковима у меморији ПОРТБ - = (1 <
глас = 1; // ако је овлашћен сет ГЛАСАЈ } } иф (воте == 0) // ауторизација није успела ако глас није постављен { УЦСРБ - = (1 <
} вхиле (воте == 1) // ради ову петљу док се не изгласа, ако је овлашћен { сенд_а_цомманд (0к80 + 0); // идемо на позицију нула на линији1 сенд_а_стринг ("ГЛАСАЈТЕ САДА"); // приказ низа иф (бит_ис_цлеар (ПИНБ, 0)) // када се притисне једно дугме { ВОТЕА ++; // повећавање меморије гласова првог лица за један воте = 0; // пуштање вхиле петље након гласања } иф (бит_ис_цлеар (ПИНБ, 1)) // када се притисне дугме 2 { ВОТЕБ ++; // повећавати гласова сећање на 2 нд особу по један глас = 0; } иф (бит_ис_цлеар (ПИНБ, 2)) // када се притисне дугме 3 { ВОТЕЦ ++; // повећавање меморије гласова треће особе за једну глас = 0; } иф (бит_ис_цлеар (ПИНБ, 3)) // када се притисне дугме 4 { ВОТЕД ++; // повећавати гласова меморију од 4 -ог лица од стране једне глас = 0; } иф (воте == 0) // брише се након примљеног гласа { сенд_а_цомманд (0к80 + 0); // померимо на позицију нулу линије1 сенд_а_стринг ("ХВАЛА НА ГЛАСОВАЊУ"); // приказ низа за (к = 0; к <10; к ++) { _делаи_мс (220); } ПОРТБ & = ~ (1 <
сенд_а_цомманд (0к01); сенд_а_цомманд (0к80 + 0); // приказивање гласова све четири особе сенд_а_стринг ("А ="); сенд_а_цомманд (0к80 + 2); итоа (ВОТЕА, А, 10); сенд_а_стринг (А); сенд_а_цомманд (0к80 + 8); сенд_а_стринг ("Б ="); сенд_а_цомманд (0к80 + 10); итоа (ВОТЕБ, Б, 10); сенд_а_стринг (Б); сенд_а_цомманд (0к80 + 0к40 + 0); сенд_а_стринг ("Ц ="); сенд_а_цомманд (0к80 + 0к40 + 2); итоа (ВОТЕЦ, Ц, 10); сенд_а_стринг (Ц); сенд_а_цомманд (0к80 + 0к40 + 8); сенд_а_стринг ("Д ="); сенд_а_цомманд (0к80 + 0к40 + 10); итоа (ГЛАСАЛО, Д, 10); сенд_а_стринг (Д); сенд_а_цомманд (0к80 + 0к40 + 16); за (к = 0; к <25; к ++) { _делаи_мс (220); } УЦСРБ - = (1 <
сенд_а_цомманд (0к01); сенд_а_цомманд (0к80 + 0); // померање у нулту позицију сенд_а_стринг ("РФИД БРОЈ"); // пошаљи низ сенд_а_цомманд (0к80 + 0к40 + 0); } } воид сенд_а_цомманд (непотписана наредба цхар) { ПОРТА = наредба; ПОРТД & = ~ (1 <
ПОРТД - = 1 <
_делаи_мс (50); ПОРТД & = ~ 1 <
ПОРТА = 0; } воид сенд_а_цхарацтер (непотписани знак карактера) { ПОРТА = карактер; ПОРТД - = 1 <
ПОРТД - = 1 <
_делаи_мс (50); ПОРТД & = ~ 1 <
ПОРТА = 0; } воид сенд_а_стринг (цхар * стринг_оф_цхарацтерс) { вхиле (* стринг_оф_цхарацтерс> 0) { сенд_а_цхарацтер (* стринг_оф_цхарацтерс ++); } } |