• Главная
  • Контакты
Подписаться:
  • Twitter
  • Facebook
  • RSS
  • VK
  • PushAll
logo

logo

  • Все
    • Положительные
    • Отрицательные
  • За сегодня
    • Положительные
    • Отрицательные
  • За вчера
    • Положительные
    • Отрицательные
  • За 3 дня
    • Положительные
    • Отрицательные
  • За неделю
    • Положительные
    • Отрицательные
  • За месяц
    • Положительные
    • Отрицательные
  • За год
    • Положительные
    • Отрицательные
  • Сортировка
    • По дате (возр)
    • По дате (убыв)
    • По рейтингу (возр)
    • По рейтингу (убыв)
    • По комментам (возр)
    • По комментам (убыв)
    • По просмотрам (возр)
    • По просмотрам (убыв)
Главная
  • Все
    • Положительные
    • Отрицательные
  • За сегодня
    • Положительные
    • Отрицательные
  • За вчера
    • Положительные
    • Отрицательные
  • За 3 дня
    • Положительные
    • Отрицательные
  • За неделю
    • Положительные
    • Отрицательные
  • За месяц
    • Положительные
    • Отрицательные
  • Главная
  • Nalivator-9000: робот-бармен на Raspberry Pi и Go

Nalivator-9000: робот-бармен на Raspberry Pi и Go +34

24.04.2017 08:27
4te 36 9100 Источник
Разработка робототехники*, Разработка для интернета вещей*, Go*


Пару лет назад я наткнулся на проект Bartendro на Kickstarter. Мне понравилась идея, и я решил, что идеальное применение для моего недавно приобретенного Raspberry Pi найдено. Я прикинул какие детали понадобятся, и приступил к DIY реализации робота-бармена. Кратко расскажу что из этого получилось.

Hardware


Основной элемент всей конструкции, конечно — насосы. В оригинальном проекте Bartendro используются перистальтические насосы собственной разработки (кстати, весь проект доступен в github).

Перистальтический насос — это такой насос который толкает по трубке её содержимое, как будто тюбик с пастой выдавливает. Соответственно, один конец опускаем в бутылку, а второй в стакан. Гифка с Википедии с принципом действия:

image

Похожие на оригинальные из Bartendro насосы есть в продаже на Aliexpress. Практика показала, что они хороши в эксплуатации, т.к. у них снимается передняя панель с трубкой — очень удобно мыть после застолья.

У Raspberry Pi на плате расположены GPIO разъемы. С помощью них посылаются или принимаются сигналы «1» или «0», 3,3В и 0В, соотвественно. В спецификации к насосу указано, что его рабочее напряжение — 12В, и «малиновых» 3.3В здесь будет мало. Поэтому для работы понадобится еще блок питания, а управлять им можно с помощью транзисторного переключателя. Итоговая схема выглядит так:

Для выбора транзистора надо чтобы напряжение коллектор-эммитер и максимальный ток коллектора у него был минимум в 1.5-2 раза выше необходимых. Я выбрал BDX33B, у него напряжение коллектор-эмиттер — 80В, а максимальный ток коллектора — 10A, что с запасом хватит для насоса со стартовым током 2А и напряжением 12В. Для того чтобы открыть транзистор, на базе надо получить не больше 2.5В. Считаем делитель в каком-нибудь онлайн-калькуляторе — получаем R1=150 Ом, R2=300 Ом.

В качестве «свистелок» я добавил три светодиода, подключенных к трем другим GPIO пинам, которые будут обозначать работающий моторчик, а также понадобятся при визуализации синтезатора речи. На выходы GPIO можно повесить максимальную нагрузку 15 мА на пин, или 50 мА суммарно. Поэтому подключаю светодиоды через резисторы по 300 Ом, ток в этом случае будет ~4 мА на пин.

Теперь можно идти в ближайший магазин радиодеталей и пробовать собирать.

Software


Raspberry Pi вообще довольно медленная штука — например, Django, на котором я изначально хотел сделать веб-приложение, запускается несколько минут. Поэтому я решил отказаться от него в пользу чего-нибудь легковесного, а именно — Go. Он быстро компилируется, кросс-компиляция под linux-arm на моем ПК занимает около 20 секунд. На выходе получаем небольшого размера бинарник, который статически собран и несет внутри все зависимости. Его можно сразу rsync-ом копировать на raspberry pi и проверять. Очень удобно для таких небольших приложений. Параметры кросс-компилияции под linux-arm выглядят так:

GOOS=linux GOARCH=arm GOARM=6 go build

У разных версий Raspberry Pi разные версии ARM. Узнать свою версию можно в /proc/cpuinfo

Так как у насосов нет никаких датчиков объема налитого, но известна пропускная способность, то объем можно контролировать через время работы насоса. Эмперическим путем я выяснил — чтобы налить 100 миллилитров, надо насос держать включенным 30 секунд. Получается нужно написать приложение, которое по команде, по очереди включает насосы на определенное время. В данной реализации подразумевается, что Наливатор умеет делать только один коктейль, то есть у него есть только одна кнопка — «Налить».

Я сделал конфиг в котором описаны подключенные насосы и коктейль, который нужно наливать.

Формат вот такой
{
  "cname": "санрайз",
  "pumps": [
    {
      "name": "Tequila",
      "pump_pin": 17,
      "led_pin": 23,
      "duration": 17
    },
    {
      "name": "Juice",
      "pump_pin": 22,
      "led_pin": 25,
      "duration": 49
    },
    {
      "name": "Grenadine",
      "pump_pin": 27,
      "led_pin": 24,
      "duration": 7
    }
  ]
}


Этот конфиг читает Наливатор при запуске, и понимает какой пин на какое время нужно включать. Для работы с GPIO я использовал библиотеку go-rpigpio:

Код наливки совсем простой
  for _, v := range CurrentPumps.Pumps {
    log.Printf("Nalivaem %s ;duration = %v; GPIO = %v", v.Name, v.Duration, v.Pump_pin)
    //pump pin open
    p, err := rpi.OpenPin(v.Pump_pin, rpi.OUT)
    if err != nil {
      panic(err)
    }
    defer p.Close()

    //led pin open
    l, l_err := rpi.OpenPin(v.Led_pin, rpi.OUT)
    if l_err != nil {
      log.Printf("LED - Can't set LED pin to output")
    }
    defer  l.Close()

    // pump on
    p.Write(rpi.HIGH)

    //led on
    l.Write(rpi.HIGH)

    time.Sleep(time.Second * time.Duration(v.Duration))

    // pump off
    p.Write(rpi.LOW)

    //led off
    l.Write(rpi.LOW)
  }
}


Весь код в гитхабе — github.com/fote/nalivator9000

Осталось добавить веб-интерфейс и все готово. Насчет корпуса я не стал заморачиваться и разместил все в икеевской коробке. В этот момент я понял, что дизайнера из меня не выйдет. В общем над внешним обликом еще стоит поработать.

Когда пришло время испытаний, я пригласил друзей провести нагрузочное тестирование, но перед их приходом понял, что веб-интерфейс это не совсем удобно — он не доступен из интернета, а подключаться к запароленной wi-fi сети, вбивать IP-адрес в браузере… слишком сложно. Тогда я добавил telegram-бота, который ждёт что ему напишут имя коктейля и наливает его. Я не буду описывать как создать бота, т.к. уже есть множество хороших статей на эту тему, в том числе и для Golang.

Также я решил добавить синтез речи, воспользовавшись Yandex SpeechKit. API этого сервиса очень прост, а лицензионное соглашение позволяет пользоваться им бесплатно в некоммерческих целях. Перед отправкой сообщения от telegram-бота, я прогоняю фразу через SpeechKit, в ответ получаю .wav-файл и воспроизвожу его через подключенный по 3.5mm-jack динамик.

Заключение


Тестирование Наливатора прошло успешно — тестировщики остались довольны и оставили много фичереквестов.

Напоследок видео работы:



За ваше здоровье!
Поделиться с друзьями
-->

Комментарии (36)


  1. Ivanii
    24.04.2017 13:07
    #10188430
    +10

    А вычислительной мощности Raspberry Pi хватило?


    1. 4te
      24.04.2017 14:38
      #10188616

      Вычислительной мощности для чего? Компиляция происходит на локальной машине, а на raspberry pi я загружаю уже скомпилированный бинарник в котором никаких вычислений нет, только включение/выключение GPIO — для этого, конечно, хватает :)


      1. AntonKop
        24.04.2017 16:11
        #10188818
        +7

        мне кажется это был сарказм…


  1. serafims
    24.04.2017 13:10
    #10188436
    +2

    Все-таки недостаточно они производительны, слишком долго наливает…


  1. fivehouse
    24.04.2017 13:22
    #10188464
    +3

    Эх научить бы его смешивать цемент с водой, полученную смесь подавать по насосам в определенное место и самомого поставить на колеса. Можно было бы дома печатать.


    1. b-s-a
      25.04.2017 21:28
      #10191032

      Это уже давно сделали.


  1. Ryppka
    24.04.2017 14:12
    #10188554
    +2

    Мне больше всего напомнило аппарат искусственного кровообращения или искусственную почку)


  1. vastzp
    24.04.2017 14:12
    #10188556
    +2

    > по очереди включает насосы на определенное время
    Почему решили включать насосы по очереди? Особенности приготовления коктейля?


    1. 4te
      24.04.2017 14:49
      #10188636

      Как уже ниже написали — да, некоторые коктейли готовятся в определенной последовательности


  1. Virviil
    24.04.2017 14:25
    #10188576
    +2

    Надо переделать конфиг на фазы.
    Потому что текилу и сок можно наливать одновременно. А вот гренадин надо заливать потом


    1. 4te
      24.04.2017 14:53
      #10188646

      Спасибо за совет. Действительно, фазы выглядят очень уместно. Кажется, это не сильно усложнит код и даст хороший прирост в скорости наливания


  1. x893
    24.04.2017 14:36
    #10188612

    Как то у меня неправильно ссылка на насос открывается за 4600 руб.
    Может такой подойдет насос?


    1. 4te
      24.04.2017 14:43
      #10188624

      Судя по описанию — питание DC 12 В. Должен подойти


      1. x893
        24.04.2017 14:55
        #10188654

        Заказал 6 таких.


        1. 4te
          24.04.2017 14:59
          #10188662

          У него 6В питание, соответственно, нужен шестивольтовый блок питания, а в остальном тоже подойдет.


          1. x893
            24.04.2017 15:04
            #10188676

            Думаю снизу под стакан поставить весы электронные (рублей за 100 на ali) и сразу можно видеть сколько налито в граммах (ну и конечно проще ESP32 отмерять будет).


        1. Kolyuchkin
          24.04.2017 15:05
          #10188682

          Готовы ждать почти 5 минут приготовления коктейля?


          1. x893
            24.04.2017 15:24
            #10188720

            Это только первый коктейль ждать надо. Потом быстрее пойдет.


            1. Kolyuchkin
              24.04.2017 15:46
              #10188768
              +1

              Я к тому, что производительность насоса предложенного автором 1000мл/мин, вашего же — 20-60мл/мин — разница больше, чем на порядок.


              1. x893
                24.04.2017 15:58
                #10188790

                Ну это не проблема. Шесть штук будут наливать 120-360 мл. Уже достаточно.
                Кто то ставит за 4600, кто за 350.
                Jedem das Seine


    1. TeosHM
      24.04.2017 17:34
      #10188954

      Производительность этого насоса примерно 60мл\мин. Для приготовления коктейлей этого очень мало.


      1. x893
        24.04.2017 17:41
        #10188970

        Смотря что пить. Для Б52 само то будет.


  1. BubaVV
    24.04.2017 15:10
    #10188688
    +5

    Как-то стремно подключен насос. Нужен встречный диод параллельно мотору. Ток GPIO с учетом коеэффициента усиления даст примерно 1.5А на коллекторе — для этого насоса впритык. Я бы поставил полевик


  1. safari2012
    24.04.2017 17:12
    #10188928
    +1

    У меня похожая система подает в аквариум удобрения. Только вместо транзисторного переключателя я поставил блок из 4х ардуинских синих релюшек, они со светодиодами и с опторазвязкой.


  1. Apokalepsis
    24.04.2017 17:34
    #10188952

    Если предположить что за вечер нужны сделать 7 разных коктейлей, как бороться с очисткой трубок? После каждого приготовления коктейля снимать и чистить?


    1. 4te
      24.04.2017 17:42
      #10188972

      В данной реализации — никак. Нужно «горизонтально маштабировать». Ставить 7 насосов, ну или 5, например, у каждого свой напиток, из них наливать разные коктейли. У меня насоса всего 3, с ними особо не разгуляешься в плане разных коктейлей


      1. Vladal
        25.04.2017 21:29
        #10191036

        В игре Сибирь (Syberia) есть интересный пример горизонтального масштабирования автоматона для коктейлей. Правда, виртуальный с механическим управлением.


  1. TeosHM
    24.04.2017 17:36
    #10188960

    Делал подобный аппарат, но на основе проекта BarMixVah, используя связку RPI2+arduino UNO. Реализация этого проекта очень понравилась, за счет удобного и понятного WEB-интерфейса. Хотел отказаться от ардуинки, получая команду напрямую с GPIO, но т.к. насосы новые не удалось купить, идея заглохла.
    ПРобовал на 12в насосах с али по 300р\штука, но при заявленных 100мл\мин они выдают по факту 50-60мл.
    Хотел собрать на насосах как у автора, но встала проблема с доставкой — связывался с поставщиком — они готовы отправлять насосы только ЕМС доставкой, которая дороже самого насоса :(
    Может подскажете, как и где их купить, без такой доставки лютой?


    1. 4te
      24.04.2017 19:02
      #10189064

      Дело в том, что я покупал насосы некоторое время назад — доставка тогда была гораздо дешевле. Может есть в каких нибудь схожих магазинах типа DX. BarMixVah кажется на таких насосах работает.


  1. olekl
    24.04.2017 18:50
    #10189044

    Сразу же напрашивается улучшение — подключаем все напитки, какие есть, вносим в конфиг «номер насоса — напиток», и получаем меню доступных коктейлей в зависимости от подключенных напитков. Моторчиков надо будет побольше, да :)


  1. vagran
    24.04.2017 22:42
    #10189370
    +1

    Забавный расчёт транзисторного каскада. Биполярный транзистор в таком включении не напряжением, а током управляется. Никакого делителя там не надо. Просто прикинуть нужный базовый ток, чтоб он вошёл в насыщение с некоторым запасом, и поставить один соответствующий резистор. Ну и защитный диод обязателен параллельно мотору.


  1. RazorRunner
    24.04.2017 22:54
    #10189382
    +1

    А если вытеснять жидкость из бутылок сжатым воздухом, а подачу контролировать клапанами? Это и тише и быстрее будет, имхо. Аквариумный компресор (один на все бутылки) + клапаны на выпуск + весы для контроля налитого.


  1. Vasyutka
    24.04.2017 23:28
    #10189402
    +1

    Ну, такое уже когда-то было на хабре: https://geektimes.ru/post/257270/ :)


    1. Vasyutka
      24.04.2017 23:31
      #10189410

      но в любом случае, всегда + :)


  1. ivblagovestny
    28.04.2017 22:57
    #10196862

    а как работает связь малинки с ботом?


    1. 4te
      28.04.2017 22:57
      #10196864

      он работает на самом raspberry pi через telegram api

МЕТКИ

  • Хабы
  • Теги

Разработка робототехники

Разработка для интернета вещей

Go

raspberry pi

gpio

go

golang

СЕРВИСЫ
  • logo

    CloudLogs.ru - Облачное логирование

    • Храните логи вашего сервиса или приложения в облаке. Удобно просматривайте и анализируйте их.
Все публикации автора
  • Nalivator-9000: робот-бармен на Raspberry Pi и Go +34

    • 24.04.2017 08:27

Подписка


ЛУЧШЕЕ

  • Сегодня
  • Вчера
  • Позавчера
05:16

Win32 API и ностальгия по окнам странной формы +115

08:00

Ремонт блока питания с Power Delivery. 470 граммов электроники +84

12:07

Как ИИ-агенты стали новым оружием скамеров на Хабр Карьере +33

09:01

Готовимся к отключению. Эффективные форматы для упаковки и раздачи HTML-страниц +32

07:05

Механический калькулятор. Как работает арифмометр? +25

12:00

Linux 7.0 и что изменилось в ядре после очередного цикла разработки +22

08:00

Программирование с AI-ассистентом — похороните меня под плинтусом +22

13:01

Электроинструмент становится хуже, и это делается намеренно +21

04:59

Замедление Телеграма замедлилось, а также законопроект об уголовной ответственности за крипту в РФ +20

07:21

«Великое очищение» в работе с контентом: что осталось от роли редактора +17

08:30

Что такое «мышечная память» и можно ли её развить? +14

01:54

Нейропластичность для разработчика — как учиться эффективнее +14

07:00

Не просто OpenBMC: как мы сделали свой BMC +13

11:35

Vibe++ очень простой язык для промпт-программистов. А почему бы и не да? +10

08:12

Легенды 90-х — кто придумал и производил жвачки Turbo, Love is… и TipiTip +10

09:30

ИИ-агенты в ИБ: путь к доверенному члену команды +9

09:11

Кастомная клавиатура в 2026: как спустить премию на кейкапы с жабами и не пожалеть +9

11:57

Усовершенствованная электронная подпись: как сохранить юридическую значимость сейчас и через 50 лет +8

09:25

ИИ существовал до компьютеров: Крышесносные примеры +8

09:05

Объяснение лямбда исчисления через Python +8

00:53

DIY: Экранчик для «умного дома» +70

08:00

Код Apollo 11 выглядит лучше современного софта. Похоже, мы где-то свернули не туда +53

09:01

Я установил все расширения Firefox +52

19:30

Умный подоконник: как ESP32 спас мой домашний огород (и что я узнал про «невидимые» пины) +43

13:01

«Управляя Солнцем»: умопомрачительная физика и смелые задачи звёздных машин +42

11:05

«Фабрика монстров» Джорджа Лукаса: как в «Звездных войнах» создавали инопланетян без компьютерной графики +35

14:05

Китайский шедевр сумрачного гения из 2000-х +29

13:59

Как ИИ-подхалимы затягивают в ИИ-психоз, или К чему приводит токсичное поддакивание +29

15:04

13 предпринимательских уроков из советской сатиры, которую вы читали не так +20

17:15

Cказ о том, как мы с Oracle на PostgreSQL переехали +16

13:46

ICMP-туннель на уровне ядра Linux: передаём TCP/UDP-трафик через эхо-запросы +15

07:39

4 привычки, которые, как кажется, двигают вашу карьеру (но на самом деле ей вредят) +15

16:05

Меньше слов, больше кода? Как опенсорс в Китае развивали — компании-инноваторы, евангелисты и выход на Гитхаб +14

11:24

Почему LLM Wiki Карпатого не стоит внедрять для личной базы знаний +14

15:45

Как я изобрёл велосипед: создание языка программирования с нуля ради одной игры и Telegram-бота +12

10:15

Приватная Cвязь на Go и Flutter +9

17:23

Сказать или не сказать — вот в чём вопрос? +8

17:23

OpenAI выкупила Sky – теперь в Codex лучшая система управления компьютером, которую я видел +8

14:00

Экс-налоговый инспектор отвечает на вопросы про проверки физических лиц +8

13:47

Контейнеры вместо серверов: Как устроена система обмена данными, которую нельзя заблокировать и подделать +8

01:12

Мыслепреступление на Android: как скрыть Перехватчик трафика от Государственных приложений +165

09:01

Юбилей легенды +88

19:15

Почему JS/TS — не функциональный язык (и почему это важно понимать) +55

13:01

Почему не взлетели дирижабли? Часть 18: «Осоавиахим репортинг!» +50

02:45

Как мы продавали компьютеры в 90-х. Шоу в нужную сторону +48

08:01

Благородные рыцари в космосе. Вспоминаем сериал «Светлячок» +37

11:58

NaïveProxy в sing-box (альтернатива VLESS) +36

14:17

Теневой рынок GitHub звезд +34

17:18

Как я стал учителем за 5 минут: BAC в электронном дневнике +29

13:26

Как я тестировал локально новый Qwen 3.6 и Gemma 4 +25

17:15

ИИ стирает рабочие места. Но кто тогда будет покупать? +24

13:38

WebFlux vs Virtual Threads: что происходит при 2000 RPS +24

18:39

Пост через 100 лет: как американцы возвращались к Луне и по дороге построили канцелярию +22

12:00

Пять мини-ПК середины весны: от производительных систем с водянкой до офисного «железа» +21

20:15

Я хотел починить стиральную машину. В итоге пришлось проектировать свой разделительный трансформатор +18

08:00

Нет, ИИ вас не заменит. Вас заменит человек, работающий с ним +17

23:32

Гармония чисел: как математика настроила музыку +15

20:45

Как я за 9 месяцев сделал свой видеосервис: сначала потому что надо было, а потом потому что понравилось +15

16:58

Clean Architecture + DDD в Go: как не превратить проект в 200 файлов ни о чём +15

09:39

Ловушка «Пари Паскаля»: как страх перед будущим ИИ отвлекает нас от проблем в настоящем +15

ОБСУЖДАЕМОЕ

  • ИИ стирает рабочие места. Но кто тогда будет покупать? +24

    • 254   18000

    Win32 API и ностальгия по окнам странной формы +115

    • 216   18000

    Я хотел починить стиральную машину. В итоге пришлось проектировать свой разделительный трансформатор +18

    • 142   17000

    Мыслепреступление на Android: как скрыть Перехватчик трафика от Государственных приложений +165

    • 135   87000

    Как я тестировал локально новый Qwen 3.6 и Gemma 4 +25

    • 76   16000

    Clean Architecture + DDD в Go: как не превратить проект в 200 файлов ни о чём +15

    • 50   9600

    Ответ Джеймса Линдси на слова Маска о безусловном доходе +6

    • 47   9000

    Почему JS/TS — не функциональный язык (и почему это важно понимать) +55

    • 42   18000

    NaïveProxy в sing-box (альтернатива VLESS) +36

    • 42   24000

    Умный подоконник: как ESP32 спас мой домашний огород (и что я узнал про «невидимые» пины) +43

    • 40   20000

    Пост через 100 лет: как американцы возвращались к Луне и по дороге построили канцелярию +22

    • 38   16000

    Теневой рынок GitHub звезд +34

    • 36   14000

    13 предпринимательских уроков из советской сатиры, которую вы читали не так +20

    • 31   12000

    Как ИИ-подхалимы затягивают в ИИ-психоз, или К чему приводит токсичное поддакивание +29

    • 31   11000

    Код Apollo 11 выглядит лучше современного софта. Похоже, мы где-то свернули не туда +53

    • 29   15000
  • Главная
  • Контакты
© 2026. Все публикации принадлежат авторам.