바코드 리더기 (CCD CAMERA 타입)
요즘 상품들은 바코드 안붙은걸 찾는게 더 힘들겁니다. 그만큼 광범위하게 사용되는 인식 수단이죠. RFID가 몇 년만 지나면 바코드를 다 대체할 것 처럼 떠들던 때도 있었는데, 바코드의 위상이 딱히 바뀐것 같지는 않네요.
바코드가 보편적인 인식 수단이다보니 DIY 용으로 나온 바코드 리더기도 판매를 하고 있습니다. 크게 laser-mirror 방식과 CCD 카메라 기반의 리더기가 있습니다. 이번에 구매해서 테스트한 제품은 카메라 기반의 스캐너로 초당 100회 까지 고속으로 촬영하면서 바코드를 스캔합니다. 어느 종류를 선택하든 상업용으로 쓰지 않는 이상 상관 없을 듯 합니다. 아두이노나 PC에 연결되는 인터페이스도 동일할 겁니다.
바코드 리더기는 1D (stripe) 바코드를 인식할 수 있습니다. QR 코드(2D)는 인식할 수 없습니다. QR 코드는 전용 인식기가 별도로 있습니다.
바코드 리더기는 대부분 PS/2 또는 USB 포트를 이용한 통신을 지원하고 연결된 장비에서 ‘키보드’ 또는 이와 유사한 장치로 인식됩니다. 그래서 마치 키보드로 데이터를 입력하는 것처럼 바코드 데이터를 보내주게됩니다.
아두이노에 연결해서 사용하시려면 PS/2 타입을, PC나 라즈베리 파이에 연결해서 사용하시려면 USB 타입을 구매하시는 것이 좋습니다.
Aliexpress 등에서 저렴한 가격으로 파는 리더기가 있으니 이걸 살짝 손봐서 사용해도 좋을 것 같습니다. 전 Adafruit 에서 판매하는 PS/2 방식의 제품을 구해서 테스트를 해봤습니다. 그래서 일단 PS/2 방식의 제품을 기준으로 설명하도록 하겠습니다.
바코드 데이터는 정말 단순하고 읽은 방법도 쉽습니다.
연결 방법
제가 가진 바코드 리더기는 PS/2 소켓이 암-수 2개가 달려 있습니다. 둘 중 숫(male)소켓을 사용해야 합니다.
PS/2 소켓에 달린 6개의 핀은 아래와 같은 용도로 사용됩니다. 아두이노와 연결해서 데이터를 읽을 예정이기 때문에 소켓에서 데이터 핀과 전원핀, 도합 4개의 핀을 확인하면 됩니다.
숫 소켓의 4개 핀만 아두이노에 연결합니다. 5V, GND 핀은 전원용이고 Data, Clock(IRQ) 핀이 데이터 통신용입니다.
- 카드리더기 –> 아두이노
- 5V –> 5V
- GND –> GND
- Data –> D2
- Clock –> D3
Clock 핀을 IRQ 라고도 표기하는데 Interrupt Request 줄임말입니다. 즉, Clock 핀으로 먼저 데이터를 보내겠노라 신호를 보내고 실제 데이터를 Data 핀으로 보내줍니다. 따라서 데이터를 받는 아두이노측에서는 Clock 핀을 인터럽트 핀에 연결해서 신호가 올 때 데이터를 받도록 하면 됩니다. 아두이노의 인터럽트 핀은 D2, D3 핀입니다.
결론은 Data 핀은 원하시는 디지털 핀에 연결하고 Clock 핀은 D2, D3에 꼭 연결하시라는 겁니다.(아두이노 UNO 보드 기준)
이걸로 연결 끝. 바코드 데이터를 읽을 하드웨어 준비는 끝입니다.
팁!!! 숫 소켓의 핀과 아두이노를 연결할 때 브레드 보드용 점퍼선(dupont cable)을 살짝 개조해서 사용하세요. 아래처럼 케이블 끝에 달린 플라스틱 커버를 벗겨내고
테이프로 합선되지 않도록 끝을 감싸주세요.
그리고 숫 소켓의 핀에 꽂아서 사용하시면 됩니다.
라이브러리 설치
다행스럽게도 PS/2 키보드가 보내주는 데이터를 읽을 수 있는 아두이노용 라이브러리가 개발되어 있습니다. 아래 링크를 통해 PS2Keyboard 라이브러리를 받아 설치해줍니다.
Download: PS2Keyboard.zip (version 2.4)
출처 : http://www.pjrc.com/teensy/td_libs_PS2Keyboard.html
테스트
설치한 라이브러리에 예제코드도 포함되어 있습니다. examples 폴더 내부에 Simple_Test 예제를 불러와서 아두이노에 업로드하면 바코드 리더기가 읽은 값을 Serial로 출력해줍니다.
업로드 하기 전, 아래 소스코드 중 DataPin, IRQpin 값을 자신의 연결 상태에 맞게 수정해줍니다. 제 경우엔 D2, D3에 연결 했으므로 2, 3으로 변경해 줬습니다.
#include <PS2Keyboard.h> const int DataPin = 8; const int IRQpin = 5; PS2Keyboard keyboard; void setup() { delay(1000); keyboard.begin(DataPin, IRQpin); Serial.begin(9600); Serial.println("Keyboard Test:"); } void loop() { if (keyboard.available()) { // read the next key char c = keyboard.read(); // check for some of the special keys if (c == PS2_ENTER) { Serial.println(); } else if (c == PS2_TAB) { Serial.print("[Tab]"); } else if (c == PS2_ESC) { Serial.print("[ESC]"); } else if (c == PS2_PAGEDOWN) { Serial.print("[PgDn]"); } else if (c == PS2_PAGEUP) { Serial.print("[PgUp]"); } else if (c == PS2_LEFTARROW) { Serial.print("[Left]"); } else if (c == PS2_RIGHTARROW) { Serial.print("[Right]"); } else if (c == PS2_UPARROW) { Serial.print("[Up]"); } else if (c == PS2_DOWNARROW) { Serial.print("[Down]"); } else if (c == PS2_DELETE) { Serial.print("[Del]"); } else { // otherwise, just print all normal characters Serial.print(c); } } }
업로드가 완료되면 아두이노 IDE에서 시리얼 모니터를 켜두고 주변의 바코드를 마구 읽어보세요. 바코드 리더기를 손에 쥐고 약 10cm 정도의 거리에서 동작 버튼을 눌러주시면 됩니다. 그럼 시리얼 모니터에 바코드의 숫자가 찍힐겁니다. 시리얼 모니터의 숫자가 바코드 하단에 기재된 숫자와 일치하는지 확인하세요.
2종의 바코드를 읽어보니 제대로 인식됩니다. 특히 약 10cm 정도 적당한 거리를 유지할 때는 거의 즉각적인 인식 능력을 보여줘서 매우 흡족합니다. 제어용 소스코드도 간단하구요. 이제 어떻게 아이디어를 접목할지만 고민하면 되겠네요.
제가 구매한 바코드 리더기의 스펙은 아래와 같습니다.
- Light Source: Visible Red light 632nm LED
- Depth Of Field: 230mm @ 20mil/0.5mm, PCS90%
- Resolution: 5mil/0.127mm, PCS90%
- Ambient Light: 5000 Lux Max
- Voltage: DC +5V ±5%
- Power Consumption: 80mA
- Reading Indicator: Beeper
- Scan Rate: 100 scans/sec ±10%
- Operating Temp: 0 oC to 50 oC (32 oF to 122 oF)
- Storage Temp: -20 oC to 70 oC (-4 oF to 158 oF)
- Relative Humidity: 20% to 95%(Non-condensing)
- Mechanical Shock: 2000G, 0.7ms, 3 axes
- Interface: PS/2 Keyboard Wedge
- Cable: Straight 5 ft.
- Connector: MOLEX 11P Pitch 1.25
- Weight: Approx. 0.56 oz(17 g)(w/o cable)
- Dimension: 44 mm W x 30 mm D x 19.2 mm H
참고자료