Робот-бармен
- Платформы: Iskra JS
- Языки программирования: JavaScript
- Тэги: Espruino, вечеринка
Что это
Робот бармен смешивает напитки. Невозможно угадать и повторить каждый приготовленный коктейль — его рецепт зависит от неповторимой ауры клиента.
Видеообзор
Что понадобится
- 2× Болт М10×100
- 2× Болт М10×40
- 4× Гайки М10
- 14× Винты М4
- 14× Гайки М4
- 18× Винты М3
- 18× Гайки М3
- Резистор 1 МОм
- Прозрачное оргстекло, толщиной 8 мм
- Тройники аквариумного компрессора, скотч, провода, хорошее настроение
Как собрать
При помощи лазерного станка с ЧПУ изготовьте корпус из 8 мм прозрачного оргстекла по чертежам:
- Прикрутите мебельные ножки длиной 30 см к нижней платформе при помощи ножек с резьбой М10. Установите Iskra JS, Troyka pad, силовые ключи и повышающий DC-DC преобразователь на нижнюю платформу. Установите поверх Iskra JS Troyka Shield LP.
- Соедините электрическую часть по схеме. Мы будем подавать 5 В с Power Shield на повышаюobq преобразователь напряжения, чтобы получить из него 12 В для управления соленоидными клапанами TODO: картинка
- Установите среднюю платформу и прикрутите её с двух сторон при помощи мебельных ножек длиной 25 см, винтов и гаек М4. Сверху установите верхнюю платформу, прикрутив её болтами М10 к ножкам.
- Установите соленоидные клапаны на среднюю платформу при помощи винтов M4.
- Подключите контакты электроклапанов к выходным клеммам силовых ключей. Установите Power Shield. Соедините контакт пина
A5
с контактом3.3V
через резистор с номиналом порядка одного мегаома. У нас таких не оказалось, поэтому мы сделали их из двух резисторов по 470 кОм. - Присоедините провод от пина
A5
к передней металлической ножке. Ко второй передней ножке присоедините провод от контактаGND
. Теперь, замыкая ножки руками мы можем дать старт роботу. - Просверлите отверстие в резиновой пробке, вставьте в него трубочку от тройника аквариумного компрессора и силиконовую трубку.
- Присоедините силиконовую трубку к спускному горлышку разделительной колбы при помощи силиконовых трубок разного диаметра и пластиковой трубки от капельницы.
- Воткните резиновую пробку в разделительную колбу. Повторите эту и две предыдущих операции 7 раз.
- Вставьте колбы в отверстия верхней платформы. Присоедините к патрубкам электроклапанов второй конец силиконовых трубок, идущих к резиновым пробкам.
- Установите держатель выходных трубок при помощи винтов М10 и гаек. Установите выходные трубки в держатель.
Код
- barmen.js
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; }