우리는 사무실, 쇼핑몰 및 기타 많은 장소에서 승인 카드를 소지 한 사람 만 방에 들어갈 수 있다는 것을 알고 있습니다. 이러한 시스템은 RFID 통신 시스템을 사용합니다. 쇼핑몰에서 RFID는 제품에 RFID 칩이 부착되어있어 도난을 막기 위해 사용되며, 사람이 RFID 칩을 가지고 건물을 나가면 자동으로 알람이 울립니다. RFID 태그는 모래의 일부만큼 작게 설계되었습니다. RFID 인증 시스템은 설계가 쉽고 비용이 저렴합니다. 오늘날 일부 학교와 대학은 RFID 기반 출석 시스템을 사용 합니다.
이 프로젝트에서는 보안을 위해 RFID 기반 요금 징수 시스템 을 설계 할 것 입니다. 따라서이 시스템은 게이트를 열고 승인 된 RFID 태그가있는 사람 만 허용합니다. 승인 된 태그 홀더 ID는 ATMEGA 마이크로 컨트롤러에 프로그래밍되어 있으며 해당 소유자 만 구내를 떠나거나 출입 할 수 있습니다.
필요한 구성 요소
하드웨어: ATmega32 마이크로 컨트롤러, 전원 공급 장치 (5v), AVR-ISP 프로그래머, JHD_162ALCD (16x2 LCD 모듈), 100uF 커패시터 (전원 공급 장치에 연결됨), 버튼, 10KΩ 저항기, 100nF 커패시터, LED (2 개), EM-18 (RFID 리더 모듈), L293D 모터 드라이버 IC, 5V DC 모터.
소프트웨어: Atmel studio 6.1, progisp 또는 flash magic.
회로도 및 작동 설명
위의 RFID 요금 징수 시스템 회로 에서 ATMEGA32의 PORTA는 LCD의 데이터 포트에 연결되어 있습니다. PORTC를 일반 통신 포트로 사용하려면 퓨즈 바이트를 변경하여 PORTC에서 ATMEGA 로의 JTAG 통신을 비활성화해야합니다. 16x2 LCD에서 백라이트가 있으면 전체적으로 16 개의 핀이 있고, 백라이트가 없으면 14 개의 핀이 있습니다. 백라이트 핀에 전원을 공급하거나 남겨 둘 수 있습니다. 이제 14 핀에는 8 개의 데이터 핀 (7-14 또는 D0-D7), 2 개의 전원 공급 장치 핀 (1 & 2 또는 VSS & VDD 또는 gnd & + 5v), 대비 제어를위한 3 번째 핀 (VEE- 문자가 표시되어야 함), 3 개의 제어 핀 (RS & RW & E).
회로에서 제어 핀이 두 개뿐임을 알 수 있습니다. 이것은 더 나은 이해의 유연성을 제공합니다. 대비 비트와 READ / WRITE는 자주 사용되지 않으므로 접지로 단락 될 수 있습니다. 이렇게하면 LCD가 가장 높은 명암비 및 읽기 모드가됩니다. ENABLE 및 RS 핀을 제어하여 문자와 데이터를 적절하게 전송하면됩니다.
LCD 용 연결은 다음과 같습니다.
접지에 대한 PIN1 또는 VSS
PIN2 또는 VDD 또는 VCC ~ + 5v 전원
PIN3 또는 VEE to ground (초보자에게 최상의 대비를 제공)
MCU의 PD6에 대한 PIN4 또는 RS (레지스터 선택)
PIN5 또는 RW (읽기 / 쓰기)를 접지 (LCD를 읽기 모드로 설정하여 사용자의 통신을 용이하게 함)
마이크로 컨트롤러의 PD5에 PIN6 또는 E (활성화)
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)을 사용했음을 알 수 있습니다. 그러나 이것은 필수는 아니고 4bit 통신 (D4-D7)을 사용할 수 있지만 4bit 통신 프로그램은 약간 복잡 해져서 8bit 통신을 선호했습니다.
따라서 위의 표만 살펴보면 LCD의 10 핀을 컨트롤러에 연결하는 것으로 8 핀은 데이터 핀이고 2 핀은 제어용입니다.
계속 진행하기 전에 직렬 통신에 대해 이해해야합니다. 여기서 RFID 모듈은 데이터를 컨트롤러에 직렬로 보냅니다. 다른 통신 모드가 있지만 쉬운 통신을 위해 RS232를 선택합니다. 모듈의 RS232 핀은 ATMEGA의 RXD 핀에 연결됩니다.
RFID 모듈에서 보낸 데이터는 다음과 같습니다.
이제 RFID 모듈 인터페이스 의 경우 다음 기능이 필요합니다.
1. 컨트롤러의 RXD 핀 (데이터 수신 기능)이 활성화되어 있어야합니다.
2. 통신은 직렬이기 때문에 데이터 바이가 수신 될 때마다 알 필요가 있으므로 완전한 바이트가 수신 될 때까지 프로그램을 중지 할 수 있습니다. 이것은 데이터 수신 완료 인터럽트를 활성화하여 수행됩니다.
3. RFID는 8 비트 모드에서 컨트롤러로 데이터를 전송합니다. 따라서 한 번에 두 개의 문자가 컨트롤러로 전송됩니다. 이것은 위 그림에 나와 있습니다.
4. 위의 그림에서 패리티 비트가없고 모듈이 보낸 데이터에 정지 비트 하나가 있습니다.
위의 기능은 컨트롤러 레지스터에서 설정됩니다. 간단히 논의 할 것입니다.
빨간색 (RXEN):이 비트는 수신 데이터 기능을 나타냅니다. 이 비트는 컨트롤러가 모듈로부터 데이터를 수신하도록 설정되어야합니다. 또한 컨트롤러의 RXD 핀을 활성화합니다.
BROWN (RXCIE):이 비트는 성공적인 데이터 수신 후 인터럽트를 받기 위해 설정되어야합니다. 이 비트를 활성화하면 8 비트 데이터 수신 직후 알게됩니다.
PINK (URSEL):이 비트는 UCSRC에서 다른 비트를 활성화하기 전에 설정해야합니다. 설정 후 UCSRC에서 필요한 다른 비트, URSEL을 비활성화하거나 0으로 설정해야합니다.
노란색 (UCSZ0, UCSZ1, UCSZ2):이 세 비트는 우리가 한 번에 수신하거나 전송하는 데이터 비트 수를 선택하는 데 사용됩니다.
RFID 모듈이 보내는 데이터는 8bit 데이터 타입이므로 UCSZ0, UCSZ1을 1로, UCSZ2를 0으로 설정해야합니다.
ORANGE (UMSEL):이 비트는 시스템이 비동기 적으로 (둘 다 다른 클럭 사용) 통신하는지 또는 동 기적으로 (둘 다 동일한 클럭 사용) 통신하는지에 따라 설정됩니다.
모듈과 컨트롤러는 서로 다른 클럭을 사용하므로이 비트는 기본적으로 모두 0으로 설정되어 있으므로 0으로 설정하거나 그대로 두어야합니다.
녹색 (UPM1, UPM0):이 두 비트는 통신에서 사용하는 비트 패리티를 기반으로 조정됩니다.
RFID 모듈은 패리티없이 데이터를 전송하기 때문에 UPM1, UPM0을 모두 0으로 설정하거나 모든 레지스터의 모든 비트가 기본적으로 0으로 설정되어 있으므로 그대로 둘 수 있습니다.
파란색 (USBS):이 비트는 통신 중에 사용하는 정지 비트 수를 선택하는 데 사용됩니다.
RFID 모듈은 하나의 정지 비트로 데이터를 전송하므로 USBS 비트를 그대로두면됩니다.
이제 마지막으로 전송 속도를 설정해야합니다. 위의 그림에서 RFID 모듈이 9600bps (초당 비트 수)의 전송 속도로 컨트롤러에 데이터를 보내는 것이 분명합니다.
전송 속도는 적절한 UBRRH를 선택하여 컨트롤러에서 설정합니다.
UBRRH 값은 보오율과 CPU 크리스털 주파수를 교차 참조하여 선택하므로 교차 참조로 UBRR 값이 '6'으로 표시되어 보오율이 설정됩니다.
이제 그림과 같이 컨트롤러의 두 핀이 저전력 DC 모터의 회전 속도와 방향을 제어하는 데 사용되는 H-BRIDGE 인 L293D로 이동합니다.
L293D는 저전력 DC 모터를 구동하기 위해 설계된 H-BRIDGE IC이며 그림에 나와 있습니다.이 IC는 두 개의 h- 브리지로 구성되어 두 개의 DC 모터를 구동 할 수 있습니다. 따라서이 IC는 마이크로 컨트롤러의 신호에서 로봇 모터를 구동하는 데 사용할 수 있습니다.
이 IC는 이전에 논의했듯이 DC 모터의 회전 방향을 변경할 수 있습니다. 이는 INPUT1 및 INPUT2에서 전압 레벨을 제어하여 수행됩니다.
핀 활성화 |
입력 핀 1 |
입력 핀 2 |
모터 방향 |
높은 |
낮은 |
높은 |
우회전 |
높은 |
높은 |
낮은 |
왼쪽으로 돌아 |
높은 |
낮은 |
낮은 |
중지 |
높은 |
높은 |
높은 |
중지 |
따라서 위의 표와 같이 시계 방향으로 회전하려면 2A는 높고 1A는 낮아야합니다. 시계 반대 방향의 경우 1A는 높고 2A는 낮습니다.
승인 된 카드가 모듈 근처에있을 때마다 모터는 1 초 동안 시계 방향으로 움직 이도록 프로그래밍되어 톨게이트가 돌아온 후 톨게이트가 닫 혔음을 알리는 톨게이트가 열리는 것을 보여줍니다. 요금소의 작동은 아래의 C 코드의 단계별로 가장 잘 설명됩니다.
프로그래밍 설명
다음은 RFID Toll Collection System 의 코드에 대한 줄 간 설명입니다. 아래 코드를 읽으면이 프로젝트의 개념과 작업을 이해할 수 있습니다. 다운로드하거나 복사하려면 페이지 하단에서 전체 코드를 찾을 수 있습니다.
핀에 대한 데이터 흐름 제어를 활성화하는 #include // 헤더
#define F_CPU 1000000 // 연결된 컨트롤러 크리스탈 주파수를 알려줍니다.
#포함
#define E 5 // LCD enable 핀에 연결되어 있으므로 PORTD의 5 번째 핀에 “enable”이라는 이름 부여
#define RS 6 // LCD RS 핀에 연결되어 있으므로 PORTD의 6 번째 핀에 “registerselection”이라는 이름 부여
void send_a_command (unsigned char 명령);
void send_a_character (unsigned char character);
void send_a_string (char * string_of_characters);
int main (void)
{
DDRA = 0xFF; // porta를 출력 핀으로 넣기
DDRD = 0b11111110;
_delay_ms (50); // 50ms 지연 제공
DDRB = 0b11110000; // 일부 portB 핀을 입력으로 사용합니다.
UCSRB-= (1 <
UCSRC-= (1 <
UCSRC & = ~ (1 <
UBRRH & = ~ (1 <
UBRRL = 6; // 전송 속도 설정 // 다음은 태그의 ID를 포함하며 다른 태그에 대해 변경해야합니다. 프로젝트가 작동하려면 업데이트해야합니다.
/ * 컨트롤러에서 프로그램을 덤핑 한 후 인증을 받아야하는 카드를 가져 와서 태그 ID를 얻어야합니다. RFID 모듈 근처에 태그를 배치하면 얻을 수 있으며 ID가 화면에 표시됩니다. ID를받은 후 아래의 ID 번호를 새 ID 번호로 교체하여 프로그램을 업데이트해야합니다.
char ADMIT = {{(0x97), (0xa1), (0x90), (0x92)}, {(0x97), (0xa1), (0x90), (0x93)}, {(0x97), (0xa1), (0x90), (0x94)}, {(0x97), (0xa1), (0x90), (0x95)}, {(0x97), (0xa1), (0x90), (0x96)}}; |
이제 위에서 우리는 5 개의 카드 만 승인하고 있으며,이 카드는 임의의 숫자로 변경할 수 있습니다.
예를 들어, 기본 프로그램이 컨트롤러에 덤프 된 경우 인증되어야하는 카드를 가져옵니다. 모듈 근처에 하나씩 배치하면 각각의 ID를 xxxxxxxx (907a4F87)로 받게됩니다.
7 개의 태그가 있으면 7 개의 8 비트 ID를 갖게됩니다. * /
// 이제 7 장의 카드에 대해 // char ADMIT = {{(0x90), (0x7a), (0x4F), (0x87)},; // 모듈에서 보내는 ID를 보여주기위한 메모리 할당 int i = 0; int vote = 0; int k = 0; send_a_command (0x01); // 화면 지우기 0x01 = 00000001 _delay_ms (50); send_a_command (0x38); // LCD에 8 비트 명령 / 데이터 모드 사용 중 _delay_ms (50); send_a_command (0b00001111); // LCD 화면이 켜지고 코스가 깜박임 char MEM; // 태그의 전체 ID를 저장하기 위해 메모리 할당 send_a_string ("RFID 번호"); // 문자열 보내기 send_a_command (0x80 + 0x40 + 0); // 두 번째 줄로 코스를 이동 동안 (1) { while (! (UCSRA & (1 <
{ } COUNTA = UDR; // UDR은 수신 된 8 비트 데이터를 저장하고 정수로 가져옵니다. MEM = COUNTA; // 처음 두 문자는 메모리로 업데이트됩니다. itoa (COUNTA, SHOWA, 16); // LCD에 변수 번호를 넣는 명령 (바꿀 문자, 밑 수가 변수 인 변수 번호 (여기서는 base10에서 숫자를 세는 것처럼 10)) send_a_string (SHOWA); // LCD에 코스터를 위치시킨 후 2 인칭 문자 (변수 번호로 대체)를 디스플레이에 표시하도록 지시 while (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // 세 번째와 네 번째 문자가 메모리에 업데이트됩니다. while (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // 다섯 번째 및 여섯 번째 문자가 메모리에 업데이트됩니다. while (! (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 ++) { if ((MEM == ADMIT) & (MEM == ADMIT) & (MEM == ADMIT) & (MEM == ADMIT)) {// 한 번에 두 문자를 메모리의 문자와 비교하여 인증 구매 확인 PORTB-= (1 <
포트 B & = ~ (1 <
_delay_ms (220); // 지연 _delay_ms (220); _delay_ms (220); _delay_ms (220); _delay_ms (220); _delay_ms (220); PORTB-= (1 <
포트 B & = ~ (1 <
_delay_ms (220); _delay_ms (220); _delay_ms (220); _delay_ms (220); _delay_ms (220); _delay_ms (220); 포트 B & = ~ (1 <
PORTB-= (1 <
} } UCSRB-= (1 <
} } void send_a_command (unsigned char 명령) { PORTA = 명령; 포트 & = ~ (1 <
포트-= 1 <
_delay_ms (50); 포트 & = ~ 1 <
PORTA = 0; } void send_a_character (unsigned char character) { PORTA = 캐릭터; 포트-= 1 <
포트-= 1 <
_delay_ms (50); 포트 & = ~ 1 <
PORTA = 0; } void send_a_string (char * string_of_characters) { while (* 문자열 _ 문자> 0) { send_a_character (* 문자열 _ 문자 ++); } } |