3D 打印机已成为快速原型制作的一个重要方面,并已接触到广泛的制造商和工程师。但是这些打印机中的大多数都是业余爱好,因此需要不断地修补和维修以保持它们的工作。在所有挑战中,3D 打印机耗材断裂或缠结是每个使用 3D 打印机的人在某些时候遇到的最常见问题之一,因为这个问题导致大量打印和耗材被浪费。为避免此问题,我们将使用灯丝传感器,这将使您的打印机能够识别灯丝何时用完,并在您更换线轴时停止打印。
今天我将演示如何使用光学编码器传感器和控制器在穿孔板上创建 3D 打印智能灯丝传感器。我为我们的灯丝传感器设计了一个单独的传感器外壳,因为我也想在其他打印机上使用它。当灯丝因断裂或缠结而停止移动时,此灯丝传感器会发出蜂鸣声提醒您。
构建 DIY 灯丝跳动传感器所需的材料
对于传感机制部分:
BB3609 光电编码器传感器 X 1
轴承625×3
M5 30mm 内六角螺栓,带螺母 X 1
PC4 M5 气动耦合器 X 2
弹簧 X 1
对于控制器和蜂鸣器部分:
AT-微型 85 X 1
DPDT 按下开关
2 针线连接器
7805
7812
有源蜂鸣器 5V
女伯格带
灯丝传感器的工作原理
由于有两种类型的灯丝传感器,一种使用限位开关检测灯丝的存在,另一种使用光学旋转编码器来感受灯丝在其中移动的速度。每个灯丝传感器都有自己的优点和缺点。
带有限位开关的那个是用于长丝溢出或当挤出机电机由于长丝断裂而趋于干转时。尽管如此,由于其简单且没有移动组件,因此易于设置和维护,并且其紧凑性使其更有用。但是,如果灯丝在传感器输出附近断裂,它将不会接合,因为灯丝在灯丝断裂后仍然存在。
图1:在上图中,您可以看到尽管输出端的灯丝断了,但开关仍然指示灯丝的存在
当涉及到基于光学旋转的传感器时,无论灯丝断裂的位置和程度如何,它都会通知您。当灯丝缠结导致灯丝停止时,它会发出哔哔声。现在,如果灯丝在任何地方断裂并且无法以任何方式到达挤出机电机,传感器就会发出哔哔声,表明出现问题。
因为我们更关心精度和有效性,我们将使用基于 MOC7811 的光学旋转传感器模块构建灯丝传感器,这将确保灯丝连续移动。
在这里,您可以查看市场上现有的传感器。
图 2:基于限位开关的灯丝传感器,可以检测灯丝的存在
图 3:上图显示了一个基于旋转编码器的传感器,它可以感知灯丝的存在和移动
基于运动的灯丝传感器
既然我们已经谈到了限位开关传感器的优点和缺点。现在让我们谈谈基于灯丝运动的传感器。
这些传感器是智能灯丝传感器,在检测灯丝堵塞、缠结和断裂等方面非常准确和有用。
我们将构建的传感器将允许我们修改灯丝运动的时间延迟或不活动,这将取决于打印质量和速度。如果灯丝移动速度慢,则打印速度也慢。为了个性化,我们将创建一个安装在电位器旋钮上的转子。它还将包含一个停用传感器按钮,该按钮将在不使用传感器时关闭传感器。
您可以在下图中看到最终连接。
我使用了 ATtiny 85 digispark 板来检测旋转和控制蜂鸣器。
编程 AT-Tiny 85
我使用 Arduino IDE 对 ATtiny85 digispark 板进行编程。如果您是 Digispark Boards 的新手并想了解如何使用 Arduino IDE 对ATtiny85进行编程,请单击链接。
我们之前使用这款 ATtiny85控制器制作了许多令人兴奋的项目,您可以查看一下。
编写以下程序,每次旋转轮随灯丝移动时,都会触发中断。
#include
#include
// 定义用于切换 LED 的引脚,加上选择的用于
响应 #define INTERRUPT_PIN PCINT1 的中断 // 这是示意图中的
PB1 #define INT_PIN PB1 // 板上 LED 中断引脚选择:PB1(与 PCINT1 相同) - 引脚 6
#define LED_PIN PB4 // PB4 - 引脚 3
#define BUZZ PB0
#define PCINT_VECTOR PCINT0_vect // 这一步不是必需的 - 这是一个命名的东西清晰度
// 仅供参考:在 ISR 中使用的变量必须声明为 Volatile。
// 静态易失字节 LEDState;
// setup 函数只在 ALU 启动时运行一次
void setup() {
pinMode(LED_PIN, OUTPUT); // 将我们选择的 LED 视觉反馈设置为输出引脚(PB4 / Pin 3)
pinMode(BUZZ,输出);
数字写入(LED_PIN,高);// 闪烁表示它正在启动并且你的 LED 连接正确
delay(500);
数字写入(LED_PIN,低);
延迟(500);
// 这里的代码是配置和启用中断的关键部分
cli(); // 在设置期间禁用中断
PCMSK |= (1 << INTERRUPT_PIN); // 为我们选择的中断引脚(PCINT1/PB1/引脚 6)启用中断处理程序 (ISR)
GIMSK |= (1 << PCIE); // 在通用中断掩码中启用 PCINT 中断
pinMode(INT_PIN, INPUT_PULLUP); // 使用上拉将中断引脚设置为输入以保持稳定
sei(); //最后一行设置 - 设置后启用中断
}
无符号长 current_millis=0;
无符号长 prev_millis=0;
整数区间;
void loop() {
// 将任何通用处理代码放入主循环
// 注意 - 如果 INT_PIN 更改状态,则循环将暂停,同时 ISR 运行完成
interval=map(analogRead(1),0,1023 ,0,20);
current_millis=millis();
if ((unsigned long)(current_millis-prev_millis)>=interval*1000)
{
digitalWrite(BUZZ,1);
延迟(50);
数字写入(嗡嗡声,0);
延迟(50);
数字写入(BUZZ,1);
延迟(50);
数字写入(嗡嗡声,0);
延迟(50);
数字写入(BUZZ,1);
延迟(50);
数字写入(嗡嗡声,0);
延迟(50);
数字写入(BUZZ,1);
延迟(50);
数字写入(嗡嗡声,0);
延迟(150);
}
}
// 这是当 INT_PIN 发生任何变化时调用的中断处理程序
// ISR 在头文件中定义 - ATtiny85 只有一个处理程序
ISR(PCINT_VECTOR)
{ prev_millis=millis();
如果(digitalRead(INT_PIN)== HIGH){
digitalWrite(LED_PIN,HIGH);
}else{
digitalWrite(LED_PIN, LOW);
}
}
外壳的 3D 设计
我从Thingiverse得到了这个想法。在那里,我遇到了一个正是我需要的设计。不幸的是,我无法找到该设计的 BOM 中包含的所有需要的组件,因此我不得不修改设计,您可以从提供的链接中获得该设计。控制器电路现在需要安装在自己的附加盒中。
在这里您可以找到设计的图像。
#include
#include
// 定义用于切换 LED 的引脚,加上选择的用于
响应 #define INTERRUPT_PIN PCINT1 的中断 // 这是示意图中的
PB1 #define INT_PIN PB1 // 板上 LED 中断引脚选择:PB1(与 PCINT1 相同) - 引脚 6
#define LED_PIN PB4 // PB4 - 引脚 3
#define BUZZ PB0
#define PCINT_VECTOR PCINT0_vect // 这一步不是必需的 - 这是一个命名的东西清晰度
// 仅供参考:在 ISR 中使用的变量必须声明为 Volatile。
// 静态易失字节 LEDState;
// setup 函数只在 ALU 启动时运行一次
void setup() {
pinMode(LED_PIN, OUTPUT); // 将我们选择的 LED 视觉反馈设置为输出引脚(PB4 / Pin 3)
pinMode(BUZZ,输出);
数字写入(LED_PIN,高);// 闪烁表示它正在启动并且你的 LED 连接正确
delay(500);
数字写入(LED_PIN,低);
延迟(500);
// 这里的代码是配置和启用中断的关键部分
cli(); // 在设置期间禁用中断
PCMSK |= (1 << INTERRUPT_PIN); // 为我们选择的中断引脚(PCINT1/PB1/引脚 6)启用中断处理程序 (ISR)
GIMSK |= (1 << PCIE); // 在通用中断掩码中启用 PCINT 中断
pinMode(INT_PIN, INPUT_PULLUP); // 使用上拉将中断引脚设置为输入以保持稳定
sei(); //最后一行设置 - 设置后启用中断
}
无符号长 current_millis=0;
无符号长 prev_millis=0;
整数区间;
void loop() {
// 将任何通用处理代码放入主循环
// 注意 - 如果 INT_PIN 更改状态,则循环将暂停,同时 ISR 运行完成
interval=map(analogRead(1),0,1023 ,0,20);
current_millis=millis();
if ((unsigned long)(current_millis-prev_millis)>=interval*1000)
{
digitalWrite(BUZZ,1);
延迟(50);
数字写入(嗡嗡声,0);
延迟(50);
数字写入(BUZZ,1);
延迟(50);
数字写入(嗡嗡声,0);
延迟(50);
数字写入(BUZZ,1);
延迟(50);
数字写入(嗡嗡声,0);
延迟(50);
数字写入(BUZZ,1);
延迟(50);
数字写入(嗡嗡声,0);
延迟(150);
}
}
// 这是当 INT_PIN 发生任何变化时调用的中断处理程序
// ISR 在头文件中定义 - ATtiny85 只有一个处理程序
ISR(PCINT_VECTOR)
{ prev_millis=millis();
如果(digitalRead(INT_PIN)== HIGH){
digitalWrite(LED_PIN,HIGH);
}else{
digitalWrite(LED_PIN, LOW);
}
}
外壳的 3D 设计
我从Thingiverse得到了这个想法。在那里,我遇到了一个正是我需要的设计。不幸的是,我无法找到该设计的 BOM 中包含的所有需要的组件,因此我不得不修改设计,您可以从提供的链接中获得该设计。控制器电路现在需要安装在自己的附加盒中。
在这里您可以找到设计的图像。
我已经为我们制作的电路更换了弹簧支架和其他附件。修改后的设计如下。
这是我们的3D 打印机细丝跳动传感器的最终外观。
结论
因此,我们使用光学编码器传感器和 AT tiny 85 控制器制作了自己的智能灯丝传感器。我希望你喜欢这个项目。如有任何疑问,请参阅我们的论坛。
代码
#include
#include
// 定义用于切换 LED 的引脚,以及用于响应的所选中断
#define INTERRUPT_PIN PCINT1 // 这是示意图中的 PB1
#define INT_PIN PB1 // 板载 LED 中断选择引脚:PB1(与 PCINT1 相同)-引脚 6
#define LED_PIN PB4 // PB4 - 引脚 3
#define BUZZ PB0
#define PCINT_VECTOR PCINT0_vect // 这一步不是必需的 - 为了清楚起见,这是一个命名的东西
// 仅供参考:在 ISR 中使用的变量必须声明为 Volatile。
// 静态易失字节 LEDState;
// setup 函数只在 ALU 启动时运行一次
无效设置(){
pinMode(LED_PIN,输出);// 将我们选择的 LED 视觉反馈设置为输出引脚(PB4 / Pin 3)
pinMode(BUZZ,输出);
数字写入(LED_PIN,高);// 闪烁以显示它正在启动并且您的 LED 连接正确
延迟(500);
数字写入(LED_PIN,低);
延迟(500);
// 这里的代码是配置和启用中断的关键部分
cli(); // 在设置期间禁用中断
PCMSK |= (1 << INTERRUPT_PIN); //为我们选择的中断引脚(PCINT1/PB1/pin 6)启用中断处理程序(ISR)
GIMSK |= (1 << PCIE); // 在通用中断掩码中启用 PCINT 中断
pinMode(INT_PIN,INPUT_PULLUP);// 使用上拉将我们的中断引脚设置为输入以保持稳定
sei(); //最后一行设置 - 设置后启用中断
}
无符号长 current_millis=0;
无符号长 prev_millis=0;
整数区间;
无效循环(){
// 将任何通用处理代码放在主循环中
// 请注意 - 如果 INT_PIN 更改状态,则循环将在 ISR 运行完成时暂停
间隔=地图(模拟读取(1),0,1023,0,20);
current_millis=millis();
if ((unsigned long)(current_millis-prev_millis)>=interval*1000)
{
数字写入(BUZZ,1);
延迟(50);
数字写入(嗡嗡声,0);
延迟(50);
数字写入(BUZZ,1);
延迟(50);
数字写入(嗡嗡声,0);
延迟(50);
数字写入(BUZZ,1);
延迟(50);
数字写入(嗡嗡声,0);
延迟(50);
数字写入(BUZZ,1);
延迟(50);
数字写入(嗡嗡声,0);
延迟(150);
}
}
// 这是当 INT_PIN 发生任何变化时调用的中断处理程序
// ISR 在头文件中定义 - ATtiny85 只有一个处理程序
ISR(PCINT_VECTOR)
{ prev_millis=millis();
如果(数字读取(INT_PIN)==高){
数字写入(LED_PIN,高);
}别的{
数字写入(LED_PIN,低);
}
}
}