Этот пост – продолжение истории о начинке торговых автоматов простой и доступной электроникой на базе Arduino. И действительно – возможности платформы просто безграничны! И так, второй автомат – снековый автомат по продаже чипсов/воды/шоколадок/etc.
Главное – начать! Желание купить автомат появилось после доведения до ума первого автомата с кофе. Многие посетители желали что-нибудь пожевать вместе с вкусным кофе.
На просторах сети и тематических форумах проводил всё свободное время. Исходя из объявлений по продаже б/у снековых аппаратов, уже готовился копить внушительную сумму (около 100 тыс. рублей за простой аппарат).
И вот оно счастье – нашлось объявление о продаже автомата с простой начинкой (ранее продавал журналы и газеты) за 20 тыс. рублей! Слово за слово, вызвал частников для доставки по городу. 250 килограмм железа грузили втроём.
И так. Первый месяц владения аппаратом – узнается досконально его начинка, включается в сеть и тестируется. Оказывается ранее это был вполне обычный снековый автомат, только под заказ его мозги перешили под продажу по 2 товара на полку (и по 2 мотора на товар). Просто взяв и подключив дополнительные редукторы – ситуация не изменилась – мозги были перепрошиты окончательно, и продавать больше товара он не мог. Созвонившись с компанией, которая производила «апгрейд», узнал сумму приведения в порядок – порядка 10 тыс. рублей только за обновление ПО контроллера. К слову, на плате стоял чип Atmel Mega-168, что немного напоминает добрую Arduino. Но увы, чтобы перешить его самостоятельно, и тем более разобраться в работе с периферией – пришлось бы убить куда больше времени.
Сняв всю электронику с автомата, утащил её домой. Прозвонив и проверив работу редукторов, начал рисовать схему для подключения Arduino и всей периферии.
Первая тестовая сборка работала на Arduino Nano (freeduino), и вполне умела включать мотор выдачи по любому алгоритму.
Параллельно была нарисована схема расположения товаров на полках. Перерыл весь Интернет в поисках примеров, искал снековые автоматы в ТЦ города (фотографировал расположение и количество товаров на полках), и нарисовал схему для своего автомата. Получилось стандартно 4 товара на первых двух полках (широкие пачки чипсов/сухариков). Одна полка на 8 товаров (батончики, печенье). И полка для бутылок с водой (7 товаров).
Двигатель, а точнее моторчик с редуктором – включается обычной подачей питания 12В. На валу редуктора стоит микрик, который реагирует на полный оборот. На вал так же подсоединяется стальная пружина, в витки которой складывается товар. При полном обороте товар сдвигается к краю и самый первый «сникерс» падает в ящик выдачи.
Имея схему расположения товаров, удалось понять сколько моторов будут выдавать товар. 23 мотора. Была реализована схема с тремя сдвиговыми регистрами 74HC595, соединенными последовательно. Но на первом испытании, а точнее при включении автомата, регистры плясали как хотели и в итоге все двигатели крутились рандомно в течение секунды. Сейчас, посмотрев на схему реализации, вижу что упустил пин управления задвижкой – когда без этого пина выходы не реагировали на переданные данные. Но что было то было… Пришлось просто взять Arduino Mega, плюс биполярные транзисторы для управления двигателями. Получается, что задействовано 23 выхода Arduino для выдачи товаров. С одной стороны это кажется перебором, а с другой – необходимость. Возможно, в следующей версии попробую ещё раз сдвиговые регистры.
На фотографии сверху вниз: Arduino Mega в пластиковом корпусе, макетная плата с транзисторами и разъемами для подключения, макетная плата с разъемами для клавиатуры выбора товаров и дисплея.
Сначала эта задача казалась мне самой сложной. Но разобрав клавиатуру, увидел что никакого контроллера там нет и используется обычная матричная схема – колонки и строчки. Поступил простым способом – на 6 строчек подается разное питание (от 5в до 0.5, через резисторы). А с 3х колонок считывается напряжение через аналоговые входы. Итого, задействовав всего 3 входа, мы можем читать кнопки клавиатуры 6x3.
На плате были установлены четыре 8-сегментных светодиодных дисплеев, светодиодный драйвер, который работает точно так же как сдвиговый регистр. На примере работы с обычным регистром и datasheet драйвера успешно написал функцию, которая тактировала драйвер, выдавала биты по порядку. Плюс два дополнительных светодиода, которые так же включены через этот же регистр.
Каково же было моё удивление, когда этот дисплей заработал! Это не просто копирование готовой функции и запуск её на контроллере – это нечто иное. Причем светодиодный дисплей в реальности выглядит круче, чем ЖК дисплей. Во время тестов запускал на нём секундный счетчик на ночь, запускал просто бегущую сточку. Причем символы генерируются не сдвиговым регистром, а своей программой – регистру просто передаются биты, которые нужно зажечь. В программу был внесен массив всех цифр, некоторых букв (для слова Err), плюс символ внесения наличности (знак равно).
На этой фотографии видны: купюроприемник, модуль платёжек, монетоприемник с тубами для монет, денежный ящик и кучу проводов — это гиковый автомат, так положено :)
В автомате уже был купюроприемник и монетоприемник с функцией выдачи сдачи. Они работают на протоколе MDB, который достаточно сложно реализовать, хотя протокол и 1993 года. Фактически, это обычный Serial-протокол, но с некоторой оговоркой – 8 бит данных +бит четности, который указывает направление передачи, а не чётность. В библиотеке SoftwareSerial в Arduino можно было сделать логику под себя, но всплыл ещё один фактор – задержка между командой и ответом не должна превышать 5мс, иначе расценивается как timeout. Нужно было общаться с платёжками в реальном времени, и скорее всего использовать для этого прерывания.
Ночи на пролёт с отладчиком com-портов ни к чему не привели.
Но выход был найден – сторонний модуль C-MDB от наших соотечественников с Украины. Модуль просто отличный – он работает с платежками по этому протоколу и в обычном com-порту выдает нужные данные (от характеристик платёжек, до типа принимаемой монеты/купюры и состояния боксов с деньгами).
После анализа всего и вся было принято решение добавить обычный системный блок в этот автомат на базе Linux CentOS. Благо места внутри автомата под полками много, как для складирования товара, так и для системника. Какие функции возложены на этот компьютер:
Arduino по USB через стандартный выход подключено к системнику. В обычном режиме появляется com-порт, в который Arduino пишет логи и получает ответы от демона (запрос цены).
Модуль C-MDB через стандартный com-порт системника передает информацию о деньгах в демон, который уже передает только информацию о внесенных деньгах в Arduino.
Двигатели, клавиатура и дисплей подключены к Arduino и управляются только ею. К слову, сейчас неким подобием master-девайса является именно Arduino. Она принимает решение о выдаче товара, запрашивает цену у компьютера, управляет отображением на дисплее и крутит двигатели. В следующей версии хочу перевести всю логику на системный блок (к демону), а у Arduino оставить только исполнительные функции, так как порой для исправления багофичи автомата приходилось выезжать с ноутбуком. А по SSH исправить демона на PHP гораздо проще.
А веб-интерфейс просто огонь! В реальном времени видны продажи, остаток денег в боксах, информация об остатках товара после закупки, логи операций и сообщений. Хотелось там же видеть веб-камеру, но она не заводится у меня. Вдруг, кто поможет с решением: ID 0c45:608f Microdia PC Camera (SN9C103 + OV7630), при попытке сделать снимок (cat /dev/video) — kernel: usb 3-2: Initialization failed again. I will retry on next open()
Демон написан на чистом PHP, который мониторит com-порт модуля платежек и общается с ним, занося всю информацию в лог. А USB-COM-порт слушает от Arduino – записывает логи и отвечает на запрос цены. Попутно ведет учет проданного товара в MySQL, а после успешной продажи так же высылает E-mail на личный ящик (приятно пророй видеть десятки продаж в день).
В выход аудио-карты включены колонки. Хотелось записать звуковые заманухи и приставалки к людям (тихое и проходное место в организации). Плюс подключил датчик движения к Arduino, который реагирует на проход человека рядом. Задумывал включать приставалки именно по датчику движения, но пока не записал фразы. Хотя эффект видится просто потрясающий!
Что хочется сказать – Arduino это не только более простой и дешевый способ сделать мозги железной коробке, но и отличная возможность сделать это своими руками! Да, бывали детские ошибки, когда невнимательность не позволяла запустить автомат (например, просело питание и двигателю не хватало сил докрутить кока-колу), но для того и дается возможность пройти все эти испытания.
Открыв сейчас веб-интерфейс, могу сказать что за это время было 1355 продаж. Да, каюсь – и сам частенько покупаю кока-колу у себя – пускай и дороже, но зато приятней :) По суммам – автомат полностью окупил себя и всё вложенное время. И приносит только прибыль и радость!
Через 2 дня приедет установка для продажи газированных напитков (точно такая же как в барах, только без кранов). Установив её сверху на кофейный автомат, подключив управление к мозгам этого автомата – получится два спаренных автомата с единой платежкой, единым управлением и безграничными возможностями! А ещё те самые идеи, когда цену на кофе можно снижать по расписанию (например, с 09 до 11 утра), выдавать штрих-коды (собери 5 штрих-кодов и получи бесплатно любое кофе), удобный способ наливать кофе «своим» (например по таблеткам ibutton или смарт-картам), оплата по СМС и многое другое!
И напоследок хотелось бы сказать, что автоматы — это круто! Круто не только со стороны разработчика, но и пользователя — удобно и быстро! Пускай он может обмануть, но сделает это не специально (свет мигнул и всё, пропал твой кредит на экране). Автомат — это круглосуточные продажи и полное доверие ему своих денег и товара. Он не украдёт, не обсчитает своего хозяина, днём и ночью пришлет E-mail об успешной продаже или ошибке, и может угостить бесплатным напитком.
В комментариях рад был бы услышать, какие ещё функции можно добавить таким автоматам.
Главное – начать! Желание купить автомат появилось после доведения до ума первого автомата с кофе. Многие посетители желали что-нибудь пожевать вместе с вкусным кофе.
На просторах сети и тематических форумах проводил всё свободное время. Исходя из объявлений по продаже б/у снековых аппаратов, уже готовился копить внушительную сумму (около 100 тыс. рублей за простой аппарат).
И вот оно счастье – нашлось объявление о продаже автомата с простой начинкой (ранее продавал журналы и газеты) за 20 тыс. рублей! Слово за слово, вызвал частников для доставки по городу. 250 килограмм железа грузили втроём.
И так. Первый месяц владения аппаратом – узнается досконально его начинка, включается в сеть и тестируется. Оказывается ранее это был вполне обычный снековый автомат, только под заказ его мозги перешили под продажу по 2 товара на полку (и по 2 мотора на товар). Просто взяв и подключив дополнительные редукторы – ситуация не изменилась – мозги были перепрошиты окончательно, и продавать больше товара он не мог. Созвонившись с компанией, которая производила «апгрейд», узнал сумму приведения в порядок – порядка 10 тыс. рублей только за обновление ПО контроллера. К слову, на плате стоял чип Atmel Mega-168, что немного напоминает добрую Arduino. Но увы, чтобы перешить его самостоятельно, и тем более разобраться в работе с периферией – пришлось бы убить куда больше времени.
Делаем мозги автомату самостоятельно
Сняв всю электронику с автомата, утащил её домой. Прозвонив и проверив работу редукторов, начал рисовать схему для подключения Arduino и всей периферии.
Первая тестовая сборка работала на Arduino Nano (freeduino), и вполне умела включать мотор выдачи по любому алгоритму.
Параллельно была нарисована схема расположения товаров на полках. Перерыл весь Интернет в поисках примеров, искал снековые автоматы в ТЦ города (фотографировал расположение и количество товаров на полках), и нарисовал схему для своего автомата. Получилось стандартно 4 товара на первых двух полках (широкие пачки чипсов/сухариков). Одна полка на 8 товаров (батончики, печенье). И полка для бутылок с водой (7 товаров).
Первая задача – научиться включать/выключать двигатели выдачи товаров
Двигатель, а точнее моторчик с редуктором – включается обычной подачей питания 12В. На валу редуктора стоит микрик, который реагирует на полный оборот. На вал так же подсоединяется стальная пружина, в витки которой складывается товар. При полном обороте товар сдвигается к краю и самый первый «сникерс» падает в ящик выдачи.
Имея схему расположения товаров, удалось понять сколько моторов будут выдавать товар. 23 мотора. Была реализована схема с тремя сдвиговыми регистрами 74HC595, соединенными последовательно. Но на первом испытании, а точнее при включении автомата, регистры плясали как хотели и в итоге все двигатели крутились рандомно в течение секунды. Сейчас, посмотрев на схему реализации, вижу что упустил пин управления задвижкой – когда без этого пина выходы не реагировали на переданные данные. Но что было то было… Пришлось просто взять Arduino Mega, плюс биполярные транзисторы для управления двигателями. Получается, что задействовано 23 выхода Arduino для выдачи товаров. С одной стороны это кажется перебором, а с другой – необходимость. Возможно, в следующей версии попробую ещё раз сдвиговые регистры.
На фотографии сверху вниз: Arduino Mega в пластиковом корпусе, макетная плата с транзисторами и разъемами для подключения, макетная плата с разъемами для клавиатуры выбора товаров и дисплея.
Вторая задача – подключить клавиатуру
Сначала эта задача казалась мне самой сложной. Но разобрав клавиатуру, увидел что никакого контроллера там нет и используется обычная матричная схема – колонки и строчки. Поступил простым способом – на 6 строчек подается разное питание (от 5в до 0.5, через резисторы). А с 3х колонок считывается напряжение через аналоговые входы. Итого, задействовав всего 3 входа, мы можем читать кнопки клавиатуры 6x3.
Третья задача – подключить дисплей
На плате были установлены четыре 8-сегментных светодиодных дисплеев, светодиодный драйвер, который работает точно так же как сдвиговый регистр. На примере работы с обычным регистром и datasheet драйвера успешно написал функцию, которая тактировала драйвер, выдавала биты по порядку. Плюс два дополнительных светодиода, которые так же включены через этот же регистр.
Каково же было моё удивление, когда этот дисплей заработал! Это не просто копирование готовой функции и запуск её на контроллере – это нечто иное. Причем светодиодный дисплей в реальности выглядит круче, чем ЖК дисплей. Во время тестов запускал на нём секундный счетчик на ночь, запускал просто бегущую сточку. Причем символы генерируются не сдвиговым регистром, а своей программой – регистру просто передаются биты, которые нужно зажечь. В программу был внесен массив всех цифр, некоторых букв (для слова Err), плюс символ внесения наличности (знак равно).
Четвертая задача – прием денежных средств
На этой фотографии видны: купюроприемник, модуль платёжек, монетоприемник с тубами для монет, денежный ящик и кучу проводов — это гиковый автомат, так положено :)
В автомате уже был купюроприемник и монетоприемник с функцией выдачи сдачи. Они работают на протоколе MDB, который достаточно сложно реализовать, хотя протокол и 1993 года. Фактически, это обычный Serial-протокол, но с некоторой оговоркой – 8 бит данных +бит четности, который указывает направление передачи, а не чётность. В библиотеке SoftwareSerial в Arduino можно было сделать логику под себя, но всплыл ещё один фактор – задержка между командой и ответом не должна превышать 5мс, иначе расценивается как timeout. Нужно было общаться с платёжками в реальном времени, и скорее всего использовать для этого прерывания.
Ночи на пролёт с отладчиком com-портов ни к чему не привели.
Но выход был найден – сторонний модуль C-MDB от наших соотечественников с Украины. Модуль просто отличный – он работает с платежками по этому протоколу и в обычном com-порту выдает нужные данные (от характеристик платёжек, до типа принимаемой монеты/купюры и состояния боксов с деньгами).
Последняя задача – соединить всё это вместе.
После анализа всего и вся было принято решение добавить обычный системный блок в этот автомат на базе Linux CentOS. Благо места внутри автомата под полками много, как для складирования товара, так и для системника. Какие функции возложены на этот компьютер:
- веб-интерфейс логами, учетом товара, денег и закупки;
- общение с модулем платёжек (демон на PHP);
- доступ через Интернет (на месте установки есть проводной Интернет с выделенным IP, проброс порта – веб-интерфейс и ssh доступны даже с мобильника);
- веб-камера внутренностей автомата;
- аудио сопровождение и подсказки (пока в задумке как именно).
Как всё это подключено
Arduino по USB через стандартный выход подключено к системнику. В обычном режиме появляется com-порт, в который Arduino пишет логи и получает ответы от демона (запрос цены).
Модуль C-MDB через стандартный com-порт системника передает информацию о деньгах в демон, который уже передает только информацию о внесенных деньгах в Arduino.
Двигатели, клавиатура и дисплей подключены к Arduino и управляются только ею. К слову, сейчас неким подобием master-девайса является именно Arduino. Она принимает решение о выдаче товара, запрашивает цену у компьютера, управляет отображением на дисплее и крутит двигатели. В следующей версии хочу перевести всю логику на системный блок (к демону), а у Arduino оставить только исполнительные функции, так как порой для исправления багофичи автомата приходилось выезжать с ноутбуком. А по SSH исправить демона на PHP гораздо проще.
А веб-интерфейс просто огонь! В реальном времени видны продажи, остаток денег в боксах, информация об остатках товара после закупки, логи операций и сообщений. Хотелось там же видеть веб-камеру, но она не заводится у меня. Вдруг, кто поможет с решением: ID 0c45:608f Microdia PC Camera (SN9C103 + OV7630), при попытке сделать снимок (cat /dev/video) — kernel: usb 3-2: Initialization failed again. I will retry on next open()
Демон написан на чистом PHP, который мониторит com-порт модуля платежек и общается с ним, занося всю информацию в лог. А USB-COM-порт слушает от Arduino – записывает логи и отвечает на запрос цены. Попутно ведет учет проданного товара в MySQL, а после успешной продажи так же высылает E-mail на личный ящик (приятно пророй видеть десятки продаж в день).
В выход аудио-карты включены колонки. Хотелось записать звуковые заманухи и приставалки к людям (тихое и проходное место в организации). Плюс подключил датчик движения к Arduino, который реагирует на проход человека рядом. Задумывал включать приставалки именно по датчику движения, но пока не записал фразы. Хотя эффект видится просто потрясающий!
Один год работы автомата – итоги
Что хочется сказать – Arduino это не только более простой и дешевый способ сделать мозги железной коробке, но и отличная возможность сделать это своими руками! Да, бывали детские ошибки, когда невнимательность не позволяла запустить автомат (например, просело питание и двигателю не хватало сил докрутить кока-колу), но для того и дается возможность пройти все эти испытания.
Открыв сейчас веб-интерфейс, могу сказать что за это время было 1355 продаж. Да, каюсь – и сам частенько покупаю кока-колу у себя – пускай и дороже, но зато приятней :) По суммам – автомат полностью окупил себя и всё вложенное время. И приносит только прибыль и радость!
А теперь о планах!
Через 2 дня приедет установка для продажи газированных напитков (точно такая же как в барах, только без кранов). Установив её сверху на кофейный автомат, подключив управление к мозгам этого автомата – получится два спаренных автомата с единой платежкой, единым управлением и безграничными возможностями! А ещё те самые идеи, когда цену на кофе можно снижать по расписанию (например, с 09 до 11 утра), выдавать штрих-коды (собери 5 штрих-кодов и получи бесплатно любое кофе), удобный способ наливать кофе «своим» (например по таблеткам ibutton или смарт-картам), оплата по СМС и многое другое!
И напоследок хотелось бы сказать, что автоматы — это круто! Круто не только со стороны разработчика, но и пользователя — удобно и быстро! Пускай он может обмануть, но сделает это не специально (свет мигнул и всё, пропал твой кредит на экране). Автомат — это круглосуточные продажи и полное доверие ему своих денег и товара. Он не украдёт, не обсчитает своего хозяина, днём и ночью пришлет E-mail об успешной продаже или ошибке, и может угостить бесплатным напитком.
В комментариях рад был бы услышать, какие ещё функции можно добавить таким автоматам.