自动瓶灌装机最常用于饮料和软饮料行业。这些机器使用传送带,这是一种经济且快速的装瓶方式。大多数 PLC 用于自动灌装机,但您可以使用 Arduino制作非常基本且多功能的灌装机。您可以对 Arduino 进行编程,使其使用红外或超声波传感器自动检测瓶子,并通过停止传送带一段时间让装瓶机进行灌装。然后再次移动皮带并在检测到下一个瓶子时停止。
在这里,我们将使用 Arduino Uno 、传送带、电磁阀、红外传感器和步进电机设计自动灌装机的原型。带式输送机由步进电机以恒定的预设速度驱动。步进电机将继续驱动传送带,直到 IR 传感器检测到传送带上存在瓶子。我们使用红外传感器作为外部触发器。因此,只要 IR 传感器变高,它就会向 Arduino 发送触发器以停止电机并打开电磁阀。已在灌装代码中输入预设的所需延迟时间。Arduino 将保持电磁阀开启并关闭步进电机,直到指定时间。之后,电磁阀关闭灌装,传送带开始移动,以便灌装下一个瓶子。
我们之前使用Arduino 与电磁阀、红外传感器和步进电机,因此要了解有关 Arduino 与这些组件的基本接口的更多信息,您可以访问链接。
所需组件
阿杜诺
步进电机 (Nema17)
中继
电磁阀
红外传感器
A4988 电机驱动器
电池
电路原理图
下面给出了使用 Arduino 的自动瓶子灌装系统的电路图。
我用Fritzing画了电路图。在该电路中,电磁阀通过继电器模块连接到Arduino,A4988驱动模块用于控制步进电机。您可以按照如何使用 Arduino 和 A4988 控制 Nema17 教程了解有关 Nema17 和 A4988 驱动模块的更多信息。
Relay 模块的输入引脚连接到 Arduino 的引脚 7。A4988 模块的 DirecTIon 和 Step 引脚连接到 Arduino 的 2 和 4 引脚。在这个项目中,红外传感器用作Arduino 的外部中断。在 Arduino Uno 中,数字引脚 2 和 3 是中断引脚,因此将 IR 传感器的 Out 引脚连接到 Arduino 的第 3引脚。电磁阀由24V电源供电,步进电机由12V电源供电。
Arduino自动灌装程序
最后给出了这个使用 Arduino 的自动灌装系统的完整程序。在这里,我解释了一些重要的行。
通过包含步进电机库来启动程序。您可以从这里下载步进电机库。
之后,定义步进电机每转的步数。对于 NEMA,每转 17 步是 200。
#include#定义步骤 200
指定连接电机驱动模块的 Step 和 DirecTIon 引脚的引脚。由于电机是通过驱动模块连接的,所以定义电机接口类型为Type1。
步进步进器(STEPS, 2, 4); #define motorInterfaceType 1
设置步进电机速度。
stepper.setSpeed(500);
将继电器、步进和方向引脚定义为输出
pinMode(继电器,输出); pinMode(4,输出); pinMode(2,输出);
Arduino中外部中断的语法如下:
attachInterrupt(digitalPinToInterrupt(pin),ISR,模式);
在哪里:
digitalPinToInterrupt(pin):用于定义连接外部中断的引脚。在 Arduino Uno 中,引脚 2 和 3 是外部中断引脚。
ISR:它是一个在调用外部中断时调用的函数。
模式:要触发的转换类型,例如下降、上升等。
通过以下链接了解有关Arduino 中断的更多信息。
在attachInterrupt()函数中,指定引脚 3 是外部中断引脚,并且只要 IR 传感器将其状态从低电平变为高电平(上升),就会调用IR_detected函数。
attachInterrupt(digitalPinToInterrupt(3),IR_detected,HIGH);
void IR_detected()是一个 ISR 函数,当 IR 传感器变高时执行。因此,每当 IR 传感器变为高电平时,此功能会使步进电机运行几步,然后停止步进电机并打开电磁阀。
无效 IR_detected() { stepper.step(150); 数字写入(继电器,高); stepper.step(0);
现在最后通过将代码连接到笔记本电脑将代码上传到 Arduino。下图显示了我们使用 Arduino 的自动瓶子灌装系统原型。
#include
#定义步骤 200
#define motorInterfaceType 1
步进步进器(STEPS, 2, 4);
诠释继电器=7;
int step_num =700;
无效设置(){
序列号.开始(9600);
pinMode(继电器,输出);
stepper.setSpeed(500);
pinMode(4,输出);
pinMode(2,输出);
attachInterrupt(digitalPinToInterrupt(3),IR_detected,RISING);
}
布尔螺线管_on = false;
无效循环(){
如果 (solenoid_on)
{
延迟(6000);//等待6秒
螺线管开启 = 假;
}
数字写入(继电器,低);// 现在继电器处于关闭状态(并且电机处于开启状态)
stepper.step(step_num);
}
void IR_detected() //ISR 函数在 IR 传感器变高时执行。
{
Serial.println("检测到中断");
stepper.step(150); //在步进电机停止前运行几步
数字写入(继电器,高);//打开电磁阀
stepper.step(0); //停止步进电机
螺线管开启 = 真;
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)