3D 打印機已成為快速原型制作的一個重要方面,并已接觸到廣泛的制造商和工程師。但是這些打印機中的大多數(shù)都是業(yè)余愛好,因此需要不斷地修補和維修以保持它們的工作。在所有挑戰(zhàn)中,3D 打印機耗材斷裂或纏結(jié)是每個使用 3D 打印機的人在某些時候遇到的最常見問題之一,因為這個問題導(dǎo)致大量打印和耗材被浪費。為避免此問題,我們將使用燈絲傳感器,這將使您的打印機能夠識別燈絲何時用完,并在您更換線軸時停止打印。
今天我將演示如何使用光學(xué)編碼器傳感器和控制器在穿孔板上創(chuàng)建 3D 打印智能燈絲傳感器。我為我們的燈絲傳感器設(shè)計了一個單獨的傳感器外殼,因為我也想在其他打印機上使用它。當燈絲因斷裂或纏結(jié)而停止移動時,此燈絲傳感器會發(fā)出蜂鳴聲提醒您。
構(gòu)建 DIY 燈絲跳動傳感器所需的材料
對于傳感機制部分:
BB3609 光電編碼器傳感器 X 1
軸承625×3
M5 30mm 內(nèi)六角螺栓,帶螺母 X 1
PC4 M5 氣動耦合器 X 2
彈簧 X 1
對于控制器和蜂鳴器部分:
AT-微型 85 X 1
DPDT 按下開關(guān)
2 針線連接器
7805
7812
有源蜂鳴器 5V
女伯格帶
燈絲傳感器的工作原理
由于有兩種類型的燈絲傳感器,一種使用限位開關(guān)檢測燈絲的存在,另一種使用光學(xué)旋轉(zhuǎn)編碼器來感受燈絲在其中移動的速度。每個燈絲傳感器都有自己的優(yōu)點和缺點。
帶有限位開關(guān)的那個是用于長絲溢出或當擠出機電機由于長絲斷裂而趨于干轉(zhuǎn)時。盡管如此,由于其簡單且沒有移動組件,因此易于設(shè)置和維護,并且其緊湊性使其更有用。但是,如果燈絲在傳感器輸出附近斷裂,它將不會接合,因為燈絲在燈絲斷裂后仍然存在。
圖1:在上圖中,您可以看到盡管輸出端的燈絲斷了,但開關(guān)仍然指示燈絲的存在
當涉及到基于光學(xué)旋轉(zhuǎn)的傳感器時,無論燈絲斷裂的位置和程度如何,它都會通知您。當燈絲纏結(jié)導(dǎo)致燈絲停止時,它會發(fā)出嗶嗶聲?,F(xiàn)在,如果燈絲在任何地方斷裂并且無法以任何方式到達擠出機電機,傳感器就會發(fā)出嗶嗶聲,表明出現(xiàn)問題。
因為我們更關(guān)心精度和有效性,我們將使用基于 MOC7811 的光學(xué)旋轉(zhuǎn)傳感器模塊構(gòu)建燈絲傳感器,這將確保燈絲連續(xù)移動。
在這里,您可以查看市場上現(xiàn)有的傳感器。
圖 2:基于限位開關(guān)的燈絲傳感器,可以檢測燈絲的存在
圖 3:上圖顯示了一個基于旋轉(zhuǎn)編碼器的傳感器,它可以感知燈絲的存在和移動
基于運動的燈絲傳感器
既然我們已經(jīng)談到了限位開關(guān)傳感器的優(yōu)點和缺點。現(xiàn)在讓我們談?wù)劵跓艚z運動的傳感器。
這些傳感器是智能燈絲傳感器,在檢測燈絲堵塞、纏結(jié)和斷裂等方面非常準確和有用。
我們將構(gòu)建的傳感器將允許我們修改燈絲運動的時間延遲或不活動,這將取決于打印質(zhì)量和速度。如果燈絲移動速度慢,則打印速度也慢。為了個性化,我們將創(chuàng)建一個安裝在電位器旋鈕上的轉(zhuǎn)子。它還將包含一個停用傳感器按鈕,該按鈕將在不使用傳感器時關(guān)閉傳感器。
您可以在下圖中看到最終連接。
我使用了 ATtiny 85 digispark 板來檢測旋轉(zhuǎn)和控制蜂鳴器。
編程 AT-Tiny 85
我使用 Arduino IDE 對 ATtiny85 digispark 板進行編程。如果您是 Digispark Boards 的新手并想了解如何使用 Arduino IDE 對ATtiny85進行編程,請單擊鏈接。
我們之前使用這款 ATtiny85控制器制作了許多令人興奮的項目,您可以查看一下。
編寫以下程序,每次旋轉(zhuǎn)輪隨燈絲移動時,都會觸發(fā)中斷。
?
#include#include // 定義用于切換 LED 的引腳,加上選擇的用于 響應(yīng) #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。 // 靜態(tài)易失字節(jié) LEDState; // setup 函數(shù)只在 ALU 啟動時運行一次 void setup() { pinMode(LED_PIN, OUTPUT); // 將我們選擇的 LED 視覺反饋設(shè)置為輸出引腳(PB4 / Pin 3) pinMode(BUZZ,輸出); 數(shù)字寫入(LED_PIN,高);// 閃爍表示它正在啟動并且你的 LED 連接正確 delay(500); 數(shù)字寫入(LED_PIN,低); 延遲(500); // 這里的代碼是配置和啟用中斷的關(guān)鍵部分 cli(); // 在設(shè)置期間禁用中斷 PCMSK |= (1 << INTERRUPT_PIN); // 為我們選擇的中斷引腳(PCINT1/PB1/引腳 6)啟用中斷處理程序 (ISR) GIMSK |= (1 << PCIE); // 在通用中斷掩碼中啟用 PCINT 中斷 pinMode(INT_PIN, INPUT_PULLUP); // 使用上拉將中斷引腳設(shè)置為輸入以保持穩(wěn)定 sei(); //最后一行設(shè)置 - 設(shè)置后啟用中斷 } 無符號長 current_millis=0; 無符號長 prev_millis=0; 整數(shù)區(qū)間; void loop() { // 將任何通用處理代碼放入主循環(huán) // 注意 - 如果 INT_PIN 更改狀態(tài),則循環(huán)將暫停,同時 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); 數(shù)字寫入(嗡嗡聲,0); 延遲(50); 數(shù)字寫入(BUZZ,1); 延遲(50); 數(shù)字寫入(嗡嗡聲,0); 延遲(50); 數(shù)字寫入(BUZZ,1); 延遲(50); 數(shù)字寫入(嗡嗡聲,0); 延遲(50); 數(shù)字寫入(BUZZ,1); 延遲(50); 數(shù)字寫入(嗡嗡聲,0); 延遲(150); } } // 這是當 INT_PIN 發(fā)生任何變化時調(diào)用的中斷處理程序 // ISR 在頭文件中定義 - ATtiny85 只有一個處理程序 ISR(PCINT_VECTOR) { prev_millis=millis(); 如果(digitalRead(INT_PIN)== HIGH){ digitalWrite(LED_PIN,HIGH); }else{ digitalWrite(LED_PIN, LOW); } }
?
外殼的 3D 設(shè)計
我從Thingiverse得到了這個想法。在那里,我遇到了一個正是我需要的設(shè)計。不幸的是,我無法找到該設(shè)計的 BOM 中包含的所有需要的組件,因此我不得不修改設(shè)計,您可以從提供的鏈接中獲得該設(shè)計??刂破麟娐番F(xiàn)在需要安裝在自己的附加盒中。
在這里您可以找到設(shè)計的圖像。
我已經(jīng)為我們制作的電路更換了彈簧支架和其他附件。修改后的設(shè)計如下。
這是我們的3D 打印機細絲跳動傳感器的最終外觀。
結(jié)論
因此,我們使用光學(xué)編碼器傳感器和 AT tiny 85 控制器制作了自己的智能燈絲傳感器。我希望你喜歡這個項目。如有任何疑問,請參閱我們的論壇。
代碼
?
?
#include
#include
// 定義用于切換 LED 的引腳,以及用于響應(yīng)的所選中斷
#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。
// 靜態(tài)易失字節(jié) LEDState;
// setup 函數(shù)只在 ALU 啟動時運行一次
無效設(shè)置(){
??? pinMode(LED_PIN,輸出);// 將我們選擇的 LED 視覺反饋設(shè)置為輸出引腳(PB4 / Pin 3)
??? pinMode(BUZZ,輸出);???
??? 數(shù)字寫入(LED_PIN,高);// 閃爍以顯示它正在啟動并且您的 LED 連接正確
??? 延遲(500);
??? 數(shù)字寫入(LED_PIN,低);
??? 延遲(500);
??? // 這里的代碼是配置和啟用中斷的關(guān)鍵部分
??? cli(); // 在設(shè)置期間禁用中斷
??? PCMSK |= (1 << INTERRUPT_PIN); //為我們選擇的中斷引腳(PCINT1/PB1/pin 6)啟用中斷處理程序(ISR)
??? GIMSK |= (1 << PCIE); // 在通用中斷掩碼中啟用 PCINT 中斷
??? pinMode(INT_PIN,INPUT_PULLUP);// 使用上拉將我們的中斷引腳設(shè)置為輸入以保持穩(wěn)定
??? sei(); //最后一行設(shè)置 - 設(shè)置后啟用中斷
}
無符號長 current_millis=0;
無符號長 prev_millis=0;
整數(shù)區(qū)間;
無效循環(huán)(){
? // 將任何通用處理代碼放在主循環(huán)中
? // 請注意 - 如果 INT_PIN 更改狀態(tài),則循環(huán)將在 ISR 運行完成時暫停
? 間隔=地圖(模擬讀?。?),0,1023,0,20);
? current_millis=millis();
? if ((unsigned long)(current_millis-prev_millis)>=interval*1000)
? {
??? 數(shù)字寫入(BUZZ,1);
??? 延遲(50);
??? 數(shù)字寫入(嗡嗡聲,0);
??? 延遲(50);
??? 數(shù)字寫入(BUZZ,1);
??? 延遲(50);
??? 數(shù)字寫入(嗡嗡聲,0);
??? 延遲(50);
??? 數(shù)字寫入(BUZZ,1);
??? 延遲(50);
??? 數(shù)字寫入(嗡嗡聲,0);
??? 延遲(50);
??? 數(shù)字寫入(BUZZ,1);
??? 延遲(50);
??? 數(shù)字寫入(嗡嗡聲,0);
??? 延遲(150);
?? }
}
// 這是當 INT_PIN 發(fā)生任何變化時調(diào)用的中斷處理程序
// ISR 在頭文件中定義 - ATtiny85 只有一個處理程序
ISR(PCINT_VECTOR)
{ prev_millis=millis();
? 如果(數(shù)字讀取(INT_PIN)==高){
??? 數(shù)字寫入(LED_PIN,高);
? }別的{
??? 數(shù)字寫入(LED_PIN,低);
? }
}
}
評論
查看更多