Licznik zużycia filamentu do drukarki 3D

Licznik zużycia filamentu do drukarki 3D

Jak mówi znane przysłowie, wszystko, co dobre, szybko się kończy. Z drugiej strony, warto być świadomym nadchodzącego końca… końca materiałów do druku 3D w naszej drukarce. Tak jak wskaźnik tonera w klasycznej drukarce jest aktualizowany na żywo i pozwala nam oszacować, ile jeszcze stron możemy wydrukować, tak samo licznik filamentu w drukarce 3D pozwala na oszacowanie, ile materiału zostało jeszcze w szpuli.

Z pewnością każdemu, kto regularnie korzysta z drukarki 3D, zdarzyło się, że filament skończył się podczas druku: jakiś czas temu założyliśmy nową szpulę PLA, wydrukowaliśmy kilka elementów i gdy tego feralnego dnia zaczęliśmy drukować jakiś element (zwłaszcza większy i bardziej czasochłonny), to wydawało nam się, że tworzywa wystarczy. Niestety czasami szacunki nas zawodzą i filament kończy się w trakcie druku.

Istnieje proste rozwiązanie na uniknięcie opisanego problemu – licznik zużytego filamentu. Zaprezentowane w poniższym artykule urządzenie realizuje właśnie taką funkcję. Jest to bardzo prosta implementacja tego pomysłu. Nie jest to licznik regresywny, to znaczy, że nie zapisuje tego, co jest w drukarce i nie odejmuje tego, co zostało zużyte, zachowując dane w pamięci. Za pomocą tego urządzenia dowiemy się tylko tego, ile filamentu zużyto na dany wydruk. Dzięki temu możemy samodzielnie śledzić, ile filamentu zostało jeszcze na szpuli.

Mimo minimalizmu zaprezentowanego licznika, jest to bardzo praktyczny dodatek do każdej drukarki 3D, korzystającej z filamentu. Jeśli chcemy, nic nie stoi na przeszkodzie, aby rozbudować ten moduł o dowolne inne funkcjonalności czy zintegrować z elektroniką i oprogramowaniem drukarki (jeśli istnieje taka możliwość) lub specjalnym serwerem druku, takim jak np. OctoPi/OctoPrin.

Potrzebne elementy

Do wykonania licznika potrzebnych będzie kilka modułów i innych komponentów, w szczególności:

  • moduł Arduino Pro mini 5 V,
  • dwa łożyska 686ZZ (o wymiarach 13×6×5 mm),
  • dwa magnesy neodymowe o wymiarach 5×5×2 mm,
  • ekran OLED o rozdzielczości 128×64 z interfejsem SPI,
  • dwa o-ringi o średnicy wewnętrznej 11 mm i średnicy 2,5 mm,
  • czujnik Halla typu A3144E,
  • opornik 10 kΩ,
  • kabel USB oraz ładowarka USB do zasilenia modułu,
  • elementy do połączeń z goldpinami, aczkolwiek można również przewody łączyć bezpośrednio, lutując je ze sobą.

Na fotografii 1 pokazano wszystkie potrzebne elementy zebrane w jednym miejscu.

Fotografia 1. Elementy potrzebne do budowy urządzenia wraz z elementami z druku 3D

Elementy mechaniczne – drukowane w 3D

Jeśli konstruujemy licznik do pomiaru ilości zużytego przez drukarkę 3D filamentu, to z dużym prawdopodobieństwem mamy drukarkę 3D, a przynajmniej mamy dostęp do takiej drukarki. Dlatego też jest ona narzędziem pierwszego wyboru do wyprodukowania elementów mechanicznych omawianego licznika.

Projekt elementów mechanicznych został wykonany za pomocą programu Fusion360. To doskonałe narzędzie dostępne dla hobbystów, które pozwala na uproszczenie projektowania. Jak wskazuje sam autor omawianej konstrukcji, „cudownie móc szybko i skutecznie wprowadzać zmiany, nawet po zakończeniu projektu”. Elementy do druku 3D są wykonane tak, aby nie trzeba było ich sklejać, pasują dokładnie do siebie i trzymają się razem na tyle mocno, aby nie wypadły przez przypadek.

Wszystkie pliki znajdują się na stronie projektu. Autor udostępnia wszystkie projekty w postaci plików STL, więc można zaimportować je do używanego przez siebie oprogramowania CAM/Slicera do drukarki 3D i następnie wydrukować. Należy wydrukować po jednej sztuce z każdego pliku oraz dwa elementy z pliku cono2iman2.stl.

Elementy montażowe, załączone w projekcie, dostępne są w dwóch wersjach – przeznaczonej do drukarki Artillery x1, której używa autor oraz do Endera 3 v1, z uwagi na jego zawrotną popularność. Nic nie stoi na przeszkodzie, aby zaprojektować własny montaż do innej drukarki, jakiej używamy. Aby to uprościć, autor umieścił na stronie z projektem również plik Fusion360 z całym urządzeniem. Na rysunku 1 pokazano gotową, zmontowaną obudowę urządzenia w formie rzutu 3D z programu CAD. Widoczne jest miejsce na wyświetlacz, przycisk oraz wejście dla filamentu (opisane IN).

Rysunek 1. Model zmontowanej obudowy urządzenia

Zasada działania systemu jest bardzo prosta. Filament jest lekko dociskany do gumowych o-ringów, które powodują obracanie zamocowanych na łożyskach rolek w kształcie dwóch stożków. Do tego elementu przymocowany jest magnes. On także obraca się dookoła osi rolki, co powoduje, że raz na obrót zbliża się do czujnika Halla i aktywuje go (rysunek 2).

Rysunek 2. Zasada działania mechanicznego sensora do pomiaru długości zużywanego filamentu

Jako że na rolce zamocowane są dwa magnesy, to jedna detekcja magnesu sensorem Halla oznacza, że przez urządzenie przeszła długość filamentu o długości połowy obwodu rolki:

L = ½ × 2πr,

gdzie r to promień rolki w układzie. W przypadku rolki wykorzystanej przez autora, promień ten równy jest 10 mm, co oznacza, że jeden impuls z hallotronu równa się około 31,4 mm filamentu. Jest to też rozdzielczość pomiaru.

Projektując tego rodzaju układ pomiarowy, zawsze konieczny jest kompromis. Z jednej strony zależy nam na zwiększeniu dokładności pomiaru, a z drugiej strony pojawiają się kwestie mechaniczne. Rozdzielczość pomiaru długości zużytego filamentu jest wprost proporcjonalna do promienia rolki pomiarowej, z drugiej strony nie można jej zmniejszać w nieskończoność – 10 mm to wielkość dobrana przez autora jako optymalna, aby zapewnić lekkie działanie systemu. W innym przypadku układ może wpływać na działanie drukarki 3D i powodować jej niepoprawną pracę.

Alternatywną metodą zwiększenia rozdzielczości pomiaru jest dodanie magnesów na obwodzie rolki. To jest uzależnione od czułości i charakterystyki kierunkowej sensora Halla – kluczowe jest to, aby pomiędzy magnesami hallotron nie wykrywał żadnego pola, inaczej zamiast możliwych do rozdzielenia impulsów, na wyjściu obserwować będziemy tylko jeden stan.

Elektronika

Elektronika w tym systemie jest dosyć prosta. Do modułu Arduino podłączony jest wyświetlacz OLED, przycisk i sensor Halla. Schemat układu pokazano na rysunku 3.

Rysunek 3. Schemat połączeń modułów w urządzeniu

Hallotron ma trzy piny, do których musi być podłączone zasilanie (VCC i GND) oraz wyjście. Układ generuje proste impulsy cyfrowe w zależności od obecności pola magnetycznego w okolicy sensora. Wyjście tego elementu to otwarty kolektor, więc potrzebne jest podciągniąganie do zasilania – w tym przypadku rezystor 10 kΩ podłączony do linii VCC. Przycisk do sterowania podłączony jest pomiędzy masę a jedno z wejść cyfrowych Arduino. Może być ono wewnętrznie podciągnięte do zasilania, więc w przypadku tego elementu nie ma konieczności montowania podciągającego opornika.

Ostatnim elementem jest wyświetlacz OLED, który oprócz zasilania (VCC i GND) podłączony ma interfejs szeregowy do sterowania. W tym przypadku jest to czteroprzewodowa magistrala SPI – linie MOSI, CLK, CS oraz RESET.

Oprogramowanie

Oprogramowanie dla tego układu zostało napisane w środowisku Arduino IDE. Dzięki temu kod jest prosty i przejrzysty – idealnie nadaje się dla hobbystów i amatorów, a także elektroników, którzy, z różnych względów, dopiero teraz uczą się programowania i pracy z mikrokontrolerami. Na listingu 1 zaprezentowano szkic Arduino, który steruje tym prostym urządzeniem. Szkic podzielony jest na dwie zasadnicze części – funkcje setup() oraz loop() – jak każdy szkic Arduino. Pierwsza część odpowiedzialna jest za konfigurację układu – wejść i interfejsów odpowiedzialnych np. za komunikację. Druga funkcja to nieskończona pętla, która stanowi główne ciało programu.

Listing 1. Szkic Arduino programu do obsługi licznika zużycia filamentu w drukarce 3D


#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128   // Szerokość wyświetlacza OLED
#define SCREEN_HEIGHT 64  // Wysokość wyświetlacza OLED
#define OLED_MOSI   3     // SDA
#define OLED_CLK   4    // SCL
#define OLED_DC    5
#define OLED_CS    12
#define OLED_RESET 6

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,
 OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

const int hall = 2;
int interrupt;
int interrupt2;
int button = 7;
int state;
float round = 0;
float roundtotal = 0;
float roundtotal2 = 0;

void setup() {
 pinMode(button, INPUT_PULLUP);
 pinMode(hall, INPUT_PULLUP);
 attachInterrupt(
digitalPinToInterrupt(hall), iman, RISING);
   display.begin();
   display.setRotation(2);
   display.clearDisplay();
   display.setTextSize(3);
   display.setTextColor(SSD1306_WHITE);
   display.setCursor(15, 5);
   display.println("  0.00");
   display.setTextSize(2);             
   display.setTextColor(SSD1306_WHITE);
   display.setCursor(30, 38);
   display.println(F("Metros"));
   display.display();
   Serial.begin(9600);
   }

void loop() {
 state = digitalRead(button);
 if (LOW == state){
   round = 0;
 }
 if (round == 0) {
   display.clearDisplay();
   display.setTextSize(3);
   display.setTextColor(SSD1306_WHITE);
   display.setCursor(15, 5);
   display.println("  0.00");
   display.setTextSize(2);
   display.setTextColor(SSD1306_WHITE);
   display.setCursor(30, 38);
   display.println(F("Metros"));
   display.display();
 }
   if (interrupt != interrupt2) {
   interrupt = interrupt2;
   round++;
   roundtotal = round/2;
   roundtotal2= roundtotal*0.0188*3.1415;
   display.clearDisplay();
   display.setTextSize(3);
   display.setTextColor(SSD1306_WHITE);
   if (roundtotal2 < 10) {
     display.setCursor(51, 5);
     display.println(roundtotal2,2);
   }
   if (roundtotal2 >= 10) {
     display.setCursor(35, 5);
     display.println(roundtotal2,2);
   }
   if (roundtotal2 >= 100) {
     display.setCursor(15, 5);
     display.println(roundtotal2,2);
   }
   display.setTextSize(2);
   display.setTextColor(SSD1306_WHITE);
   display.setCursor(30, 38);
   display.println(F("Metros"));
   display.display();
   Serial.println(roundtotal2,2);
   interrupt = 0;
   }
 if (interrupt >= 2) {
   interrupt = 0;
 }
}

void iman() {
 interrupt++;
}

Za obsługę wyświetlacza odpowiada biblioteka Adafruit_SSD1306 poprzez obiekt display(), którego metody służą do konfiguracji i obsługi wyświetlacza. W sekcji setup() konfigurowane są piny przycisku i sensora Halla (za pomocą funkcji pinMode()), a do pinu hall „podłączane” jest przerwanie (attachInterrupt()). Spowoduje to, że każdorazowe zbocze narastające na tym pinie skutkuje uruchomieniem funkcji iman(), zdefiniowanej w dalszej części kodu. Dalsza część bloku setup() to konfiguracja wyświetlacza – orientacji, wielkości tekstu itd.

Funkcja iman() jest bardzo prosta. Obsługa przerwania musi być szybka, dlatego też w funkcji tej znajduje się tylko inkrementacja licznika interrupt.

W sekcji loop() znajduje się logika obsługi licznika, wyświetlania itd. W pierwszej kolejności program sprawdza stan przycisku button i zapisuje jego stan w zmiennej state. Jeśli zmierzony stan jest niski (LOW), to oznacza, że przycisk został wciśnięty, więc licznik round jest zerowany, a następnie czyszczony jest wyświetlacz, aby to, co jest na nim prezentowane, odpowiadało rzeczywistości. Licznik ten zlicza liczbę impulsów z hallotronu.

Logika stojąca za zliczaniem impulsów (zmienna interrupt) musi pozwalać na zliczanie zboczy. Dlatego zastosowano pomocniczą zmienną interrupt2. Jeśli wartości obu tych zmiennych są różne, tzn. że pomiędzy obecną a poprzednią iteracją funkcji loop() nastąpiło wyzwolenie przerwania i funkcji iman(), to w takiej sytuacji wartość interrupt jest przenoszona do interrupt2, a wartość round jest inkrementowana. Następnie program oblicza liczbę obrotów rolki – roundtotal, która jest równa połowie round. Obliczana jest też rzeczywista długość zużytego filamentu, która zapisywana jest w zmiennej roundtotal2. Wartość ta jest wyświetlana następnie na ekranie OLED. Finalnie interrupt jest zerowane. Podobnie, jeżeli licznik interrupt jest większy lub równy 2, to również zostanie wyzerowany.

Program do mikrokontrolera dobrze jest załadować przed rozpoczęciem montażu. W przeciwnym wypadku programowanie będzie dosyć trudne z uwagi na zabudowanie Arduino w obudowie urządzenia. Firmware najprościej załadować do układu, korzystając z Arduino IDE.

Podsumowanie

„Czy można to zrobić lepiej? Jasne, ale wtedy byłoby droższe i większe” – podsumowuje swoją konstrukcję autor. Jest to bardzo minimalistyczne urządzenie, co jest jednak jego ogromną zaletą. Można dzięki temu system ten zastosować w niemal każdej drukarce 3D.

Jedyne, co trzeba dostosować pomiędzy drukarkami, to sposób montażu urządzenia w drukarce. Projekt może być wartościowym dodatkiem do drukarki 3D, który ustrzeże nas przed problemami, jakie opisano na początku artykułu. Może również być podstawą bardziej złożonego projektu, który nie tylko mierzy zużycie filamentu, ale także zapisuje wartość pomiędzy wydrukami, a może nawet komunikuje się z oprogramowaniem drukarki i uniemożliwia drukowanie, jeśli nie ma ona odpowiedniej ilości filamentu? Nic nie ogranicza kreatywności w tym zakresie.

Nikodem Czechowski, EP

Źródło: https://bit.ly/3PNm2Uo

Artykuł ukazał się w
Elektronika Praktyczna
sierpień 2022

Elektronika Praktyczna Plus lipiec - grudzień 2012

Elektronika Praktyczna Plus

Monograficzne wydania specjalne

Elektronik wrzesień 2024

Elektronik

Magazyn elektroniki profesjonalnej

Raspberry Pi 2015

Raspberry Pi

Wykorzystaj wszystkie możliwości wyjątkowego minikomputera

Świat Radio wrzesień - październik 2024

Świat Radio

Magazyn krótkofalowców i amatorów CB

Automatyka, Podzespoły, Aplikacje wrzesień 2024

Automatyka, Podzespoły, Aplikacje

Technika i rynek systemów automatyki

Elektronika Praktyczna październik 2024

Elektronika Praktyczna

Międzynarodowy magazyn elektroników konstruktorów

Elektronika dla Wszystkich październik 2024

Elektronika dla Wszystkich

Interesująca elektronika dla pasjonatów