Подключение купюроприемника CashCode SM к Arduino


Так сложилось, что моя основная работа связана с вендинговым оборудованием (терминалы самообслуживания, кофейники и так далее), вот и решил описать подключение купюроприемника CashCode SM к Arduino.
Технические параметры CashCode SM
► Обработка купюр: продольная
► Ширина купюр: 67-71 мм
► Вместимость кассеты: 200 / 400 / 1000 / 1500
► Скорость обработки купюры: 3 секунды
► Поддержка протоколов: Pulse / ccNet / ID003
► Напряжение питания: 12В
Общие сведения
Немного теории, для всех существующих купюропреимниках производитель выпускает прошивки, в которых защиты параметры купюр и реализована микропрограмма для передачи данных «Протокол работы». Существует разные протоколы работы, одни из популярных CCnet, MDB, ID003, ID004, Pulse, обычно производитель реализует от одного до трех (бывают и больше) протоколов работы на устройство. В этой статье, для взаимодействия буду использовать протокол «Pulse», существует два вида протокола:
Виды протокола Pulse
► последовательный — передача данных осуществляется с помощью одного вывода (пример: 10 руб — 1 импульс, 50 руб — 5 импульса и так далее);
► параллельный — передача данный осуществляется с помощью несколько выводов (пример: 10 руб — 1-й вывод, 50 руб — 2-й вывод и так далее).
Все зависит от используемого оборудования, например компания CashCode (SM, MVU) использует последовательный протокол работы, а ITL (NV9 и NV10) параллельный. Так как в качестве купюроприемника использую CashCode SM 2073, а он поддерживает протокол «Pulse» (последовательный), скетч будет написан именно для него.
Примечание: протокол работы «Pulse» унифицирован, следовательно вместо CashCode SM 2073 можно использовать например ICT A7, A7, BS7, L70 и так далее.
Кстати, позже добавлю монетоприемник EU9, он отлично подходит, запоминает 12 видов монет и есть функция суммирования, то есть может послать один импульс, при наборе заданной сумме, например: если настроили 10 руб — 1 импульс, то он может принять 5 руб + 5 руб — 1 импульс, 2 руб + 2 руб + 2 руб + 2 руб + 2 руб — 1 импульс, в общем суть поняли и он по сравнению не дорогой (по сравнению цена качество)
А как же выбрать купюроприемник?
Для сравнения, возьму два популярных моделей купюроприемников ICT V7 и CashCode SM:
ICT V7
► плюсы — дешевый, поддерживает сразу три протокола Pulse, ID004 и MDB (меняется с помощью дипов).
► минусы — обновление программы через компьютер, нужен программатор, периодически необходимо калибровка с помощью калибровочной бумаги.
CashCode SM 2073
► плюсы — прошивка через карты SmartStick, поддержка протоколов Pulse, ID003, CCNet (меняется с помощью прошивки), не надо калибровать.
► минусы — дорогой, с картой SmartStick можно прошить до 100 купюроприемников (саму карту, можно обновить только у официальных представителей в России их не более 10).
В общем, в двух словах, если в день оборот всех купюр составляет порядка 100 шт, выбирайте ICT если оборот более 100 шт, выбирайте CashCode.
Подключение купюроприемниика CashCode и Arduino
Вернемся к Arduino, как говорил ранее, в примере использую CashCode SM (прошитый под Pulse, прошивка SM-RU7620) и плату Arduino. Информация о принятых купюрах, будет отображаться на LCD дисплее и в мониторинге порта, среды разработки IDE Arduino.
Для подключения, советую использовать разъем 3х3 (MFB-3×3), для быстрой замены на другой купюроприемник.
Необходимые детали:
► Arduino UNO R3 x 1 шт.
► Провод DuPont, 2,54 мм, 20 см x 1 шт.
► Кабель USB 2.0 A-B x 1 шт.
► CashCode SM 2073 с кассетой x 1 шт.
► LCD-дисплей 1602A (2×16, 5V, Синий) x 1 шт.
► Интерфейсный модуль IIC, I2C, TWI для LCD x 1 шт.
► Блок питания DC 12В, 2А x 1 шт.
► Резистор 4кОм, 0,125Вт x 1 шт.
Подготовка
Производитель позаботился и дал возможность пользователю менять параметры, передаваемого импульса, сигнала inhibit (сигнал запрета) так далее. Для изменения параметром, необходимо изменить состояние DIP переключателя (всего их два 8 и 4), что находится на центральной плате, для работы в моем примере. необходимо установить:
SW1 — первый линейка переключателей
► 1 — ON — цена одного импульса 1 импульс — 10 руб или 1 импульс — 50 руб.
► 2 — ON — запрет 50 руб.
► 3 — ON — запрет 100 руб.
► 4 — ON — запрет 200 руб.
► 5 — ON — запрет 500 руб.
► 6 — ON — запрет 1000 руб.
► 7 — OFF — положительный или отрицательный импульс
► 8 — OFF — сигнал запрета, Inhibit можно переключить в положение ON и не подключать 3-й вывод к Arduino
SW2 — вторая линейка переключателей
► 1 — ON — запрет 2000 и 5000 руб.
► 2 — OFF — настройка импульса
► 3 — ON — включение усиленного распознавания купюр
► 4 — ON — переключение в сервисный режим
Для более подробной информации, можно скачать мануал по прошивке или посмотреть на фото ниже. Управление Inhibit реализовано в скетче (хотя можно было и не использовать), необходим он, для отключения приема купюр, например изза ошибки или кончился размен, в общем, все зависит от вас. Чтобы Inhibit работал, необходимо в разъем 2х8, установить перемычку между 3 и 4 контактом.
Подключение
Схему подключения можно посмотреть на рисунке ниже использовался разъем MFB-3×3.

Назначение выводов на купюроприемнике CashCode SM-2073

После того как вы собрали схему, необходимо залить скетч в плату Arduino UNO, LCD дисплей подключаю с помощью интерфейса I2C, для нее необходимо установить библиотеку.
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 |
/* Тестировалось на Arduino IDE 1.6.12 Дата тестирования 16.12.2016г. */ #include <Wire.h> // Подключаем библиотеку #include <LiquidCrystal_I2C.h> // Подключаем библиотеку LiquidCrystal_I2C lcd(0x27,16,2); // Задаем адрес и размер дисплея #define moneyPin 2 // Вывод Pulse #define InhiBit 3 // Вывод InhiBit (сигнал запрета) int valuePulse = 10; // Стоимость одного импульса int minWidthPulse = 40; // Минимальная ширина одного импульса int maxWidthPulse = 60; // Максимальная ширина одного импульса int debounce = 4; // Защита от помех int pulseCount = 0; // Сколько импульсов получено int receivedRUB = 0; // Сумма unsigned long pulseDuration; // Как давно был последний импульс unsigned long pulseBegin = 0; // Начало импульса unsigned long pulseEnd = 0; // Конец импульса unsigned long curtime; // Время int postPulsePause = 300; // Время ожидания, для завершения подсчета импульсов int pulseState; // Состояние входа "0" или "1" int lastState = 1; // Последние состояние входа "0" или "1" void setup() { pinMode(moneyPin, INPUT); // Установить вывод moneyPin как вход pinMode(InhiBit, OUTPUT); // Установить вывод InhiBit как выход digitalWrite(InhiBit,HIGH); // Установить на InhiBit лог "1" Serial.begin(9600); // Включаем последовательный порт, на скорости 9600 lcd.init(); // Инициализация LCD lcd.backlight(); // Включаем подсветку lcd.setCursor(0,0); // Устанавливаем курсор в начало первой строки lcd.print("NO MONEY "); // Вывести текст на LCD } void loop() { pulseState = digitalRead(moneyPin); // Считываем значение с входа moneyPin curtime = millis(); // Записываем значение миллисекунд с момента начала выполнения программы if ((pulseState == 0) && (lastState == 1)) // Ждем начало импульса, логический "0" { pulseBegin = curtime; // Записываем значение милисикунд lastState = 0; // Записываем значение "0" в переменную lastState } else if ((pulseState == 1) && (lastState == 0)) // Ждем окончания импульса, логический "1" { pulseDuration = curtime - pulseBegin; // Расчет длительности импульса в миллисекунд if (pulseDuration > debounce) // Защита от помех, если импульс был небольшой { lastState = 1; // Записываем значение "1" в переменную lastState } if ((pulseDuration > minWidthPulse) && (pulseDuration < maxWidthPulse)) // Проверяем ширину импульса { pulseEnd = curtime; // Сохранить значение милисикунд, окончания импульса pulseCount++; // Инкремент счетчика импульсов } } if ((pulseEnd > 0) && (curtime - pulseEnd > postPulsePause)) // Проверяем, поступают ли еще импульсы { receivedRUB += pulseCount * valuePulse; // Расчет суммы lcd.setCursor(0,0); // Устанавливаем курсор в начало первой строки lcd.clear(); // Очистка дисплея lcd.print("Credit: "); // Вывести текст на LCD lcd.setCursor(0,1); // Устанавливаем курсор в начало второй строки lcd.print(receivedRUB); // Вывести значение переменной на LCD lcd.print(" RUB"); // Вывести значение переменной на LCD Serial.print("Credit: "); // Вывести текст на последовательный порт Serial.print(receivedRUB); // Вывести значение переменной на пслеовательный порт Serial.println(" RUB"); // Вывести текст на последовательный порт pulseEnd = 0; // Обнуляем pulseCount = 0; // Обнуляем receivedRUB = 0; // Обнуляем } } |
Если один недостаток данного скетча, программа всегда опрашивает pin 2, чуть позже покажу пример работы MDB, для примера выложил фото с подключенным купюроприемником ICT V7, скетч не меняется
Ссылки Документация к купюроприемнику CashCode SM-2073
Документация к прошивке SM-RU7622 (страница 1, страница 2)
Библиотека LiquidCrystal_I2C
Документация к LCD1602A
Купить на Aliexpress Контроллер Arduino UNO R3 на CH340G
Контроллер Arduino UNO R3 на Atmega16U2
Провода DuPont, 2,54 мм, 20 см
LCD-дисплей 1602A
Купить в Самаре и области Контроллер Arduino UNO R3 на CH340G
Контроллер Arduino UNO R3 на Atmega16U2
Провода DuPont, 2,54 мм, 20 см
LCD-дисплей 1602A
Спасибо вам большое, всё работает! Сначала были проблемы, но резистор на 4.7кОм всё решил.
Очень рад, что пример программы помог.
Спасибо большое за пример! С нетерпением и большим интересом жду пример работы MDB.
Подскажите какой купюроприемник будет совместно работать с планшетом на Андройд? И как это можно реализовать?
Схему подключения плохо видно .__.
страшно подключать…. пойду еще уроки посмотрю. пусть полежит на полке попылиться
Можно нарисовать принципиальную схем. Так же к купюроприемника CashCode есть защита от неправильного включения питания.
Собрал работает. но… код pulseCount = 0; непонятно зачем в программе.
Это пример, стоку можно и исключить, но тогда при принятии первых 10 руб. отобразиться 10 руб., при принятии следующих 10 руб, будет уже сумма из 20 руб. и так далее.
Если скачать скетч из архива, в нем присутствует описание.
я так думаю потому что потом стоит инкремент, и както он не сможет ставить инкремент к значению null
Спасибо! Все работает отлично! Ждем пример работы MDB, было бы очень интересно и познавательно!!!
Рад что статья помогла, по MDB чуток попозже, не хватает времени.
Тоже интересно было бы почитать про MDB.
Жду его 🙂
К Raspberry pi никто не подключал CashCode sm?
К Raspberry pi подключал, но по протоколу CCNET
А можете исходниками по CCNET поделиться для Raspberry?
Аналогично, очень хотелось бы найти побольше информации по этой связке.
Спасибо за отличную статью.
С нетерпением жду статью о работе по MDB.
А куда документация по купюрнику загуляла?)
Добрый день, спасибо, поправил.
Сергей, обещали выложить пример работы с MDB, получилось? А то не получается ничего, купюрник GPT Aurora, работает только в mdb и v2.2
Добрый день, с первого раза не получилось и как то время не нашел, может в этом году найду время на протокол MDB
А если я свои наработки с кодом вам скину, может сможем вместе довести дело до конца?
Здравствуйте, думаю доведу, напишите мне на почту
К Raspberry pi подключал, но по протоколу CCNET, и матричный модуль табло, работает.
А вот к ардуино протокол CCNET пока не прикрутил.
Поделитесь?
Поделитесь знаниями!?
Автор Вы еще тут? Вопрос можно задать?
Здравствуйте, да можно задать, можете написать на мою почту
Здравствуйте, имею разукомплектованный автомат по продаже жетонов (корпус, бп, хоппер cube MK2, cashcode sm) , надеюсь вышеописанная схема поможет его вернуть к жизни. Подскажите пожалуйста как подключить к Arduino UNO R3 хоппер?
Добрый день, Максим.
Хопер MK2 не подключал к ардуино. Но если память не изменяет, при подачи питания он начинает беспрерывно выдавать монеты и при этом выдает импульс при каждой выданной монеты.
Программу можно поправить, сложного нету не чего
Здравствуйте, подскажите, пожалуйста: Cashcode SM — 2073RU1335 есть ли опыт работы? А именно как настроить Inhibit. По задумке аппарат принимает деньги только после выбора клиентом услуги.
Добрый день, Юрий.
Как понимаю 2073RU1335, это написано на бирке спереди купюроприемника? Изначально был прошить прошивкой SM-RU1335 протокол CCNet. Первым делом необходимо прошить купюроприемник под протокол PULSE и использовать inhibit как описано в статье.
Сергей, можно еще вопрос: уточнить по поводу перемычки в разъеме 2*8… В тексте написано 3 и 4, на схеме 5 и 7 контакт соединен. И на картинке даташита картинка с нумерацией это клемма или гнездо?
Опечатка, спасибо за замечание, поправлю статью. Используемый разъем 2×9. Картинка с документации, это клемма.
Все получилось! Спасибо! Действительно 3 и 4 контант согласно картинки клеммы(зеркально по горизонтали для гнезда). Большое спасибо за статью, с нетерпением ждем про MDB ;))
Здравствуйте, Сергей. А где вообще можно найти эту прошивку под протокол pulse? В моём городе нет официальных сервисов cashcode, а у человека, продавшего мне купюрник, есть карты для прошивки только под CCNet. Вроде как у него есть карты, куда можно заливать свою прошивку, но в открытом доступе именно под pulse я не нашёл
Здравствуйте, а какой у вас город?
В открытом доступе не найдете прошивку под pulse для CashCode SM, ее можно получит через специальный программатор также можно обновить прошивку на этой карте под Pulse, но через программатор.
Сергей, напишите пожалуйста свою почту.
Добрый день, info@robotchip.ru
Сергей, добрый день, тоже задам вопрос про перемычку для включения режима неприёма купюр (inhibit). Перепробовал уже все варианты, как мне кажется, установки перемычки, но купюры продолжают приниматься. Могли бы Вы пожалуйста уточнить — какие точно пины надо закоротить?
Добрый день, Антон.
1. Необходимо переключить 8-oй дип в положение OFF.
2. Установить перемычку (верно фото с купюроприемником).
3. Подключить провод Inhibit- к земле (GND)
4. Подключить провод Inhibit+ к +5В
При подачи питания, купюроприемник сделает тестирование (покрутит двигателями), затем загорится зеленая индикация, при отключении провода Inhibit+ от 5В, загорится красная индикация.
При переключенном 8-ом дипе (OFF) и не установленной перемычки купюроприемник не перейдет в режим приема (зеленая индикация), то есть не будет реагировать на подучу питания на линию Inhibit+.
При переключении дипа и установки перемычки необходимо отключать питание купюроприемника, так как все показания переключателей снимается один раз при подачи питания на купюроприемник.
Всё заработало. Спасибо!
Здравствуйте.
А можно ли в пульсовом протоколе отслеживать, если купюроприемник в ошибке? Например «зажевало» купюру.
Добрый день, Алексей.
Нет нельзя.
Здравствуйте Сергей, скажите пожалуйста, есть ли вариант подключить купюроприёмник к одноплатнику orange pi под linux? если есть, то не могли бы скинуть инструкцию, очень интересная тема
p.s. статья очень годная
Здравствуйте, Влад.
К сожалению нету
Здравствуйте, Сергей. Не совсем понял, как пин pulse подключен к порту ардуино. Там же напряжение на выходе 12 вольт
Здравствуйте, Павел.
Выход Pulse с открытым коллектором, на какое напряжение вы его подтянете такое и будет. В примере подтянули к 5В, через резистор 4.7кОм.
Спасибо, разобрался
Здравствуйте! Подскажите, пожалуйста, есть ли возможность подключения онлайн кассы на аппарат с протоколами ccnet cctalk? Никто ничего не знает и подсказать не может. Может есть какой-то решение?
Здравствуйте, знаю что есть реализация с протоколом pulse.
День добрый! Не поделитесь схемой подключения для новичка. Не понимаю как по представленным схемам подключить. пример для новичка https://ph0en1x.net/uploads/Image/news/raspberry-pi/raspberry-pi-led-key-test-application-in-fritzing.jpg.
А можно фото переключателей дип ? Что то у меня не выдает сигнал , вроде все подключил правильно , может у меня в купераприемнике не прошивка pulse , а как узнать ?
Здравствуйте, напишите на почту info@robotchip.ru.
Чтобы узнать, прошит ли купюроприемник под протокол pulse, просто подайте питание, купюропримник должен покрутит двигателями и индикация загорится зеленным.
Большое Вам спасибо за помощь новичку! Редко встретишь такую отзывчивость!
Спасибо большое!
Подскажите пожалуйста, а вы работали с данным устройством в режиме штрих-кода?
Здравствуйте,
Не работал и не знаю, работает ли..
На прктике, в 6-ти контактном разъёме питания, используются только 1й и 2й контакты для подачи питания 12V. А вот 3й и 5й для MSM и MVU купюрников не используют.
Спасибо за статью и качественный код! Много дилетантских версий в сети, но это просто бомба! Версия в MDB появилась на свет?)
Кстати, все заметили, что при режиме импульса «высокого уровня» (Credit-Pulse Normal LOW) идет недостача ровно на 1 импульс?)
В режиме Credit-Pulse Normal HIGH — все ок!
а у меня почему-то без смарт стика не работает…(( Ставлю-работает,снимаю-нет…
Подошло к ICT-P77, спасибо)
здравствуйте! интересна реализация CCNet по RS-232. скажите пожалуйста, чтоб перевести аппарат в этот режим, что нужно сделать? исходя из документации нужно чего то там подать на 3-й пин 18-пинового коннектора, верно? помогите пожалуйста! просто я не электронщик, но программист.
5000р импульсы считает 50 сек, 1000р — 10 сек.
что можно сделать, чтоб ускорить процесс?
Здравствуйте, сейчас у вас 1 руб — 1 импульс, измените на 10 руб — 1 импульс.
Так же у CashCode есть настройка 1 импульс — 10 рублей, 2 импульса — 50 рублей, 3 импульса — 100 рублей и так далее.
Сейчас 1 импульс уже равен 10руб. Для 5000р это 500 иммпульсов. Каждый импульс по 50 мс, получаем 25с. и, как я понимаю, есть пауза между импульсами те же 50мс, в итоге имеем 50 секунд на распознавание купюры 5000р.
При установке 1 импульса=50руб, получаем 10 сек на 5000 руб, что тоже не быстро.
Это один из минусов протокола Pulse, вам тогда надо переходить на другой протокол. У вас како купюроприемник cashcode, ict, itl?
cashcode 2073
В конце статьи есть документация
Откройте ее, справа вверху есть таблица 1, если в правильно выставите дипы на купюрнике, то получите 2 импульс — 50 руб, 3 импульса — 100 руб …. 6 импульсов — 5000 руб и так далее.
Здравствуйте, Сергей! Очень хорошая статья! Если мы договоримся, смогли бы написать подобный скетч для ESP8266 ну или NodeMCU с некоторыми доработками (удаленный доступ и мониторинг)?
Здравствуйте, Сергей.
А не подскажите и нам решение. У нас 300 машин с CashCode SM для Азербайджанского маната. У нас в оборот вышли новые купюры номиналом 1, 5, 20 манат. Нужна прошивка для новых купюр. А производитель отказывается поставлять, ссылаясь на то, что они остановили производство этой модели и у программистов нет времени писать для нас. Помогите решением, пожалуйста 🙏🏻 994 55 211 91 50 для экстренной связи
Здравствуйте, проблема возникла подключил все правильно пульс работает но на экране не меняется значение NO MANY все время, подскажите как проверить сигнал есть с приемника на ардуинку или софт не обрабатывает сигнал?
Здравствуйте, можно проверит помощью светодиода.
Доброго здравия! Подскажите пожалуйста как подключить в паре купюрник и монетник к ардуино ? Заранее благодарен!
Здравствуйте, можно подключить к одному выводу, только чтобы импульсы были одинаковые.