Construa uma Máquina de Vendas Inteligente com Arduino: Guia Completo de Mecatrônica DIY
Neste projeto, aprenderemos como fazer uma máquina de vendas baseada em Arduino DIY. Mostrarei todo o processo de construção, desde o corte e montagem das placas de MDF, até a conexão de todas as partes eletrônicas e a escrita do código Arduino.
Você pode assistir ao vídeo a seguir ou ler o tutorial escrito abaixo.
Visão Geral
A máquina de vendas possui quatro unidades de dispensação controladas por quatro servomotores de rotação contínua, um sistema transportador controlado por motores de passo, um LCD, quatro botões para seleção de item e um detector de moedas.

Você pode estar pensando agora que o transportador de itens não é tão útil para esta máquina de vendas, e sim, você provavelmente está certo. Mas minha ideia aqui era tornar este projeto mais interessante ou um pouco mais complexo para que você possa aprender mais coisas novas. Acho que esta ideia de projeto pode ser ótima para estudantes de eletrônica ou mecatrônica considerando construir um como projeto de final de ano, bem como para qualquer entusiasta de Arduino.
Construindo a Máquina de Vendas
Comecei cortando a placa de MDF de 8mm de espessura no tamanho certo.

Anteriormente, fiz um modelo 3D da máquina de onde obtive todas as medidas.
Você pode encontrar e baixar este modelo 3D, bem como explorá-lo no seu navegador no Thangs.

Para cortar o MDF, usei uma serra circular. Na verdade, esta é uma bancada de trabalho caseira com serra circular, tupia e serra tico-tico, feita pela minha parceira Marija e há um vídeo DIY para isso no canal YouTube Creativity Hero dela.
Após cortar todos os painéis usando a serra circular, continuei fazendo as aberturas em alguns dos painéis usando a serra tico-tico invertida.

Na verdade, uma serra tico-tico pode ser usada até para o passo anterior, caso você não tenha uma serra circular. Também usei a serra tico-tico para cortar as peças menores que tinham vários cortes. No entanto, note que estas são máquinas perigosas, então você precisa ter muito cuidado ao usá-las.
Uma vez que tinha todas as peças de MDF prontas, comecei a montá-las usando cola de madeira e parafusos. Para fixar os painéis, usei grampos de ângulo de 90 graus. Usando uma parafusadeira sem fio, primeiro fiz furos piloto, depois fiz contra-afundamentos e aparafusei os parafusos de 3mm no lugar. Usei o mesmo método para montar todos os painéis e para alguns deles também usei alguns grampos tipo F.

Sistema de Trilhos
Neste ponto da montagem, continuarei com a fabricação do sistema de trilhos. Para isso, estou usando tubos de alumínio que cortei no tamanho usando uma serra manual para metal. O diâmetro do tubo para o trilho horizontal é 16mm, enquanto para o trilho vertical o diâmetro é 20mm. Em placas de madeira maciça de 18mm, fiz fendas para os tubos usando broca Forstner e, então, fixei os tubos a elas.

O trilho horizontal é feito de dois tubos de 27cm de comprimento, enquanto o trilho vertical é feito de três tubos de 45cm de comprimento.
Em seguida, estão os deslizadores e aqui está como os fiz. Usei uma placa de madeira de 21x21cm na qual fiz furos de 8mm.

Então, inseri hastes roscadas de 8mm através destes furos e, usando arruelas e porcas, fixei os mancais de 22mm. Quanto ao deslizador horizontal, usei o mesmo método, mas com mancais menores de 16mm de diâmetro externo.
Após inserir o deslizador entre os trilhos de tubo, notei que estava um pouco frouxo. Para resolver este problema, tive que reduzir a distância entre os dois trilhos. Primeiro, expandi as fendas dos tubos, depois fiz fendas perpendiculares através dos tubos e, finalmente, usando uma haste roscada, apertei os dois trilhos de tubo mais próximos um do outro. Após isso, os deslizadores não estavam mais frouxos e funcionavam corretamente.

No entanto, neste ponto, tive que desmontar os trilhos para adicionar os outros elementos. Primeiro, adicionei um parafuso de 5mm no lado esquerdo dos trilhos no qual fixarei uma polia para a correia dentada horizontal, bem como dois mancais adicionais que deslizarão no trilho vertical esquerdo.

No outro lado direito do trilho, tive que fixar o motor de passo para o movimento horizontal. Primeiro, fixei o motor em uma placa de MDF de 8mm, adicionei uma peça de madeira de suporte a ele e também fixei a parte ranhurada a ele. Finalmente, fixei toda esta montagem no deslizador vertical usando cola de madeira e dois parafusos.

Em seguida, continuei adicionando o container no deslizador horizontal. Para isso, usei alguns pedaços pequenos de madeira que juntei usando cola de madeira. Uma vez terminado isso, estava pronto para montar o sistema de trilhos. Usei epóxi nas fendas dos trilhos e adicionei uma placa de madeira adicional ao lado dos trilhos para tornar todo o sistema de trilhos mais rígido.

No próximo passo, inseri a montagem entre os trilhos verticais e os fixei no lugar também. O resultado final dos deslizadores e do sistema de trilhos ficou funcionando excelentemente.

Continuei com a instalação da correia dentada horizontal. Medi o comprimento necessário, cortei no tamanho e fixei ao deslizador usando uma abraçadeira plástica (zip tie). Quanto ao deslizador vertical, fixei o motor de passo no topo da máquina usando uma peça de MDF e alguns parafusos. Na parte inferior, fixei a polia e, de maneira similar, instalei a correia dentada.

Unidades de Dispensação
Em seguida, passei para a unidade de dispensação de itens. Fiz uma bobina helicoidal de arame metálico de 3mm de espessura enrolando-o em uma lata de tinta spray de 7cm de diâmetro.

Depois disso, usando uma pistola de cola quente, fixei-a a um servomotor de rotação contínua.

Painel Frontal
Em seguida, está o painel da porta frontal, que fixei à máquina de vendas usando dobradiças simples, e para travá-lo usei um fecho magnético de porta. Então, usei acrílico de 5mm de espessura para cobrir a grande abertura frontal, enquanto para a abertura menor no lado direito usei uma chapa de alumínio bem fina. Aqui fiz 4 furos para os botões, bem como aberturas para as moedas e o display LCD. Usei uma furadeira e uma serra para metal para fazê-los. Uma vez que fixei as peças eletrônicas na chapa de alumínio, fixei-a ao painel da porta frontal usando parafusos de 5mm.

Para posicionar o transportador em sua posição inicial, instalei dois micro interruptores e, para as moedas, colei um guia que guiará a moeda para deslizar até o fundo da máquina.

O detector de moedas é um sensor de proximidade infravermelho simples, então, quando uma moeda passar perto dele, o sensor nos dará um feedback positivo.
Esquemático do Circuito
Chega a parte divertida: conectar todos os componentes eletrônicos à placa Arduino. Aqui está o esquemático completo do circuito para este projeto DIY de máquina de vendas.

Precisamos de uma fonte de 12V, com pelo menos 2 amperes. Precisamos dos 12V para os dois motores de passo, bem como as fitas de LED que depois fixarei na porta frontal. No entanto, para todos os outros componentes precisamos de 5V, então usei um conversor buck para reduzir os 12V para 5V. Os servomotores de rotação contínua DS04-NFC são alimentados com 5V e controlados via sinais PWM vindos da placa Arduino, enquanto os motores de passo são controlados via drivers A4988. Os quatro botões e os dois micro interruptores estão conectados ao Terra e aos pinos digitais do Arduino, então, usando os resistores pull-up internos da placa Arduino, podemos detectar facilmente quando são pressionados.
Você pode obter os componentes necessários para este Tutorial Arduino nos links abaixo:
- Conversor Buck DC-DC LM2596
- LCD 16x2
- Servomotor 360 Graus Contínuo
- Motor de Passo NEMA 17
- Driver de Motor de Passo A4988
- Sensor de Proximidade IR
- Botões
- Micro Interruptor de Fim de Curso
- Placa Arduino
Conectei os componentes eletrônicos usando alguns jumpers. Ficou um pouco bagunçado com tanta fiação, mas tudo funcionou corretamente. No final, fixei duas fitas de LED no painel da porta para iluminar o interior da máquina de vendas.

Código Arduino
O que resta agora é programar o Arduino e aqui está o código que fiz para este projeto. Abaixo há uma descrição do código.
/* Máquina de Vendas DIY - Projeto Mecatrônico Baseado em Arduino
by Dejan Nedelkovski, www.HowToMechatronics.com */
#include <LiquidCrystal.h> // inclui a biblioteca LiquidCrystal
#include <Servo.h>
LiquidCrystal lcd(27, 26, 25, 24, 23, 22); // Cria objeto LC. Parâmetros: (rs, enable, d4, d5, d6, d7)
Servo servo1, servo2, servo3, servo4; // motores DS04-NFC
// Pinos dos motores de passo
#define dirPinVertical 0
#define stepPinVertical 1
#define dirPinHorizontal 2
#define stepPinHorizontal 3
#define coinDetector 9
#define button1 13
#define button2 12
#define button3 11
#define button4 10
#define microSwitchV 15
#define microSwitchH 14
int buttonPressed;
void setup() {
lcd.begin(16, 2); // Inicializa interface para tela LCD, especifica dimensões (largura e altura)
servo1.attach(4);
servo2.attach(5);
servo3.attach(6);
servo4.attach(7);
pinMode(dirPinVertical, OUTPUT);
pinMode(stepPinVertical, OUTPUT);
pinMode(dirPinHorizontal, OUTPUT);
pinMode(stepPinHorizontal, OUTPUT);
pinMode(coinDetector, INPUT);
// Ativando resistores pull-up dos pinos digitais
pinMode(button1, INPUT_PULLUP);
pinMode(button2, INPUT_PULLUP);
pinMode(button3, INPUT_PULLUP);
pinMode(button4, INPUT_PULLUP);
pinMode(microSwitchV, INPUT_PULLUP);
pinMode(microSwitchH, INPUT_PULLUP);
// Posição inicial vertical
digitalWrite(dirPinVertical, HIGH); // Define stepper para mover em direção particular
while (true) {
if (digitalRead(microSwitchV) == LOW) {
// Se micro interruptor pressionado, move plataforma um pouco para cima e sai do while
moveUp(70);
break;
}
// Move transportador para cima até micro interruptor ser pressionado
digitalWrite(stepPinVertical, HIGH);
delayMicroseconds(300);
digitalWrite(stepPinVertical, LOW);
delayMicroseconds(300);
}
// Posição inicial horizontal
digitalWrite(dirPinHorizontal, LOW);
while (true) {
if (digitalRead(microSwitchH) == LOW) {
moveLeft(350);
break;
}
digitalWrite(stepPinHorizontal, HIGH);
delayMicroseconds(300);
digitalWrite(stepPinHorizontal, LOW);
delayMicroseconds(300);
}
}
void loop() {
// Imprime "Insira uma moeda!" no LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Insira uma moeda!");
// Espera até moeda ser detectada
while (true) {
if (digitalRead(coinDetector) == LOW) {
// Se moeda detectada, sai do while
break;
}
}
delay(10);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Selecione seu item");
lcd.setCursor(0, 1);
lcd.print(" 1, 2, 3 ou 4?");
// Espera até botão ser pressionado
while (true) {
if (digitalRead(button1) == LOW) { buttonPressed = 1; break; }
if (digitalRead(button2) == LOW) { buttonPressed = 2; break; }
if (digitalRead(button3) == LOW) { buttonPressed = 3; break; }
if (digitalRead(button4) == LOW) { buttonPressed = 4; break; }
}
// Imprime "Entregando..."
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Entregando...");
// Dependendo do botão pressionado, move transportador para posição e dispensa item
switch (buttonPressed) {
case 1:
// Move container para localização 1
moveUp(4900); // Move para cima 4900 passos (Nota: stepper em resolução de quarto de passo)
delay(200);
moveLeft(1700); // Move para esquerda 1700 passos
delay(300);
// Rotaciona bobina helicoidal, dispensa item
servo1.writeMicroseconds(2000); // rotaciona
delay(950);
servo1.writeMicroseconds(1500); // para
delay(500);
// Move container de volta para posição inicial
moveRight(1700);
delay(200);
moveDown(4900);
break;
case 2:
// Move container para localização 2
moveUp(4900);
delay(200);
// Rotaciona hélice, empurra item
servo2.writeMicroseconds(2000);
delay(950);
servo2.writeMicroseconds(1500);
delay(500);
moveDown(4900);
break;
case 3:
// Move container para localização 3
moveUp(2200);
delay(200);
moveLeft(1700);
delay(300);
// Rotaciona hélice, empurra item
servo3.writeMicroseconds(2000);
delay(950);
servo3.writeMicroseconds(1500);
delay(500);
// Move container de volta para posição inicial
moveRight(1700);
delay(200);
moveDown(2200);
break;
case 4:
// Move container para localização 4
moveUp(2200);
delay(200);
// Rotaciona hélice, empurra item
servo4.writeMicroseconds(2000);
delay(950);
servo4.writeMicroseconds(1500);
delay(500);
moveDown(2200);
break;
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Item entregue!");
delay(2000);
}
// == Funções personalizadas ==
void moveUp(int steps) {
digitalWrite(dirPinVertical, LOW);
for (int x = 0; x < steps; x++) {
digitalWrite(stepPinVertical, HIGH);
delayMicroseconds(300);
digitalWrite(stepPinVertical, LOW);
delayMicroseconds(300);
}
}
void moveDown(int steps) {
digitalWrite(dirPinVertical, HIGH);
for (int x = 0; x < steps; x++) {
digitalWrite(stepPinVertical, HIGH);
delayMicroseconds(300);
digitalWrite(stepPinVertical, LOW);
delayMicroseconds(300);
}
}
void moveLeft(int steps) {
digitalWrite(dirPinHorizontal, HIGH);
for (int x = 0; x < steps; x++) {
digitalWrite(stepPinHorizontal, HIGH);
delayMicroseconds(300);
digitalWrite(stepPinHorizontal, LOW);
delayMicroseconds(300);
}
}
void moveRight(int steps) {
digitalWrite(dirPinHorizontal, LOW);
for (int x = 0; x < steps; x++) {
digitalWrite(stepPinHorizontal, HIGH);
delayMicroseconds(300);
digitalWrite(stepPinHorizontal, LOW);
delayMicroseconds(300);
}
}
Explicação do Código Fonte
Primeiro, precisamos incluir as bibliotecas Servo e LiquidCrystal, definir os pinos do LCD, os quatro servomotores, os pinos dos motores de passo, o detector de moedas, bem como os quatro botões e os dois micro interruptores.
Na seção setup, definimos os modos de pino para cada um dos pinos mencionados acima. Podemos notar que para os pinos dos botões e micro interruptores ativamos os resistores pull-up internos. Isso significa que o nível lógico nestes pinos será HIGH o tempo todo, e uma vez que os pressionamos, o nível lógico cairá para LOW.
Antes de entrar no loop principal, também definimos o transportador para sua posição inicial, que é definida pelos dois micro interruptores. Então, com o loop while, continuamos movendo o transportador para sua posição inicial e, uma vez que os dois micro interruptores forem pressionados, os motores param e movem para a posição inicial desejada.
// Posição inicial vertical
digitalWrite(dirPinVertical, HIGH);
while (true) {
if (digitalRead(microSwitchV) == LOW) {
moveUp(70);
break;
}
digitalWrite(stepPinVertical, HIGH);
delayMicroseconds(300);
digitalWrite(stepPinVertical, LOW);
delayMicroseconds(300);
}
// Posição inicial horizontal
digitalWrite(dirPinHorizontal, LOW);
while (true) {
if (digitalRead(microSwitchH) == LOW) {
moveLeft(350);
break;
}
digitalWrite(stepPinHorizontal, HIGH);
delayMicroseconds(300);
digitalWrite(stepPinHorizontal, LOW);
delayMicroseconds(300);
}
No programa principal, começamos imprimindo no LCD a mensagem "Insira uma moeda". Então, ficamos presos no loop while. Uma vez que inserimos uma moeda e ela passa perto do sensor de proximidade, o estado lógico no pino do detector de moedas cairá para LOW e, nesse caso, sairemos do loop while usando a instrução break.
// Espera até moeda ser detectada
while (true) {
if (digitalRead(coinDetector) == LOW) {
break;
}
}
Então, imprimimos a mensagem "Selecione seu item" e ficamos presos em outro loop while.
// Espera até botão ser pressionado
while (true) {
if (digitalRead(button1) == LOW) { buttonPressed = 1; break; }
if (digitalRead(button2) == LOW) { buttonPressed = 2; break; }
if (digitalRead(button3) == LOW) { buttonPressed = 3; break; }
if (digitalRead(button4) == LOW) { buttonPressed = 4; break; }
}
Este loop while espera que pressionemos qualquer um dos quatro botões, e uma vez que fazemos isso, saímos dele e imprimimos a mensagem "Entregando".
Agora, dependendo do botão pressionado, executamos um dos casos na instrução switch. No caso de termos pressionado o primeiro botão, o transportador começará a mover para cima usando a função personalizada "moveUp()".
switch (buttonPressed) {
case 1:
moveUp(4900);
delay(200);
moveLeft(1700);
delay(300);
servo1.writeMicroseconds(2000);
delay(950);
servo1.writeMicroseconds(1500);
delay(500);
moveRight(1700);
delay(200);
moveDown(4900);
break;
}
Se olharmos para esta função, veremos que ela simplesmente define o motor de passo para mover em uma direção particular e faz a quantidade de passos que inserimos como argumento.
void moveUp(int steps) {
digitalWrite(dirPinVertical, LOW);
for (int x = 0; x < steps; x++) {
digitalWrite(stepPinVertical, HIGH);
delayMicroseconds(300);
digitalWrite(stepPinVertical, LOW);
delayMicroseconds(300);
}
}
Podemos notar aqui que configurei o driver de passo A4988 para funcionar em resolução de quarto de passo, e com alguns testes concluí que precisava de 4900 passos para o transportador chegar à posição superior. De maneira similar, movemos o transportador para a esquerda até atingir a localização número 1.
Logo após, rotacionamos o motor de rotação contínua por 950 milissegundos para que a bobina helicoidal faça um ciclo completo.
// Rotaciona bobina helicoidal, dispensa item selecionado
servo1.writeMicroseconds(2000); // rotaciona
delay(950);
servo1.writeMicroseconds(1500); // para
Note aqui que estes valores podem variar às vezes e dependem do próprio motor. Usando as funções personalizadas moveRight() e moveDown(), trazemos o transportador de volta à posição inicial. Da mesma forma, podemos dispensar qualquer um dos quatro itens.
No final, apenas imprimimos a mensagem "Item entregue".
É assim tão simples, e espero que tenha gostado deste vídeo e aprendido algo novo. Sinta-se à vontade para fazer qualquer pergunta na seção de comentários abaixo e confira minha Coleção de Projetos Arduino.
Processo de manufatura
- Máquinas de Venda Automática: Uma Indústria de US$ 36,6 Bilhões nos EUA
- Construa Sua Própria Máquina de Escrever Deveres de Casa (Plotter de Caneta) em Casa
- Console de Controle DIY para Photoshop com Arduino Nano RP2040
- Crie um Sistema Ambilight Impressionante para Monitor com Arduino
- Construa um Dispositivo de Levitação Ultrassônica com Arduino – Guia Passo a Passo
- Construa um Voltímetro Inteligente com Arduino e Smartphone – Projeto DIY Fácil
- Construa um Sensor de Batimento Cardíaco Infravermelho Confiável com Arduino: Guia Passo a Passo
- Jogo da Velha com Arduino, Matriz LED MAX7219 e Caixa de Papelão
- Construa um Voltímetro DIY com Arduino e Display Nokia 5110 – Guia Passo a Passo
- Relógio Digital com Arduino usando Máquina de Estados Finitos (YAKINDU)