Главная » Arduino
Призовой фонд
на январь 2017 г.
1. 1000 руб.
Radio-Sale
2. Регулируемый паяльник 60 Вт
Паяльник
3. 600 руб.
От пользователей
4. Тестер компонентов LCR-T4
Паяльник

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

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

Для автомата будем использовать купюроприемник ICT BL-700, монетоприемник на одну монету, хоппер Cube Hopper MK2

Я уже рассматривал подключение к Arduino монетоприемника (http://cxem.net/arduino/arduino85.php) и купюропримника ICT (http://bhv.ru/books/book.php?id=191366). Рассмотрим подключение к Arduino хоппера – электромеханического прибора, предназначенного для выдачи монет. 

Рассмотрим хоппер, который хранит и выдает сдачу монетами одного номинала - так дешевле, чем ставить универсальное устройство. Новые модели хоппера Cube Hopper MK2 (datasheet) можно приобрести по цене от 3000 руб, можно найти и б/у устройства от 1500 руб. Cube Hopper MK2, один из самых распространенных, разработан всемирно известной компанией Suzo, известнейшим игроком на рынке развлекательного оборудования. Данная модель специально разработана для игровой и вендинговой индустрии и выполнена из износостойкого пластика и обладает высокой надежностью. 

Характеристики:

  • Количествно номиналов: 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 мм
     

Для подключение к Arduino будем использовать следующие контакты:
pin 6 - выход оптического сенсора
pin 8 - +12В
pin 9 - земля

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

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

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

Схема электрическая

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

И скетч на Arduino:
// купюроприемник 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 Плата ArduinoMega1 Поиск в FivelВ блокнот
T2 Биполярный транзистор
C945
1 Поиск в FivelВ блокнот
D2 Выпрямительный диод
1N4004
1 Поиск в FivelВ блокнот
КупюроприемникICT BL-7001 Поиск в FivelВ блокнот
Монетоприемник1 Поиск в FivelВ блокнот
ХопперCube Hopper MK21 Поиск в FivelВ блокнот
Резистор
10 кОм
1 Поиск в FivelВ блокнот
Резистор
4.7 кОм
3 Поиск в FivelВ блокнот
R2 Резистор
1 кОм
1 Поиск в FivelВ блокнот
Потенциометр10 кОм1 Поиск в FivelВ блокнот
WH1602 ЖК дисплейWH16021 Поиск в FivelВ блокнот
БП Компьютерный блок питания+5В.+12В1 Поиск в FivelВ блокнот
S1 Кнопка1 Поиск в FivelВ блокнот
Rel2 РелеSRD-05VDC-SL-C1 Поиск в FivelВ блокнот
Добавить все

Скачать список элементов (PDF)

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

Теги:

Опубликована: Изменена: 06.12.2014 0 0
Я собрал 0 1
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 5 Проголосовало: 1 чел.

Комментарии (15) | Я собрал (0) | Подписаться

0
Андрей #
Не нашел обработки события, когда закончились монеты в хопере? Нужно при каждом подсчете импульса запоминать millis() а в цикл "пока не выдало все монеты" добавить проверку времени выдачи и если с момента последней выданной монеты прошло например больше 4сек- выключать хопер и выдавать ошибку
Ответить
0

[Автор]
victoruni #
Да, верно
Не подумал об этом
Ответить
0
Андрей #
Но у меня возникла другая проблема, подключил отдельно к меге этот хопер. Количество монет для выдачи подаю через serial. Так вот у меня выдача не стабильна- иногда ошибается на 1 монету... Только мне пришлось делать цикл while(pulse3
Ответить
0

[Автор]
victoruni #
digitalWrite(powerHopper,HIGH);
while(pulse3 меньше или равно sum/nominal_hop)
{
if(pulse3 = sum/nominal_hop)
break;
delay(50);
}
delay(50);
digitalWrite(powerHopper,LOW);
Ответить
0
Андрей #
Не - все тоже. Делаю
digitalWrite(DCHoper,LOW);
delay(2000);
digitalWrite(DCHoper,HIGH);
А внутри функции прерывания
Serial.println(" pulse3="+(String)pulse3);
так вот за 2 сек выдает разное кол-во монет(смотря как лежат), но закономерности в импульсах нет.. при 11 импульсах выдал 7 монет, до этого при 12 импульсах выдал 9 монет
Ответить
0
Андрей #
Короче продиагностировал проблему. Подключил провод сенсора хопера к аналоговому входу ардуино и в цикле делал analogRead() так вот по этим значениям 100% видна выдача монет без ошибок.. т.е. проблема либо в прерываниях либо в неправильном подсчете- хопер тут не виноват..
Ответить
0
Андрей #
Итого. Отказался от использования прерываний, для выдачи монет они не нужны(мы сами инициируем процесс выдачи). Сделал все используя данные с AnalogRead() с порта сенсора хопера. Работает как автомат калашникова- выдача 100%
Ответить
0

[Автор]
victoruni #
Попробуйте поставить сглаживающий конденсатор, может в этом проблема - у меня выдает нормально
Ответить
0
Павел #
Подскажите, пожалуйста, какой и куда в цепь поставить сглаживающий конденсатор?
Периодически хоппер выдает лишние жетоны.
Спасибо.
Ответить
0
Андрей #
У меня похожая проблема, мега ловит левые импульсы на линиях купюрника и монетника, т.е. как будто внесли деньги. Тоже не могу понять куда конденсатор воткнуть
Ответить
+1
Андрей #
Нашел как погасить помехи- сделал- заработало, правда количество импульсов монетника уменьшилось в 2 раза для каждого номинала, но это не страшно, поправил в коде. В общем делал так: сигнал от купюрника/монетника/хопера приходит на резистор 160 Ом далее от резистора общая точка - от нее 4к7 на +5, 0.1мкф на землю и дальше сигнал на ардуино.
Ответить
0
Иван #
А как подключить реле?
Ответить
0
Михаил #
Возникла потребность установки терминала с функциями размера (купюры от 50 до 500 рублей на монеты 10 рублей), выдачи клиентских (шипованных) карт и пополнения счёта на них. Простыми словами: человек приезжает на автомойку самообслуживания, подходит к терминалу, вставляет купюру в купюроприемник, нажимает на кнопку (получить карту, применять, либо пополнить карту (на дисплее выдается сообщение-вставить карту), операция выполнена. Теоретически для этого необходимо: купюроприемник, хопер, диспенсер карт, дисплей, плата, программа, кнопки и другие комплектующие. Какие будут у вас мысли по этому вопросу?
Ответить
0

[Автор]
victoruni #
По комплектующим - вроде все правильно, проблема может быть с диспансером карт, документации по ним наверняка маловато
Мне не приходилось с ними работать
Ответить
0
Михаил #
По поводу карт. Можно использовать бесконтактные карты. Удобно пополнять - приложил к считывателю. Получить новую карту с записанными кредитами тоже можно, есть диспенсеры карт. По бесконтактным картами делал один проект, мне понравилось
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическое сопротивление?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Arduino UNO
Arduino UNO
МиниПК MK809V - 4 ядра, Android 4.4.2 ELM327 OBD II — адаптер с поддержкой CAN
вверх