산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

나만의 동전 투입식 개인 자판기 만들기: 부품 및 조립 가이드

필요한 부품 및 소모품

1/4" 합판 (도면 치수대로 재단) 4장
3/4" 합판 블로킹 (도면 참조하여 스트립으로 재단) 1세트
28BYJ-48 5V 스테퍼 모터 + ULN2003 드라이버 보드 5세트 1세트
IDC 1.27mm 피치 레인보우 플랫 리본 케이블 (50P-10FT) 1개
듀폰 커넥터 하우징 수/암핀 40핀 (635개 세트) 1세트
게임용 조명 마이크로스위치 (버튼용) 1세트
브레드보드 (납땜 기판 대체 가능) 1개
양면 PCB 기판 프로토타입 키트 (30개) 1세트
Arduino Mega 2560 1개
5V 릴레이 모듈 (Arduino ARM용) 1개
1602 시리얼 LCD 모듈 디스플레이 1개
LED 라이트 스트립 (선택 사항) 2개
8게이지 솔리드 동 접지선 50ft (코일 제작용) 1개
평면 금속 선반 디바이더 1개

필요한 도구 및 기계

앱 및 온라인 서비스

프로젝트 소개

개인용 자판기

이 프로젝트는 개인용 자판기를 단계별로 제작하는 과정을 다룹니다. 좋아하는 간식을 채워두거나 사무실에 가져다 두고 팀원들과 간식을 나눌 수 있습니다. 살펴보시고 의견을 공유해 주세요.

기계 치수:

박스 조립

도면과 같이 3/4" 블로킹을 각 접합부에 사용하여 박스를 조립하세요. 측면 벽은 바닥 플레이트 위에, 상단 플레이트 아래에 위치합니다. 둘레 벽은 21"W x 24 1/4"H가 되어야 합니다.

구분 벽은 설치 전에 설정해야 합니다. 위에서 16 1/4" 내려와 하단 선반용 블로킹을 부착하세요. 위에서 8 1/4" 내려와 상단 선반용 블로킹을 부착하세요. 정면에서 봤을 때 왼쪽 벽에도 동일하게 상/하단 선반용 블로킹을 부착하세요.

주의: 하단 선반을 먼저 설치해야 합니다. 그렇지 않으면 블로킹에 고정하기 매우 어렵습니다.

선반용 블로킹 설치 후 13" x 12" 패널을 각 블로킹 세트에 하나씩 설치하세요. 이렇게 하면 구분 벽이 제자리에 자동으로 위치합니다. 그런 다음 구분 벽 오른쪽의 상단과 하단에 블로킹을 고정하고 상단/하단 패널에 고정하세요. 이렇게 하면 구조가 완전히 견고해집니다.

후면 패널을 설치하고 모터 설치를 준비하세요. 코일 휠을 3D 프린트하여 치수를 측정하고 드릴 구멍 위치를 정하세요. 휠을 측정하고 높이에 1/4"를 더해 코일이 회전할 여유 공간을 만드세요. 재료에 따라 조정하세요. 선반에서 6 1/2" 지점을 표시해 중앙을 찾으세요. 3 1/4" 지점에서 각 선반 구간의 중심을 찾으세요. 앞서 측정한 높이로 드릴 포인트를 정하세요. 휠 샤프트가 보드에 닿지 않게 드릴로 구멍을 뚫으세요. 모터를 마운트하고 나사로 고정하세요.

모터 릴레이 설정

L293D 칩(노치가 왼쪽)을 사용하여 릴레이를 제어하세요 (회로도 참조). 이렇게 하면 모터에 전원을 연결할 수 있습니다.

(왼쪽에서 오른쪽으로)

화면 및 버튼 설치

화면: 기계 오른쪽(정면 기준)에 적절한 위치를 정하고 디스플레이 부분 구멍을 표시하세요 (2.53937" x 0.5708661").

버튼: 기계 오른쪽에 4개 버튼 구멍을 표시하세요. 부품 리스트와 동일한 버튼 사용 시 구멍 크기는 1.10236"입니다. 필요 크기보다 작은 드릴 비트로 뚫고 사포로 마무리하는 것을 추천합니다.

위 회로도의 모든 연결이 정확히 일치하는지 확인하세요. 회로도의 LED는 푸시 버튼에 내장된 LED입니다. 회로도상으로는 분리되어 있지만 이는 표시와 가독성을 위한 것입니다.

각 모터를 제공된 드라이버에 연결한 후, 각 드라이버를 컨트롤러에 연결하세요:

모터 설정:

전원은 브레드보드 12V 측에 연결하세요. 이 전원은 마지막에 준비할 ATX 파워 서플라이에서 나옵니다. 드라이버의 4개 "in" 핀을 컨트롤러에 연결하세요:

※ 주의: 이 블록의 처음 2핀은 5V 핀이므로 연결하지 마세요. 본 프로젝트에서는 사용하지 않습니다. ※

버튼 연결:

LCD 화면:

ATX 파워 서플라이:

기기 구동에 필요한 선만 자르고 피복을 벗기세요. 나머지 선은 플라스틱 커넥터에 둔 채로 다른 프로젝트에 재사용할 수 있습니다.

ATX 핀 연결:

선반 디바이더 및 코일

선반: 정면 기준 왼쪽 벽 또는 구분 벽에서 6 1/2" 중앙 지점에 표시하세요. 평면 금속을 삼각형 꼭대기 모양("^")으로 구부려 중앙 디바이더로 사용하세요. 삼각형을 선반 중앙 표시에 맞추고 핫글루로 고정하세요. 양쪽에도 슬라이드를 달 수 있지만 선택 사항입니다.

코일: 1 1/2" 직경 튜브(파이프, 실리콘 튜브, 스프레이 캔 등)를 준비하세요. 고무줄을 튜브 길이 방향으로 감고 양옆에 평행선을 긋으세요. 한 쪽은 1" 간격으로, 다른 쪽은 2" 간격으로 표시하세요. 1" 쪽에서 시작해 양쪽 표시를 모두 통과하도록 코일을 감으세요. 이렇게 하면 런그 간격이 2"가 되어 대부분의 품목에 적합합니다. 캔디바용이라면 1"로 줄이세요 (위 공식의 절반).

코일을 3D 프린트 휠에 연결: 시판 휠도 아마존 등에서 구매 가능합니다. 코일의 1" 쪽을 원형으로 모아 직경을 휠보다 약간 작게 줄이세요. 휠 가장자리에 맞춰 끼우면 코일이 압축되어 고정됩니다. 핫글루로 코일 끝을 휠에 고정하세요.

LED 스트립 조명:

질문이 있으시면 모두 물어봐 주세요. 이 프로젝트를 가장 쉽게 따라할 수 있도록 업데이트하겠습니다!

코드

자판기 코드 - LED 라이트 변경 없음 버전
// Display
#include <LiquidCrystal.h>
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);

// Stepper Library
#include <Stepper.h>

// Relay Setup
#define ENABLE 10
#define DIRA 8
#define DIRB 9

// Define "i"
int i;

// Stepper Connect 1
int stepIN1Pin = 22, stepIN2Pin = 24, stepIN3Pin = 26, stepIN4Pin = 28;
// Stepper Connect 2
int stepIN1Pin1 = 23, stepIN2Pin1 = 25, stepIN3Pin1 = 27, stepIN4Pin1 = 29;
// Stepper Connect 3
int stepIN1Pin2 = 30, stepIN2Pin2 = 32, stepIN3Pin2 = 34, stepIN4Pin2 = 36;
// Stepper Connect 4
int stepIN1Pin3 = 31, stepIN2Pin3 = 33, stepIN3Pin3 = 35, stepIN4Pin3 = 37;

int stepsPerRevolution = 2048;

const int button1Pin = A0;
const int button2Pin = A1;
const int button3Pin = A2;
const int button4Pin = A3;

Stepper myStepper0(stepsPerRevolution, stepIN1Pin, stepIN3Pin, stepIN2Pin, stepIN4Pin);
Stepper myStepper1(stepsPerRevolution, stepIN1Pin1, stepIN3Pin1, stepIN2Pin1, stepIN4Pin1);
Stepper myStepper2(stepsPerRevolution, stepIN1Pin2, stepIN3Pin2, stepIN2Pin2, stepIN4Pin2);
Stepper myStepper3(stepsPerRevolution, stepIN1Pin3, stepIN3Pin3, stepIN2Pin3, stepIN4Pin3);

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 button1State = digitalRead(button1Pin);
  int button2State = digitalRead(button2Pin);
  int button3State = digitalRead(button3Pin);
  int button4State = digitalRead(button4Pin);
  digitalWrite(ENABLE, HIGH);
  for (i=0; i<5; i++);

  // 버튼 1
  if ((button1State == LOW) && !(button2State == 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);
  }

  // 버튼 2
  if ((button2State == LOW) && !(button1State == 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);
  }

  // 버튼 3
  if ((button3State == LOW) && !(button4State == 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);
  }

  // 버튼 4
  if ((button4State == LOW) && !(button3State == 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);
  }
}
자판기 코드 - LED 라이트 변경 버전

영상을 참고하세요! RGB LED 스트립이 버튼에 따라 색상이 변합니다.

// Display
#include <LiquidCrystal.h>
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
#include <Stepper.h>
#define ENABLE 10
#define PinA 8
#define PinB 9
#define REDPIN 38
#define GREENPIN 39
#define BLUEPIN 40
int i, r, g, b;
// ... (핀 정의 동일)
void setup() {
  // ... (핀 모드 설정 동일)
  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() {
  // ... (버튼 읽기 동일)
  // 버튼별 RGB 색상 변화 로직 추가
  // 버튼 1: 빨강→파랑→초록 페이드
  // 버튼 2: 초록→파랑→빨강 페이드
  // 버튼 3: 파랑→빨강→초록 페이드
  // 버튼 4: 빨강+초록→파랑 페이드
}
코인 수용기 및 전체 코드

동전 투입 시 크레딧 적립, 크레딧 있을 때만 버튼 작동하는 완전한 버전입니다.

#include <LiquidCrystal.h>
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
#include <Stepper.h>
#define ENABLE 10
#define REDPIN 38
#define GREENPIN 39
#define BLUEPIN 40
int r, g, b;
const int coinpin = 21;
const int ledpin = 13;
const int targetcents = 100;
volatile int cents = 0;
int credits = 0;
// ... (핀 정의 동일)
void setup() {
  attachInterrupt(digitalPinToInterrupt(coinpin), coinInterrupt, RISING);
  // ... (핀 모드, 스테퍼 속도, LCD 초기화 동일)
  analogWrite(REDPIN, 256);
  analogWrite(GREENPIN, 256);
  analogWrite(BLUEPIN, 256);
}
void loop() {
  if (cents >= targetcents) {
    credits++; cents -= targetcents;
  }
  // 디버깅용 LCD 표시
  lcd.begin(16, 2); 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) {
    // 버튼 읽기 및 모터 구동 (LED 색상 변화 포함)
    // 크레딧 차감: credits--; cents = 0;
  }
}
void coinInterrupt() {
  cents += 5;
  digitalWrite(ledpin, HIGH);
}

회로도

ATX 파워 서플라이, 모터, LCD, LED, 조명, 컨트롤러를 모두 포함한 전체 시스템 회로도

제조공정

  1. 뇌파계(EEG): 설계, 제조, 새로운 응용 분야
  2. 재봉틀의 진화와 제조: 19세기 혁신에서 현대 자동화까지
  3. 감자튀김 자판기 작동 원리: 비하인드 스토리
  4. 신선 우유 자판기: 편리하고 저렴하며 친환경적인 선택
  5. 칩 벤딩 머신(Chip Vending Machine): 몇 분 만에 뜨겁고 신선한 감자튀김을 제공하는 비결
  6. 누들 자판기(Noodle Vending Machine) 완전 분석: 작동 원리 & 구매 가능 메뉴
  7. 차·커피·수프 자동판매기: 혁신적 기능과 작동 원리
  8. 밀키트 자판기: 언제든 신선하고 건강한 한 끼
  9. 음료 자판기: 알아야 할 모든 것
  10. 아이스크림·팝시클 자판기 사업의 수익 잠재력 분석