亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

由 Arduino 驱动的零食自动售货机

组件和用品

Arduino UNO
我应该改用 Arduino Mega,以获得更多 IO。
× 1
传感器屏蔽
× 1
直流电机 6V 含轮
× 3
红外(反射)或线跟随传感器,用于产品检测
× 3
接近(电磁)传感器,用于1号硬币传感器
× 1
距离中断器(红外/光耦)传感器,用于硬币传感器2号
× 1
直流电机6V电源
× 1
中继(通用)
4 开关继电器
× 1
LCD(诺基亚 5110 LCD)
× 1
LED(通用)
白色 LED
× 2
按钮
红色、黄色和绿色
× 3

应用和在线服务

Arduino IDE
Solidworks
或任何 3d 模型制造商

关于这个项目

介绍

你好,来自印度尼西亚的问候。

这台零食自动售货机是我的最终项目。该项目实际上是在2015年底完成的。

该项目的目标是创建一个自动售货机,由 arduino 微控制器驱动,使用本地商店中可用的“任何便宜且容易获得”的组件。

下面这个视频是零食自动售货机最终测试视频,从支付/投币测试,产品选择,到产品交付。

所以,这就是我为实现这些目标所做的:

第 1 步:勾勒概念

先想先,概念 .

这张草图是我对我可能建造的东西的第一个想法。它将是一个小吃自动售货机,接受硬币作为付款,并使用亚克力盒。

选择并完善您的概念 , 试着去想任何事情、任何场景、任何条件。

尽量画草图,别担心你的画丑,认真看我的画。 :D

在项目开始之前就应该考虑不可想象的事情。

第 2 步:创建 3D 模型

也许这一步不是每个人都需要的,但对我来说,对这个项目来说,它是至关重要的。

我创建了solidworks模型。我的意思是真正完全完成的模型。我需要确定产品的尺寸,在本例中为零食包装。接受硬币的大小,拒绝硬币的大小,投币口的大小,硬币斜面的大小,按钮的大小,几乎所有东西的大小。此步骤包括比较、挑选和测量所使用的 Arduino 微控制器的大小。使用了什么传感器,或者将来可能使用什么传感器,放置在哪里,尺寸和大小是多少,接受的硬币去哪里,我还考虑应该在哪里放置单色 LCD(这不是必需的,但我坚持)。

最后,仍然在 Solidworks 模型创建中,不要忘记为每个零件创建螺钉孔。

外壳由亚克力材料制成,并采用激光切割方法切割。这就是我尽可能详细和准确地创建模型的原因,因为我的模型越准确,我得到的案例就越准确。

第 3 步:设计一个投币口

要过滤硬币,首先我使用硬币维度。通过设计投币式硬币,我可以确定允许进入机器的硬币大小 .

然后第二个过滤器,我确定允许接受什么硬币尺寸并向下滚动到硬币容器 .

因为利用重力,如果硬币尺寸(直径)小于硬币坡道/轨道的长度,则硬币会掉落并被拒绝。

  • 在上图中,左边的硬币不会进入老虎机硬币。
  • 中间的硬币会掉落并被拒绝。
  • 右边的硬币是接受的硬币,归硬币持有人所有。

这是我在做一些硬币测试时的视频,它将向您展示这种方法的工作原理。

第 4 步:准备和测试每个组件

准备好您的 arduino,准备好所有需要的东西。

测试每个组件、LCD 按钮、继电器、LED,尝试组合所有内容并学习不同的逻辑和编码。确保你知道你在做什么。尝试测试到极限,找到极限,但不要打破它。

为什么要使用电阻,什么时候发生这个,或者那个,为什么传感器读数不稳定,传感器实际读取的值是什么等等。我做了测试,发现接近传感器读数“不干净”,需要加一个电阻来冷静一下。

红外传感器在阳光直射下表现非常糟糕且不正常(我之前知道这一点,但直到现在才真正感受到影响)。解决方案是使用胶带将红外传感器的接收器部分周围隔离,如图所示。

第 5 步:构建螺旋机制

这是自动售货机最重要的部分之一,交付机制。

我使用的是螺旋机构,用铝线(2mm 线径),在 9cm 直径 PVC 管的帮助下手动成型为螺旋。

螺旋线使用电缆扎带绑在车轮上。直流电机ON时,轮子转动,螺旋线会转动。

旋转螺旋实际上是将旋转转化为直线运动 产品。

第六步:建立硬币识别机制

第一张图是1号硬币传感器,它使用接近传感器或感应电磁传感器。当接受的硬币通过这个传感器时,它会触发arduino开始计数时间(以毫秒为单位)。

如果sensor1被触发,则以毫秒为单位开始计时 

当接受硬币通过 2 号传感器时,距离中断传感器,arduino 将停止计数时间,并获取该特定硬币从 1 号传感器到 2 号传感器所需的时间。

如果sensor2被触发,则停止以毫秒为单位计数时间。 “行程时间”为 xxx 毫秒  

不要使用过多的磁铁,因为它会卡住并使硬币停在硬币坡道中间。 我们不希望这种情况发生,因为我们需要计算每个硬币的时间,以获得 1 号和 2 号传感器之间的“旅行时间”。这个“旅行时间”(以毫秒为单位)用于 arduino 来确定接受硬币。

如果“旅行次数”大于或等于“yyy”毫秒,则为“aaa”币,否则为“bbb” 

这是我测试这个方法时的视频,用磁铁识别硬币。

第七步:建立产品检测机制

当产品因螺旋机构推动/移动而掉落时,我正在使用 3 个红外传感器进行产品检测。

当产品跌落时,触发红外传感器,向直流电机(通过继电器)发送OFF信号。

该视频展示了产品检测在这台自动售货机中的工作原理。

第 8 步:使用 LCD 获取信息

在这个项目中,我让 LCD 显示有关接受硬币价值的信息(以印度尼西亚货币表示),每次客户输入硬币时。它还将显示接受硬币的总余额,以及有关逐步操作此机器的其他一般说明。

当机器开启时

  • MAIN display ="请输入硬币"。
  • 如果输入的硬币=“显示硬币价值和总余额”。
  • 如果没有输入硬币 =保持主显示。

硬币识别成功后

  • 如果总余额大于或等于产品的价格 ="请选择产品"。
  • 如果总余额低于产品价格 ="请输入更多硬币"。

螺旋机构开启后(发生传送)

  • 如果触发了产品检测机制 =“谢谢”,交易完成。
  • 延迟,然后返回主显示。

第 9 步:完成和测试

最后,完成了小吃自动售货机。;)

大约 3 个月后,我准备对这台机器做一些最终测试,从付款/硬币测试、产品选择和产品交付。

这是零食自动售货机最终测试视频:

我希望这个项目可以帮助你们中的一些人,也许会给你们一些关于构建和创建下一个 Arduino 驱动的自动售货机的灵感或想法。

第 10 步:改进空间

改进此零食自动售货机的一些想法:

  • 添加一些硬币兑换机制。
  • 接受纸币。
  • 接受比特币和/或数字支付。
  • 在 LCD 上显示产品库存。
  • 物联网:每次交易发生时通过互联网通知。
  • 物联网:当产品库存为空或低等时发出通知。

特别鸣谢:ITENAS Bandung,机械工程系。

代码

  • 零食自动售货机的源代码
零食自动售货机的源代码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 =常量字节KOIN_MASUK6 =6; const的字节KOIN_MASUK7 =7; const的字节SALDO_500 =8; const的字节SALDO_500500 =9; const的字节SALDO_500500500 =10; const的字节SALDO_500500500500 =11; const的字节SALDO_5005005001000 =12; const的字节SALDO_5001000 =13; const的字节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; const的字节KOIN_KELUAR =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_SDIN 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, 0x5f , 0x00, 0x00} // 21 ! , {0x00, 0x07, 0x00, 0x07, 0x00} // 22 ", {0x14, 0x7f, 0x14, 0x7f, 0x14} // 23 # , {0x24, 0x2a, 0x7f, } 0x7f, } 0x12 0x23, 0x13, 0x08, 0x64, 0x62} // 25 % , {0x36, 0x49, 0x55, 0x22, 0x50} // 26 &, {0x00, 0x05, 0x03, } 0x00, 0x00 0x1c, 0x22, 0x41, 0x00} // 28 ( , {0x00, 0x41, 0x22, 0x1c, 0x00} // 29 ) , {0x14, 0x08, 0x3e, 0x08, * 0x18, {0x18 0x3e, 0x08, 0x08} // 2b + , {0x00, 0x50, 0x30, 0x00, 0x00} // 2c , , {0x08, 0x08, 0x08, 0x08, 0x08}, {0x08}, {0x08}, // 0x60 0x00, 0x00} // 2e . , {0x20, 0x10, 0x08, 0x04, 0x02} // 2f / , {0x3e, 0x51, 0x49, 0x45, 0x3e} // 30 0, 0, 0x4, {0x4} 0x00} // 31 1 , {0x42, 0x61, 0x51, 0x49, 0x46} // 32 2 , {0x21, 0x41, 0x45, 0x4b, 0x31} // 33 3 , {0x14, 0x18, 0x18, 0x18, 0x46} // 34 4, {0x27, 0x45, 0x45, 0x45, 0x39} // 35 5, {0x3c, 0x4a, 0x49, 0x49, 0x30} // 36 6, {0x01, 0x09, 0x70, 0x01, 0x01, // 37 7, {0x36, 0x49, 0x49, 0x49, 0x36} // 38 8, {0x06, 0x49, 0x49, 0x29, 0x1e} // 39 9, {0x00, 0x36, 0 x36, 0x00, 0x00} // 3a :, {0x00, 0x56, 0x36, 0x00, 0x00} // 3b; , {0x08, 0x14, 0x22, 0x41, 0x00} // 3c <, {0x14, 0x14, 0x14, 0x14, 0x14} // 3d =, {0x00, 0x41, 0x22, } 0x22, } 0x28, {0x14 0x02, 0x01, 0x51, 0x09, 0x06} // 3f ? , {0x32, 0x49, 0x79, 0x41, 0x3e} // 40 @ , {0x7e, 0x11, 0x11, 0x11, 0x7e} // 41 A , {0x7f, 0x49, 0x49, } 0x49, {0x26 0x3e, 0x41, 0x41, 0x41, 0x22} // 43 C , {0x7f, 0x41, 0x41, 0x22, 0x1c} // 44 D , {0x7f, 0x49, 0x49, 0x49, {0x419, {0x419} 0x09, 0x09, 0x09, 0x01} // 46 F , {0x3e, 0x41, 0x49, 0x49, 0x7a} // 47 G , {0x7f, 0x08, 0x08, 0x08, 0x08, {0x7f}, // 0x7f 0x7f, 0x41, 0x00} // 49 I , {0x20, 0x40, 0x41, 0x3f, 0x01} // 4a J , {0x7f, 0x08, 0x14, 0x22, 0x41}, {0x7f, 0x40, // 4b0 0x40, 0x40} // 4c L, {0x7f, 0x02, 0x0c, 0x02, 0x7f} // 4d M, {0x7f, 0x04, 0x08, 0x10, 0x7f} // 4e N, {0x4e, {0x4e, 0x3e} // 4f O , {0x7f, 0x09, 0x09, 0x09, 0x06} // 50 P , {0x3e, 0x41, 0x51, 0x21, 0x5e} // 51 Q, {0x7f, 0x209, 0x209 // 52 R , {0x46, 0x49, 0x49, 0x49, 0x31} // 53 S , {0x01, 0x01, 0x7f, 0x01, 0x01} // 54 T , {0x3f, 0x40, } 0x340 55 U, {0x1f, 0x20, 0x40, 0x20, 0x1f} // 56 V, {0x3f, 0x40, 0x38, 0x40, 0x3f} // 57 W, {0x63, 0x14, 0 x08, 0x14, 0x63} // 58 X , {0x07, 0x08, 0x70, 0x08, 0x07} // 59 Y , {0x61, 0x51, 0x49, 0x45, 0x43} // {0x70, 0x40, 0x07} 0x41, 0x00} // 5b [ , {0x02, 0x04, 0x08, 0x10, 0x20} // 5c ¥ , {0x00, 0x41, 0x41, 0x7f, 0x00} // 5x, 0, 0x04, {0x08, 0x10, 0x20} , 0x04} // 5e ^ , {0x40, 0x40, 0x40, 0x40, 0x40} // 5f _ , {0x00, 0x01, 0x02, 0x04, 0x00} // 60 ` , {0x54, 0x40, 0 } // 61 a, {0x7f, 0x48, 0x44, 0x44, 0x38} // 62 b, {0x38, 0x44, 0x44, 0x44, 0x20} // 63 c, {0x38, 0x44, / 0x7, / 0x7 / 64 d , {0x38, 0x54, 0x54, 0x54, 0x18} // 65 e , {0x08, 0x7e, 0x09, 0x01, 0x02} // 66 f , {0x0c, 0x52, 0x52, 0x52, 0x52 g , {0x7f, 0x08, 0x04, 0x04, 0x78} // 68 h , {0x00, 0x44, 0x7d, 0x40, 0x00} // 69 i , {0x20, 0x40, 0x34, } 0x44, 0x44, 0x44, 0 {0x7f, 0x10, 0x28, 0x44, 0x00} // 6b k , {0x00, 0x41, 0x7f, 0x40, 0x00} // 6c l , {0x7c, 0x04, 0x18, 0x78, {0x78} , 0x08, 0x04, 0x04, 0x78} // 6e n , {0x38, 0x44, 0x44, 0x44, 0x38} // 6f o , {0x7c, 0x14, 0x14, 0x14, 0 } // 70 p, {0x08, 0x14, 0x14, 0x18, 0x7c} // 71 q, {0x7c, 0x08, 0x04, 0x04, 0x08} // 72 r, {0x48, 0x54, /x20, / 0 / 73 s , {0x04, 0x3f, 0x44, 0x40, 0x20} // 74 t, {0x3c, 0x40, 0x40, 0x20, 0x7c} // 75 u, {0x1c, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 v , {0x3c, 0x40, 0x30, 0x40, 0x3c} // 77 w , {0x44, 0x28, 0x10, 0x28, 0x44} // 78 x , {0x0c, 0x50, 0x50, 0x50, 0x50, 0x50, 0 {0x44, 0x64, 0x54, 0x4c, 0x44} // 7a z , {0x00, 0x08, 0x36, 0x41, 0x00} // 7b { , {0x00, 0x00, 0x7f, 0x00} // , {0x00, 0x41, 0x36, 0x08, 0x00} // 7d } , {0x10, 0x08, 0x08, 0x10, 0x08} // 7e ⇔ , {0x78, 0x46, 0x7â, } , // †'};void LcdWrite(byte dc, byte data){ digitalWrite(PIN_DC, dc);数字写入(PIN_SCE,低); 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");液晶初始化();液晶清除(); 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;时间 1 =毫秒();音调(2, 4200, 40); Serial.println("snsr1,"); Serial.println("开始周"); } } else if ((state ==KOIN_MASUK1) &&(!(digitalRead(13)))) { if ((digitalRead(12)) &&(state ==KOIN_MASUK1)) { unsigned long diff1 =(millis() - time1 ); Serial.println("snsr2,"); Serial.println("停止周"); Serial.print("jeda wkt:"); Serial.print(diff1); Serial.println("毫秒"); if (diff1> jeda_waktu) { state =SALDO_1000;液晶初始化();液晶清除(); LcdString(" diterima Saldo=Rp1000 Tambah Koin Koin Rp1000");数字写入(13,高); Serial.println("koin=Rp 1000, Saldo:Rp1000");音调(2, 4200, 299); } else if (diff1 =33) { state =KOIN_MASUK2;时间 2 =毫秒();音调(2, 4200, 40); Serial.println("snsr1,"); Serial.println("开始周"); } } else if ((state ==KOIN_MASUK2) &&((digitalRead(13)))) { if ((digitalRead(12)) &&(state ==KOIN_MASUK2)) { unsigned long diff2 =(millis() - time2); Serial.println("snsr2,"); Serial.println("停止周"); Serial.print("jeda wkt:"); Serial.print(diff2); Serial.println("毫秒"); if (diff2> jeda_waktu) { state =SALDO_5001000;液晶初始化();液晶清除(); 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;时间 3 =毫秒();音调(2, 4200, 40); Serial.println("snsr1,"); Serial.println("开始周"); } } else if ((state ==KOIN_MASUK3) &&((digitalRead(13)))) { if ((digitalRead(12)) &&(state ==KOIN_MASUK3)) ​​{ unsigned long diff3 =(millis() - time3); Serial.println("snsr2,"); Serial.println("停止周"); Serial.print("jeda wkt:"); Serial.print(diff3); Serial.println("毫秒"); if (diff3> jeda_waktu) { state =SALDO_5005001000;液晶初始化();液晶清除(); 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;时间 4 =毫秒();音调(2, 4200, 40); Serial.println("snsr1,"); Serial.println("开始周"); } } else if ((state ==KOIN_MASUK4) &&((digitalRead(13)))) { if ((digitalRead(12)) &&(state ==KOIN_MASUK4)) { unsigned long diff4 =(millis() - time4); Serial.println("snsr2,"); Serial.println("停止周"); Serial.print("jeda wkt:"); Serial.print(diff4); Serial.println("毫秒"); if (diff4> jeda_waktu) { state =SALDO_5005005001000;液晶初始化();液晶清除(); 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;时间 5 =毫秒();音调(2, 4200, 40); Serial.println("snsr1,"); Serial.println("开始周"); } } else if ((state ==KOIN_MASUK5) &&((digitalRead(13)))) { if ((digitalRead(12)) &&(state ==KOIN_MASUK5)) { unsigned long diff5 =(millis() - time5); Serial.println("snsr2,"); Serial.println("停止周"); Serial.print("jeda wkt:"); Serial.print(diff5); Serial.println("毫秒"); if (diff5> jeda_waktu) { state =SALDO_50010001000;液晶初始化();液晶清除(); 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;时间 6 =毫秒();音调(2, 4200, 40); Serial.println("snsr1,"); Serial.println("开始周"); } } else if ((state ==KOIN_MASUK6) &&((digitalRead(13)))) { if ((digitalRead(12)) &&(state ==KOIN_MASUK6)) { unsigned long diff6 =(millis() - time6); Serial.println("snsr2,"); Serial.println("停止周"); Serial.print("jeda wkt:"); Serial.print(diff6); Serial.println("毫秒"); if (diff6> jeda_waktu) { state =SALDO_10001000;液晶初始化();液晶清除(); 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;时间 7 =毫秒();音调(2, 4200, 40); Serial.println("snsr1,"); Serial.println("开始周"); } } else if ((state ==KOIN_MASUK7) &&((digitalRead(13)))) { if ((digitalRead(12)) &&(state ==KOIN_MASUK7)) { unsigned long diff7 =(millis() - time7); Serial.println("snsr2,"); Serial.println("停止周"); Serial.print("jeda wkt:"); Serial.print(diff7); Serial.println("毫秒"); if (diff7> jeda_waktu) { state =SALDO_10005001000;液晶初始化();液晶清除(); LcdString(" diterima Saldo=Rp2500 Pilih Produk Koin Rp1000"); Serial.println("koin=Rp 1000, Saldo:Rp2500");音调(2, 4200, 799); } else if (diff7  Siap"); } }}

定制零件和外壳

这是我用于该项目的 Solidworks 3d 模型的打印屏幕。

制造工艺

  1. 自动售货机
  2. 使用 K30 传感器监测二氧化碳
  3. 你有多高?
  4. 带有 Arduino 或 ESP8266 的电容式指纹传感器
  5. Arduino Cloud Sensor Tower
  6. 运动感应水枪
  7. 反向自动售货机 (RVM)
  8. 带 Arduino 的迷你雷达
  9. 数控机床
  10. 二手机械价格
  11. 什么是牛奶自动售货机?
  12. 什么是面条自动售货机?