안녕하세요 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);
}
|