«

»

Распечатать Запись

Вендинговый разменный автомат на Arduino

Рассмотрим создание разменного автомата на Arduino. Автомат будет разменивать монеты 10 руб, купюры 10, 50, 100 руб на монеты достоинством 5 руб.

Для автомата будем использовать купюроприемник ICT BL-700, монетоприемник на одну монету, хоппер Cube Hopper MK2
12Я уже рассматривал подключение к Arduino монетоприемника (http://meandr.org/archives/23612) и купюропримника ICT (http://bhv.ru/books/book.php?id=191366). Рассмотрим подключение к Arduino хоппера – электромеханического прибора, предназначенного для выдачи монет.

Рассмотрим хоппер, который хранит и выдает сдачу монетами одного номинала - так дешевле, чем ставить универсальное устройство. Новые модели хоппера Cube Hopper MK2 (datasheet) можно приобрести по цене от 3000 руб, можно найти и б/у устройства от 1500 руб. Cube Hopper MK2, один из самых распространенных, разработан всемирно известной компанией Suzo, известнейшим игроком на рынке развлекательного оборудования. Данная модель специально разработана для игровой и вендинговой индустрии и выполнена из износостойкого пластика и обладает высокой надежностью.
3Характеристики:
Количествно номиналов: 1
Есть варианты под монеты: 1р, 2р, 5р, 10р!
Скорость выдачи монет: 7монет/сек
Размер монет: 18.00mm - 31.00mm
Толщина монет: 1.50mm - 3.20mm
Питание: 12V DC ±10% or 24V DC -25% +10%
Температура работы: от 0С до +50С
Вместимость: 450 монет диаметром 24мм
В хоппере МК2 применено современное электронное управление оптическими датчиками выдачи
Хоппер МК2 работает в двух протоколах: ccTalk или параллельный
Хоппер МК2 квадратного типа, таким образом выдача монет(жетонов) может быть осуществлена с 4 различных сторон в зависимости от необходимости.
Опционально: Расширитель держателя монет  можно установить до трёх расширителей, что даёт возможность загружать в бункер хоппера МК2 более 1200 монет(жетонов) диаметром 24 мм.
4Для подключение к Arduino будем использовать следующие контакты:
pin 6 - выход оптического сенсора
pin 8 - +12В
pin 9 - земля

При подаче на pin8 напряжения +12В хоппер начинает выдавать монеты. При выдаче каждой монеты на pin6 хоппер выдает отрицательный импульс длительностью 35 мс.

pin подтягиваем режиссером 10 кОм к +5В и подключаем к входу Arduino.

Приступим к созданию разменного автомата.

Схема электрическая
000При внесении монет через монетоприемник и купюр через купюроприемник на дисплее отображается внесенная сумма. При нажатии на кнопку Разменять хоппер выдает внесенную сумму монетами по 5 (или 10) руб. Отслеживание импульсов от монетоприемника, купюроприемника и хоппера по прерыванию. Используем Arduino Mega, прерывания 0(D2), 1(D3), 2(D21). Подача +12В на хоппер через реле.
Скетч на Arduino:

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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
// купюроприемник IC A7 V7
const int moneyPin1=2;
// монетоприемник CH-926
const int moneyPin2=3;
// хоппер suzo mk2
const int moneyPin3=21;
const int powerHopper=8;
int nominal_kup=10;
int nominal_hop=10;
// кнопка
const int pinButton=8;
boolean lastButton=HIGH;
boolean currentButton=HIGH;
int pulse1=0;
int pulse2=0;
int pulse3=0;
unsigned long timeAllPulse1=2000; // макс. время приема купюры
unsigned long timeAllPulse2=500; // макс. время приема монеты
unsigned long timeCount1=0;
unsigned long timeCount2=0;
int sum=0;
// дисплей WH1602
#include "LiquidCrystalRus.h"
LiquidCrystalRus lcd(12,11,7,6,5,4);
void setup()
{
  Serial.begin(9600); 
  //
  pinMode(moneyPin1,INPUT);
  pinMode(moneyPin2,INPUT);
  pinMode(moneyPin3,INPUT);
  pinMode(pinButton,INPUT);
 
  Serial.println("coin ready");
  lcd.begin(16,2);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Внесите деньги");
  delay(1000);
  attachInterrupt(0,count_pulse1,FALLING);
  attachInterrupt(1,count_pulse2,FALLING);
}
void loop()
{
  // нажатие кнопки
  currentButton=debounce(lastButton);
  if(lastButton==HIGH && currentButton==LOW)
    {
    doForKey();
    }
  lastButton=currentButton;
  // прошло максимальное время приема монеты?
  if(pulse2 (больше) 0 && (millis()-timeCount2)  (больше) timeAllPulse2)
    {
     sum=nominal_kup;
     pulse2=0;
     lcd.clear();
     lcd.setCursor(0,0);lcd.print("Баланс");
     lcd.setCursor(0,1);lcd.print(sum);
    }
  // прошло максимальное время приема купюры?
  if(pulse1 (больше) 0 && (millis()-timeCount1) (больше) timeAllPulse1)
    {
    sum+=pulse1*10;
    pulse1=0; 
    lcd.clear();
    lcd.setCursor(0,0);lcd.print("Баланс");
    lcd.setCursor(0,1);lcd.print(sum);
    }
}
// обработка прерывания монетоприемника - получить кол-во импульсов
// 
void count_pulse2()
  {
  detachInterrupt(1);
  pulse2++;
  if(pulse2==1)
      timeCount2=millis();
  attachInterrupt(1,count_pulse2,FALLING);
  }
// обработка прерывания купюроприемника - получить кол-во импульсов
// 
void count_pulse1()
  {
  detachInterrupt(0);
  //detachInterrupt(1);
  pulse1++;
  if(pulse1==1)
       timeCount1=millis();
  attachInterrupt(0,count_pulse1,FALLING);
  }
// обработка прерывания хоппера 
void count_pulse3()
  {
  detachInterrupt(2);
  pulse3++;
  attachInterrupt(2,count_pulse3,FALLING);
  }
// обработка нажатия кнопки
void doForKey() {
   if(sum==0)
     return;
   detachInterrupt(0);
   detachInterrupt(1);
   attachInterrupt(2,count_pulse3,FALLING);
   pulse3=0;
   lcd.clear();
   lcd.setCursor(0,0);lcd.print("Размен");
   digitalWrite(powerHopper,HIGH);
   while(pulse3<=sum/nominal_hop)
      {
      delay(50);
      }
   digitalWrite(powerHopper,LOW);
   detachInterrupt(2);
   lcd.clear();
   lcd.setCursor(0,0);lcd.print("Размен");
   lcd.setCursor(0,1);lcd.print("произведен");
   delay(3000);
   lcd.clear();
   lcd.setCursor(0,0);
   lcd.print("Внесите деньги");
   attachInterrupt(0,count_pulse1,FALLING);
   attachInterrupt(1,count_pulse2,FALLING);
   sum=0;
 }
// проверка на дребазг
boolean debounce(boolean last)
  {
  boolean current=digitalRead(pinButton);
  if(last!=current)
    {
    delay(5);
    current=digitalRead(pinButton);
    
  return current;
  }

Прикрепленные файлы:

Список радиоэлементов:

Обозначение Тип Номинал Количество
Arduino Mega Плата Arduino Mega 1
T2 Биполярный транзистор C945 1
D2 Выпрямительный диод 1N4004 1
  Купюроприемник ICT BL-700 1
  Монетоприемник 1
  Хоппер Cube Hopper MK2 1
  Резистор 10 кОм 1
  Резистор 4.7 кОм 3
R2 Резистор 1 кОм 1
  Потенциометр 10 кОм 1
WH1602 ЖК дисплей WH1602 1
БП Компьютерный блок питания +5В.+12В 1
S1 Кнопка 1
Rel2 Реле SRD-05VDC-SL-C 1

cxem.net

 

Постоянная ссылка на это сообщение: http://meandr.org/archives/23620

Добавить комментарий