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.
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.
[[Súbor::Snímka obrazovky 2023-06-23 183803.png|400px|thumb|center|Model stlpiku.]]
Algoritmus a program
Algoritmus programu vychádza z artuino countdown timera.
<tab name="AVR C-code"><source lang="c++" style="background: LightYellow;">
- 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);
}
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.
Video: https://www.youtube.com/watch?v=ZnA87YROfug
Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.