고등학교/스마트홈 프로젝트

2022/01/18 - 2일차

MSHUN 2022. 1. 18.
반응형

RFID (RFID-RC522) - SPI 통신

RFID란

RFID

RFID(Radio Frequency IDentification)는 전파를 이용해 근거리에서 정보를 인식하는 기술이며 전자기 유도 방식으로 통신한다.

수동형(Passive) RFID는 리더에서 방출되는 전파를 전원으로 사용하여 자체적인 전원 없이 동작하고 인식거리는 비교적 짧다.

능동형(Active) RFID는 자체적인 전원을 사용하여 전파 출력이 크고 인식거리도 길다.

 

회로 연결

회로

 

라이브러리 설치

라이브러리 설치

아두이노> 툴> 라이브러리 관리> MFRC522 설치

 

소스 코드

#include <SPI.h>
#include <MFRC522.h>

#define SS_PIN 10
#define RST_PIN 9

MFRC522 rfid(SS_PIN, RST_PIN); // 클래스 인스턴스

MFRC522::MIFARE_Key key; // 키값 속성

byte nuidPICC[3][4] = {{0xB7, 0xBB, 0xCB, 0x4D},  // 등록카드1
                       {0x39, 0x4C, 0xAF, 0xB0},  // 등록카드2
                       {0xFF, 0xFF, 0xFF, 0xFF}}; // 등록카드3
void setup() {
  Serial.begin(9600);
  SPI.begin(); // SPI 통신 시작
  rfid.PCD_Init(); // MFRC522 초기화
  Serial.println(F("This code scan the MIFARE Classsic NUID."));
}

void loop() {
  getRfid();
}

// RFID 카드 읽기
void getRfid() {
  // 카드를 반복해서 읽지 않도록 빠져나감
  if ( ! rfid.PICC_IsNewCardPresent())
    return;

  // 키값을 인식하지 못하면 빠져나감
  if ( ! rfid.PICC_ReadCardSerial())
    return;
  // 카드 종류 알아내기
  MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);

  // MIFARE 타입이 아니면 빠져나감
  if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI &&
      piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
      piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
    Serial.println(F("Your tag is not of type MIFARE Classic."));
    return;
  }

  // 읽은 ID와 등록된 ID값을 비교
  bool isConfirmedCard = false;
  for (int i = 0; i < sizeof(nuidPICC) / sizeof(nuidPICC[0]); i++){
    if (rfid.uid.uidByte[0] == nuidPICC[i][0] &&
        rfid.uid.uidByte[1] == nuidPICC[i][1] &&
        rfid.uid.uidByte[2] == nuidPICC[i][2] &&
        rfid.uid.uidByte[3] == nuidPICC[i][3] ) {
      Serial.println(F("This is a confirmed card."));
      isConfirmedCard = true;
     if(isConfirmedCard){
      break;
     }
    }
  }
  if (isConfirmedCard == false)
  {
      Serial.print(F("Unconfirmed card :"));
      printHex(rfid.uid.uidByte, rfid.uid.size);
      Serial.println();
  }
  // PICC 종료
  rfid.PICC_HaltA();

  // 암호화 종료
  rfid.PCD_StopCrypto1();
}

// 카드 ID를 Hex로 출력
void printHex(byte *buffer, byte bufferSize) {
  for (byte i = 0; i < bufferSize; i++) {
    Serial.print(buffer[i] < 0x10 ? " 0" : " ");
    Serial.print(buffer[i], HEX);
  }
}

등록할 카드를 미리 코드에 적어놓자.

OLED - I2C 통신

OLED란

OLED(유기 발광 다이오드 : Organic Light Emitting Diode)는 유기 화합물층이 전류에 반응하여 빛을 발산하는 필름으로 이루어진 LED 반도체 소자 중 하나이다.

LCD처럼 백라이트가 필요하지 않고 두께도 얇으며 휘어지도록 만들 수 있다.

회로 연결

OLED

라이브러리 설치

01
라이브러리 설치

아두이노> 툴> 라이브러리 관리> Adafruit SSD1306 설치 > Install all

 

주소 찾기

주소 찾기

파일 > 예제 > Wire > i2c_scanner

예제를 실행해 설치한 OLED의 주소를 찾는다. 

소스 코드

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // OLED 가로 픽셀 수
#define SCREEN_HEIGHT 64 // OLED 세로 픽셀 수

// I2C OLED 인스턴스 생성
#define OLED_RESET     -1 // 리셋핀(-1이면 아두이노 리셋핀을 공유)
Adafruit_SSD1306 display(OLED_RESET);

void setup() {
  Serial.begin(9600);
  // OLED 연결 안되면 무한루프
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { //찾은 주소 입력
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
  }
}

void loop() {
  updateOled();    // Draw 'stylized' characters
}


void updateOled(void) {
  display.clearDisplay();

//  display.setTextSize(1);             // Normal 1:1 pixel scale
  display.setTextColor(SSD1306_WHITE);        // Draw white text
  display.setCursor(0,0);             // Start at top-left corner
  
  display.print(F("Line1"));
  display.println(F("TEXT"));
  
  display.print(F("Line2"));
  display.println(F("TEXT"));
  
  display.print(F("Line3"));
  display.print(F("TEXT1"));
  display.println(F("TEXT2"));

  display.print(F("Line4"));

  display.display();
  delay(2000);
}

아까 찾은 주소를 코드 안에 넣는다.

릴레이 회로

조심해서 작업하자
핀배치

작업순서

전원 연결 커넥터 설치 > 220V 전구 소켓 설치 > 12V 팬 설치 >  커넥터-소켓- 팬-2채널 릴레이 배선 연결
2일차에 12V 어댑터 연결까지 완료함.

통신

UART

UART(범용 비동기화 송수신기: Universal Asynchronous Receiver Transmitter)는 병렬 데이터를 직렬 방식으로 전환하여 전송하는 하드웨어이다.

TxRx가 각각 있기 때문에 전이중 통신이다.

시작 비트 : 통신의 시작을 의미한다.
데이터 비트 : 5~8비트의 데이터 전송을 한다. 몇 비트를 사용할 것인지는 해당 레지스터 설정에 따라 결정된다.
패리티 비트 : 오류 검증을 하기 위한 패리티 값을 생성하여 송신하고 수신 쪽에 오류를 판단한다. 사용 안 함, 짝수, 홀수 패리티 등의 세 가지 옵션으로 해당 레지스터 설정에 따라 선택할 수 있다. 
끝 비트 : 통신 종료를 알린다.

I2C

I2C(Inter Integrated Circuit)는 필립스에서 개발한 직렬 버스이다.

주로 메인보드, 임베디드 등 저속의 기기를 연결하기 위해 사용한다.

데이터 선(SDA)과 클럭 선(SCL)이 있다.

데이터 선이 하나밖에 없기 때문에 송신과 수신을 동시에 하지 못해 반이중 통신이다.

SPI

SPI(직렬 주변기기 인터 페이스 버스 : Serial Peripheral Interface Bus)는 모토로라에 의해 개발된 직렬 데이터 전송 방식이다.

클럭 선(SCK), 데이터 송신(MOSI), 데이터 수신(MISO), 신호 선(SS)이 있다.

완전한 전이중 통신이다.

 

비교

  UART I2C SPI
동기여부 비동기 동기 동기
Tx, Rx SDA, SCL SCK, MOSI, MISO, SS
이중통신 전이중 반이중 전이중
관계 1:1 N:N 1:N

2일 차 결과물

반응형

댓글