A Raspberry Pi-powered robotic bartender
Contents
- Overview
- Video Demo
- High Level System Design
- Pump Controller Circuit
- Audio Amplifier Circuit
- Power Distribution/Voltage Regulator Circuit
- LED Panel circuit
- Connector Board Circuit
- The software
- Future improvements
Overview
People ask me why I built a drink-mixing robot (aka the drinkbot).
The better question: Why wouldn’t I build one?
This project originally started as an exercise in learning about the Raspberry Pi 3 Model B Motherboard and Nodejs. I came across a similar drink-mixing project called the Bar Mixvah and was inspired to build my own with more features and a different system architecture. I borrowed the idea of using peristaltic pumps and the design for the pump control circuit, but all other components (including the nodejs code) use my own design.
This article isn’t meant be a complete tutorial on how to build one. I’ve documented just enough here to avoid forgetting too many details about it. I make no guarantees and take no responsibility for whatever happens if you try to build this yourself.
Highlights:
- The frame was built from mainly scrap aluminum. I had to machine a few of the parts.
- Some of the electronics come from old stuff pulled from a parts bin.
- Controlled by a Raspberry Pi computer.
- You select your drink from a web page.
- Supports up to six liquid ingredients, using six peristaltic pumps powered by a 12V DC motor. Ingredients can be layered or mixed.
- Avoids big messes by only pumping when a cup is present.
- It talks! It announces the drink it is making and occasionally tells jokes.
- Maintenance mode for cleaning and pump priming
- Blinky LEDs
Video Demo
High Level System Design
The hardware system consists of several circuit boards, noted below. This makes the system modular and allowed easy testing of components in isolation. The various boards all plug into a central connector board to make wiring easier. That connector board took a while to design and solder but the convenience of easy connections later made it worthwhile. Being able to use these components in other projects later is a bonus.
Pump Controller Circuit
The pump controller is essentially a motor controller circuit that supports up to six 12v motors. TIP120 transistors drive the pump motors. Perhaps I’ll try mosfets in a future version and see if there’s any performance difference.
Part | Quantity | Purpose |
---|---|---|
12V DC Peristaltic Pumps | 6 | Pumps liquid from the ingredient containers (i.e. liquor bottles) through food-safe tubing to the cup/glass. These come with some tubing but it's too small and can't be sure it's food-safe. It is replaced with the tubing mentioned below. |
Tygon B-44-3 PVC Beverage Tubing, 1/8" ID, 3/16" OD, 1/32" Wall, 25' Length, Clear | 1 | Food-safe tubing that carries liquids through the pumps. This is the only thing that comes into contact with the liquid. There should be a length of tubing for each pump, long enough to run from the bottle of the ingredient container (i.e. liquor bottle) to the cup/glass. |
2.2K Resistors (R1 - R6) | 6 | Limits current into the transistors that drive the motors |
TIP120 TO-220 Darlington Transistors (Q1 - Q6) | 6 | Switches the current to the motors on and off. |
1N4004 Diodes (D1 - D6) | 6 | Serves as flyback diodes. When the pump motors turn off, their magnetic field collapses, sending a voltage spike back through the circuit. These diodes prevent those voltage spikes from damaging the other components. |
12-pin female header (SV1) | 1 | Provides power and ground connectors for each of the 6 pump motors. |
7 pin female header (SV2) | 1 | Six pump control inputs from the Raspberry Pi via the connector board, plus the common ground connection. The schematic above doesn't show a seventh pin for the ground, but it's there. |
DC Power Barrel Jack (J1) | 1 | 12V input |
0.1uf capacitor | 6 | These are not shown on the schematic, but one is soldered across the terminals of each pump motor to reduce electrical noise. My surrounding electronics were behaving strangely while the motors were running until I added these. |
These capacitors really help reduce electrical noise. The motors are still pretty noisy.
Audio Amplifier Circuit
The Raspberry Pi’s audio output plugs into this amplifier circuit, which is based on a LM386N-1 amplifier chip. An LED flashes with the sound.
The LED, driven by a transistor, is connected in parallel to the speaker, with the audio signal entering the transistor base. This makes the LED brightness proportional to the audio signal strength. It’s sort of a like a volume unit (VU) meter with just one “unit”.
This amplifier takes 9V, so a linear voltage regulator steps down the 12V input to 9V.
Schematic:
Parts list:
Part | Quantity | Purpose |
---|---|---|
LM386N-1 (IC1) | 1 | Audio amplifier chip. Amplifies the sound from the Raspberry Pi using a single channel. |
10 uf capacitor (C2) | 1 | Sets the gain of the LM386 to the maximum, at 200 (24 dB) per the datasheet. |
220uf capacitor (C1 and C3) | 2 | Noise reduction. |
4.7uf (C4) | 1 | Bypass capacitor. |
10K Audio Potentiometer (R2) | 1 | Volume control knob. |
.05uf capacitor (C5) | 1 | |
1N415 Diode (D1) | 1 | Creates a small voltage drop that makes LED1 flashes slightly less sensitive. |
1K Resistor (R3) | 1 | Limits current into the Q1 transistor base. |
NPN2222A Transistor (Q1) | 1 | Drives and switches LED1. |
200 ohm resistor (R4) | 1 | Limits current into LED1. |
Blue LED (LED1) | 1 | Flashes with the audio signal. You can use another color if desired. |
4ohm 3W Speaker (SP1) | 1 | Speaker for the audio. |
Note: Parts IC2, C6 and C7 are actually part of the power distribution/voltage regulator circuit below so they aren’t listed in this audio amp parts list.
Power Distribution/Voltage Regulator Circuit
Warning! Electricity is dangerous! Since this circuit involves a power brick that plugs into a wall outlet, it’s the most dangerous one on this page. Do not attempt this unless you really know what you’re doing. I take no responsibility for whatever happens if you try it.
With that said…
Powering this whole thing from one power brick is more convenient than using a separate power supply for each circuit, so I added this power distribution board. This takes 12V DC as input from a 12V 6A power brick and provides the following output voltages:
- 12V for the pump controller circuit
- 9V for the audio amplifier circuit
- Regulated 5V for the Raspberry Pi
Why 12V at 6A? Each pump requires 12V (the maximum voltage requirement of all components), and the whole system draws about 2-3A when all pumps are running simultaneously (each pump draws about 300ma when running), so 6A seems to work. The Raspberry Pi gets up to 2.5A of that (provided by the 5V/2.5A buck converter) of that so there’s some extra room in that 6A for initial high load from the motor startup plus the other electronics. So far so good.
Schematic:
Parts List:
Part | Quantity | Purpose |
---|---|---|
DC 12V 6A Power Adapter | 1 | Powers the whole thing. |
DC Barrel Jack (J2) | 1 | 12v input from a power brick. |
5-pin female header (SV1) | 1 | A 5V 2.5 Pololu Buck Converter plugs into this to provide a regulated 5v output for the Raspberry Pi. |
Double-pole double-throw (DPDT) switch (S1) | 1 | Used to turn off the 12v and 9v power. Acts as sort of a "kill switch" for the pumps and audio. It doesn't turn off the Raspberry Pi, since simply killing power to it can cause data corruption. A button on a separate circuit gracefully shuts down the Raspberry Pi. |
1k 1/2 watt resistor (R1) | 1 | Limits current into the power indicator LED (LED1). |
Red LED (LED1) | 1 | Power indicator light |
L7809CV 9V voltage regulator (IC1) | 1 | Steps down the 12v input to 9v for the audio amplifier circuit. |
0.3uf capacitor (C1) | 1 | Required for the 9v output per the L7809CV datasheet. |
0.1uf capacitor (C2) | 1 | Required for the 9v output per the L7809CV datasheet. |
LED Panel Circuit
Although interaction with the drinkbot is mainly via its web page, it’s nice to have some visibility on status on the bot itself. So we have a little panel with some status LEDs:
- Green – Stays lit when ready to start pumping.
- Yellow – Blinks when a cup is missing (i.e. the cup switch is open)
- Red – Blinks when it is making a drink
- White – Blinks when in maintenance mode
There’s also a momentary pushbutton switch that gracefully shuts down the Raspberry Pi.
Schematic:
Parts List:
Part | Quantity | Purpose |
---|---|---|
Green LED (LED1) | 1 | Indicates a "ready" status when lit. |
Yellow LED (LED2) | 1 | Blinks when a cup is missing/cup switch is up. |
Red LED (LED3) | 1 | Blinks when pumping. |
White LED (LED4) | 1 | Blinks when in maintenance mode. |
330 ohm resistor (R1-R3) | 3 | Limits current into the green, yellow and red LEDs. |
1K resistor (R4) | 1 | Limits current into the white LED. This draws more current than the other colors so more resistance is needed here. |
Momentary pushbutton switch (S1) | 1 | Gracefully shuts down the Raspberry Pi. |
10K resistor (R5) | 1 | Pulldown resistor for the pushbutton switch. |
5-pin right-angle male header pins (JP1) | 1 | Connector for the LEDs. Connects to the connector board. |
2-pin right angle male header pins (JP2) | 1 | Connector for the pushbutton switch (S1). Connects to the connector board. |
Connector Board Circuit
I needed a way to connect all of the other boards to the Raspberry Pi. A connector board acting as a central hub or backplane for everything makes this much easier. I used a piece of strip board and designed it using Fritzing since it offers a strip board component.
It turned out that I needed to include some more resistors and a capacitor, and putting those on this board was easier than trying to cram them onto the other boards.
Board layout and wiring:
The strip board works well here since we can place all the connectors parallel to each other.
Parts list:
Part | Quantity | Purpose |
---|---|---|
2-pin Male Header (JP1 and JP2) | 2 | Connectors for the cup switch and shutdown button |
5-pin Male Header (JP3) | 1 | Connector for status LEDs. |
7-pin Female Header (JP4) | 1 | Connector for the pump controller board |
20-pin Female Header (JP5 and JP6) | 2 | Connectors for the Raspberry Pi's cobbler connector and ribbon cable. |
1K Resistor (R1 and R3) | 2 | Limits current into Raspberry Pi's GPIO pins from the cup detection and shutdown switches. |
10K Resistor (R2) | 1 | Pulldown resistor for the cup detection switch. |
0.1uf Capacitor (C1) | 1 | Noise reduction for the cup switch. This makes the readings of the cup switch position more reliable. |
The Software
Like the Bar Mixvah, I’m using the MEAN middleware stack, which consists of:
M – MongoDB, A database system that stores drink recipes, drink orders, and some settings.
E – ExpressJS, a web development framework for nodejs
A – AngularJS, a front-end HTML templating system for nodejs
N – Nodejs, a server-side Javascript framework.
These are installed on the Raspberry Pi, which serves the web page allowing control of the system. There are other ways to do this, but it works.
Sitting on top of all of this are two main components, written in nodejs:
- The front-end: The actual web page allowing control. Open a web browser and point to the Raspberry Pi’s IP address to get to the drinbot’s user interface.
- The back-end: Polls for requests coming in from the front-end, detects button and switch presses and controls the drinkbot’s pumps and LEDs via the Raspberry Pi’s GPIO pins.
The text-to-speech is done with pico2wave.
The code and more details can be found on the github project at https://github.com/upperboundcom/drinkbot
Future improvements
Like with any other hobby project, there’s room for improvement. For whenever I get to it:
- Add a page for managing the list of ingredients and assignments to pumps.
- Refactor the code to avoid database polling for orders (yeah, I know that’s an anti-pattern). Maybe use a queuing model with MQTT instead.
- Add a built-in LCD screen so you don’t need a separate phone or tablet, or even a Wi-Fi connection. This would mean redesigning the front panel. I have one of these Raspberry Pi 7″ Touchscreen Displays but haven’t had a chance to try it with the drinkbot yet.
- Build real enclosures for the circuit boards.
- Maybe consolidate some of the circuitry onto fewer boards, and make actual printed circuit board (PCB) layouts instead of hand-soldering the whole thing on protoboard.
- Wire the cup detection switch such that the motors don’t run unless it is pressed, instead of relying only on the software.
- Make the audio amp less electrically noisy.