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:上圖顯示了一個基于旋轉編碼器的傳感器,它可以感知燈絲的存在和移動
基于運動的燈絲傳感器
既然我們已經談到了限位開關傳感器的優點和缺點?,F在讓我們談談基于燈絲運動的傳感器。
這些傳感器是智能燈絲傳感器,在檢測燈絲堵塞、纏結和斷裂等方面非常準確和有用。
我們將構建的傳感器將允許我們修改燈絲運動的時間延遲或不活動,這將取決于打印質量和速度。如果燈絲移動速度慢,則打印速度也慢。為了個性化,我們將創建一個安裝在電位器旋鈕上的轉子。它還將包含一個停用傳感器按鈕,該按鈕將在不使用傳感器時關閉傳感器。
您可以在下圖中看到最終連接。
我使用了 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 中包含的所有需要的組件,因此我不得不修改設計,您可以從提供的鏈接中獲得該設計??刂破麟娐番F在需要安裝在自己的附加盒中。
在這里您可以找到設計的圖像。
我已經為我們制作的電路更換了彈簧支架和其他附件。修改后的設計如下。
這是我們的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 運行完成時暫停
? 間隔=地圖(模擬讀?。?),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();
? 如果(數字讀?。↖NT_PIN)==高){
??? 數字寫入(LED_PIN,高);
? }別的{
??? 數字寫入(LED_PIN,低);
? }
}
}
評論
查看更多