Содержание

Робот-бармен

Что это

Робот бармен смешивает напитки. Невозможно угадать и повторить каждый приготовленный коктейль — его рецепт зависит от неповторимой ауры клиента.

Видеообзор

Что понадобится

Как собрать

При помощи лазерного станка с ЧПУ изготовьте корпус из 8 мм прозрачного оргстекла по чертежам:

  1. Прикрутите мебельные ножки длиной 30 см к нижней платформе при помощи ножек с резьбой М10. Установите Iskra JS, Troyka pad, силовые ключи и повышающий DC-DC преобразователь ​на нижнюю платформу. Установите поверх Iskra JS Troyka Shield LP.
  2. Соедините электрическую часть по схеме. Мы будем подавать 5 В с Power Shield на повышаюobq преобразователь напряжения,​ чтобы получить из него 12 В для управления соленоидными клапанами TODO: картинка
  3. Установите среднюю платформу и прикрутите её с двух сторон при помощи мебельных ножек длиной 25 см, винтов и гаек М4. Сверху установите верхнюю платформу, прикрутив её болтами М10 к ножкам.
  4. Установите соленоидные клапаны на среднюю платформу при помощи винтов M4.
  5. Подключите контакты электроклапанов к выходным клеммам силовых ключей. Установите Power Shield. Соедините контакт пина A5 с контактом 3.3V через резистор с номиналом порядка одного мегаома. У нас таких не оказалось, поэтому мы сделали их из двух резисторов по 470 кОм.
  6. Присоедините провод от пина A5 к передней металлической ножке. Ко второй передней ножке присоедините провод от контакта GND. Теперь, замыкая ножки руками мы можем дать старт роботу.
  7. Просверлите отверстие в резиновой пробке, вставьте в него трубочку от тройника аквариумного компрессора и силиконовую трубку.
  8. Присоедините силиконовую трубку к спускному горлышку разделительной колбы при помощи силиконовых трубок разного диаметра и пластиковой трубки от капельницы.
  9. Воткните резиновую пробку в разделительную колбу. Повторите эту и две предыдущих операции 7 раз.
  10. Вставьте колбы в отверстия верхней платформы. Присоедините к патрубкам электроклапанов второй конец силиконовых трубок, идущих к резиновым пробкам.
  11. Установите держатель выходных трубок при помощи винтов М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;
}