Microprocessor/Module RFID 기초/사운드 출력
  • 728x90
    반응형

    RFID(기초/사운드출력)




    RFID 란 ?




     RF(무선통신) 의 종류 : WiFi, RFID, NFC


    RFID(Radio Frequency Identification)란 ?

    RFID는 판독 및 해독 기능을 하는 판독기(Reader)와 정보를 제공하는 태그(Tag)로 구성되는데,

    제품에 붙이는 태그에 생산, 유통, 보관, 소비의 전 과정에 대한 정보를 담고, 판독기로 하여금

    안테나를 통해서 이 정보를 읽도록 한다.

    또 인공위성이나 이동통신망과 연계하여 정보시스템과 통합하여 사용된다.


    Tip(주파수 상식) : 주파수는 낮아지면 벽을 통과할 수 있는 음파의 성질을 가지고 높아지면 레이저 같은 투과할 수 없는 성질을 가진다.


    Wifi 주파수 대역 : 2.5GHz


    채널

    주파수

    (GHz)

    1

    2412

    2

    2417

    3

    2422

    4

    2427

    5

    2432

    6

    2437 

    7

    2442

    8

    2447

    9

    2452

    10 

    2457

    11

    2462

    12

    2467


    - RFID 주파수 대역 :

    • 13.552 ~ 13.568 MHz : 무선근접카드용 등(- 전계강도기준 : 47.544 m V/m @ 10m 이하)
    • 433.67 ~ 437.17 MHz : 항만, 내륙 컨테이너 집하장, 부두창고 등(- 전계강도기준 : 3.6 mV 이하)
    • 917 ~ 923.5 MHz : 공급망, 물류관리, 자동 통행료 징수 등(- 복사전력 : 4W 이하)
    레귤레이터가 있으면 전압을 바꾸어 주므로 어뎁터 사용에 제한이 없다.

    - 비동기식 방식
    - RS232, RS485 시리얼 통신을 지원



    - Host로 명령을 전송하면 저장하거나 실행해 준다. yes 가 되면 상태정보를 전송하고 no면 에러 상태를 전송해준다.



    - Inventory 에 카드의 주소(UID)를 얻어온다.

    - Transponder의 UID가 일치한 것이 있는지 판단.

    - yes일 경우 읽어온 Transponder의 상태 데이터를 보내준다.



    - 아래표의 n은 기기의 번호를 뜻한다. 본 프로젝트의 장비 번호는 0번으로 통일한다.



    - 위 4번 자리의 STATUS는 일종의 return 값이다. 아래표를 참고.




    RFID Beep 사운드 출력



    모던 리더기 설정

    • 속도 : 38400
    • 패리티 : 짝수
    • 다음과 같이 1 ~ 13번 까지의 비트를 세팅한다.


    코드

     unsigned char msg[] = { 0x0D,
                             0x00,
                             0x71,
                             0x000x20,
                             0x000x01,
                             0x000x0A,
                             0x000x00,
                             0xFF, 0xFF};


    • 4, 5Bit OS 설정은 스팩을 참고하여 FLASH로 설정하였다.

    • 6, 7Bit OSF는 8Hz로 설정하였다. 8번 소리를 연달아 낸다.


    • 8, 9Bit OS-Time은 1초로 설정하였다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    #include <windows.h>
    #include <stdio.h>
    #include <windows.h>
    #include <stdio.h>
     
    int main()
    {
       unsigned char msg[] = { 0x0D,
                 0x00,
                 0x71,
                 0x000x20,
                 0x000x01,
                 0x000x0A,
                 0x000x00,
                 0xFF0xFF};
        HANDLE hComm;
        DWORD DW_write;
        DCB sPS;      // 씨리얼 포트 상태 저장
        COMMTIMEOUTS cTime;
     
     
        // CreateFile = File open 함수와 같다. COM1은 컴포트1이 열린다.
        hComm = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL,
                            OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
        
        if(INVALID_HANDLE_VALUE == hComm)
        {
            printf("Com port open Error !\n");
            return 0;
        }
     
        
        // 버퍼 설정
        if== SetupComm(hComm, 40964096))
        {
            printf("Buffer setting Error !\n");
            CloseHandle(hComm);  
            return 0;
        }
     
        /* 
         * 포트 초기화
         * DCB 구조체 사용
         * 길이
         * 속도
         */
        if== PurgeComm(hComm, PURGE_TXABORT | PURGE_TXCLEAR))
        {
            printf("Buffer initialization Error !\n");
            CloseHandle(hComm);  
            return 0;
        }
     
        sPS.DCBlength = sizeof(sPS);
     
        if== GetCommState(hComm, &sPS))
        {
            printf("Port status read Error !\n");
            CloseHandle(hComm);  
            return 0;
        }
     
        sPS.BaudRate = CBR_38400;  // 비트,초
        sPS.ByteSize = 8;        // 데이터 비트 전송
        sPS.Parity   = EVENPARITY;  // 짝수
        sPS.StopBits = ONESTOPBIT;  // 정지 비트
        
     
        // 위 세팅값을 핸들에 넣어준다.
        if== SetCommState(hComm, &sPS))
        {
            printf("Port status write Error !\n");
            CloseHandle(hComm);  
            return 0;
        }
     
       
       
        *((unsigned short *)(msg + 11)) = Emb_Crc(msg);
        WriteFile(hComm, msg, sizeof(msg), &DW_write, 0);
        
      
     
        
     
        printf("Com port open Success !\n");
        CloseHandle(hComm);      // 터미널은 닫아주어야한다.
     
        return 0;
    }
    cs

    실행결과 영상



    • 12, 13Bit CRC16을 Emb_Crc의 함수를 사용하여 Mask 시켰다.
    • 아래는 스팩에 나와있는 알고리즘이다.


    함수 사용 결과


    RFID ISO 15693 16Bit CRC

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
      unsigned short Emb_Crc(void *arg)
    {
        unsigned short i;
        unsigned short j;
        unsigned short cnt;
        unsigned short crc=0xFFFF;
        unsigned short temp;
        unsigned char *buf = arg;
     
        cnt = (*buf) - 2;
     
        for(i=; i < cnt ; ++i)
        {
          crc^= *(buf + i);
          for(j=; j < ++j) 
          {
            if(!= (crc&0x0001))
            {
              crc=(crc>>1)^0x8408;
            }
            else
            {
              crc=(crc>>1);
            }
          }
          
        }
     
        return crc;
    }
    cs




    728x90
    반응형
상단으로