Главная » Arduino
Призовой фонд
на май 2017 г.
1. Тестер компонентов MG328
Паяльник
2. Осциллограф DSO138
Паяльник
3. Регулируемый паяльник 60 Вт
Паяльник
4. 100 руб.
От пользователей

Вендинговый разменный автомат на 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

Raspberry Pi 2
Raspberry Pi 2
FM-модуль RDA5807M 200 Вт усилитель класса D на IRS2092
вверх