Самодельный вендинг-автомат с приемником монет: детали и сборка
Компоненты и материалы
| Фанера 1/4″ (FriendlyARM) — вырезать по чертежам | ×4 |
| Брусок фанеры 3/4″ — полоски 3/4″ шириной, длина по схеме | ×1 |
| Набор 5 шаговых двигателей 28BYJ-48 + драйверы ULN2003 (LAFVIN) | ×1 |
| Шлейф IDC 1.27mm (50P, 10ft) — для чистой проводки | ×1 |
| Набор разъемов Dupont 635 шт. (Male/Female, 40 pin) | ×1 |
| Подсвечиваемые микрокнопки (Gamelec) | ×1 |
| Макетная плата (или паяльные платы) | ×1 |
| Двухсторонние PCB платы (30 шт.) — 1-2 штуки понадобятся | ×1 |
| Arduino Mega 2560 | ×1 |
| Релейный модуль 5V (Tolako) для Arduino — защита двигателей от перегрева | ×1 |
| LCD 1602 с I2C (HiLetgo, 2 шт.) | ×1 |
| LED-лента (опционально) | ×2 |
| Провод медный 8 AWG (50 ft) — для изготовления катушек | ×1 |
| Металлический разделитель полки | ×1 |
Инструменты
- Циркулярная/столовая пила (или заказ резки фанеры)
- Паяльник
- Клеевой пистолет (и клейкие стержни)
Приложения и сервисы
- Arduino IDE
О проекте
Персональный вендинг-автомат
Пошаговая сборка личного вендинг-автомата. Можно заполнить любимыми снеками или поставить в офис для угощения коллег. Изучите и делитесь мнением!

Сборка корпуса
Размеры коробка: 21″Ш × 18″Г × 24 1/4″В (внешние).
- 2 боковые стенки: 18″Г × 23 3/4″В
- Крышка и дно: 21″Ш × 18″Г
- Передняя и задняя стенки: 21″Ш × 24 1/4″В
- Перегородка: 18″Г × 23 3/4″В
- Внутренние полки (2 шт.): 13″Ш × 12″Г
- Расстояние между полками: 8″, ширина 13″, глубина 12″
- Каждый синий блок на схемах — это монтажный брусок 3/4″×3/4″, глубиной как панель.


Соберите коробок, используя бруски 3/4″ в каждой точке стыковки. Боковые стенки стоят на дне и под крышкой. Периметр должен быть 21″Ш × 24 1/4″В.

Перегородку настраивайте перед установкой: от верха отмерьте 16 1/4″ — крепите брусок для нижней полки; еще 8 1/4″ вниз — для верхней полки. То же на левой стенке (видом спереди). Важно: сначала установите нижнюю полку, иначе закрепить её будет трудно.

Установите полки (13″×12″) на бруски — это автоматически задаст положение перегородки. Закрепите бруски сверху и снизу справа от перегородки, затем прикрепите её к верху и низу. Конструкция станет жесткой.

Установите заднюю стенку и готовьте отверстия под моторы. Распечатайте колеса для катушек, измерьте их и просверлите отверстия. Отметьте середину полки (6 1/2″ от левой стенки), затем центр каждой секции (3 1/4″). Используйте измеренную высоту колеса + 1/4″ для отверстий под валы. Закрепите моторы.

Настройка релейного модуля
Используйте драйвер L293D (ключ слева) для управления реле, подающим питание на моторы.
Подключение L293D (слева направо):
- Pin 1 → пин 10 контроллера
- Pin 2 → пин 9 контроллера
- Pin 3 → «+» реле (левый контакт из трёх, глядя на реле)
- Pin 4 → GND 12V на макетке
- Pin 5 — не используется
- Pin 6 → «-» реле (правый контакт из трёх)
- Pin 7 → пин 8 контроллера
- Pin 8 → +12V на макетке
Средний контакт реле → +12V на макетке.
Задний правый контакт реле → «+» к драйверам моторов.

Установка экрана и кнопок
Экран — справа спереди. Вырезь под дисплей: 2.53937″ × 0.5708661″.
4 кнопки — справа. Отверстия 1.10236″ (под конкретные кнопки). Лучше просверлить меньше и довести наждачной бумагой.


Все соединения должны в точности соответствовать схеме. Встроенные в кнопки светодиоды на схеме показаны отдельно для наглядности.
Подключите каждый мотор к его драйверу, затем драйверы к контроллеру:
Моторы (пины IN1-IN4 драйверов):
- Мотор 1 (синий): пины 22, 24, 26, 28
- Мотор 2 (желтый): пины 23, 25, 27, 29
- Мотор 3 (зеленый): пины 30, 32, 34, 36
- Мотор 4 (красный): пины 31, 33, 35, 37
Кнопки (аналоговые входы с подтяжкой 220 Ом к GND):
- Кнопка 1: 5V → кнопка → A0 + 220Ω → GND
- Кнопка 2: 5V → кнопка → A1 + 220Ω → GND
- Кнопка 3: 5V → кнопка → A2 + 220Ω → GND
- Кнопка 4: 5V → кнопка → A3 + 220Ω → GND

LCD-экран (I2C)

- Питание и GND — от 5V шины макетки.
- Pin 1 (GND) → GND
- Pin 2 (VCC) → 5V
- Pin 3 (V0) → средний вывод подстроечного резистора (крайние: GND и 5V) — настройка контраста
- Pin 4 (RS) → D2
- Pin 5 (RW) → GND
- Pin 6 (EN) → D3
- Pin 7-10 — не используются
- Pin 11 (D4) → D4
- Pin 12 (D5) → D5
- Pin 13 (D6) → D6
- Pin 14 (D7) → D7
- Pin 15 (A) → 5V (подсветка)
- Pin 16 (K) → GND

Блок питания ATX

Обрежьте только нужные провода. Остальные оставьте в разъеме для других проектов.
ATX пины:
- GND (черный, пин 3) + PS_ON (зеленый, пин 16) → к выключателю включения автомата.
- GND (черный, пин 7) + +12V (желтый, пин 10) → к 12V шине макетки (желтые/черные соединения).
- GND (черный, пин 24) + +12V (желтый, пин 11) → к разъему питания Arduino (Jack).
- GND (черный, пин 19) + +5V (красный, пин 21) → к 5V шине макетки.

Разделители полок и катушки
Разделители: В середине полки (6 1/2″) установите металлическую пластинку, согнутую в виде «^» (треугольник). Центрируйте над отметкой. Закрепите горячим клеем. Боковые направляющие — опционально.
Катушки: Найдите трубу диаметром 1 1/2″ (труба, баллончик, банка). Намотайте резиновую ленту по спирали, нанесите параллельные линии. На одной стороне отметьте 1″, потом каждые 2″. На другой — только каждые 2″. Навивайте провод, начиная с 1″ отметки, попадая в каждую линию на обеих сторонах — получится шаг 2″ между витками. Для конфет уменьшите шаг вдвое.
Наконец катушки надевайте на 3D-печатные колеса: сожмите катушку в кольцо, немного уменьшите диаметр, надежьте на колесо, зафиксируйте каплей горячего клея.
LED-подсветка

«+» ленты → +12V на 12V шине макетки. «-» ленты → GND на 12V шине (не на схеме).
Задавайте вопросы — я обновлю инструкцию, чтобы проект стал максимально понятным!
Код
1. Вендинг-автомат БЕЗ смены цветов LED (Arduino)
#include <LiquidCrystal.h>
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
#include <Stepper.h>
#define ENABLE 10
#define DIRA 8
#define DIRB 9
int i;
int stepsPerRevolution = 2048;
const int button1Pin = A0;
const int button2Pin = A1;
const int button3Pin = A2;
const int button4Pin = A3;
Stepper myStepper0(stepsPerRevolution, 22, 26, 24, 28);
Stepper myStepper1(stepsPerRevolution, 23, 27, 25, 29);
Stepper myStepper2(stepsPerRevolution, 30, 34, 32, 36);
Stepper myStepper3(stepsPerRevolution, 31, 35, 33, 37);
void setup() {
pinMode(button1Pin, INPUT);
pinMode(button2Pin, INPUT);
pinMode(button3Pin, INPUT);
pinMode(button4Pin, INPUT);
pinMode(ENABLE, OUTPUT);
pinMode(DIRA, OUTPUT);
pinMode(DIRB, OUTPUT);
myStepper0.setSpeed(15);
myStepper1.setSpeed(15);
myStepper2.setSpeed(15);
myStepper3.setSpeed(15);
lcd.begin(16, 2);
lcd.clear();
lcd.setCursor(0, 0); lcd.print("Select your item");
lcd.setCursor(0, 1); lcd.print(" #1 #2 #3 #4");
}
void loop() {
int b1 = digitalRead(button1Pin);
int b2 = digitalRead(button2Pin);
int b3 = digitalRead(button3Pin);
int b4 = digitalRead(button4Pin);
digitalWrite(ENABLE, HIGH);
for (i=0; i<5; i++);
if ((b1 == LOW) && !(b2 == LOW)) {
digitalWrite(DIRA, HIGH); digitalWrite(DIRB, LOW);
lcd.clear(); lcd.setCursor(2,0); lcd.print("Dispensing");
lcd.setCursor(3,1); lcd.print("Your Item");
myStepper0.step(stepsPerRevolution);
lcd.clear(); lcd.setCursor(2,0); lcd.print("Please take");
lcd.setCursor(3,1); lcd.print("Your Item");
delay(2500);
lcd.setCursor(0,0); lcd.print("Button State 1");
lcd.setCursor(2,1); lcd.print("1 2 3 or 4");
digitalWrite(DIRA, LOW); digitalWrite(DIRB, LOW);
}
if ((b2 == LOW) && !(b1 == LOW)) {
digitalWrite(DIRA, HIGH); digitalWrite(DIRB, LOW);
lcd.clear(); lcd.setCursor(2,0); lcd.print("Dispensing");
lcd.setCursor(3,1); lcd.print("Your Item");
myStepper1.step(stepsPerRevolution);
lcd.clear(); lcd.setCursor(2,0); lcd.print("Please take");
lcd.setCursor(3,1); lcd.print("Your Item");
delay(2500);
lcd.setCursor(0,0); lcd.print("Button State 2");
lcd.setCursor(2,1); lcd.print("1 2 3 or 4");
digitalWrite(DIRA, LOW); digitalWrite(DIRB, LOW);
}
if ((b3 == LOW) && !(b4 == LOW)) {
digitalWrite(DIRA, HIGH); digitalWrite(DIRB, LOW);
lcd.clear(); lcd.setCursor(2,0); lcd.print("Dispensing");
lcd.setCursor(3,1); lcd.print("Your Item");
myStepper2.step(stepsPerRevolution);
lcd.clear(); lcd.setCursor(2,0); lcd.print("Please take");
lcd.setCursor(3,1); lcd.print("Your Item");
delay(2500);
lcd.setCursor(0,0); lcd.print("Button State 3");
lcd.setCursor(2,1); lcd.print("1 2 3 or 4");
digitalWrite(DIRA, LOW); digitalWrite(DIRB, LOW);
}
if ((b4 == LOW) && !(b3 == LOW)) {
digitalWrite(DIRA, HIGH); digitalWrite(DIRB, LOW);
lcd.clear(); lcd.setCursor(2,0); lcd.print("Dispensing");
lcd.setCursor(3,1); lcd.print("Your Item");
myStepper3.step(-stepsPerRevolution);
lcd.clear(); lcd.setCursor(2,0); lcd.print("Please take");
lcd.setCursor(3,1); lcd.print("Your Item");
delay(2500);
lcd.setCursor(0,0); lcd.print("Button State 4");
lcd.setCursor(2,1); lcd.print("1 2 3 or 4");
digitalWrite(DIRA, LOW); digitalWrite(DIRB, LOW);
}
}
2. Вендинг-автомат С сменой цветов LED (C# / Arduino)
// ... аналогично, с добавлением RGB-ленты на пинах 38,39,40
// При нажатии кнопок проигрываются цветовые анимации через analogWrite
// Полный код в исходнике проекта
3. Полный код с приемником монет (C# / Arduino)
#include <LiquidCrystal.h>
#include <Stepper.h>
#define ENABLE 10
#define REDPIN 38
#define GREENPIN 39
#define BLUEPIN 40
const int coinpin = 21;
const int ledpin = 13;
const int targetcents = 100;
volatile int cents = 0;
int credits = 0;
int stepsPerRevolution = 2048;
const int button1Pin = A0, button2Pin = A1, button3Pin = A2, button4Pin = A3;
Stepper myStepper0(stepsPerRevolution, 22, 26, 24, 28);
Stepper myStepper1(stepsPerRevolution, 23, 27, 25, 29);
Stepper myStepper2(stepsPerRevolution, 30, 34, 32, 36);
Stepper myStepper3(stepsPerRevolution, 31, 35, 33, 37);
void setup() {
attachInterrupt(digitalPinToInterrupt(coinpin), coinInterrupt, RISING);
pinMode(button1Pin, INPUT); pinMode(button2Pin, INPUT);
pinMode(button3Pin, INPUT); pinMode(button4Pin, INPUT);
pinMode(ENABLE, OUTPUT);
pinMode(REDPIN, OUTPUT); pinMode(GREENPIN, OUTPUT); pinMode(BLUEPIN, OUTPUT);
myStepper0.setSpeed(15); myStepper1.setSpeed(15);
myStepper2.setSpeed(15); myStepper3.setSpeed(15);
lcd.begin(16, 2);
lcd.clear(); lcd.setCursor(0,0); lcd.print("Select your item");
lcd.setCursor(0,1); lcd.print(" #1 #2 #3 #4");
analogWrite(REDPIN, 256); analogWrite(GREENPIN, 256); analogWrite(BLUEPIN, 256);
}
void loop() {
if (cents >= targetcents) { credits++; cents -= targetcents; }
lcd.clear(); lcd.setCursor(0,0); lcd.print(cents); lcd.setCursor(3,0); lcd.print("Coin Count");
lcd.setCursor(0,1); lcd.print(credits); lcd.setCursor(3,1); lcd.print("credit earned");
delay(1000);
if (credits > 0) {
int b1 = digitalRead(button1Pin), b2 = digitalRead(button2Pin);
int b3 = digitalRead(button3Pin), b4 = digitalRead(button4Pin);
if ((b1 == LOW) && !(b2 == LOW)) {
digitalWrite(ENABLE, HIGH);
analogWrite(REDPIN, 256);
for (int b=256; b>0; b--) analogWrite(BLUEPIN, b);
for (int g=256; g>0; g--) analogWrite(GREENPIN, g);
for (int g=256; g>0; g--) analogWrite(GREENPIN, g);
lcd.clear(); lcd.setCursor(2,0); lcd.print("Dispensing");
lcd.setCursor(3,1); lcd.print("Your Item");
myStepper0.step(stepsPerRevolution);
lcd.clear(); lcd.setCursor(2,0); lcd.print("Please take");
lcd.setCursor(3,1); lcd.print("Your Item");
delay(2500);
for (int b=0; b<256; b++) analogWrite(BLUEPIN, b);
for (int g=0; g<256; g++) analogWrite(GREENPIN, g);
digitalWrite(ENABLE, LOW);
credits--; cents = 0;
}
// ... аналогичные блоки для кнопок 2, 3, 4 с их цветовыми анимациями
// (код сокращен для краткости, полная версия в проекте)
}
}
void coinInterrupt() {
cents += 5;
digitalWrite(ledpin, HIGH);
}
Схемы
Полная схема системы: ATX питание, моторы, LCD, LED, кнопки, контроллер.

Производственный процесс
- ЭЭГ-аппараты: дизайн, производство и новые применения
- Эволюция и производство швейных машин: от изобретений XIX века к современной автоматизации
- Как работают автоматы с картошкой фри: закулисный обзор
- Автоматы с молоком: удобно, доступно, экологично
- Как вендинговые машины для картошки фри выдают горячую свежую картофель фри по запросу
- Вендинг-машины для лапши: как работают и что можно получить
- Инновационные вендинговые автоматы для чая, кофе и супа
- Автоматы свежей еды: горячая еда 언제 и где угодно
- Автоматы для продажи газированных напитков: полное руководство
- Раскрываем прибыль: бизнес-потенциал вендинговых автоматов с мороженым