ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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

     

    서보 모터의 기본적인 연결 및 동작

    서보모터와 관련한 함수 하드웨어 연결 서보 모터는 3개의 선으로 구성되어 있는데, 아래의 세 선이 서보 모터에 연결된 선이다. 이 선 색을 중심으로 보면 서보 모터의 가운데는 VCC에, 갈색은 GN

    designatedroom87.tistory.com

    간단한 연결이다.

     

    흰색 카드를 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);
    }

    댓글

Designed by Tistory.