Operácie

Zariadenie na vytvrdzovanie resinu pre MLSA 3D tlačiarne

Zo stránky SensorWiki

Záverečný projekt predmetu DTV / LS2023 - Jakub Tinák


Úvod

Vytvrdzovanie resinu po 3D tlači je súčasťou post Procesingu, aby som sa nemusel spoliehať na prirodzený zdroj UV-svetla -> slnko, som sa rozhodol ako semestrálny projekt vypracoavť zariadenie ktoré mi s tým pomôže. Ako zdroj UV svetla som použil UV diody v 3 stĺpikoch vztlačených z resinu, tieto budú svietiť na rotujúcu platformu ktorou bude otáčať krokový motor, o zobrazenie zostávajúceho času sa stará lcd displej a na ovládanie slúžia 4 tlačidlá. Vzhľadom na to, že UV svetlo je očiam škodlivé som pridal NO-kontakt ktorý kontroluje či je veko zavreté.

Zapojenie.

Analýza a opis riešenia

Realizácia sa dá rozdeliť na 3 časti:

                                     -Elektrická časť
                                     -Fyzická časť
                                     -Programové riešenie

Elektrická časť zabezpečuje spája programovú a fyzickú časť. slúži na prenos a riadenie.

Schéma zapojenia.

Pozostáva z Arduina, krokového motora, paralelne zapojených diód, a niekolkých ovládacích prvkov.

Schéma zapojenia.


Fyzická časť pozostáva z krabičky, taniera a stlpikov, Krabička bola vyrezaná laserom zo 4mm preglejky a tanier bol vytlačený na 3D tlačiarni.

Celá Krabička.

Krabička má dva účeli. Zabraňuje mechanickému poškodeniu elektrickej časti ktorej velká časť je uložená v priestore pod tanierom a medziposchodím, druhým a hlavným účelom pre ktorý som si ako materíal zvolil drevo je zamedzenie úniku UV žiarenia do vonka.

Rozložená krabička.

Pre lepší celkový výkon a kvalitu vytvrdnutia modelu by sa dala vnútorná časť krabický potiahnuť/natrieť odrazným materiálom napr. hliníkovou fóliou.

Model Taniera.

Tanier Je poidstava na ktorú sa položí objek ktorý treba vytvrdiť, je priamo mechanicky spojený s krokovým motorom cez drážku a teda priamo otáčaný.

Model stlpiku.

Stĺpiky spúžia na držanie led diód budú zapustené do medziposchodia a pod nimi sa nachádza diera cez ktorú budú diódy napájané.


Algoritmus a program

Algoritmus programu vychádza z artuino countdown timera ale je upravený aby vzhovoval mojim potrebám. Využité sú 3 knižnice:

                     LiquidCrystal.h -Umožňuje ovládanie lcd displeja.
                     EEPROM.h  -Umožnuje uchovanie údajov v pameti aj ked sa doska vypne, napríklad otvorením viečka laebo zlihaním baterky.
                     Stepper.h -Umožňuje riadenie krokového motora.



<tab name="Kód v prostredí Arduino IDE"><source lang="c++" style="background: LightYellow;">

  1. include <LiquidCrystal.h>
  2. include<EEPROM.h>
  3. include <Stepper.h>

const int rs = 7, en = 6, d4 = 5, d5 = 4, d6 = 3, d7 = 2; LiquidCrystal lcd(rs, en, d4, d5, d6, d7); const int stepsPerRevolution = 1027; Stepper myStepper = Stepper(stepsPerRevolution, 8, 10, 9, 11);

const int kontakt=A5; const int diode= 12; const int stsp = A0; const int inc = A1; const int dec = A2; const int set = A3; const int relay = 8; int hrs = 0; int Min = 0; int sec = 0; unsigned int check_val = 50; int add_chk = 0; int add_hrs = 1; int add_min = 2; bool RUN = true; bool min_flag = true; bool hrs_flag = true; void setup() {

 lcd.begin(16, 2);
 lcd.clear();
 lcd.setCursor(0, 0);
 lcd.print("COUNTDOWN TIMER");
 pinMode(stsp, INPUT_PULLUP);
 pinMode(kontakt, INPUT_PULLUP);
 pinMode(inc, INPUT_PULLUP);
 pinMode(dec, INPUT_PULLUP);
 pinMode(set, INPUT_PULLUP);
 pinMode(relay, OUTPUT);
 pinMode(diode,OUTPUT);
 digitalWrite(relay, LOW); 
 digitalWrite(diode, LOW); 
 if (EEPROM.read(add_chk) != check_val)
 {
   EEPROM.write(add_chk, check_val);
   EEPROM.write(add_hrs, 0);
   EEPROM.write(add_min, 1);
 }
 else
 {
   hrs = EEPROM.read(add_hrs);
   Min = EEPROM.read(add_min);
 }
 delay(1500);
 myStepper.setSpeed(15);
 INIT();

}

void loop() {

 if (digitalRead(stsp) == LOW)
 {
   lcd.clear();
   delay(250);
   RUN = true;
   while (RUN)
   {
     if (digitalRead(stsp) == LOW)
     {
       delay(1000);
       if (digitalRead(stsp) == LOW)
       {
         digitalWrite(relay, LOW); 
         digitalWrite(diode,LOW);
         lcd.clear();
         lcd.setCursor(0, 0);
         lcd.print("  TIMER STOPPED");
         lcd.setCursor(0, 1);
         lcd.print("----------------");
         delay(2000);
         RUN = false;
         INIT();
         break;
       }
     }
     if (digitalRead(kontakt) == LOW)
     {
       digitalWrite(diode, HIGH);
       myStepper.step(stepsPerRevolution/4);
       sec = sec - 1;
     }
     else{
       digitalWrite(diode, LOW);
     }
     digitalWrite(relay, HIGH); 
     if (sec == -1)
     {
       sec = 59;
       Min = Min - 1;
     }
     if (Min == -1)
     {
       Min = 59;
       hrs = hrs - 1;
     }
     if (hrs == -1) hrs = 0;
     lcd.setCursor(0, 1);
     lcd.print("****************");
     lcd.setCursor(4, 0);
     if (hrs <= 9)
     {
       lcd.print('0');
     }
     lcd.print(hrs);
     lcd.print(':');
     if (Min <= 9)
     {
       lcd.print('0');
     }
     lcd.print(Min);
     lcd.print(':');
     if (sec <= 9)
     {
       lcd.print('0');
     }
     lcd.print(sec);
     if (hrs == 0 && Min == 0 && sec == 0)
     {
       digitalWrite(relay, LOW); 
       lcd.setCursor(4, 0);
       RUN = false;
       digitalWrite(diode, LOW);
       INIT();
     }
   }
 }
 if (digitalRead(set) == LOW)
 {
   delay(500);
   while (min_flag)
   {
     lcd.clear();
     lcd.setCursor(0, 0);
     lcd.print("SET MINUTE: ");
     lcd.print(Min);
     delay(100);
     if (digitalRead(inc) == LOW)
     {
       Min = Min + 1;
       if (Min >= 60) Min = 0;
       delay(100);
     }
     if (digitalRead(dec) == LOW)
     {
       Min = Min - 1;
       if (Min <= -1) Min = 0;
       delay(100);
     }
     if (digitalRead(set) == LOW)
     {
       min_flag = false;
       delay(250);
     }
   }
   while (hrs_flag)
   {
     lcd.clear();
     lcd.setCursor(0, 0);
     lcd.print("SET HOUR: ");
     lcd.print(hrs);
     delay(100);
     if (digitalRead(inc) == LOW)
     {
       hrs = hrs + 1;
       if (hrs > 23) hrs = 0;
       delay(100);
     }
     if (digitalRead(dec) == LOW)
     {
       hrs = hrs - 1;
       if (hrs <= -1) hrs = 0;
       delay(100);
     }
     if (digitalRead(set) == LOW)
     {
       hrs_flag = false;
       delay(250);
     }
   }
   if (hrs == 0 && Min == 0)
   {
     lcd.clear();
     lcd.setCursor(0, 0);
     lcd.print("  INVAID TIME");
     delay(2000);
   }
   else
   {
     EEPROM.write(add_hrs, hrs);
     EEPROM.write(add_min, Min);
   }
   INIT();
 }

}

void INIT() {

 hrs = EEPROM.read(add_hrs);
 Min = EEPROM.read(add_min);
 sec = 0;
 lcd.clear();
 lcd.setCursor(0, 0);
 lcd.print("Start / Set Time");
 lcd.setCursor(4, 1);
 if (hrs <= 9)
 {
   lcd.print('0');
 }
 lcd.print(hrs);
 lcd.print(':');
 if (Min <= 9)
 {
   lcd.print('0');
 }
 lcd.print(Min);
 lcd.print(':');
 if (sec <= 9)
 {
   lcd.print('0');
 }
 lcd.print(sec);
 min_flag = true;
 hrs_flag = true;
 delay(500);

}

Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x zdrojaky.zip:

Zdrojový kód: zdrojaky.zip

Overenie

Na používanie našej aplikácie stačia dve tlačítka a postup používania je opísaný v sekcii popis riešenia. Na konci uvádzame fotku záverečnej obrazovky pred resetom. Vypísaný je tu priemerný čas a najlepší čas.

Aplikácia.

Video: https://www.youtube.com/watch?v=ZnA87YROfug

Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.