Pen State University의 연구원들에 따르면, 인간은 사람보다 기계를 더 신뢰하는 경향이 있는데, 이는 우리가 ATM 핀을 기계에 쉽게 노출시키는 것을 분명히 알 수 있습니다. 오늘날 AI, 머신 러닝, 챗봇, 스마트 스피커, 로봇 등이 활발히 진행되고있는 세상에서 인간과 로봇의 시너지는 증가 할 것입니다. 오늘날, 통행료 징수 원부터 계산대 계산원에 이르기까지 우리 주변의 모든 것이 기계로 대체되어 작업을보다 쉽고 효율적으로 수행 할 수 있습니다. 이 단계를 따라 잡기 위해이 프로젝트에서는 AVR 마이크로 컨트롤러 를 사용 하여 수동 출석 절차를 대체 하는 생체 측정 출석 시스템을 구축 할 것 입니다. 이 시스템은 시간을 절약하고 다저스를 피할 수 있기 때문에 더 안정적이고 효율적입니다.
지문 출석 시스템 은 이미 시장에서 바로 구할 수 있지만 구축하는 것보다 더 재미있는 것은 무엇일까요? 또한 간단한 RFID 기반 출석 시스템에서 Arduino 및 Raspberry Pi를 사용하는 IoT 기반 생체 인식 출석 시스템에 이르기까지 다양한 출석 시스템을 구축했습니다. 이 프로젝트에서는 지문 모듈과 AVR (atmega32)을 사용하여 출석을 등록했습니다. 지문 센서를 사용하면 시스템이 더욱 안전 해집니다. 다음 섹션에서는 AVR을 사용하여 지문 기반 생체 인식 시스템 을 만드는 기술적 인 세부 사항을 설명합니다.
필수 구성 요소
- Atmega32-1
- 지문 모듈 (r305) -1
- 누름 버튼 또는 멤브레인 버튼-4
- LED -2
- 1K 저항 -2
- 2.2K 저항 -1
- 전원 12v 어댑터
- 전선 연결
- 부저 -1
- 16x2 LCD -1
- PCB 또는 브레드 보드
- RTC 모듈 (ds1307 또는 ds3231) -1
- LM7805 -1
- 1000uf, 10uf 커패시터 -1
- Burgstips 남성 여성
- DC JACK (옵션)
- BC547 트랜지스터 -1
이 지문 출석 시스템 회로 에서 우리는 지문 센서 모듈 을 사용하여 시스템 에 지문 을 입력하여 사람 또는 직원의 신원을 인증했습니다. 여기에서는 4 개의 푸시 버튼을 사용하여 지문 데이터 를 등록, 삭제, 증가 및 감소 합니다 . 키 1은 새 사람을 시스템에 등록하는 데 사용됩니다. 따라서 사용자가 새 손가락 을 등록 하려면 키 1을 눌러야하며 LCD는 지문 센서에 손가락을 두 번 대라고 요청한 다음 직원 ID를 요청합니다. 마찬가지로 키 2는 사용자가 새 손가락을 등록 할 때와 같이 이중 기능을 가지고 있으며, 지문 ID 를 선택 해야합니다.다른 두 개의 키, 즉 3과 4를 사용합니다. 이제 사용자는 선택한 ID로 진행하기 위해 키 1 (이번에는이 키가 OK처럼 동작 함)을 눌러야합니다. 그리고 키 2는 마이크로 컨트롤러의 EEPROM에서 데이터 를 재설정하거나 삭제 하는데도 사용됩니다.
지문 센서 모듈은 지문 이미지를 캡처 한 다음 동일한 템플릿으로 변환하여 마이크로 컨트롤러가 선택한 ID에 따라 메모리에 저장합니다. 모든 프로세스는 지문 이미지를 찍는 것처럼 마이크로 컨트롤러에 의해 명령됩니다. 템플릿으로 변환하고 ID 등으로 저장합니다. 지문 센서 보안 시스템과 지문 센서 투표기를 구축 한 다른 지문 센서 프로젝트도 확인할 수 있습니다.
회로도
지문 기반 출석 시스템 프로젝트 의 전체 회로도 가 아래에 나와 있습니다. 프로젝트의 모든 프로세스를 제어하기위한 Atmega32 마이크로 컨트롤러가 있습니다. 푸시 또는 멤브레인 버튼은 등록, 삭제, 출석 ID 선택 에 사용되며 부저는 표시에 사용되며 16x2 LCD는 사용자에게 기계 사용 방법을 알려줍니다.
회로도에서 보듯이 누름 또는 멤브레인 버튼은 접지를 기준으로 마이크로 컨트롤러의 PA2 (ENROL 키 1), PA3 (DEL 키 2), PA0 (UP 키 3), PA1 (DOWN 키 4) 핀에 직접 연결됩니다. 또는 PA4. 그리고 LED는 1k 저항을 통해 접지와 관련하여 마이크로 컨트롤러의 핀 PC2에 연결됩니다. 마이크로 컨트롤러의 직렬 핀 PD1 및 PD3에 직접 연결된 지문 모듈의 Rx 및 Tx. 5v 전원은 LM7805 전압 조정기 를 사용하여 전체 회로에 전원을 공급하는 데 사용됩니다.12v dc 어댑터로 전원이 공급됩니다. 버저도 핀 PC3에 연결됩니다. 16x2 LCD는 4 비트 모드로 구성되며 RS, RW, EN, D4, D5, D6 및 D7은 마이크로 컨트롤러의 PB0, PB1, PB2, PB4, PB5, PB6, PB7 핀에 직접 연결됩니다. RTC 모듈은 I2Cpin PC0 SCL 및 PC1 SDA에 연결됩니다. PD7은 현재 시간을 얻기위한 소프트 UART Tx 핀으로 사용됩니다.
지문 출석 시스템 작동 원리
사용자가 지문 모듈 위에 손가락을 대면 지문 모듈이 손가락 이미지를 캡처하고 시스템에서이 지문과 관련된 ID가 있는지 검색합니다. 지문 ID가 감지되면 LCD에 등록 된 출석이 표시되고 동시에 부저가 한 번 울립니다.
지문 모듈과 함께 시간 및 날짜 데이터를 위한 RTC 모듈 도 사용했습니다. 시간과 날짜는 시스템에서 지속적으로 실행되므로 실제 사용자가 지문 센서에 손가락을 대고 할당 된 메모리 슬롯의 EEPROM에 저장할 때마다 마이크로 컨트롤러가 시간과 날짜를 취할 수 있습니다.
사용자는 키를 길게 눌러 출석 데이터 를 다운로드 할 수 있습니다. 4. 전원을 회로에 연결하고 잠시 기다리면 LCD에 'Downloading….'이 표시됩니다. 그리고 사용자는 직렬 모니터를 통해 출석 데이터를 볼 수 있습니다. 여기에서이 코드 소프트웨어 UART는 핀 PD7-pin20에서 Tx로 프로그래밍되어 데이터를 터미널로 전송합니다. 사용자는 또한 직렬 터미널을 통해 출석 데이터를 보려면 TTL to USB 변환기가 필요합니다.
And if the user wants to delete all the data then he/she has to press and hold key 2 and then connect power and wait for some time. Now after some time LCD will show ‘Please wait…’ and then ‘Record Deleted successfully’. These two steps are not shown in demonstration video given in the end.
Code Explanation
Complete code along with the video for this biometric attendance system is given at the end. Code of this project is a little bit lengthy and complex for beginner. Hence we have tried to take descriptive variables to make good readability and understanding. First of all, we have included some necessary header file then written macros for different-different purpose.
#define F_CPU 8000000ul #include #include
After this, we have declared some variables and arrays for fingerprint command and response. We have also added some functions for fetching and setting data to RTC.
void RTC_stp() { TWCR=(1<
Then we have some functions for LCD which are responsible to drive the LCD. LCD driver function is written for 4-bit mode drive. Followed by that we also have some UART driver functions which are responsible for initializing UART and exchanging data between fingerprint sensor and microcontroller.
void serialbegin() { UCSRC = (1 << URSEL) - (1 << UCSZ0) - (1 << UCSZ1); UBRRH = (BAUD_PRESCALE >> 8); UBRRL = BAUD_PRESCALE; UCSRB=(1<
Now we have some more UART function but they are software UART. It is used for transferring saved data to the computer via serial terminal. These functions are delay-based and don’t use any type of interrupt. And for UART only tx signal will work and we have hardcoded baud rate for soft UART as 9600.
void SerialSoftWrite(char ch) { PORTD&=~(1<<7); _delay_us(104); for(int i=0;i<8;i++) { if(ch & 1) PORTD-=(1<<7); else PORTD&=~(1<<7); _delay_us(104); ch>>=1; } PORTD-=(1<<7); _delay_us(104); } void SerialSoftPrint(char *str) { while(*str) { SerialSoftWrite(*str); str++; } }
Followed by that we have functions that are responsible for displaying the RTC time in the LCD. The below given functions are used for writing attendance data to EEPROM and reading attendance data from EEPROM.
int eeprom_write(unsigned int add,unsigned char data) { while(EECR&(1<
The below function is responsible for reading fingerprint image and convert them in template and matching with already stored image and show result over LCD.
void matchFinger() { // lcdwrite(1,CMD); // lcdprint("Place Finger"); // lcdwrite(192,CMD); // _delay_ms(2000); if(!sendcmd2fp((char *)&f_detect,sizeof(f_detect))) { if(!sendcmd2fp((char *)&f_imz2ch1,sizeof(f_imz2ch1))) { if(!sendcmd2fp((char *)&f_search,sizeof(f_search))) { LEDHigh; buzzer(200); uint id= data; id<<=8; id+=data; uint score=data; score<<=8; score+=data; (void)sprintf((char *)buf1,"Id: %d",(int)id); lcdwrite(1,CMD); lcdprint((char *)buf1); saveData(id); _delay_ms(1000); lcdwrite(1,CMD); lcdprint("Attendance"); lcdwrite(192,CMD); lcdprint("Registered"); _delay_ms(2000); LEDLow; }
Followed by that we have a function that is used for enrolling a new finger and displaying the result or status on LCD. Then the below function is used for deleting stored fingerprint from the module by using id number and show status of the same.
void deleteFinger() { id=getId(); f_delete=id>>8 & 0xff; f_delete=id & 0xff; f_delete=(21+id)>>8 & 0xff; f_delete=(21+id) & 0xff; if(!sendcmd2fp(&f_delete,sizeof(f_delete))) { lcdwrite(1,CMD); sprintf((char *)buf1,"Finger ID %d ",id); lcdprint((char *)buf1); lcdwrite(192, CMD); lcdprint("Deleted Success"); } else { lcdwrite(1,CMD); lcdprint("Error"); } _delay_ms(2000); }
Below function is responsible for sending attendance data to serial terminal via soft UART pin PD7 and TTL to USB converter.
/*function to show attendence data on serial moinitor using softserial pin PD7*/ void ShowAttendance() { char buf; lcdwrite(1,CMD); lcdprint("Downloding…."); SerialSoftPrintln("Attendance Record"); SerialSoftPrintln(" "); SerialSoftPrintln("S.No ID1 ID2 Id3 ID4 ID5 "); //serialprintln("Attendance Record"); //serialprintln(" "); //serialprintln("S.No ID1 ID2 Id3 ID4 ID5"); for(int cIndex=1;cIndex<=8;cIndex++) { sprintf((char *)buf,"%d " "%d:%d:%d %d/%d/20%d " "%d:%d:%d %d/%d/20%d " "%d:%d:%d %d/%d/20%d " "%d:%d:%d %d/%d/20%d " "%d:%d:%d %d/%d/20%d ", cIndex, eeprom_read((cIndex*6)),eeprom_read((cIndex*6)+1),eeprom_read((cIndex*6)+2),eeprom_read((cIndex*6)+3),eeprom_read((cIndex*6)+4),eeprom_read((cIndex*6)+5), eeprom_read((cIndex*6)+48),eeprom_read((cIndex*6)+1+48),eeprom_read((cIndex*6)+2+48),eeprom_read((cIndex*6)+3+48),eeprom_read((cIndex*6)+4+48),eeprom_read((cIndex*6)+5+48), eeprom_read((cIndex*6)+96),eeprom_read((cIndex*6)+1+96),eeprom_read((cIndex*6)+2+96),eeprom_read((cIndex*6)+3+96),eeprom_read((cIndex*6)+4+96),eeprom_read((cIndex*6)+5+96), eeprom_read((cIndex*6)+144),eeprom_read((cIndex*6)+1+144),eeprom_read((cIndex*6)+2+144),eeprom_read((cIndex*6)+3+144),eeprom_read((cIndex*6)+4+144),eeprom_read((cIndex*6)+5+144), eeprom_read((cIndex*6)+192),eeprom_read((cIndex*6)+1+192),eeprom_read((cIndex*6)+2+192),eeprom_read((cIndex*6)+3+192),eeprom_read((cIndex*6)+4+192),eeprom_read((cIndex*6)+5+192)); SerialSoftPrintln(buf); //serialprintln(buf); } lcdwrite(192,CMD); lcdprint("Done"); _delay_ms(2000); }
Below function is used for deleting all the attendance data from the microcontroller’s EEPROM.
void DeleteRecord() { lcdwrite(1,CMD); lcdprint("Please Wait…"); for(int i=0;i<255;i++) eeprom_write(i,10); _delay_ms(2000); lcdwrite(1,CMD); lcdprint("Record Deleted"); lcdwrite(192,CMD); lcdprint("Successfully"); _delay_ms(2000); }
In the main function we will initialize all the used module and gpio pins. Finally, all-controlling event are performed in this as shown below
while(1) { RTC(); // if(match == LOW) // { matchFinger(); // } if(enrol == LOW) { buzzer(200); enrolFinger(); _delay_ms(2000); // lcdinst(); } else if(delet == LOW) { buzzer(200); getId(); deleteFinger(); _delay_ms(1000); } } return 0; }
The complete working set-up is shown in the video linked below. Hope you enjoyed the project and learnt something new. If you have any questions leave them in the comment section or use the forums for other technical questions.