====== Робот-бармен ====== {{ :projects:barmen:barmen-overview.jpg?nolink |}} * Платформы: Iskra JS * Языки программирования: JavaScript * Тэги: Espruino, вечеринка ===== Что это ===== Робот бармен смешивает напитки. Невозможно угадать и повторить каждый приготовленный коктейль — его рецепт зависит от неповторимой ауры клиента. ===== Видеообзор ===== {{youtube>63mqogRxddI?large}} ===== Что понадобится ===== * [[amp>product/iskra-js?utm_source=proj&utm_campaign=barmen&utm_medium=wiki | Iskra JS]] * [[amp>product/arduino-power-shield-li-ion?utm_source=proj&utm_campaign=barmen&utm_medium=wiki | Power Shield (Li-Ion, 2000 мА·ч)]] * [[amp>product/arduino-troyka-shield-lp?utm_source=proj&utm_campaign=barmen&utm_medium=wiki | Troyka Shield LP]] * 7× [[amp>product/troyka-mosfet-n-channel-v3?utm_source=proj&utm_campaign=barmen&utm_medium=wiki | Силовой ключ (Troyka-модуль)]] * [[amp>product/troyka-dc-dc-booster?utm_source=proj&utm_campaign=barmen&utm_medium=wiki | Повышающий стабилизатор напряжения (Troyka-модуль)]] * [[amp>product/troyka-pad-1x4?utm_source=proj&utm_campaign=barmen&utm_medium=wiki | Troyka Pad 1×4 (Troyka-модуль)]] * 7× [[amp>product/solenoid-valve-normally-closed?utm_source=proj&utm_campaign=barmen&utm_medium=wiki | Нормально закрытый соленоидный клапан]] * [[http://www.labteh.com/productID1663/ | Трубка силиконовая 6 мм]] * 7× [[http://www.labteh.com/productID18750/| Делительная воронка (500 мл)]] * 3× [[https://leroymerlin.ru/product/nozhka-kruglaya-300h30-mm-cvet-hrom-13761888/ | Мебельная ножка 30 см]] * 3× [[https://leroymerlin.ru/product/nozhka-kruglaya-30h250-mm-cvet-hrom-15615577/ | Мебельная ножка 25 см]] * 3× [[https://leroymerlin.ru/product/nozhka-s-rezboy-160-mm-cvet-hrom-15002324/ | Ножка с резьбой М10]] * 7× [[https://www.piluli.ru/product278448/product_info.html | Система для переливания инфузионных растворов]] * 7× [[http://www.labteh.com/productID1639/ | Пробка резиновая 24 мм]] * 2× [[https://leroymerlin.ru/product/gayka-kolpachkovaya-din-1587-m10-10963708/ | Гайка колпачковая М10]] * 2× Болт М10×100 * 2× Болт М10×40 * 4× Гайки М10 * 14× Винты М4 * 14× Гайки М4 * 18× Винты М3 * 18× Гайки М3 * Резистор 1 МОм * Прозрачное оргстекло, толщиной 8 мм * Тройники аквариумного компрессора, скотч, провода, хорошее настроение ===== Как собрать ===== При помощи лазерного станка с ЧПУ изготовьте корпус из 8 мм прозрачного оргстекла по чертежам: {{ :projects:barmen:barmen-wiki.png?nolink |}} * {{:projects:barmen:barmen-wiki.dxf| Исходник для редактирования (DXF)}} * {{:projects:barmen:barmen-wiki.pdf| Чертёж для изготовления (PDF)}} - Прикрутите мебельные ножки длиной 30 см к нижней платформе при помощи ножек с резьбой М10. Установите Iskra JS, Troyka pad, силовые ключи и повышающий DC-DC преобразователь ​на нижнюю платформу. Установите поверх Iskra JS Troyka Shield LP.{{ :projects:barmen:bottom.jpg?nolink |}} - Соедините электрическую часть по схеме. Мы будем подавать 5 В с Power Shield на повышаюobq преобразователь напряжения,​ чтобы получить из него 12 В для управления соленоидными клапанами TODO: картинка - Установите среднюю платформу и прикрутите её с двух сторон при помощи мебельных ножек длиной 25 см, винтов и гаек М4. Сверху установите верхнюю платформу, прикрутив её болтами М10 к ножкам.{{ :projects:barmen:middle-low.jpg?nolink |}}{{ :projects:barmen:middle-high.jpg?nolink |}} - Установите соленоидные клапаны на среднюю платформу при помощи винтов M4.{{ :projects:barmen:170809_lin_1769.jpg?nolink |}} - Подключите контакты электроклапанов к выходным клеммам силовых ключей. Установите Power Shield. Соедините контакт пина ''A5'' с контактом ''3.3V'' через резистор с номиналом порядка одного мегаома. У нас таких не оказалось, поэтому мы сделали их из двух резисторов по 470 кОм. {{ :projects:barmen:170809_lin_1778.jpg?nolink |}} {{ :projects:barmen:170809_lin_1776.jpg?nolink |}} - Присоедините провод от пина ''A5'' к передней металлической ножке. Ко второй передней ножке присоедините провод от контакта ''GND''. Теперь, замыкая ножки руками мы можем дать старт роботу. {{ :projects:barmen:170809_lin_1775.jpg?nolink |}} {{ :projects:barmen:170809_lin_1774.jpg?nolink |}} - Просверлите отверстие в резиновой пробке, вставьте в него трубочку от тройника аквариумного компрессора и силиконовую трубку. {{ :projects:barmen:170809_lin_1765.jpg?nolink |}} - Присоедините силиконовую трубку к спускному горлышку разделительной колбы при помощи силиконовых трубок разного диаметра и пластиковой трубки от капельницы. {{ :projects:barmen:170809_lin_1762.jpg?nolink |}} - Воткните резиновую пробку в разделительную колбу. Повторите эту и две предыдущих операции 7 раз. {{ :projects:barmen:170809_lin_1760.jpg?nolink |}} - Вставьте колбы в отверстия верхней платформы. Присоедините к патрубкам электроклапанов второй конец силиконовых трубок, идущих к резиновым пробкам.{{ :projects:barmen:170809_lin_1757.jpg?nolink |}} - Установите держатель выходных трубок при помощи винтов М10 и гаек. Установите выходные трубки в держатель. {{ :projects:barmen:170809_lin_1771.jpg?nolink |}} {{ :projects:barmen:170809_lin_1773.jpg?nolink |}} ===== Код ===== var bottles = [P2, P3, P4, P5, P6, P7, P8]; var friendPin = A5; var holdPeriod = 500; // ms, требуемое время удержания рук var thres = 0.6; // если напряжение меньше, значит кто-то держится за ножки var friendPeriod = 0; // ms, сколько друзья уже держатся var pingPeriod = 50; // ms var isShaking = false; var start = true; var pitch = 500; // время открытия клапана для единичного объёма var shortValue = 5000; // суммарное время открытия на стакан setInterval(function() { if (analogRead(friendPin) < thres) { friendPeriod += pingPeriod; } else { friendPeriod = 0; start = true; } if (friendPeriod >= holdPeriod) { if ((!isShaking) && start) { shake(); start = false; } } }, pingPeriod); function shake() { isShaking = true; // сколько бутылок участвует var bottlesInRound = Math.floor(Math.random() * bottles.length) + 1; if (bottlesInRound == 1) { bottlesInRound = 2; } // print('bottlesInRound:', bottlesInRound); // какие бутылки участвуют? var usingBottles = shuffleArray(bottles); // print(usingBottles); // в цикле окрываем клапаны пока не заполним стакан for (var i = 0; i < shortValue; i += pitch) { // выбираем клапан var bottle = Math.floor(Math.random() * bottlesInRound); // печатаем какая бутылка наливается // print('bottle', usingBottles[bottle]); // высокий импульс digitalPulse(usingBottles[bottle], 1, pitch); // остановка до завершения импульса digitalPulse(usingBottles[bottle], 1, 0); // print('stop'); } isShaking = false; } function bottleOff(bottle) { setTimeout(function(){ digitalWrite(bottle, false); },pitch); } function shuffleArray(array) { for (var i = array.length - 1; i > 0; i--) { var j = Math.floor(Math.random() * (i + 1)); var temp = array[i]; array[i] = array[j]; array[j] = temp; } return array; }