-
RFID와 아두이노 연결 및 카드 정보 읽고 서보 모터 회전시키기Arduino/RFID(RC522) 2020. 11. 13. 16:35
라이브러리 관리에서 RFID검색하고 MFRC522의 깃허브커뮤니티로 설치한다.
하드웨어의 연결은 아래와 같다.
RFID의 SDA는 아두이노의 10번핀에 연결
RFID의 SCK는 아두이노의 13번핀에 연결
RFID의 MOSI는 아두이노의 11번핀에 연결
RFID의 MISO는 아두이노의 12번핀에 연결
RFID의 IRQ는 N.C(연결 안 함)
RFID의 GND는 아두이노의 GND핀에 연결
RFID의 RST는 아두이노의 9번핀에 연결
RFID의 3.3V는 아두이노의 3.3V핀에 연결아래의 예졔에서 흰색 카드의 UID값을 확인하자.
밑에서 이 값을 통해 서보모터를 회전시킬 것이다.
소스 코드
더보기#include <MFRC522.h> #include <SPI.h> #define SS_PIN 10 // 칩셋핀(데이터 핀) #define RST_PIN 9 // 리셋핀 MFRC522 mfrc522(SS_PIN, RST_PIN); void setup() { // put your setup code here, to run once: Serial.begin(9600); SPI.begin(); // Init SPI bus mfrc522.PCD_Init(); // Init mfrc522 mfrc522.PCD_DumpVersionToSerial(); // RFID의 펌웨어 버전 확인 } void loop() { // put your main code here, to run repeatedly: // 카드가 읽혀지지 않은 상태(찍히지 않으면)이면 리턴 if (!mfrc522.PICC_IsNewCardPresent()) return; if (!mfrc522.PICC_ReadCardSerial()) return; // 읽은 카드에 대한 정보를 Serial로 전송. mfrc522.PICC_DumpToSerial(&(mfrc522.uid)); delay(1000); }
서보 모터를 연결해보자.
서보 모터의 연결은 아래를 참고하자.
designatedroom87.tistory.com/247?category=899480
간단한 연결이다.
흰색 카드를 RFID에 찍을 때 서보 모터를 180 혹은 0로도 회전시키기
일단 흰색 카드의 UID를 시리얼 통신으로 확인하자.
그리고 이 카드의 정보를 전역 변수 배열로 선언을 하자.
소스 코드
더보기// 카드의 UID를 체크한다. // 흰 카드 97 A8 B6 4E // 파란색 카드 C7 99 FF 32 #include <MFRC522.h> #include <SPI.h> #include <Servo.h> #define SS_PIN 10 // 칩셋핀(데이터 핀) #define RST_PIN 9 // 리셋핀 #define SERVO_PIN 6 MFRC522 mfrc522(SS_PIN, RST_PIN); Servo servo; int angle = 0; bool motorState = false; const int g_Card_UID[4] = {0x97, 0xA8, 0xB6, 0x4E}; // 흰 카드의 UID번호 void setup() { // put your setup code here, to run once: Serial.begin(9600); SPI.begin(); // Init SPI bus mfrc522.PCD_Init(); // Init mfrc522 mfrc522.PCD_DumpVersionToSerial(); // RFID의 펌웨어 버전 확인 servo.attach(SERVO_PIN); // 6번핀 servo.write(0); } bool CheckCardUID() { if (mfrc522.uid.uidByte[0] == g_Card_UID[0] && mfrc522.uid.uidByte[1] == g_Card_UID[1] && mfrc522.uid.uidByte[2] == g_Card_UID[2] && mfrc522.uid.uidByte[3] == g_Card_UID[3]) return true; return false; } void loop() { // put your main code here, to run repeatedly: // 카드가 읽혀지지 않은 상태(찍히지 않으면)이면 리턴 if (!mfrc522.PICC_IsNewCardPresent()) return; if (!mfrc522.PICC_ReadCardSerial()) return; // uid카드를 출력하기. 각 자리는 16진수로 출력 Serial.println(mfrc522.uid.uidByte[0],HEX); Serial.println(mfrc522.uid.uidByte[1],HEX); Serial.println(mfrc522.uid.uidByte[2],HEX); Serial.println(mfrc522.uid.uidByte[3],HEX); if (CheckCardUID()) { if (!motorState) angle = 180; else angle = 0; servo.write(angle); motorState = !motorState; delay(1000); } // delay함수 대신에 아래의 두 함수를 호출. mfrc522.PICC_HaltA(); mfrc522.PCD_StopCrypto1(); // 읽은 카드에 대한 정보를 Serial로 전송. //mfrc522.PICC_DumpToSerial(&(mfrc522.uid)); //delay(1000); }