コイン式パーソナル自動販売機を自作 - 部品リストと組み立てガイド
必要な部品と材料
| FriendlyARM 1/4合板 (図面指定寸法にカット) | × | 4 | |
| 3/4インチ合板ブロッキング (幅3/4インチ、接続先パネルと同長にカット、図面参照) | × | 1 | |
| LAFVIN 5セット 28BYJ-48 ULN2003 5Vステッピングモーター + ULN2003ドライバーボード (Arduino用) (投入するお菓子を押し出せるトルク) | × | 1 | |
| PCアクセサリ - IDC 1.27mmピッチ レインボーフラットリボンケーブル (2.54mmコネクタ用、50P-10FT) (配線をきれいにプロフェッショナルに) | × | 1 | |
| Glarks 635個 Dupontコネクタハウジング オス/メスピン 40ピン (配線をきれいにプロフェッショナルに) | × | 1 | |
| Gamelec 照光式マイクロスイッチ交換用 (ボタン必須) | × | 1 | |
![]() |
ブレッドボード (ユニバーサル基板でも可) | × | 1 |
| 30枚 両面PCB基板 プロトタイプキット (1-2枚で十分だが、将来のプロジェクト用に最適サイズ) | × | 1 | |
![]() |
Arduino Mega 2560 (本プロジェクトのコントローラー) | × | 1 |
| Tolako 5Vリレーモジュール (Arduino ARM用) (モーター過熱防止用) | × | 1 | |
| HiLetgo 2個 1602 シリアルLCDモジュールディスプレイ (これがないとどのボタンが押されたかわからない) | × | 1 | |
| LEDライトストリップ (オプション) | × | 2 | |
| 50フィート 8ゲージ 単線裸銅接地線 (コイル巻き線用) | × | 1 | |
| フラット金属棚仕切り | × | 1 |
必要な工具と機器
| テーブルソーまたは電動ノコギリ (木材カットできる場所がある場合不要) | |
![]() |
はんだごて |
![]() |
ホットグルーガン (グルースティックも忘れずに) |
使用するアプリとオンラインサービス
![]() |
Arduino IDE |
プロジェクトについて
パーソナル自動販売機
このプロジェクトは、パーソナル自動販売機をステップバイステップで構築するものです。お気に入りのお菓子を詰めたり、オフィスに置いてチームでシェアしたりできます。ご意見お待ちしています。

機械の組み立て
本文中で機械の図面を参照するので、理解のために図面もご覧ください。
機械寸法: 幅21インチ × 奥行18インチ × 高さ24 1/4インチ (箱寸法)
- 側面パネル 2枚: 18"D × 23 3/4"H
- 天板・底板 2枚: 21"W × 18"D
- 前面・背面パネル 2枚: 21"W × 24 1/4"H
- 仕切り壁: 18"D × 23 3/4"H
- 内部棚 2枚 (上段・下段): 13"W × 12"D
- 棚間隔: 8インチ、棚幅13インチ、奥行12インチ
- パネル図の青ブロックは、幅3/4" × 高さ3/4"の取り付けポイント (パネルと同奥行)


図示の通り、各接合点に3/4インチブロッキングを使って箱を組み立てます。側面パネルは底板の上に、天板の下に配置します。外周壁は幅21インチ × 高さ24 1/4インチになります。

仕切り壁は設置前にセットアップが必要です。上面から16 1/4インチ下がった位置に下段棚用ブロッキングを、上面から8 1/4インチ下がった位置に上段棚用ブロッキングを取り付けます。正面から見て左側壁にも同様に上下棚用ブロッキングを取り付けます。
※重要: 下段棚を先に取り付けてください。後からブロッキング固定が非常に困難になります。

棚用ブロッキング設置後、13×12インチパネルを各ブロッキングセットに取り付けます。これで仕切り壁が正しい位置に固定されます。その後、仕切り壁右側の上下にブロッキングを固定し、天板と底板に固定します。これで構造が完全に固まります。

背面パネルを取り付け、モーター設置の準備をします。3Dプリントしたコイルホイールを用意し、寸法を測ってドリル穴位置を決めます。ホイールの高さに1/4インチ足してコイル回転分の余裕を持たせます (材質により調整)。棚の中央(左壁から6 1/2インチ)に印をつけ、各棚区画の中心(3 1/4インチ)をマーク。先ほど測った高さでドリル穴位置を決定。ホイールシャフトが板に擦れないよう穴を開け、モーターを取り付けネジ止めします。

モーターリレーの設定
以下のようにピン接続します。L293Dチップ(ノッチ左側)を使用してリレーを制御 (回路図参照)。これでモーターに電力供給できます。
(左から右へ)
- Pin 1 → コントローラー ピンソケット10 (回路図参照)
- Pin 2 → コントローラー ピンソケット9
- Pin 3 → リレー正極側 (3ピン向きで左ピン)
- Pin 4 → ブレッドボード 12V GND
- Pin 5 → 未使用
- Pin 6 → リレー負極側 (3ピン向きで右ピン)
- Pin 7 → コントローラー ピンソケット8
- Pin 8 → ブレッドボード +12V
- リレー中央ピン → ブレッドボード +12V
- リレー右奥ピン (3ピン向きで右奥) → モータードライバー正極リード線

画面とボタンの設置
画面: 正面から見て機械右側の適切な場所を選び、ディスプレイ部分の穴 (2.53937" × 0.5708661") をマーキング。
ボタン: 同様に右側の適切な場所に4つのボタン用穴 (直径1.10236"、指定ボタン使用時) をマーキング。必要より小さいドリルビットで開け、サンドペーパーで調整するのがコツです。


図の接続位置と完全に一致させてください。図のLEDはプッシュボタン内蔵LEDです。図では分かりやすくするため別々に描いていますが、実際はボタンに内蔵されています。
各モーターを付属ドライバーに接続し、各ドライバーをコントローラーに接続:
モーター設定:
電源はブレッドボードの12V側に接続 (ATX電源から後で供給)。ドライバーの4つの「IN」ピンをコントローラーに接続:

※※※ このブロックの最初の2ピンは5Vピンです - 本プロジェクトでは使用しません ※※※
- モーター1 (青): ピン 22, 24, 26, 28
- モーター2 (黄): ピン 23, 25, 27, 29
- モーター3 (緑): ピン 30, 32, 34, 36
- モーター4 (赤): ピン 31, 33, 35, 37
ボタン接続:

- ボタン1: 片側を5V、もう片側を220Ω抵抗経由でGND + アナログピンA0
- ボタン2: 片側を5V、もう片側を220Ω抵抗経由でGND + アナログピンA1
- ボタン3: 片側を5V、もう片側を220Ω抵抗経由でGND + アナログピンA2
- ボタン4: 片側を5V、もう片側を220Ω抵抗経由でGND + アナログピンA3
LCD画面:

- 画面をブレッドボード5V側の電源とGNDに接続
- Pin 1: GND
- Pin 2: 5V電源
- Pin 3: 可変抵抗器 (コントラスト調整用) - 左端GND、右端5V、中央Pin 3へ
- Pin 4: 信号1 → コントローラー ピンソケット2
- Pin 5: GND
- Pin 6: 信号2 → コントローラー ピンソケット3
- Pin 7-10: 未使用
- Pin 11: 信号3 → コントローラー ピンソケット4
- Pin 12: 信号4 → コントローラー ピンソケット5
- Pin 13: 信号5 → コントローラー ピンソケット6
- Pin 14: 信号6 → コントローラー ピンソケット7
- Pin 15: 5V電源
- Pin 16: GND

ATX電源ユニット:

デバイス電源に必要な配線のみカット・ストリップ。他の配線はコネクタに残しておけば他プロジェクトで再利用可能。
ATXピン配置:
- (GND)黒線ピン3 と (Signal)緑線ピン16 をカット・ストリップ。スイッチに接続してマシン電源ON/OFF制御
- (GND)黒線ピン7 と (+12V)黄線ピン10 をカット・ストリップ。ブレッドボード12V側 (黄/黒接続) へ
- (GND)黒線ピン24 と (+12V)黄線ピン11 をカット・ストリップ。Arduinoボード電源用互換コネクタへ
- (GND)黒線ピン19 と (+5V)赤線ピン21 をカット・ストリップ。ブレッドボード5V側へ

棚仕切りとコイル
棚と押し出しコイルのセットアップ方法:
棚仕切り: 正面から見て左側壁または仕切り壁から6 1/2インチの中央点 (上記手順でマーキング済み) に、平らな金属板を三角形「^」に曲げて中央仕切りとして設置。中央マークに合わせてセンタリング。上下両棚で繰り返し。ホットグルーで固定。側面スライドレールはオプション。
コイル作成: 直径1 1/2インチの管 (パイプ、コーキングチューブ、スプレー缶等) を用意。ゴムバンドを管の長さ方向に巻き、両側の直線をなぞる。両側に平行線が引けたら、片側を1インチから開始し、そこから2インチ間隔でマーク。反対側は最初から2インチ間隔でマーク。1インチ側からコイルを巻き始め、両側のマークに合わせて巻く。これで段差2インチのコイルが完成 (ほとんどの商品に対応)。キャンディバー用なら1インチ間隔に短縮 (上記を半分に)。
コイルと3Dプリントホイールの接続: 市販ホイールも利用可能 (Amazon等で検索)。コイルの1インチ側を潰して円形にし、直径をホイールよりわずかに小さくする。ホイール外周に嵌めるとコイルが圧縮されて滑り止めになる。フィットしたらホットグルーでコイル端をホイールに固定。
LEDストリップライト:

正極リードをブレッドボード12V側の+12Vピンへ。負極リードをブレッドボード12V側のGNDピンへ (図には未記載)。
質問があれば何でも聞いてください。このプロジェクトを史上最も簡単にするためアップデートします!
コード
自動販売機 - LEDライト変更なし版 Arduino
プロジェクト完成と理解に必要なすべて
// 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;
// Defining pins section
// Stepper Connect 1
int stepIN1Pin = 22;
int stepIN2Pin = 24;
int stepIN3Pin = 26;
int stepIN4Pin = 28;
// Stepper Connect 2
int stepIN1Pin1 = 23;
int stepIN2Pin1 = 25;
int stepIN3Pin1 = 27;
int stepIN4Pin1 = 29;
// Stepper Connect 3
int stepIN1Pin2 = 30;
int stepIN2Pin2 = 32;
int stepIN3Pin2 = 34;
int stepIN4Pin2 = 36;
// Stepper Connect 4
int stepIN1Pin3 = 31;
int stepIN2Pin3 = 33;
int stepIN3Pin3 = 35;
int stepIN4Pin3 = 37;
// Define steps
int stepsPerRevolution = 2048;
// Define buttons pin ports
const int button1Pin = A0;
const int button2Pin = A1;
const int button3Pin = A2;
const int button4Pin = A3;
// Define each stepper
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, button2State, button3State, button4State;
button1State = digitalRead(button1Pin);
button2State = digitalRead(button2Pin);
button3State = digitalRead(button3Pin);
button4State = digitalRead(button4Pin);
digitalWrite(ENABLE, HIGH);
for (i = 0; i < 5; i++);
// Button 1 pressed
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);
}
// Button 2 pressed
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);
}
// Button 3 pressed
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);
}
// Button 4 pressed
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ライト変更版 C++
動画をご覧ください!
// Display
#include <LiquidCrystal.h>
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
// Stepper Library
#include <Stepper.h>
// Relay Setup
#define ENABLE 10
#define PinA 8
#define PinB 9
#define REDPIN 38
#define GREENPIN 39
#define BLUEPIN 40
int i;
int r, g, b;
// Defining pins section (同上)
// ... ピン定義は前コードと同じ ...
void setup() {
pinMode(button1Pin, INPUT);
pinMode(button2Pin, INPUT);
pinMode(button3Pin, INPUT);
pinMode(button4Pin, INPUT);
pinMode(ENABLE, OUTPUT);
pinMode(PinA, OUTPUT);
pinMode(PinB, 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() {
int button1State, button2State, button3State, button4State;
button1State = digitalRead(button1Pin);
button2State = digitalRead(button2Pin);
button3State = digitalRead(button3Pin);
button4State = digitalRead(button4Pin);
digitalWrite(ENABLE, HIGH);
for (i = 0; i < 5; i++);
// Button 1: 赤→青→緑 フェード
if ((button1State == LOW) && !(button2State == LOW)) {
digitalWrite(PinA, HIGH);
digitalWrite(PinB, LOW);
analogWrite(REDPIN, 256);
for (b = 256; b > 0; b--) analogWrite(BLUEPIN, b);
for (g = 256; g > 0; g--) analogWrite(GREENPIN, g);
for (g = 256; g > 0; 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);
lcd.setCursor(0, 0);
lcd.print("Button State 1");
lcd.setCursor(2, 1);
lcd.print("1 2 3 or 4");
for (b = 0; b < 256; b++) analogWrite(BLUEPIN, b);
for (g = 0; g < 256; g++) analogWrite(GREENPIN, g);
digitalWrite(PinA, LOW);
digitalWrite(PinB, LOW);
}
// Button 2: 緑→青→赤 フェード
if ((button2State == LOW) && !(button1State == LOW)) {
digitalWrite(PinA, HIGH);
digitalWrite(PinB, LOW);
analogWrite(GREENPIN, 256);
for (b = 256; b > 0; b--) analogWrite(BLUEPIN, b);
for (r = 256; r > 0; r--) analogWrite(REDPIN, r);
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(PinA, LOW);
digitalWrite(PinB, LOW);
for (b = 0; b < 256; b++) analogWrite(BLUEPIN, b);
for (r = 0; r < 256; r++) analogWrite(REDPIN, r);
}
// Button 3: 青→赤→緑 フェード
if ((button3State == LOW) && !(button4State == LOW)) {
digitalWrite(PinA, HIGH);
digitalWrite(PinB, LOW);
analogWrite(BLUEPIN, 256);
for (r = 256; r > 0; r--) analogWrite(REDPIN, r);
for (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");
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(PinA, LOW);
digitalWrite(PinB, LOW);
for (g = 0; g < 256; g++) analogWrite(GREENPIN, g);
for (r = 0; r < 256; r++) analogWrite(REDPIN, r);
}
// Button 4: 赤緑→青 フェード
if ((button4State == LOW) && !(button3State == LOW)) {
digitalWrite(PinA, HIGH);
digitalWrite(PinB, LOW);
analogWrite(REDPIN, 256);
analogWrite(GREENPIN, 256);
for (b = 256; b > 0; b--) analogWrite(BLUEPIN, b);
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(PinA, LOW);
digitalWrite(PinB, LOW);
for (b = 0; b < 256; b++) analogWrite(BLUEPIN, b);
}
}
コインアクセプター対応完全版コード C++
完全版コード
// Display
#include <LiquidCrystal.h>
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
// Stepper Library
#include <Stepper.h>
// Relay Setup
#define ENABLE 10
//#define PinA 8
//#define PinB 9
// Transistor pins for LEDs
#define REDPIN 38
#define GREENPIN 39
#define BLUEPIN 40
// int i;
int r, g, b;
// Constants
const int coinpin = 21;
const int ledpin = 13;
const int targetcents = 100;
// Variables
volatile int cents = 0;
int credits = 0;
// Defining pins section (同上)
// ... ピン定義は前コードと同じ ...
void setup() {
attachInterrupt(digitalPinToInterrupt(coinpin), coinInterrupt, RISING);
pinMode(button1Pin, INPUT);
pinMode(button2Pin, INPUT);
pinMode(button3Pin, INPUT);
pinMode(button4Pin, INPUT);
pinMode(ENABLE, OUTPUT);
// pinMode(PinA, OUTPUT);
// pinMode(PinB, 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 = credits + 1;
cents = cents - targetcents;
}
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) {
int button1State, button2State, button3State, button4State;
button1State = digitalRead(button1Pin);
button2State = digitalRead(button2Pin);
button3State = digitalRead(button3Pin);
button4State = digitalRead(button4Pin);
// Button 1
if ((button1State == LOW) && !(button2State == LOW)) {
digitalWrite(ENABLE, HIGH);
analogWrite(REDPIN, 256);
for (b = 256; b > 0; b--) analogWrite(BLUEPIN, b);
for (g = 256; g > 0; g--) analogWrite(GREENPIN, g);
for (g = 256; g > 0; 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 (b = 0; b < 256; b++) analogWrite(BLUEPIN, b);
for (g = 0; g < 256; g++) analogWrite(GREENPIN, g);
digitalWrite(ENABLE, LOW);
credits = credits - 1;
cents = cents - cents;
}
// Button 2
if ((button2State == LOW) && !(button1State == LOW)) {
digitalWrite(ENABLE, HIGH);
analogWrite(GREENPIN, 256);
for (b = 256; b > 0; b--) analogWrite(BLUEPIN, b);
for (r = 256; r > 0; r--) analogWrite(REDPIN, r);
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);
digitalWrite(ENABLE, LOW);
for (b = 0; b < 256; b++) analogWrite(BLUEPIN, b);
for (r = 0; r < 256; r++) analogWrite(REDPIN, r);
credits = credits - 1;
cents = cents - cents;
}
// Button 3
if ((button3State == LOW) && !(button4State == LOW)) {
digitalWrite(ENABLE, HIGH);
analogWrite(BLUEPIN, 256);
for (r = 256; r > 0; r--) analogWrite(REDPIN, r);
for (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");
myStepper2.step(stepsPerRevolution);
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("Please take");
lcd.setCursor(3, 1);
lcd.print("Your Item");
delay(2500);
digitalWrite(ENABLE, LOW);
for (g = 0; g < 256; g++) analogWrite(GREENPIN, g);
for (r = 0; r < 256; r++) analogWrite(REDPIN, r);
credits = credits - 1;
cents = cents - cents;
}
// Button 4
if ((button4State == LOW) && !(button3State == LOW)) {
digitalWrite(ENABLE, HIGH);
analogWrite(REDPIN, 256);
analogWrite(GREENPIN, 256);
for (b = 256; b > 0; b--) analogWrite(BLUEPIN, b);
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);
digitalWrite(ENABLE, LOW);
for (b = 0; b < 256; b++) analogWrite(BLUEPIN, b);
credits = credits - 1;
cents = cents - cents;
}
}
}
void coinInterrupt() {
cents = cents + 5;
digitalWrite(ledpin, HIGH);
}
回路図
システム全体の完全な図面。ATX電源、モーター、LCD、LED、ライト、コントローラーを含む
製造プロセス
- EEG装置:設計、製造、新たな応用展開
- 自動販売機:366億ドル規模の米国産業パワーハウス
- ミシン:19世紀革新から現代自動化までの進化と製造
- フライドポテト自動販売機の仕組みと導入メリット徹底解説
- 生乳自動販売機(ミルクATM)の仕組み・メリット・衛生管理の全知識
- チップ自動販売機:熱々フライドポテトをオンデマンドで提供する仕組み
- 麺類自動販売機を発見:仕組みと購入可能商品
- 革新的な茶・コーヒー・スープ自動販売機を探る
- ミールプレップ自販機:いつでも新鮮・ヘルシーな食事を提供
- CNC旋盤の基礎と応用:構造・制御・工具・自動化で実現する高精度旋削加工
- 利益を解き放つ:アイスキャンディー自販機のビジネスポテンシャル




