Arduinoで作るDIYキャンディディスペンサー:スマートなお菓子マシン
必要な部品と用品
| 部品 | 数量 | 備考 |
|---|---|---|
| Arduino UNO | 1 | |
| サーボモーター(180°回転) | 1 | |
| LCDディスプレイ 16x2(白文字/青背景、I2C搭載) | 1 | Adafruit製等 |
| タクトスイッチ 12mm | 2 | 「少し」「たくさん」選択用 |
| PHPoC Shield for Arduino | 1 | ネットワーク機能拡張用(任意) |
| IR距離センサー(障害物検知用) | 1 | カップ検知に使用 |
| 電源スイッチ | 1 | |
| ブレッドボード | 1 |
必要な工具
- はんだごて
使用するアプリ
- Arduino IDE
プロジェクト概要
プロジェクトの全体像
IRセンサー、サーボ、プッシュボタンだけで作れるシンプルなキャンディディスペンサーです。工程は以下の5ステップ:
- Arduino Uno R3の準備
- コーディングとセットアップ
- ケースと機械部品の製作
- 電子部品の取り付け
- テストと使用
コーディングが最も時間がかかりました(初心者のため)。Google検索と友人の助けで何とか完成。参考にしたオリジナル作品:
Google Assistant対応キャンディディスペンサー の簡易版です。
ケースと機械部品の製作
丸1日かけて試行錯誤の末に完成。段ボールとアクリル板を使用。
ステップ1:部品のレイアウト
段ボール上に全部品を配置し、配線色分けで管理。各部品の動作テストもここで実施。
ステップ2:箱の設計・切り出し
| パーツ | サイズ | 素材 |
|---|---|---|
| 前面・背面 | 20cm × 16cm | 背面はアクリル |
| 側面(左右) | 12cm × 16cm | 段ボール |
| 天面・底面 | 20cm × 12cm | 段ボール |
ステップ3:組み立てと切り抜き
マスキングテープで仮組みし、以下の穴を開けます:
- LCD:7.2cm × 2.5cm
- ボタン:1.2cm × 1.2cm(2個)
- カップ挿入口:9cm × 12cm(高さ×幅)、奥行き9cm
- センサー用穴
お菓子が一度に落ちないよう、内部に段差を設けています。
ステップ4:基板の配置
ブレッドボードとArduinoをアクリル板で重ねて固定し、省スペース化。
ステップ5:部品の取り付け
- LCDとボタンを前面に取り付け
- 配線後、箱の中央に固定
- サーボモーターを取り付け(お菓子排出口に連動)
- 背面に電源スイッチと電池ボックスを設置
ステップ6:完成
外観はシンプルながら、全機能が収まったコンパクトなディスペンサーになりました。
Arduinoコード
//------ライブラリ------
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
//----------------------
// LCDアドレス 0x27、16文字×2行
LiquidCrystal_I2C lcd(0x27, 16, 2);
Servo myservo;
int pos = 90; // サーボ初期位置
int buttonCLK = 7; // 「少し」ボタン
int buttonAntiCLK = 6; // 「たくさん」ボタン
int set = 0; // 選択状態
const int avoidPin = 5; // IR障害物センサーピン
void setup() {
lcd.begin();
lcd.clear();
myservo.attach(9); // サーボ:D9
pinMode(buttonCLK, INPUT);
pinMode(buttonAntiCLK, INPUT);
pinMode(avoidPin, INPUT);
Serial.begin(9600);
lcd.backlight();
// 起動メッセージ
lcd.setCursor(3,0); lcd.print("Welcome to");
lcd.setCursor(3,1); lcd.print("Candy Land");
delay(2000);
lcd.clear();
lcd.setCursor(0,0); lcd.print("How much candy?");
lcd.setCursor(0,1); lcd.print("A Little A Lot");
delay(5000);
}
void loop() {
// ボタン処理
if (digitalRead(buttonCLK) == HIGH) { // 「少し」押下
lcd.clear(); lcd.print("Please Place Cup");
delay(2000); lcd.clear();
set = set + 1;
}
if (digitalRead(buttonAntiCLK) == HIGH) { // 「たくさん」押下
lcd.clear(); lcd.print("Please Place Cup");
delay(2000); lcd.clear();
set = set + 2;
}
// 選択に応じた処理
if (set == 1) { IRCLK(); }
if (set == 2) { IRAntiCLK(); }
}
// 時計回り(少し)
void TurnClockwise() {
Serial.println("Candy 1 Being Dispensed");
CandyText1();
for (pos = 90; pos < 180; pos += 1) {
myservo.write(pos);
delay(15);
}
if (pos == 180) {
delay(2000);
ThankYouText();
}
}
// 反時計回り(たくさん)
void TurnAntiClockwise() {
Serial.println("Candy 2 Being Dispensed");
CandyText2();
for (pos = 90; pos < 180; pos += 1) {
myservo.write(pos);
delay(20);
}
if (pos == 180) {
delay(3000);
ThankYouText();
}
}
// IRセンサー検知→少し排出
void IRCLK() {
delay(1000);
boolean avoidVal = digitalRead(avoidPin);
lcd.setCursor(0,0); lcd.print("Detecting Cup");
lcd.setCursor(0,14); lcd.print("...");
if (avoidVal == LOW) { // カップ検知
lcd.clear(); lcd.print("Cup Placed");
delay(2000);
TurnClockwise();
}
}
// IRセンサー検知→たくさん排出
void IRAntiCLK() {
delay(1000);
boolean avoidVal = digitalRead(avoidPin);
lcd.setCursor(0,0); lcd.print("Detecting Cup");
lcd.setCursor(0,14); lcd.print("...");
if (avoidVal == LOW) {
lcd.clear(); lcd.print("Cup Placed");
delay(2000);
TurnAntiClockwise();
}
}
// 表示関数群
void CandyText1() {
lcd.clear(); lcd.setCursor(4,0); lcd.print("Pouring");
lcd.setCursor(1,1); lcd.print("Little Candy");
}
void CandyText2() {
lcd.clear(); lcd.setCursor(4,0); lcd.print("Pouring");
lcd.setCursor(3,1); lcd.print("Lot Candy");
}
void ThankYouText() {
lcd.clear(); lcd.setCursor(5,0); lcd.print("Thank");
lcd.setCursor(6,1); lcd.print("You");
delay(15);
software_Reset();
}
// ソフトウェアリセット(最初から再開)
void software_Reset() {
asm volatile ("jmp 0");
}
回路図
配線は色分けに従って接続してください。Fritzingファイルまたは画像を参照。
製造プロセス
- キャンディケイン:歴史、製造、そして定番ホリデー菓子の甘い科学
- キャンディコーン:伝統から現代生産へ
- ジョーブレイカー:伝統的ハードキャンディの歴史、原料、職人技
- 綿菓子:クラシック菓子から現代生産技術へ
- グミキャンディの甘い科学:歴史から現代生産まで
- M&M'sチョコレート:発明から現代生産まで
- Microsoft Flight Simulator 2020用Arduinoスイッチ&LEDパネル
- Bluetooth操作のArduinoスパイボットを自作する
- FlickMote:ジェスチャー操作のIRリモコンでスマートホームを制御
- 自作Arduino TV-B-Gone:全テレビ対応の万能リモコン
- 12メートル先から見える大型LEDマスタークロック(アラーム機能付き)を自作しよう