본문 바로가기
코스웨어/15년 스마트컨트롤러

20151208 임현수 업무일지 RF통신이론, 코드작성

by 알 수 없는 사용자 2015. 12. 9.
728x90
반응형
■ RFID 


■ 시리얼 프로토콜

프로시저 - 절차
프로토콜 - 규약(좀더 포괄적인 의미)

▲ RFID 펌웨어는 변경할 수 없다.
안테나 - 연결선으로부터 데이터를 받는다.

아침에 대중교통 타고올때 카드찍고 온 그기계다.

Radio Frequency - 라디오 주파수
외국에서는 라디오 주파수 자체가 무선이라는 뜻이다.
RF가 무선 통신을 통칭한다고 볼 수 있다.

무선통신이 wireless와 같은뜻이라고 착각 하면 안되는데,
wireless는 유선 가전제품에서 선을 없앴다는 뜻이다.

RF는 전파쪽에서 온 용어다.

무선통신으로 데이터 전송은 캐리어 주파수에 실어 보낸다.
주파수가 높아질 수록 싫을 수 있는 데이터양이 많아진다.

Wifi 2.4G vs 5G
전파의 속도는 빛의속도와 같다(일정).
전파의 속도는 똑같은데, 양을 많이 보내는 것이다.

데이터를 케리어주파수에 싣는것을 변조(Modulation)
케리어 주파수에서 내리는것을 복조(deModulation)

여러가지 RF통신의 대부분의 주파수가 13.56Mhz를 사용한다.
주파수가같은데 주파수의 모양이 다 달라서 용도가 다른것이다.
그 중 ISO15693을 채택한 것이 RFID라고 한다.

■ 교통카드 돈내는 원리

카드에 칩이 들어있는데. 배터리가 없이 어떻게 동작하느냐?

칩에다가 안테나를 연결한다.

리더기에서 카드로 전자파를 쏘는데
전파가 날아오면 순식간에 데이터와 케리어주파수를 분리하고
케리어주파수는 교류에서 정류회로를 거쳐 칩이 동작하기 위한 직류 전기로 사용한다.
카드안에 정류회로가 들어가있고, 칩안에 메모리, 펌웨어까지 다 들어있다.

옛날에 마그네틱카드는 보안깨는게 가능했는데
지금은 칩이 들어가있어서 해킹이 안된다.

■ 발전의 원리

전자기 유도
전기는 자기를 유도시키고
자기는 전기를 유도시킨다.

전자가움직이면 전기라고 부른다. 자력때문에 전자가 움직인다.

수력발전이나 원자력발전의 터빈. 물이나 원자력으로 끓인다.
태양광 발전만 스스로 전기를 생산한다.

RF리더기 근처에 전자파를 흡수하는 물질이있으면 안된다.(피뢰침)
물도 전자파를 흡수한다. 비오는날은 무선통신이 장애를 많이 받는다.
전선은 잡음에 방해를 받는다.
전자파는 공기자체가 장애물이다.

전자기학에선 전자가 어떻게 공중에 존재할 수 있는지를 미적분으로 증명한다.



카드마다 고유번호가 찍혀있다.

NFC가 바코드를 대체한다고했는데 대체 못하는 이유가
바코드는 프린트만하면되는데 반해
제품 하나하나에 태그를 붙이면 가격이 비싸다.

통과하기만 하면 된다고 했는데 실제로 전자파를 흡수하는 등의 장애물오류가 많기때문에 여전히 계산할때 바코드로찍는다.

버스 카드 리더기에 전자파가 계속 나오고 있다. 옆에 서있지마라. 
전자파가 양면으로 나오기 때문에 반대면에도 읽는다. 

전자파가 몸에 해로운건 맞는데, DNA를 바꾸지는 않는다.
전자파는 수분을 진동시킨다. 그래서 열이 난다. 이 원리를 이용한게 전자레인지.

GE에서 스피커 시연중 스피커위에 물을 올려놨었는데 물이 따뜻해졌다.
그 이유를 증명한 것이 물이 에너지를 얻어서 진동하기때문에 끓는 것이다.는 것이었고,
전자레인지를 개발하였다.


사람이 감전당할때 손을 못떼다가 죽는 이유는
전기는 그라운드로 흘러 가려고 하기 때문에 몸을 타고 땅으로 들어가면서 
몸 내부를 태워버린다.
나무가 다 타면 더이상 타지 않듯이, 몸 도 다 타버리고 수분이 모두 증발해서
더이상 전기를 흡수할 수 없게 되었을때 전기가 더이상 흐르지 않는다.
손을 떼려고 해도 뇌가 보내는 전기보다 더 강력한 전기가 들어오기 때문에
뇌의 지시가 듣지않아서 손을 뗄 수가 없다.


본 회로에는 ARM칩이 ASIC으로 들어가있다.

ASIC(Application Specific Integrated Circuit) - 특정용도 설계 가능 주문형 반도체
ASIC은 일반적으로 주문형 반도체라 불리며, 사용자의 주문에 따라 특정 용도로 설계할 수 있는 반도체를 의미한다. ASIC은 FPGA 등에 비해 가격이 저렴하지만, 일반적으로 상품화까지의 기간은 다소 긴 편이다.

SoC(System On Chip) - 여러가지 기능 단일칩으로 구현
SoC는 단일 칩을 사용해 여러 가지 관련된 기능을 구현하는 것으로, FPGA나 ASIC과는 차이가 있다. SoC는 여러 기능을 가진 시스템을 하나의 칩에 집적하는 기술로, 지난 2001년 5월 미국의 반도체 회사인 인텔이 무선통신과 관련된 칩셋시장 진입을 선언하면서 SoC 개발을 공식 발표한 것이 SoC활성화의 계기가 됐다. 이후 세계 반도체 검사 장비업체들이 이 제품의 양산에 대비해 SoC시장 쪽으로 눈을 돌리기 시작했고, 개발 경쟁이 점차 가속화되고 있다.

ISO15693 - RFID는 이 규격을 따른다.
저 프로토콜중에 시리얼통신 방법만 배웠다.
ISO 14443A가 아마 교통카드일거다.

RFID 리더기 종류
  1. 손잡이형
  2. 리더형
  3. 리더대형

버스는 리더형 + 무선통신장치

■ 데이터시트

▲ 4가지 모드가 존재한다.

▲ 컴퓨터에서 리더로 파라미터가 수신되면 저장/제어/명령을 처리한다.
파라미터가 옳은값이면 status/data를 반환하고,
옳지않은 값이면 error status를 반환한다.

■ Host Commands

■ Addressed mode


■ Non-Addressed mode

UID 카드의 주민등록번호같은 것.
번호를 읽어온다.
Transponder - 카드
안테나 필드 범위내에 카드가 있는가?
No면 카드가없다.
YES면 카드 개수나 UID를 보내준다.

PC가 UID를 알아야 한다.
그러기 위해선 Inventory to get UID명령이 수행된 상태이어야 한다.

UID를 다루면 Address mode. 안다루면 Non-Address mode.

셀렉트모드는 셀렉트된 특정카드와만 통신한다.

1~255
COM-ADR 0 단말기 번호
CONTROLBYTE 4번의 길이가 달아짐

MSB 빅인디안

Hz 최소 반복 단위.








PARENB
만일 이 비트가 설정되면, 패리티 비트의 생성과 검출이 가능하게 된다. 
만일 이 비트가 설정되지 않으면, 출력 문자들에 패리티 비트가 더해지지 않고, 입력 문자들에서는 패리티에러를 체크하지 않는다.

PARODD
이 비트는 PARENB가 설정됐을 때만 유용하다. 만일 PARODD가 설정되면, 홀수 패리티가 사용되고, 그렇지 않으면 짝수 패리티가 사용된다.
제어 모드 플래그들은 문자당 비트들의 개수를 나타내는 필드를 갖고 있다. 당신은 그 값을 추출하기 위해서 CSIZE 매크로를 사용할 수 있다. 이처럼 : settings. c_cflag & CSIZE

■ ws_rfid_lib.h


#ifndef  __WS_RFID_LIB__
#define  __WS_RFID_LIB__

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <termios.h>
#include <fcntl.h>

#define SENDBSIZE   128
#define RECVBSIZE   128

#define INVENT_STD  0x0010
#define INVENT_EP8  0x0020
#define INVENT_E12  0x0040
#define INVENT_UID  0x0080

#define TRTYPE_ICODE_UID  0x8000
#define TRTYPE_ICODE_EPC  0x4000
#define TRTYPE_ICODE_156  0x0800
#define TRTYPE_ICODE_HF   0x0200
#define TRTYPE_ICODE_ICO  0x0100

#define MAXPORT     4
#define MAXONCEREAD 4

#pragma pack(1)

typedef struct WS_RFID        WS_RFID;
typedef struct RFID_MANAGER   RFID_MANAGER;
typedef struct COMMON         COMMON;
typedef struct INVEN_COMMON   INVEN_COMMON;
typedef struct IDD            IDD;
typedef  union INVENT_PTR     INVENT_PTR;

struct WS_RFID
{
  int iDev;
  struct termios stOldtio;
  unsigned char ucaSendTo[SENDBSIZE];
  unsigned char ucaRecvFr[RECVBSIZE];
};

/*
struct RFID_MANAGER
{
  WS_RFID  stCOM;
  int (port_cal)(int, struct termios *);
  int (close)(int, struct termios *);
  int (recv)(int, void *, int);
  int (send)(int, void *);
  int (open)();
};*/


struct COMMON
{
  unsigned char  ucLen;
  unsigned char  ucComAdr;
  unsigned char  ucCtl;
};

struct INVEN_COMMON  //Reply Inventory Common
{
  unsigned char  ucStatus;   //[4]
  unsigned char  ucDataSet;  //[5]
  unsigned char  ucTr_Type;  //[6]
};

struct IDD
{
  unsigned char  ucData[12];  //[0]~[11]
  unsigned short  usCrc;      //[12][13]
  unsigned char  ucUid[5];    //[14]~[18]
};

typedef struct ISO15693_reader_control_Baud_Rate_Detect
{
  COMMON          stCOM;
  unsigned char   ucOpt;
  unsigned short  usCrc;
}baud_detect;

typedef struct ISO15693_host_command_req_inven
{
  COMMON          stCOM;
  unsigned char   ucOpt;
  unsigned char   ucMode;
  unsigned short  usCrc;
}req_inven;

typedef struct ISO15693_host_command_reply_inven_standard
{
  COMMON         stCOM;     //[1]~[3]
  INVEN_COMMON   stICOM;    //[4]~[6]
  unsigned char  ucDSFID;   //[7]
  unsigned char  ucUID[8];  //[8]~[15]  //8Bytes
  unsigned short usCrc;     //[16][17]
}reply_inven_std;

typedef struct ISO15693_host_command_reply_inven_icode_epc8
{
  COMMON            stCOM;     //[1]~[3]
  INVEN_COMMON      stICOM;    //[4]~[6]
  unsigned char     ucEPC[8];  //[7]~[14]  //8Bytes
  unsigned short    usCrc;     //[15][16]
}reply_inven_icode_epc8;

typedef struct ISO15693_host_command_reply_inven_icode_epc12
{
  COMMON          stCOM;      //[1]~[3]
  INVEN_COMMON    stICOM;     //[4]~[6]
  unsigned char   ucEPC[12];  //[7]~[18]  //12Bytes
  unsigned short  usCrc;      //[19][20]
}reply_inven_icode_epc12;

typedef struct ISO15693_host_command_reply_inven_icode_uid
{
  COMMON           stCOM;   //[1]~[3]
  INVEN_COMMON     stICOM;  //[4]~[6]
  IDD              stIDD;   //[7]~[25]  //19Bytes
  unsigned short   usCrc;   //[26][27]
}reply_inven_icode_uid;

#pragma pack(4)

union INVENT_PTR
{
  reply_inven_std         *stSTD;
  reply_inven_icode_epc8  *stEPC8;
  reply_inven_icode_epc12 *stEPC12;
  reply_inven_icode_uid   *stUID;
};

unsigned short RFID_CRC(void *);

#endif    // __WS_RFID_LIB__

■ main.c


#include <stdio.h>
#include <fcntl.h>
#include <termios.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "ws_rfid_lib.h"

#define SPEED  B38400
#define SPORT  "/dev/ttyS0"

#define CRC_POLYNOM    0x8408
#define  CRC_PRESET    0xFFFF

unsigned char ucaBeep[] = {0x0D, 0x000x710x00 
            , 0x300x000x000x00
            , 0x0A, 0x000x000x46
            , 0x41};


unsigned short CRC16(void *, unsigned int);

main()
{
  char cBuff[255];
  int iDev = 0;
  int iRet = 0;

  struct termios stOldState;
  struct termios stNewState;

  iDev = open(SPORT, O_RDWR|O_NOCTTY);  // Serial Port Open
  if(0>iDev)
  {
    perror(SPORT);
    exit(-100);
  }

  tcgetattr(iDev, &stOldState);
  bzero(&stNewState, sizeof(stNewState));

  stNewState.c_cflag = SPEED|CRTSCTS|CS8|PARENB|CLOCAL|CREAD;
  stNewState.c_iflag = IGNPAR|ICRNL;
  stNewState.c_oflag = 0;

  stNewState.c_lflag = 0;    // Non Canonical
  bzero(stNewState.c_cc, NCCS);
  stNewState.c_cc[VTIME] = 0;
  stNewState.c_cc[VMIN] = 10;

  tcflush(iDev, TCIFLUSH);
  tcsetattr(iDev, TCSANOW, &stNewState);

/*
  iRet = read(iDev, cBuff, 255);
  cBuff[iRet] = 0;
  printf("[%s]:[%d]\n", cBuff, iRet);

  tcsetattr(iDev, TCSANOW, &stOldState);
  close(iDev);
*/

  getchar();
  write(iDev, ucaBeep, ucaBeep[0]);
  

}

int main1(void)
{
  unsigned short usCrc = CRC16(ucaBeep, ucaBeep[0]-2);
  printf("[%04X]\n", usCrc);
  return 0;
}

unsigned short CRC16(void *vpData, unsigned int uiLen)
{
  unsigned int i;
  unsigned int j;
  unsigned char *DATA = vpData;
  unsigned short crc = CRC_PRESET;
  for (i = 0; i < uiLen; i++) 
  {
    crc ^= DATA[i];
    for (j = 0; j < 8; j++)
    {
      if (crc & 0x0001)
      {
        crc = (crc >> 1) ^ CRC_POLYNOM;
      }
      else
      {
        crc = (crc >> 1);
      }
    }
  }
  return crc;
}



728x90