工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

Arduinoを搭載したスナック自動販売機

コンポーネントと消耗品

>
Arduino UNO
IOを増やすために、代わりにArduinoMegaを使用する必要があります。
× 1
センサーシールド
× 1
DCモーター6Vインクルードホイール
× 3
製品検出に使用される赤外線(反射)またはラインフォロワーセンサー
× 3
近接(電磁)センサー、コインセンサー番号1に使用
× 1
コインセンサーに使用される距離インターアプター(赤外線/オプトカプラー)センサー番号2
× 1
DCモーター用電源6V
× 1
リレー(汎用)
4スイッチリレー
× 1
LCD(Nokia 5110 LCD)
× 1
LED(汎用)
白色LED
× 2
プッシュボタン
赤、黄、緑
× 3

アプリとオンラインサービス

>
Arduino IDE
Solidworks
または任意の3Dモデルメーカー

このプロジェクトについて

イントロ

こんにちは、インドネシアからのご挨拶。

このスナック自動販売機は私の最後のプロジェクトです。このプロジェクトは実際には2015年末に終了しました。

このプロジェクトの目的は、地元の店舗で入手できる「安価で入手しやすい」コンポーネントを使用して、arduinoマイクロコントローラーを搭載した自動販売機を作成することです。

以下のこのビデオは、支払い/コインテスト、製品の選択、および製品の配送からのスナック自動販売機の最終テストビデオです。

それで、これは私がその目標を達成するためにしたことです:

ステップ1:コンセプトをスケッチする

まず最初に考えてください、コンセプト

このスケッチは、私が何を作成するかについての私の最初のアイデアです。コインを支払いとして受け取り、アクリルケースを使用するスナック自動販売機になります。

コンセプトを選んで成熟させる 、あらゆるシナリオ、あらゆる条件について考えてみてください。

<図>

すべてをスケッチしてみてください。あなたの絵が醜くても心配しないでください。私の絵を真剣に見てください。 :D

考えられないことについて考える適切な時期は、プロジェクトが始まる前です。

ステップ2:3Dモデルを作成する

たぶん、このステップはすべての人にとって必要なわけではありませんが、私にとって、そしてこのプロジェクトにとって、それは非常に重要です。

<図>

Solidworksモデルを作成します。そして、私は本当に完全に完成したモデルを意味します。製品、この場合はスナックパッケージの寸法を決定する必要があります。受け入れられたコインのサイズ、拒否されたコインのサイズ、コインスロットのサイズ、コインランプのサイズ、プッシュボタンのサイズ、ほとんどすべてのサイズ。このステップには、使用するArduinoマイクロコントローラーのサイズの比較、選択、測定が含まれます。使用したセンサー、または将来使用する可能性のあるセンサー、配置場所、寸法とサイズ、受け入れられたコインの行き先、モノクロLCDを配置する場所についても考えます(必須ではありませんが、私は主張します)。

そして最後に、Solidworksモデルの作成では、すべての部品にネジ用の穴を作成することを忘れないでください。

ケースはアクリル素材で、レーザーカット方式でカットしています。そのため、モデルをできるだけ詳細かつ正確に作成します。モデルが正確であればあるほど、より正確なケースが得られるからです。

ステップ3:コインスロットを設計する

コインをフィルタリングするために、最初にコインディメンションを使用しています。スロットコインをデザインすることで、マシンに入ることができるコインのサイズを決定できます。 。

次に、2番目のフィルターで、どのコインサイズを受け入れてコインホルダーにロールダウンできるかを決定します。 。

重力を利用するため、コインのサイズ(直径)がコインランプ/トラックの長さよりも小さい場合、落下して拒否されます。

<図>
  • 上の写真では、左側のコインはスロットコインに入りません。
  • 真ん中のコインは落ちて拒否されます。
  • 右側のコインは受け入れられたコインで、コインホルダーに下がっています。

これは私がコインテストをしているときのビデオです。この方法がどのように機能するかを示します。

ステップ4:すべてのコンポーネントを準備してテストする

<図>

arduinoを準備し、必要なものをすべて準備します。

<図>

すべてのコンポーネント、LCDプッシュボタン、リレー、LEDをテストし、すべてを組み合わせて、さまざまなロジックとコーディングを学習してみてください。あなたが何をしているのかを知っていることを確認してください。限界までテストし、限界を見つけてください。ただし、限界を超えないでください。

抵抗器を使用する理由、これが発生した場合、またはセンサーの読み取り値が安定しない理由、センサーによって実際に読み取られた値など。テストを行ったところ、近接センサーの読み取り値が「クリーンではない」ことがわかりました。落ち着いてください。

<図>

赤外線センサーのパフォーマンスは非常に悪く、直射日光の下では正常ではありません(これについては以前から知っていましたが、今まで実際に衝撃を感じることはありませんでした)。解決策は、写真に示すように、赤外線センサーのレシーバー部分の周りを分離するためにダクトテープを使用することです。

ステップ5:スパイラルメカニズムを構築する

これは、自動販売機の最も重要な部分の1つであり、メカニズムを提供します。

直径9cmのPVCパイプを使用して手動でスパイラル状に成形されたアルミニウムワイヤー(ワイヤー直径2mm)を使用したスパイラルメカニズムを使用しています。

<図> <図> <図>

スパイラルワイヤーは、ケーブルタイを使用してホイールに結ばれます。 DCモーターがオンになると、ホイールが回転し、スパイラルワイヤーが回転します。

回転スパイラルは、実際には回転を線形運動に変換しています 製品の。

ステップ6:コイン識別メカニズムを構築する

<図> <図> <図>

最初の写真はコインセンサー番号1で、近接センサーまたは誘導電磁石センサーを使用しています。受け入れられたコインがこのセンサーを通過すると、arduinoが時間(ミリ秒単位)のカウントを開始します。

  Sensor1がトリガーされた場合、ミリ秒単位で時間のカウントを開始します 

そして、承認されたコインパスコインセンサー番号2、距離インタープターセンサー、arduinoは時間のカウントを停止し、その特定のコインがセンサー番号1からセンサー番号2に移動するのに必要な時間を取得します。

  Sensor2がトリガーされた場合は、ミリ秒単位の時間のカウントを停止します。 「移動時間」はxxxミリ秒です 

磁石を使いすぎないでください。磁石が詰まり、コインランプの途中でコインが止まります。 センサー番号1と番号2の間の「移動時間」を取得するために、すべてのコインの時間をカウントする必要があるため、これが発生することは望ましくありません。この「移動時間」(ミリ秒単位)は、arduinoが受け入れられたコイン。

 「移動時間」が「yyy」ミリ秒以上の場合は「aaa」コイン、それ以外の場合は「bbb」 

これは、磁石を使用してコインを識別し、この方法をテストしたときのビデオです。

ステップ7:製品検出メカニズムを構築する

スパイラル機構で押したり動かしたりして落下したときの製品検出に3つの赤外線センサーを使用しています。

<図>

製品が落下すると、赤外線センサーがトリガーされ、オフ信号がDCモーターに送信されます(リレーを介して)。

このビデオは、この自動販売機で製品検出がどのように機能するかを示しています。

ステップ8:情報にLCDを使用する

<図>

このプロジェクトでは、顧客がコインを入力するたびに、受け入れられたコインの価値に関する情報(インドネシア通貨)を表示するLCDを作成します。また、受け入れられたコインからの合計残高、およびこのマシンを操作するためのステップバイステップに関するその他の一般的な指示も表示されます。

マシンの電源がオンになったとき

  • メインディスプレイ="コインを入力してください"。
  • 入力されたコインの場合="コインの価値と合計残高を表示します。
  • コインが入力されなかった場合=メイン表示を維持します。

コインが正常に識別された後

  • 合計残高が商品の価格以上の場合="商品を選択してください"。
  • 商品の価格よりも低い総量の場合=「より多くのコインを入力してください」。

スパイラル機構がオンになった後(配信が発生)

  • 製品検出メカニズムがトリガーされた場合=「ありがとう」、トランザクションが完了しました。
  • 遅延して、メインディスプレイに戻ります。

ステップ9:仕上げとテスト

最後に、スナック自動販売機が完成しました。;)

<図> <図> <図>

約3か月後、支払い/コインテスト、製品の選択、製品の配送など、このマシンの最終テストを行う準備が整いました。

これはスナック自動販売機の最終テストビデオです:

このプロジェクトが、次のArduino搭載の自動販売機の構築と作成について、インスピレーションやアイデアを提供してくれることを願っています。

ステップ10:改善の余地

このスナック自動販売機を改善するためのいくつかのアイデア:

  • コインチェンジャーメカニズムを追加します。
  • 紙幣を受け取ります。
  • ビットコインやデジタル決済を受け入れます。
  • LCDに製品在庫を表示します。
  • IoT:トランザクションが発生するたびにインターネット経由で通知します。
  • IoT:商品の在庫が空か少ない場合などに通知します。
<図>

特別な感謝:ITENASバンドン、機械工学科。

コード

  • スナック自動販売機のソースコード
スナック自動販売機のソースコード Arduino
これは、この自動販売機プロジェクトに使用したソースコードです
 const byte SIAP =0; const byte KOIN_MASUK1 =1; const byte KOIN_MASUK2 =2; const byte KOIN_MASUK3 =3; const byte KOIN_MASUK4 =4; const byte KOIN_MASUK5 =5; const byte KOIN_MASUK6 =6; const byte KOIN_MASUK7 =7; const byte SALDO_500 =8; const byte SALDO_500500 =9; const byte SALDO_500500500 =10; const byte SALDO_500500500500 =11; const byte SALDO_5005005001000 =12; const byte SAL SALDO_5001000500 =14; constバイトSALDO_50010001000 =15; constバイトSALDO_5005001000 =16; constバイトSALDO_1000 =17; constバイトSALDO_10001000 =18; constバイトSALDO_1000500 =19; constバイトSALDO_1000500500 =20; constバイトSALDO_10005001000 =21; 22; byte state =SIAP; const float jeda_waktu =876; unsigned long time1; unsigned long time2; unsigned long time3; unsigned long time4; unsigned long time5; unsigned long time6; unsigned long time7; #define PIN_SCE 7#define PIN_RESET 6# PIN_DCを定義する5#PIN_SDを定義するIN 4#define PIN_SCLK 3#define LCD_C LOW#define LCD_D HIGH#define LCD_X 84#define LCD_Y 48static const byte ASCII [] [5] ={{0x00、0x00、0x00、0x00、0x00} // 20、{0x00、 0x00、0x5f、0x00、0x00} // 21! 、{0x00、0x07、0x00、0x07、0x00} // 22 "、{0x14、0x7f、0x14、0x7f、0x14} // 23#、{0x24、0x2a、0x7f、0x2a、0x12} // 24 $、{ 0x23、0x13、0x08、0x64、0x62} // 25%、{0x36、0x49、0x55、0x22、0x50} // 26&、{0x00、0x05、0x03、0x00、0x00} // 27 '、{0x00、 0x1c、0x22、0x41、0x00} // 28(、{0x00、0x41、0x22、0x1c、0x00} // 29)、{0x14、0x08、0x3e、0x08、0x14} // 2a *、{0x08、0x08、 0x3e、0x08、0x08} // 2b +、{0x00、0x50、0x30、0x00、0x00} // 2c 、、 {0x08、0x08、0x08、0x08、0x08} // 2d-、{0x00、0x60、0x60、 0x00、0x00} // 2e。、{0x20、0x10、0x08、0x04、0x02} // 2f /、{0x3e、0x51、0x49、0x45、0x3e} // 30 0、{0x00、0x42、0x7f、0x40、 0x00} // 31 1、{0x42、0x61、0x51、0x49、0x46} // 32 2、{0x21、0x41、0x45、0x4b、0x31} // 33 3、{0x18、0x14、0x12、0x7f、0x10} // 34 4、{0x27、0x45、0x45、0x45、0x39} // 35 5、{0x3c、0x4a、0x49、0x49、0x30} // 36 6、{0x01、0x71、0x09、0x05、0x03} // 37 7、{0x36、0x49、0x49、0x49、0x36} // 38 8、{0x06、0x49、0x49、0x29、0x1e} / / 39 9、{0x00、0x36、0x36、0x00、0x00} // 3a:、{0x00、0x56、0x36、0x00、0x00} // 3b; 、{0x08、0x14、0x22、0x41、0x00} // 3c <、{0x14、0x14、0x14、0x14、0x14} // 3d =、{0x00、0x41、0x22、0x14、0x08} // 3e>、{ 0x02、0x01、0x51、0x09、0x06} // 3f? 、{0x32、0x49、0x79、0x41、0x3e} // 40 @、{0x7e、0x11、0x11、0x11、0x7e} // 41 A、{0x7f、0x49、0x49、0x49、0x36} // 42 B、{ 0x3e、0x41、0x41、0x41、0x22} // 43 C、{0x7f、0x41、0x41、0x22、0x1c} // 44 D、{0x7f、0x49、0x49、0x49、0x41} // 45 E、{0x7f、 0x09、0x09、0x09、0x01} // 46 F、{0x3e、0x41、0x49、0x49、0x7a} // 47 G、{0x7f、0x08、0x08、0x08、0x7f} // 48 H、{0x00、0x41、 0x7f、0x41、0x00} // 49 I、{0x20、0x40、0x41、0x3f、0x01} // 4a J、{0x7f、0x08、0x14、0x22、0x41} // 4b K、{0x7f、0x40、0x40、 0x40、0x40} // 4c L、{0x7f、0x02、0x0c、0x02、0x7f} // 4d M、{0x7f、0x04、0x08、0x10、0x7f} // 4e N、{0x3e、0x41、0x41、0x41、 0x3e} // 4f O、{0x7f、0x09、0x09、0x09、0x06} // 50 P、{0x3e、0x41、0x51、0x21、0x5e} // 51 Q、{0x7f、0x09、0x19、0x29、0x46} // 52 R、{0x46、0x49、0x49、0x49、0x31} // 53 S、{0x01、0x01、0x7f、0x01、0x01} // 54 T、{0x3f、0x40、0x40、0x40、0x3f} // 55 U、{0x1f、0x20、0x40、0x20、0x1f} // 56 V、{0x3f、0x40、0x38、0x40、0x3f} / / 57 W、{0x63、0x14、0x08、0x14、0x63} // 58 X、{0x07、0x08、0x70、0x08、0x07} // 59 Y、{0x61、0x51、0x49、0x45、0x43} // 5a Z、{0x00、0x7f、0x41、0x41、0x00} // 5b [、{0x02、0x04、0x08、0x10、0x20} //5cÂ¥、{0x00、0x41、0x41、0x7f、0x00} // 5d] 、{0x04、0x02、0x01、0x02、0x04} // 5e ^、{0x40、0x40、0x40、0x40、0x40} // 5f _、{0x00、0x01、0x02、0x04、0x00} // 60 `、{ 0x20、0x54、0x54、0x54、0x78} // 61 a、{0x7f、0x48、0x44、0x44、0x38} // 62 b、{0x38、0x44、0x44、0x44、0x20} // 63 c、{0x38、 0x44、0x44、0x48、0x7f} // 64 d、{0x38、0x54、0x54、0x54、0x18} // 65 e、{0x08、0x7e、0x09、0x01、0x02} // 66 f、{0x0c、0x52、 0x52、0x52、0x3e} // 67 g、{0x7f、0x08、0x04、0x04、0x78} // 68 h、{0x00、0x44、0x7d、0x40、0x00} // 69 i、{0x20、0x40、0x44、 0x3d、0x00} // 6a j、{0x7f、0x10、0x28、0x44、0x00} // 6b k、{0x00、0x41、0x7f、0x40、0x00} // 6c l、{0x7c、0x04、0x18、0x04、 0x78} // 6d m、{0x7c、0x08、0x04、0x04、0x78} // 6e n、{0x38、0x44、0x44、0x44 、0x38} // 6f o、{0x7c、0x14、0x14、0x14、0x08} // 70 p、{0x08、0x14、0x14、0x18、0x7c} // 71 q、{0x7c、0x08、0x04、0x04、0x08 } // 72 r、{0x48、0x54、0x54、0x54、0x20} // 73 s、{0x04、0x3f、0x44、0x40、0x20} // 74 t、{0x3c、0x40、0x40、0x20、0x7c} / / 75 u、{0x1c、0x20、0x40、0x20、0x1c} // 76 v、{0x3c、0x40、0x30、0x40、0x3c} // 77 w、{0x44、0x28、0x10、0x28、0x44} // 78 x、{0x0c、0x50、0x50、0x50、0x3c} // 79 y、{0x44、0x64、0x54、0x4c、0x44} // 7a z、{0x00、0x08、0x36、0x41、0x00} // 7b {、 {0x00、0x00、0x7f、0x00、0x00} // 7c | 、{0x00、0x41、0x36、0x08、0x00} // 7d}、{0x10、0x08、0x08、0x10、0x08} //7eâ†�、{0x78、0x46、0x41、0x46、0x78} //7fâ † '}; void LcdWrite(byte dc、byte data){digitalWrite(PIN_DC、dc); digitalWrite(PIN_SCE、LOW); shiftOut(PIN_SDIN、PIN_SCLK、MSBFIRST、データ); digitalWrite(PIN_SCE、HIGH);} void LcdCharacter(char character){LcdWrite(LCD_D、0x00); for(int index =0; index <5; index ++){LcdWrite(LCD_D、ASCII [character-0x20] [index]); } LcdWrite(LCD_D、0x00);} void LcdClear(void){for(int index =0; index  Siap"); LcdInitialise(); LcdClear(); LcdString( "Masukkan Koin Rp500 atau Koin Rp1000 @ Rp2000"); delay(500);} void loop(){int x =analogRead(14); if(state ==SIAP){if(x> =33){state =KOIN_MASUK1; time1 =ミリ秒();トーン(2、4200、40); Serial.println( "snsr1、"); Serial.println( "start wkt"); }} else if((state ==KOIN_MASUK1)&&(!(digitalRead(13)))){if((digitalRead(12))&&(state ==KOIN_MASUK1)){unsigned long diff1 =(millis()-time1 ); Serial.println( "snsr2、"); Serial.println( "stop wkt"); Serial.print( "jeda wkt:"); Serial.print(diff1); Serial.println( "ms"); if(diff1> jeda_waktu){状態=SALDO_1000; LcdInitialise(); LcdClear(); LcdString( "diterima Saldo =Rp1000 Tambah Koin Koin Rp1000"); digitalWrite(13、HIGH); Serial.println( "koin =Rp 1000、Saldo:Rp1000");トーン(2、4200、299); } else if(diff1  =33){state =KOIN_MASUK2; time2 =ミリ秒();トーン(2、4200、40); Serial.println( "snsr1、"); Serial.println( "start wkt"); }} else if((state ==KOIN_MASUK2)&&((digitalRead(13)))){if((digitalRead(12))&&(state ==KOIN_MASUK2)){unsigned long diff2 =(millis()-time2); Serial.println( "snsr2、"); Serial.println( "stop wkt"); Serial.print( "jeda wkt:"); Serial.print(diff2); Serial.println( "ms"); if(diff2> jeda_waktu){状態=SALDO_5001000; LcdInitialise(); LcdClear(); LcdString( "diterima Saldo =Rp1500 Tambah Koin Koin Rp1000");トーン(2、4200、299); Serial.println( "koin =Rp 1000、Saldo:Rp1500"); } else if(diff2  =33){state =KOIN_MASUK3; time3 =ミリ秒();トーン(2、4200、40); Serial.println( "snsr1、"); Serial.println( "start wkt"); }} else if((state ==KOIN_MASUK3)&&((digitalRead(13)))){if((digitalRead(12))&&(state ==KOIN_MASUK3)){unsigned long diff3 =(millis()-time3); Serial.println( "snsr2、"); Serial.println( "stop wkt"); Serial.print( "jeda wkt:"); Serial.print(diff3); Serial.println( "ms"); if(diff3> jeda_waktu){状態=SALDO_5005001000; LcdInitialise(); LcdClear(); LcdString( "diterima Saldo =Rp2000 Pilih Produk Koin Rp1000"); Serial.println( "koin =Rp 1000、Saldo:Rp2000");トーン(2、4200、799); } else if(diff3  =33){state =KOIN_MASUK4; time4 =ミリ秒();トーン(2、4200、40); Serial.println( "snsr1、"); Serial.println( "start wkt"); }} else if((state ==KOIN_MASUK4)&&((digitalRead(13)))){if((digitalRead(12))&&(state ==KOIN_MASUK4)){unsigned long diff4 =(millis()-time4); Serial.println( "snsr2、"); Serial.println( "stop wkt"); Serial.print( "jeda wkt:"); Serial.print(diff4); Serial.println( "ms"); if(diff4> jeda_waktu){状態=SALDO_5005005001000; LcdInitialise(); LcdClear(); LcdString( "diterima Saldo =Rp2500 Pilih Produk Koin Rp1000"); Serial.println( "koin =Rp 1000、Saldo:Rp2500");トーン(2、4200、799); } else if(diff4  =33){state =KOIN_MASUK5; time5 =ミリ秒();トーン(2、4200、40); Serial.println( "snsr1、"); Serial.println( "start wkt"); }} else if((state ==KOIN_MASUK5)&&((digitalRead(13)))){if((digitalRead(12))&&(state ==KOIN_MASUK5)){unsigned long diff5 =(millis()-time5); Serial.println( "snsr2、"); Serial.println( "stop wkt"); Serial.print( "jeda wkt:"); Serial.print(diff5); Serial.println( "ms"); if(diff5> jeda_waktu){状態=SALDO_50010001000; LcdInitialise(); LcdClear(); LcdString( "diterima Saldo =Rp2500 Pilih Produk Koin Rp1000"); Serial.println( "koin =Rp 1000、Saldo:Rp2500");トーン(2、4200、799); } else if(diff5  =33){state =KOIN_MASUK6; time6 =ミリ秒();トーン(2、4200、40); Serial.println( "snsr1、"); Serial.println( "start wkt"); }} else if((state ==KOIN_MASUK6)&&((digitalRead(13)))){if((digitalRead(12))&&(state ==KOIN_MASUK6)){unsigned long diff6 =(millis()-time6); Serial.println( "snsr2、"); Serial.println( "stop wkt"); Serial.print( "jeda wkt:"); Serial.print(diff6); Serial.println( "ms"); if(diff6> jeda_waktu){状態=SALDO_10001000; LcdInitialise(); LcdClear(); LcdString( "diterima Saldo =Rp2000 Pilih Produk Koin Rp1000"); Serial.println( "koin =Rp 1000、Saldo:Rp2000");トーン(2、4200、799); } else if(diff6  =33){state =KOIN_MASUK7; time7 =ミリ秒();トーン(2、4200、40); Serial.println( "snsr1、"); Serial.println( "start wkt"); }} else if((state ==KOIN_MASUK7)&&((digitalRead(13)))){if((digitalRead(12))&&(state ==KOIN_MASUK7)){unsigned long diff7 =(millis()-time7); Serial.println( "snsr2、"); Serial.println( "stop wkt"); Serial.print( "jeda wkt:"); Serial.print(diff7); Serial.println( "ms"); if(diff7> jeda_waktu){状態=SALDO_10005001000; LcdInitialise(); LcdClear(); LcdString( "diterima Saldo =Rp2500 Pilih Produk Koin Rp1000"); Serial.println( "koin =Rp 1000、Saldo:Rp2500");トーン(2、4200、799); } else if(diff7  Siap"); }}} 

カスタムパーツとエンクロージャー

これは、このプロジェクトのSolidworks3Dモデルのプリントスクリーンです。

製造プロセス

  1. 自動販売機
  2. K30センサーによるCO2モニタリング
  3. あなたの身長はどれくらいですか?
  4. ArduinoまたはESP8266を搭載した静電容量式指紋センサー
  5. Arduinoクラウドセンサータワー
  6. モーションセンサー水鉄砲
  7. リバース自動販売機(RVM)
  8. Arduinoを搭載したミニレーダー
  9. 中古機械価格
  10. 牛乳自販機とは?
  11. 麺自販機とは?