Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

DIY Vending Machine – Projeto Mecatrônico baseado em Arduino


Neste projeto, aprenderemos como fazer uma máquina de venda automática DIY baseada em Arduino. Mostrarei todo o processo de construção, começando pelo corte e montagem das placas de MDF, até conectar todas as partes eletrônicas e escrever o código do Arduino.

Você pode assistir ao vídeo a seguir ou ler o tutorial escrito abaixo.

Visão geral


A máquina de venda automática possui quatro unidades de descarga controladas por quatro servomotores de rotação contínua, um sistema de transporte controlado por motores de passo, um LCD, quatro botões para selecionar um item e um detector de moedas.

Você pode estar pensando agora que o portador do item não é tão útil para esta máquina de venda automática, e sim, você provavelmente está certo. Mas a minha ideia aqui foi tornar este projeto mais interessante ou um pouco mais complexo para que você possa aprender mais coisas novas. Eu acho que essa ideia de projeto pode ser ótima para estudantes de eletrônica ou mecatrônica que consideram construir um como seu projeto final do ano, bem como para qualquer entusiasta do Arduino.

Construindo a máquina de venda automática


Comecei cortando a placa de MDF de 8 mm no tamanho certo.

Anteriormente fiz um modelo 3D da máquina de onde tirei todas as medidas.

Você pode encontrar e baixar este modelo 3D, bem como explorá-lo em seu navegador no Thangs.

Para cortar o MDF usei uma serra circular. Na verdade, esta é uma bancada caseira com uma serra circular, um roteador e um quebra-cabeças, feita pela minha parceira Marija e há um vídeo DIY para ela em seu canal do YouTube Creativity Hero.

Depois de cortar todos os painéis com a serra circular continuei a fazer as aberturas em alguns dos painéis com a serra tico-tico invertida.

Na verdade, um quebra-cabeça pode ser usado até mesmo para a etapa anterior, caso você não tenha uma serra circular. Usei também o Jigsaw para cortar as partes menores que tinham vários cortes. No entanto, observe que essas máquinas são perigosas, portanto, você precisa ter muito cuidado ao usá-las.

Depois de ter todas as peças de MDF prontas, comecei a montá-las usando um pouco de cola de madeira e parafusos. Para a fixação dos painéis, usei grampos de ângulo de 90 graus. Usando uma furadeira sem fio, primeiro fiz furos piloto, depois fiz contra-pias e aparafusei os parafusos de 3 mm no lugar. Usei o mesmo método para montar todos os painéis e para alguns deles também usei alguns grampos F.

Sistema ferroviário


Neste ponto da montagem continuarei fazendo o sistema ferroviário. Para isso estou usando tubos de alumínio que eu cortei com uma serra manual de metal. O diâmetro do tubo para o trilho horizontal é de 16 mm, enquanto para o trilho vertical o diâmetro é de 20 mm. Em tábuas de madeira maciça de 18 mm, fiz ranhuras para os tubos usando uma broca Forstner e depois prendi os tubos nelas.

O trilho horizontal é feito de dois tubos de 27 cm de comprimento, enquanto o trilho vertical é feito de três tubos de 45 cm de comprimento.

Em seguida estão os controles deslizantes e aqui está como eu os fiz. Usei uma tábua de madeira de 21 por 21 cm na qual fiz furos de 8 mm.

Em seguida, inseri hastes rosqueadas de 8 mm por esses orifícios e, usando arruelas e porcas, prendi os rolamentos de 22 mm. Quanto ao controle deslizante horizontal, usei o mesmo método, mas com rolamentos menores de 16 mm de diâmetro externo.

Depois de inserir o controle deslizante entre os trilhos do tubo, notei que estava um pouco solto. Para resolver este problema tive que reduzir a distância entre os dois trilhos. Então, primeiro expandi as ranhuras do tubo, depois fiz ranhuras perpendiculares através dos tubos e, finalmente, usando uma haste rosqueada, prendi os dois trilhos do tubo mais próximos um do outro. Depois disso, os controles deslizantes não ficaram mais soltos e funcionaram corretamente.

No entanto, neste momento tive que desmontar os trilhos para adicionar os outros elementos a ele. Primeiro adicionei um parafuso de 5mm no lado esquerdo dos trilhos no qual vou prender uma polia para a correia dentada horizontal, além de mais dois rolamentos que deslizarão no trilho vertical esquerdo.

No outro lado direito do trilho tive que prender o motor de passo para o movimento horizontal. Primeiro prendi o motor em uma placa de MDF de 8 mm, depois acrescentei um pedaço de madeira de apoio a ele e também prendi a parte ranhurada nele. Por fim, colei toda esta montagem no slider vertical usando uma cola de madeira e dois parafusos.

Em seguida, continuei adicionando o contêiner no controle deslizante horizontal. Para isso usei alguns pequenos pedaços de madeira que os uni com uma cola de madeira. Uma vez feito isso, estava pronto para montar o sistema ferroviário. Usei um pouco de epóxi nas ranhuras dos trilhos e adicionei uma placa de madeira adicional ao lado dos trilhos para tornar todo o sistema de trilhos mais rígido.

Na próxima etapa, inseri o conjunto entre os trilhos verticais e os prendi no lugar também. O resultado final dos controles deslizantes e do sistema de trilhos ficou excelente.

Continuei com a instalação da correia dentada horizontal. Eu medi o comprimento que eu precisava, cortei no tamanho certo e prendi no slider usando uma braçadeira. Quanto ao controle deslizante vertical, fixei o motor de passo na parte superior da máquina usando um pedaço de MDF e alguns parafusos. Na parte inferior, prendi a polia e, de maneira semelhante, instalei a correia dentada.

Unidades de descarga


Em seguida, passei para a unidade de descarga de itens. Eu fiz uma bobina helicoidal com um fio de metal de 3 mm enrolando-o em torno de uma lata de tinta spray de 7 cm de diâmetro.

Depois disso, usando uma pistola de cola, prendi-o a um servo motor de rotação contínua.

Painel frontal


Em seguida está o painel da porta frontal que prendi à máquina de venda automática usando dobradiças simples e, para bloqueá-lo, usei um prendedor de porta magnético. Depois usei um acrílico carrapato de 5mm para cobrir a grande abertura frontal, enquanto para a abertura menor do lado direito usei uma chapa de alumínio bem estanhada. Aqui fiz 4 furos para os botões, assim como aberturas para as moedas e o display LCD. Eu usei uma furadeira e uma serra para fazê-los. Depois de prender as peças eletrônicas na placa de alumínio, prendi-as no painel da porta frontal usando parafusos de 5 mm.

Para posicionar o portador na sua posição inicial instalei dois micro interruptores e para as moedas colei uma guia que irá guiar a moeda para deslizar para o fundo da máquina.

O detector de moedas é um sensor de proximidade infravermelho simples, portanto, quando uma moeda passar perto dele, o sensor nos dará um feedback positivo.

Esquema do circuito


Em seguida vem a parte divertida, conectar todos os componentes eletrônicos à placa Arduino. Aqui está o esquema completo do circuito para este projeto de máquina de venda automática DIY.

Portanto, precisamos de uma fonte de alimentação de 12V, com pelo menos 2 amperes. Precisamos dos 12V para os dois motores de passo, assim como as fitas de LED que mais tarde colocarei na porta da frente. No entanto, para todos os outros componentes, precisamos de 5V, portanto, 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 através dos drivers A4988. Os quatro botões e os dois micro interruptores estão conectados ao terra e aos pinos digitais do Arduino, portanto, usando os resistores internos de pull up da placa Arduino, podemos detectar facilmente quando eles são pressionados.

Você pode obter os componentes necessários para este tutorial do Arduino nos links abaixo:
  • Conversor Buck DC-DC LM2596 …………..
  • LCD 16×2 ……………………………………………………..
  • Servomotor contínuo de 360 ​​graus …
  • Motor de passo NEMA 17 ……………………….
  • A4988 Motorista de Motor de Passo ……………….
  • Sensor de proximidade IR ………………………………..
  • Botões …………………………………………………….
  • Micro interruptor de limite ………………………………….
  • Placa Arduino …………………………………………

Liguei os componentes eletrônicos usando alguns fios de salto. Ficou um pouco confuso com tantos fios, mas tudo funcionou corretamente. No final coloquei duas fitas de LED no painel da porta para iluminar o interior da máquina de venda automática.

Código do Arduino


O que resta agora é programar o Arduino e aqui está o código que fiz para este projeto. Abaixo disso há uma descrição do código.
/*     DIY Vending Machine - Arduino based Mechatronics Project

    by Dejan Nedelkovski, www.HowToMechatronics.com

*/

#include <LiquidCrystal.h> // includes the LiquidCrystal Library
#include <Servo.h>

LiquidCrystal lcd(27, 26, 25, 24, 23, 22); // Creates an LC object. Parameters: (rs, enable, d4, d5, d6, d7)
Servo servo1, servo2, servo3, servo4;   // DS04-NFC motors

// Stepper motors pins
#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); // Initializes the interface to the LCD screen, and specifies the dimensions (width and height) of the display

  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);

  // Activating the digital pins pull up resistors
  pinMode(button1, INPUT_PULLUP);
  pinMode(button2, INPUT_PULLUP);
  pinMode(button3, INPUT_PULLUP);
  pinMode(button4, INPUT_PULLUP);

  pinMode(microSwitchV, INPUT_PULLUP);
  pinMode(microSwitchH, INPUT_PULLUP);

  // Vertical starting position
  digitalWrite(dirPinVertical, HIGH); // Set the stepper to move in a particular direction
  while (true) {
    if (digitalRead(microSwitchV) == LOW) { // If the micro switch is pressed, move the platfor a little bit up and exit the while loop
      moveUp(70);
      break;
    }
    // Move the carrier up until the micro switch is pressed
    digitalWrite(stepPinVertical, HIGH);
    delayMicroseconds(300);
    digitalWrite(stepPinVertical, LOW);
    delayMicroseconds(300);
  }
  // Horizontal starting position
  digitalWrite(dirPinHorizontal, LOW);
  while (true) {
    if (digitalRead(microSwitchH) == LOW) {
      moveLeft(350);
      break;
    }
    digitalWrite(stepPinHorizontal, HIGH);
    delayMicroseconds(300);
    digitalWrite(stepPinHorizontal, LOW);
    delayMicroseconds(300);
  }
}
void loop() {
  // Print "Insert a coin!" on the LCD
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Insert a coin!");
  
  // Wait until a coin is detected
  while (true) {
    if (digitalRead(coinDetector) == LOW) { // If a coin is detected, exit the from the while loop
      break;
    }
  }
  
  delay(10);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Select your item");
  lcd.setCursor(0, 1);
  lcd.print(" 1, 2, 3 or 4?");
  
  // Wait until a button is pressed
  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;
    }
  }
  
  // Print "Delivering..." 
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Delivering...");
  
  // Depending on the pressed button, move the carrier to that position and discharge the selected item 
  switch (buttonPressed) {
    case 1:
      // Move the container to location 1
      moveUp(4900); // Move up 4900 steps (Note: the stepper motor is set in Quarter set resolution)
      delay(200);
      moveLeft(1700); // Move left 1700 steps
      delay(300);
      // Rotate the helical coil, discharge the selected item
      servo1.writeMicroseconds(2000); // rotate
      delay(950);
      servo1.writeMicroseconds(1500);  // stop
      delay(500);
      // Move the container back to starting position
      moveRight(1700);
      delay(200);
      moveDown(4900);
      break;
      
     case 2:
      // Move the container to location 2
      moveUp(4900);
      delay(200);
      // Rotate the helix, push the selected item
      servo2.writeMicroseconds(2000); // rotate
      delay(950);
      servo2.writeMicroseconds(1500);  // stop
      delay(500);
      moveDown(4900);
      break;

      case 3:
      // Move the container to location 3
      moveUp(2200); 
      delay(200);
      moveLeft(1700);
      delay(300);
      // Rotate the helix, push the selected item
      servo3.writeMicroseconds(2000); // rotate
      delay(950);
      servo3.writeMicroseconds(1500);  // stop
      delay(500);
      // Move the container back to starting position
      moveRight(1700);
      delay(200);
      moveDown(2200);
      break;

      case 4:
      // Move the container to location 4
      moveUp(2200); // Move verticaly 4800 steps
      delay(200);
      // Rotate the helix, push the selected item
      servo4.writeMicroseconds(2000); // rotate
      delay(950);
      servo4.writeMicroseconds(1500);  // stop
      delay(500);
      moveDown(2200);
      break;
  }
  
  lcd.clear(); // Clears the display
  lcd.setCursor(0, 0);
  lcd.print("Item delivered!"); // Prints on the LCD
  delay(2000);
}

// == Custom functions ==

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);
  }
}Code language: Arduino (arduino)

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 microswitches.

Na seção de configuração, definimos os modos de pinos para cada um dos pinos mencionados acima. Podemos notar que para os pinos dos botões e microinterruptores ativamos os resistores internos de pull up. Isso significa que o nível lógico nesses pinos será ALTO o tempo todo e, uma vez pressionados, o nível lógico cairá para BAIXO.

Antes de entrarmos no loop principal, também colocamos o transportador em sua posição inicial, que é definida pelos dois microinterruptores. Assim, com o loop while continuamos movendo o transportador para sua posição inicial e uma vez que os dois micros interruptores forem pressionados, os motores pararão e se moverão para a posição inicial desejada.
// Vertical starting position
  digitalWrite(dirPinVertical, HIGH); // Set the stepper to move in a particular direction
  while (true) {
    if (digitalRead(microSwitchV) == LOW) { // If the micro switch is pressed, move the platfor a little bit up and exit the while loop
      moveUp(70);
      break;
    }
    // Move the carrier up until the micro switch is pressed
    digitalWrite(stepPinVertical, HIGH);
    delayMicroseconds(300);
    digitalWrite(stepPinVertical, LOW);
    delayMicroseconds(300);
  }
  // Horizontal starting position
  digitalWrite(dirPinHorizontal, LOW);
  while (true) {
    if (digitalRead(microSwitchH) == LOW) {
      moveLeft(350);
      break;
    }
    digitalWrite(stepPinHorizontal, HIGH);
    delayMicroseconds(300);
    digitalWrite(stepPinHorizontal, LOW);
    delayMicroseconds(300);
  }Code language: Arduino (arduino)

No programa principal, comece por imprimir no LCD a mensagem “Inserir uma moeda”. Então ficamos presos no loop while. Depois de inserir uma moeda e ela passar 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.
// Wait until a coin is detected
  while (true) {
    if (digitalRead(coinDetector) == LOW) { // If a coin is detected, exit the from the while loop
      break;
    }
  }Code language: Arduino (arduino)

Em seguida, imprimimos a mensagem “Selecione seu item” e ficamos presos em outro loop while.
// Wait until a button is pressed
  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;
    }
  }Code language: Arduino (arduino)

Este loop while espera que pressionemos qualquer um dos quatro botões e, quando fizermos isso, saímos dele e imprimimos a mensagem “Delivering”.

Agora, dependendo do botão pressionado, executamos um dos casos na instrução switch. Caso tenhamos pressionado o primeiro botão, a transportadora começará a subir usando a função personalizada “moveUp()”.
switch (buttonPressed) {
    case 1:
      // Move the container to location 1
      moveUp(4900); // Move up 4900 steps (Note: the stepper motor is set in Quarter set resolution)
      delay(200);
      moveLeft(1700); // Move left 1700 steps
      delay(300);
      // Rotate the helical coil, discharge the selected item
      servo1.writeMicroseconds(2000); // rotate
      delay(950);
      servo1.writeMicroseconds(1500);  // stop
      delay(500);
      // Move the container back to starting position
      moveRight(1700);
      delay(200);
      moveDown(4900);
      break;
}Code language: Arduino (arduino)

Se dermos uma olhada nesta função podemos ver que ela simplesmente configura o motor de passo para se mover em uma determinada direção, 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);
  }
}Code language: Arduino (arduino)

Podemos notar aqui que configurei o driver de passo A4988 para trabalhar em resolução de quarto de passo, e com algumas provas concluí que precisava de 4900 passos para que o transportador chegasse à posição superior. De maneira semelhante, movemos a transportadora para a esquerda até atingir a localização número 1.

Logo em seguida giramos o motor de rotação contínua por 950 milissegundos para que a bobina helicoidal faça um ciclo completo.
// Rotate the helical coil, discharge the selected item
      servo1.writeMicroseconds(2000); // rotate
      delay(950);
      servo1.writeMicroseconds(1500);  // stopCode language: Arduino (arduino)

Observe aqui que esses valores às vezes podem variar e dependem do próprio motor. Usando as funções personalizadas moveRight() e moveDown(), trazemos a transportadora de volta à posição inicial. Da mesma forma, podemos descartar qualquer um dos quatro itens.

Ao final apenas imprimimos a mensagem “Item entregue”.

Então é simples assim, e espero que você tenha gostado deste vídeo e aprendido algo novo. Sinta-se à vontade para fazer qualquer pergunta na seção de comentários abaixo e verifique minha coleção de projetos do Arduino.

Processo de manufatura

  1. Máquina de venda automática
  2. Faça uma máquina de escrever trabalhos de casa DIY em casa
  3. Console de edição DIY Photoshop usando Arduino Nano RP 2040
  4. Faça Monitor Ambilight usando Arduino
  5. Máquina de LEVITAÇÃO ULTRASÔNICA Usando ARDUINO
  6. Faça você mesmo voltímetro usando Arduino e Smartphone
  7. Sensor de batimento cardíaco infravermelho DIY usando Arduino
  8. Tech-TicTacToe
  9. Voltímetro DIY com Arduino e um visor Nokia 5110
  10. Relógio digital no Arduino usando uma máquina de estado finito