반응형

Note(Banknote) Acceptor, Bill Acceptor 등으로 불리는 지폐 인식기는 보통 자판기, 동전 교환기, 오락실등에서 사용된다. 여러가가지 모델이 있지만 작동 원리는 대부분 비슷하다.

 

SAMDUCKSA의 SN401PK라는 모델의 지폐인식기다.

 

오른쪽 측면에 8개의 dip switch가 있다. 2번(천원당 pulse 2회), 7번(pulse length = 50ms) switch가 on 되어 있다.

 

왼쪽 측면에는 입력(Vcc, GND), 출력(Pulse)등을 위한 10개의 터미널(Molex Microblade Connector)이 있다. 보통 2, 8(9), 10번 터미널을 사용한다.

 

위에도 6개의 터미널은 있는데 설명이 없다. 제조사에서 사용하는 터미널이 아닐까 싶다.

 

 

 

 

지폐 투입구. 지폐를 밀어 넣으면 자동으로 인식 된다.

 

지폐 투입구를 열어보면 LED, 센서, 타이밍 밸트, 롤러등이 있다.

 

 

 

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
const int NOTEPIN = 4;
unsigned long duration;
int count = 0;
 
void setup() {
  pinMode(NOTEPIN , INPUT_PULLUP);
  // 플로팅 방지 풀업 저항.
  Serial.begin(9600);
  Serial.println("Counter Ready");
}
 
void loop() {
  duration = pulseIn(NOTEPIN, LOW, 200000); // microsecond  
  // NOTEPIN은 풀업 저항을 사용하므로 LOW 펄스를 읽어야한다.
  // 0.2초 대기. 0.1초는 너무 짧아 Pulse signal을 제대로 받지 못한다.
  // 빠른 지폐인식을 위해 최소한의 대기시간을 지정.
  
  //Serial.println(duration); // 약 50ms의 펄스가 발생한다.
  
  // Condition: Pulse = 50 ms(millisecond), 1 time/1,000 won
  // 지폐 인식기의 Pulse 신뢰도가 100%가 아니면 1,000원당 1회의 Pulse로 세팅시
  // 1,000원짜리는 인식 하지 못하거나 다른 지폐도 잘못 인식하는 경우가 발생한다.
  // 그런 경우 1,000원당 2회 이상의 Pulse로 세팅하고 코드를 적절히 수정하면 오류에
  // 대응할 수 있다. 하지만 지폐 인식 속도는 느려진다.
  if (duration > 40000// 40 millisecond = 40000 microsecond
                        // SN401PK는 약50ms의 시그널을 발생한다.
  {
    count++;
  } else if (count > 0 && duration < 10000) {
    Serial.print("Signal count: ");
    Serial.println(count);
    
    if (count == 1) {
      Serial.println("1천원");
    } else if (count == 5) {
      Serial.println("5천원");
    } else if (count == 10) {
      Serial.println("1만원");
    } else {
      Serial.println("Error");
    }
    
    count = 0;
  }
 
  delay(10);
}
 

 

소스 코드

 

 

 

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
const int NOTEPIN = 4;
const int COINPIN = 2;
const int RELAYPIN = 6;
 
unsigned long duration = 0;
int billCount = 0;
int coinCount = 0;
 
int pulse=0,temp,target=0,index=0;
char sen;
unsigned long int timer;
 
 
void setup() {
    pinMode(NOTEPIN, INPUT_PULLUP);
 
    pinMode(COINPIN, INPUT_PULLUP);
    sen=digitalRead(COINPIN);
 
    pinMode(RELAYPIN, OUTPUT);
    digitalWrite(RELAYPIN, HIGH);
 
    Serial.begin(9600);
    Serial.println("Counter Ready");
}
 
void SpitCoin(int target) {
 
    index=0;
    timer=millis();
    temp=target;
    if((temp>0)&(temp<=100)){
      pulse=0;
      target=temp;
      Serial.println("Give me "+String(target)+" coins");
      digitalWrite(RELAYPIN,LOW);
    }
  while(true)
  {
    sen=(sen<<1)|digitalRead(COINPIN);
    sen&=0x03;
    if(sen==1&(digitalRead(RELAYPIN)==LOW))
    {
      timer=millis();
      pulse++;
      Serial.println("Count "+String(pulse));
      if(pulse>=target)
      {
        digitalWrite(RELAYPIN,HIGH);
        Serial.println("You get "+String(pulse)+"/"+String(target)+" coins");
        pulse=0;
        target=0;
 
        break;
      }
    }
 
    if((digitalRead(RELAYPIN)==LOW)&(millis()-timer>2000))
    {
      digitalWrite(RELAYPIN,HIGH);
      Serial.println("Out of coin. You get "+String(pulse)+"/"+String(target)+" coins");
      pulse=0;
      target=0;
 
      break;
    }
  }
}
 
void loop() {
    duration = pulseIn(NOTEPIN, LOW, 200000); // microsecond
    if (duration > 40000// microsecond (40 millisecond = 40000 microsecond)
    {
        billCount++;
    }
    else if (billCount > 0 && duration < 10000) {
        Serial.print("Signal count: ");
        Serial.println(billCount);
        
        if (billCount < 5) {            
            Serial.println("1,000 won");
            SpitCoin(2);
        }
        else if (billCount < 15) {
            Serial.println("5,000 won");
            SpitCoin(10);
        }
        else if (billCount < 25) {
            Serial.println("10,000 won");
            SpitCoin(20);
        }
        else {
            Serial.println("Error");
        }
 
        billCount = 0;
    }
 
  delay(10);
}
 

 

소스 코드

 

반응형
Posted by J-sean
: