최근 유튜브에서 이런 영상을 보았다.

 

 

이 영상을 요약하자면, 옛날 농협에서 쓰던 마그네틱 리더기가 달린 키보드에 삼성페이 결제를 하면, 자동으로 컴퓨터 잠금을 해제할 수 있다는 내용이다. 마그네틱 리더기도 일종의 HID 장치이기 때문에, 충분히 이런 게 가능하다. 이 분은 키보드를 구할 수 없어서 직접 마그네틱 리더기를 구매해 버리셨다(...)

 

어쨌든 난 이렇게 고가의(?) 장비를 살 돈과 삼성페이 & LG페이가 지원되는 폰이 없기 때문에 아두이노를 통해 헝그리 버전으로 구현해 보기로 했다. 난 MST 방식 말고 RC522 RFID 모듈을 사용하기로 했다.

 

이 모듈은 엄청 흔하디 흔한 모듈로, 쉽게 구할 수 있다. 또 가격도 저렴하다(이거에 관해서는 웃픈 스토리가 하나 있다.내가 인두기를 사기 전에, 이 모듈을 쓰고 싶어서 여기다 대충 글루건으로 고정을 했는데, 그 이후로 이 모듈을 사용할 수 있었던 적은 없었다. 인두기를 사고 나서도 말이다. 결국 내 피같은 2000원을 희생해 샀다)

 

근데, 한 가지 문제점이 있다.

 

바로 아두이노 레오나르도가 없다는 것(!!!)

 

아두이노 우노의 2세대 격인 레오나르도는 HID 장치이기 때문에, 컴퓨럴에 꽂기만 하면 바로 키보드 같은 장치로 인식 가능하다. 근데 우노는 그게 안 된다. 왜냐하면 USB 스케치 업로드 부분과 메인으로 핀을 제어하는 MCU가 따로 분리되어 있기 때문인데, 아두이노 우노는(거의 대부분의 모델이) 16u2 칩셋으로 업로드를, ATMega328로 핀 제어를 담당한다(만약 USB 업로드 칩셋이 CH340일 경우, 안타깝게도 내가 쓸 방법이 먹히지 않는다). 이 둘은 엄연한 MCU이기 때문에, 각각 독립적으로 사용이 가능하다. 따라서 16u2를 키보드 용과 USB 업로드 용으로, ATMega328을 핀 제어 용으로 각각 사용하면서 둘 MCU를 연결해 주면 레오나르도처럼 사용할 수 있다.

 

그럼 어떻게 해야 할까?

 

정답은 HoodLoader라는 부트로더에 있다.

 

USB 업로드 용으로 만들어진 16u2의 부트로더를 개조, ATMega328과 동시에 쓸 수 있게 해준다.

 

내가 이걸 업로드 하는 방법은 다음에 소개하겠다. 여러분이 부트로더니 뭐니를 올리는 귀찮고 지루한 과정을 보기 싫어하시는 것은 나도 다 안다.

 

그럼 바로 시작하자(난 이미 HoodLoader 부트로더를 올려 놨다. 난 아두이노 우노만 3개다)

 

<핀 배열>

 

3.3v --> 3.3v

GND --> GND

MOSI --> Pin 11
MISO --> Pin 12 
SCK  --> Pin 13
SS   --> Pin 10 
RST  --> Pin 9

IRQ는 연결하지 않는다.

 

이것만 연결하면 끝이다. 참 쉽죠?

 

그럼 소스 코드를 보여 드리겠다. 다른 블로그에서 퍼온 소스를 일부 수정하고 짬뽕했다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <SPI.h>
#include <MFRC522.h>
 
#define SS_PIN 10
#define RST_PIN 9
 
MFRC522 rc522(SS_PIN, RST_PIN);                  
 
void setup() {
  Serial.begin(115200);                        
  SPI.begin();         
  rc522.PCD_Init();                              
}
 
void loop() {
  if(!rc522.PICC_IsNewCardPresent()) return;     
  if(!rc522.PICC_ReadCardSerial()) return;       
  
  if(rc522.uid.uidByte[0]==0xFB && rc522.uid.uidByte[1]==0x04 && rc522.uid.uidByte[2]==0xE6 && rc522.uid.uidByte[3]==0x21) {
    Serial.write(1);
  } 
  else {
    Serial.write(0);
  }
  delay(100);
}
 
cs

 딜레이는 0.1초를 주었다. 근데 이 정도는 아무 체감도 나지 않는다.

 

위의 것은 ATMega328로 업로드 해야 한다. ATMega328과 16u2는 115200 보드레이트로 통신한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <Keyboard.h>
 
void setup() {
  Serial1.begin(115200);
  Keyboard.begin();
}
 
void loop() {
  int d = Serial1.read();
 
  if (d == 1) {
    Keyboard.print("yourpassword");
    delay(30);
    Keyboard.press(KEY_RETURN);
    Keyboard.releaseAll();
    delay(100);
  }
  else {
    d = 0;
  }
}
cs

이건 16u2에 업로드해야 하는 것이다. ATMega328과 115200 보드레이트로 통신하면서 카드가 인식되어 1이 날라오면 패스워드를 입력하고, 아니면 가만히 있는다. 카드를 재빨리 떼지 못해 여러번 입력되는 것을 막기 위해 체감도 안나는 0.1초의 딜레이를 주었다.

 

완성작

 

(저기 RESET SW 라고 써져 있는 스위치는 ATMega328과 16u2간 전환하기 위한 것이다)

 

원래 작동 영상까지 올리려고 했으나, 집이 너무 더러워서(...) 올리지 않았다.

 

어쨌든 내가 영상에서 봤던 것을 비슷하게라도 구현해 봤으니 기분은 좋았다.

 

일반적인 교통카드도 UID까진 읽어낼 수 있으니 일반적인 교통카드를 이용해도 된다. 스마트폰의 NFC를 이용하면 진짜 삼성페이처럼 구현할 수도 있겠다. 

 

근데 이게 실용성이 있을진 여러분의 판단에 맡기겠다.

 

*해외에 보니 나처럼 한 사례가 꽤 보인다. 역시 세상은 넓다.

 

+ Recent posts