Arduino駆動スナック自販機:設計&製作ガイド
必要なパーツと用品
| Arduino UNO(※Megaの方がI/O多くて良い) | ×1 |
| センサーシールド | ×1 |
| DCモーター 6V(ホイール付き) | ×3 |
| 赤外線反射型/ラインフォロワーセンサー(商品検知用) | ×3 |
| 近接センサー(電磁誘導式、コインセンサー1用) | ×1 |
| 距離遮断型センサー(赤外線/フォトカプラ、コインセンサー2用) | ×1 |
| DCモーター用 6V電源 | ×1 |
| リレー(4チャネル) | ×1 |
| LCD(Nokia 5110) | ×1 |
| LED(白) | ×2 |
| プッシュボタン(赤・黄・緑) | ×3 |
アプリとオンラインサービス
| Arduino IDE |
| SolidWorks(または任意の3Dモデリングツール) |
このプロジェクトについて
はじめに
こんにちは、インドネシアからご挨拶します。
このスナック自販機は私の卒業制作プロジェクトです。実際には2015年末に完成しました。
目的は、Arduinoマイコンで制御する自販機を、「地元の店で安く簡単に手に入る」部品だけで作ることです。
以下の動画は最終テストの様子です:支払い/コインテスト、商品選択、商品排出。
目標達成のために私が行った手順は以下の通りです:
ステップ1:コンセプトをスケッチする
まず第一に、コンセプトです。
これは私が最初に考えたイメージスケッチです。スナック自販機で、コイン投入による支払い、アクリルケースを想定しています。
コンセプトを選び、練り上げること。あらゆるシナリオ、あらゆる条件を想像してみてください。
すべてスケッチしてみましょう。絵が下手でも気にしないでください。私の絵を見てください :D
プロジェクト開始前に「考えられないこと」を考えるのが正しいタイミングです。
ステップ2:3Dモデルを作成する
このステップは全員に必要とは限りませんが、私とこのプロジェクトにとっては極めて重要でした。
SolidWorksでモデルを作成しました。それも完全に完成したモデルです。商品(スナック包装)の寸法、受け入れるコインのサイズ、排除するコインのサイズ、コイン投入口のサイズ、コインレールのサイズ、プッシュボタンのサイズ、ほぼすべての寸法を決定する必要があります。このステップには、Arduinoマイコンのサイズ比較・選定・計測、使用センサーの選定と配置、その寸法、受け入れコインの行き先、モノクロLCDの配置(必須ではないが私はこだわった)なども含まれます。
最後に、3Dモデル作成時に全パーツのネジ穴も忘れずに作成します。
ケースはアクリル素材で、レーザーカットで作ります。だからこそ、モデルをできるだけ詳細かつ正確に作る必要があります。モデルが正確であれば、より精密なケースが得られます。
ステップ3:コイン投入口を設計する
コインの選別には、まずコインの寸法を利用します。コイン投入口を設計することで、どのサイズのコインを機械内部に入れるかを決められます。
次に、どのサイズのコインを受け入れ、コインホルダーまで転がり落ちるかを決めます。
重力を利用するため、コインの直径がコインレール/トラックの長さより小しければ、落下して排除されます。
- 左のコイン: 投入口に入らない
- 中央のコイン: 落下して排除される
- 右のコイン: 受け入れコイン、コインホルダーへ
この方式の動作テスト動画は元記事を参照してください。
ステップ4:すべてのコンポーネントを準備・テストする
Arduinoを用意し、必要なものをすべて準備します。
すべてのコンポーネントをテストします:LCD、プッシュボタン、リレー、LEDなど、すべてを組み合わせてさまざまなロジックとコーディングを試します。自分が何をやっているか理解しているか確認してください。限界までテストし、限界を見つけます(ただし壊さないように)。
なぜ抵抗が必要か、これがどうなるか、なぜセンサー読み取りが安定しないか、センサーが実際に読み取っている値は何か、など。テストの結果、近接センサーの読み取りが「ノイジー」で、抵抗を追加して落ち着かせる必要があることがわかりました。
赤外線センサーは直射日光下で非常に悪く、正常に動作しません(以前から知っていましたが、実際の影響を初めて実感しました)。解決策は、赤外線センサーの受光部周りをダクトテープで遮光することです(写真参照)。
ステップ5:スパイラル機構を作る
これは自販機で最も重要な部品の一つ、商品排出機構です。
スパイラル機構を採用し、アルミニウムワイヤー(線径2mm)を、直径9cmのPVCパイプを芯にして手作業でスパイラル形状に曲げました。
スパイラルワイヤーはケーブルタイでホイールに固定します。DCモーターが回るとホイールが回り、スパイラルワイヤーが回転します。
回転するスパイラルは、回転運動を商品の直線運動に変換します。
ステップ6:コイン識別機構を作る
1枚目の写真はコインセンサー1で、近接センサー(電磁誘導センサー)を使用します。受け入れコインがこのセンサーを通過すると、Arduinoが時間計測(ミリ秒)を開始します。
if センサー1が作動したら ミリ秒で時間計測開始
受け入れコインがコインセンサー2(距離遮断型センサー)を通過すると、Arduinoは計測を停止し、そのコインがセンサー1からセンサー2まで移動するのにかかった時間を取得します。
if センサー2が作動したら ミリ秒で時間計測停止。「移動時間」は xxx ミリ秒
磁石を大量に使わないでください。コインがコインレールの途中で詰まって止まってしまいます。 それは避けたいです。なぜなら、すべてのコインについてセンサー1とセンサー2間の「移動時間」を計測し、その「移動時間」(ミリ秒)でArduinoが受け入れコインの価値を判断するからです。
if "移動時間" >= "yyy" ミリ秒 なら "aaa" コイン、else "bbb" コイン
この方法でコインを磁石で識別するテスト動画は元記事を参照してください。
ステップ7:商品検知機構を作る
商品がスパイラル機構で押し出されて落下したときに検知するため、赤外線センサーを3個使用します。
商品が落下すると赤外線センサーが作動し、DCモーターへOFF信号を送ります(リレー経由)。
この自販機での商品検知の動作動画は元記事を参照してください。
ステップ8:LCDで情報表示
このプロジェクトでは、LCDに(インドネシア通貨で)受け入れコインの金額を毎回表示します。また、受け入れコインの合計残高、機械の操作手順なども表示します。
電源投入時
- メイン表示 = 「コインを投入してください」
- コイン投入時 = 「コイン金額と合計残高を表示」
- コイン未投入時 = メイン表示を維持
コイン正常識別後
- 合計残高 ≥ 商品価格なら = 「商品を選択してください」
- 合計残高 < 商品価格なら = 「さらにコインを投入してください」
スパイシャル機構作動後(排出発生)
- 商品検知機構作動なら = 「ありがとうございます」、取引完了
- 遅延後、メイン表示に戻る
ステップ9:仕上げとテスト
ついにスナック自販機が完成しました ;)
3ヶ月ほどかけて最終テストを行いました:支払い/コインテスト、商品選択、商品排出。
これが最終テスト動画です。
このプロジェクトが皆さんの参考になり、次なるArduino駆動自販機の製作のヒントやアイデアになれば幸いです。
ステップ10:改善の余地
このスナック自販機を改善するアイデア:
- お釣り機構の追加
- 紙幣対応
- ビットコイン/電子決済対応
- LCDに商品在庫表示
- IoT:取引ごとにインターネット経由で通知
- IoT:在庫切れ/少ない時に通知 など
特別謝辞:ITENASバンドン、機械工学科。
ソースコード
// スナック自販機用ソースコード
const byte SIAP = 0;
const byte KOIN_MASUK1 = 1;
// ... (状態定義多数) ...
const float jeda_waktu = 876; // コイン識別用閾値時間(ms)
#define PIN_SCE 7
#define PIN_RESET 6
#define PIN_DC 5
#define PIN_SDIN 4
#define PIN_SCLK 3
#define LCD_C LOW
#define LCD_D HIGH
#define LCD_X 84
#define LCD_Y 48
// ASCIIフォントデータ配列(省略)
void LcdWrite(byte dc, byte data) { ... }
void LcdCharacter(char character) { ... }
void LcdClear(void) { ... }
void LcdInitialise(void) { ... }
void LcdString(char *characters) { ... }
void setup() {
// ピンモード設定、シリアル開始、LCD初期化、メイン表示
pinMode(11, INPUT); // 赤外線センサー等
// ... 各ピン設定 ...
Serial.begin(9600);
Serial.println("=> Siap");
LcdInitialise();
LcdClear();
LcdString(" Masukkan Koin Rp500 atau Koin Rp1000 @ Rp2000");
delay(500);
}
void loop() {
int x = analogRead(14); // コインセンサー1読み取り
// 状態機械によるコイン識別、残高管理、商品選択、排出制御
// ... 詳細なステートマシン処理(元コード参照) ...
}
カスタムパーツとエンクロージャ
このプロジェクトのSolidWorks 3Dモデルのスクリーンショットです。
製造プロセス
- 自動販売機:366億ドル規模の米国産業パワーハウス
- K30 CO2センサで室内空気質をリアルタイム監視する
- デジタル身長計の自作:Arduino Nanoとレーザー距離センサーで成長記録
- DFRobot静電容量式指紋センサーをArduino/ESP8266で使う – 登録・認証・削除の完全ガイド
- ESP32で作るIoT環境モニター:温湿度・気圧・CO2をWebダッシュボードで可視化
- Arduino Nanoで作るスマートな動体検知水鉄砲
- リバースベンディングマシン(RVM):DIYスマートリサイクルシステムキット
- コンパクトなArduinoレーダーシステム – HC-SR04超音波センサー & 1.8インチST7735ディスプレイ搭載
- 生乳自動販売機(ミルクATM)の仕組み・メリット・衛生管理の全知識
- 麺類自動販売機を発見:仕組みと購入可能商品
- 利益を最大化:中古機械の最適価格設定