정보나눔

오픈소스하드웨어 프로젝트에 대한 다양한 정보를 나누는 공간입니다.

하나의 아두이노에 두 개 이상의 RFID 사용은 어떻게 하나요?
김진하 | 2015-11-26

안녕하세요 RFID 센서 사용하다가 막혀서 질문 드립니다 ㅜㅜ

 

현재 제가 사용하고 있는 모듈은 HZ-1050 모듈인데요 

코코아팹에 있는 튜토리얼에서 사용한 RFID 모듈 ID-12LA와 주파수가 125kHz 로 같아서 

이 튜토리얼에 있는 코드를 똑같이 사용했습니다

 

차이점이 있는데 제가 사용하는 Hz-1050은 RFID Tag가 가까워서 센싱이 되면 

그 태그가 가까이 붙어서 센싱이 되는 동안에는 계~속 해서 이 태그 정보를 읽고 업데이트 한다는 것입니다

ID-12LA는 한번 tag가 찍히면 삑 소리가 나고 그 정보가 시리얼 모니터에 한번만 출력이 되지만

똑같은 코드를 사용했을 때 HZ-1050은 계속해서 그 정보가 출력이 됩니다

 

그래서 똑같이 한번만 센싱을 하도록 코드를 수정하였는데 아래와 같습니다.

 

 

#include 

SoftwareSerial rSerial1(7,4);

#define RFID_num 2

// ------------ Part 5 --------------- 완성 버전, 원하는 대로 한번만 출력


int tag1[4] = {0, 95, 87, 203};   // RFID 태그의 ID입니다. 
int tag2[4] = {0, 146, 138, 168};
int tag3[4] = {0, 146, 207, 160};
int tag4[4] = {0, 134, 233, 58};

int TestTag[RFID_num][4] = {{0, 0, 0, 1}, {0, 0, 0, 1}}; //  TestTag를 선언합니다

int oldTag[RFID_num][4] = {{0, 0, 0, 2}, {0, 0, 0, 3}};
int zeroTag[4] = {0,0,0,0};

void setup(){
  Serial.begin(9600);
  rSerial1.begin(9600);

}

void loop(){
  
  int index1 =0 ;


  while(rSerial1.available()) {
    
    int readByte = rSerial1.read(); // 시리얼 포트에 있는 데이터를 저장합니다.
    TestTag[0][index1] = readByte;
    //Serial.println(TestTag[index]); // RFID 태그의 ID를 출력합니다.
    index1++;
    }

  
  if(!compareTag(TestTag[0], oldTag[0])){
    checkTag(TestTag[0],0); // 미리 저장된 태그 ID와 RFID 리더에서 읽은 태그 ID와 일치하는지 확인
  }
  
  
  clearTag(TestTag[0]); // 읽어온 태그 ID를 지움

  delay(1000);
}

void checkTag(int tag[], int k){

 if(compareTag(tag, tag1)){ // 미리 저장된 태그 ID 1번과 읽은 태그 ID를 비교합니다.
    Serial.write("O");
    for(int i = 0; i<4; i++)
    {
      oldTag[k][i] = tag[i]; // 일치한다면 그 태그 정보를 oldTag에 저장합니다.
    }
 }  
 else if(compareTag(tag, tag2)){ 
    Serial.write("X");
    for(int i = 0; i<4; i++)
    {
      oldTag[k][i] = tag[i];
    }
 }
 else if(compareTag(tag, tag3)){
    Serial.write("Y");
    for(int i = 0; i<4; i++)
    {
      oldTag[k][i] = tag[i];
    }

 }
 else if(compareTag(tag, tag4)){
    Serial.write("Z");
    for(int i = 0; i<4; i++)
    {
      oldTag[k][i] = tag[i];
    }

 }
 else if(compareTag(tag, zeroTag)){
    Serial.write("null");
    for(int i = 0; i<4; i++)
    {
      oldTag[k][i] = tag[i];
    }
 }
}


void clearTag(int tag[]){   // 읽은 태그 ID를 초기화
  for(int i =0; i < 4; i++){
    tag[i] = 0;
  }
}

boolean compareTag(int one[], int two[]){ // 읽은 태그 ID와 저장된 태그 ID를 비교

  for (int i=0; i < 4; i++){  // 읽은 태그와 저장된 태그 ID를 한자리 씩 비교
    if(one[i]!=two[i]) { 

      return false; // 하나라도 다르면 두 태그는 다른 값을 가지는 것
    }
  }
  return true; // 전부 일치할 경우 일치하는 상태 값을 보냄
}

 

 

 

기본적인 아이디어는 한번 센싱을 하면 그 태그를 oldTag로 저장을 하고

새롭게 읽어 들인 태그를 TestTag라고 선언한 다음에

두 tag를 비교해서 만약에 같으면 방금전에 센싱한 태그와 같다는 얘기가 되어 한번만 출력이 되도록 합니다

만약에 oldTag와 TestTage가 다르다면 새로운 태그가 센싱이 되었다는 뜻이기 때문에 다시 그 태그에 대한 정보를 출력하고

그 태그 정보를 oldTag로 저장합니다

 

이렇게해서 동작이 잘 되면 태그를 찍었을 때 시리얼 모니터에 해당 태그에 대한 정보가 출력이 되고

만약에 그 태그를 떼서 아무 것도 인식이 안되면 시리얼 모니터에 null이 뜹니다

아래에는 차례대로 X, Z, Y 태그를 인식한 결과입니다

 

 

 

 

문제가 있는데 바로 하나의 아두이노에 두 개의 RFID 를 연결하면 인식을 못 한다는 것입니다

제가 인터넷에 찾아본 결과 SoftwareSerial 변수를 두 개 이상 선언하는 경우에

아두이노는 한번에 하나의 소프트웨어 시리얼만 처리를 할 수 있기 때문에 listen 함수를 호출해야 된다고 합니다.

예를 들어 SoftwareSerial port1(2,3); SoftwareSerial port2(4,5);  

가 있을 때 port1에 대한 어떤 작업을 수행하려면 그 전에

port1.listen();

이라고 써주어야 하는 것이죠

 

 

그래서 그렇게 써 주었는데도 두 개의 RFID 모듈을 연결하면 둘 다 인식을 못하는 사태가 벌어집니다 ㅜㅜ

무엇이 원인일까요? 혹시 아시는 분 계시면 도와주세요 ㅜㅜ

아래는 두 개 rfid 사용할 때 코드인데 기본적으로 위와 거의 동일합니다. 사용하는 함수는 똑같기 때문에 loop 안에 달라진 부분만 코드를 첨부하겠습니다.

아래와 같습니다.

 

 

 

#include 

SoftwareSerial rSerial1(7,4);
SoftwareSerial rSerial2(6,3);

#define RFID_num 2

// ------------ Part 5 --------------- 완성 버전, 원하는 대로 한번만 출력


int tag1[4] = {0, 95, 87, 203};   // 미리 지정된 RFID 태그의 ID입니다. 
int tag2[4] = {0, 146, 138, 168};
int tag3[4] = {0, 146, 207, 160};
int tag4[4] = {0, 134, 233, 58};

int TestTag[RFID_num][4] = {{0, 0, 0, 1}, {0, 0, 0, 1}}; //  TestTag를 선언합니다

int oldTag[RFID_num][4] = {{0, 0, 0, 2}, {0, 0, 0, 3}};


int zeroTag[4] = {0,0,0,0};


void setup(){
  Serial.begin(9600);
  rSerial1.begin(9600);
  rSerial2.begin(9600); 
}

void loop(){
  
  int index1 =0 ;


 rSerial1.listen();
  while(rSerial1.available()) {
    
    int readByte = rSerial1.read(); // 시리얼 포트에 있는 데이터를 저장합니다.
    TestTag[0][index1] = readByte;
    index1++;
    //Serial.println(index);
    }

  
  if(!compareTag(TestTag[0], oldTag[0])){
    checkTag(TestTag[0], 0); // 미리 저장된 태그 ID와 RFID 리더에서 읽은 태그 ID와 일치하는지 확인
  }
  
  
  clearTag(TestTag[0]); // 읽어온 태그 ID를 지움

  delay(1000);


int index2 =0 ;
  rSerial2.listen();
  
  while(rSerial2.available()) {
    
   
    int readByte = rSerial2.read(); // 시리얼 포트에 있는 데이터를 저장합니다.
    TestTag[1][index2] = readByte;
    index2++;
    }

  
  if(!compareTag(TestTag[1], oldTag[1])){
    checkTag(TestTag[1],1); // 미리 저장된 태그 ID와 RFID 리더에서 읽은 태그 ID와 일치하는지 확인
  }
  
  
  clearTag(TestTag[1]); // 읽어온 태그 ID를 지움
  delay(1000);
}

 

이전글   |    날씨 정보를 알려주는 무드 램프 만들기[완성]에서 코드 질문드립니다... 2015-11-26
다음글   |    weathercube에서 날씨받아오는 부분 질문드립니다... 2015-11-26