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é.
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.
Pozostáva z Arduina, krokového motora, paralelne zapojených diód, a niekolkých ovládacích prvkov.
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.
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.
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.
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ý.
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
#include <LiquidCrystal.h>
#include<EEPROM.h>
#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);
}
Zdrojový kód: Médiá:Tinak-DTV.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.
Video: https://www.youtube.com/watch?v=ZnA87YROfug
Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.