Robot Prototyping – en industrirobot som 3D-skrivare Kandidatarbete inom Automation och Mekatronik MARKUS HÄGERSTRAND ROBIN LINDHOLM TOMAS NILSSON Institutionen för produkt- och produktionsutveckling Avdelningen för produktionssystem CHALMERS TEKNISKA HÖGSKOLA Göteborg, Sverige 2013 Sammanfattning 3D-skrivare och additiv tillverkning har vuxit i popularitet på senare tid. De används både av privatpersoner och av företag främst för att skapa enklare detaljer och prototyper. I konventionella 3D-skrivare sitter oftast skrivarhuvudet placerat på en kartesisk robot med tre frihetsgrader. Kandidatarbetet syftar till att analysera lämpligheten att istället ha skrivarhuvudet på en industrirobot med sex frihetsgra- der. Dessa är större och dyrare men finns ofta redan på plats i verk- stadsindustrin och har andra egenskaper än kartesiska robotar. Detta medför andra möjligheter och begränsningar. Lämpligheten att använ- da industrirobotar för additiv tillverkning analyserades genom att ett prototypsystem konstruerades och utvärderades. Systemet består av ett skrivarhuvud från 3D-skrivaren Makerbot Replicator 2 monterat på en industrirobot av typen ABB IRB1600-8/1.45. Det resulterande 3D-skrivarsystemet skrev ut olika typer av modeller och det visade sig att en lägre utskriftshastighet gav finare utskriftsföremål. Att an- vända en robot som 3D-skrivare ger stora möjligheter att förverkliga konstruktioner som tidigare inneburit komplikationer, men för att de ska ta över uppgifter som i dagsläget görs av andra maskiner krävs ytterligare utveckling. Potentiella användningsområden identifierades framförallt inom tillverkningsindustrin, där industrirobotar redan har en naturlig plats i produktionen, och det finns processer som potenti- ellt kan förbättras med hjälp av en 3D-skrivarfunktion. Abstract 3D-printers and additive manufacturing have grown in popularity in recent years. The printers are used by both individual hobbyists and businesses, mainly to create simple details and prototypes. The most common printer consists of an extruder mounted on a Cartesian co- ordinate robot with three degrees of freedom. This thesis investigates the suitability of having the extruder mounted on an industrial robot with six degrees of freedom. In general, the robots are bigger and more expensive but often already exist in the manufacturing industry,and they have different characteristics than Cartesian coordinate robots. This results in other possibilities and limitations. The suitability of using industrial robots for additive manufacturing was analyzed by constructing a prototype and then evaluating it. The prototype sys- tem consists of an extruder from a Makerbot Replicator 2 3D-printer mounted on an industrial robot ABB IRB1600-8/1.45. The resulting 3D-printing system was used to print a few different models and it was found that a lower speed yielded a better result. However, fur- ther development is needed for such a system to take over tasks in the industry. Potential applications were identified to exist in an industry environment where industrial robots already are installed, and there are tasks that can be simplified or improved with 3D-printing. Robot Prototyping Förord Stor tack till handledare Per Nyqvist samt Göran Stigler och Hans Sjöberg för deras hjälp i PPU-labbet på Chalmers tekniska högskola. Robot Prototyping INNEHÅLL Innehåll 1 Inledning 1 1.1 Syfte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.2 Avgränsningar . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 1.3 Notationer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 2 Systembeskrivning 3 2.1 Systembeskrivning 3D-skrivare . . . . . . . . . . . . . . . . . . 3 2.1.1 STL-formatet . . . . . . . . . . . . . . . . . . . . . . . 3 2.1.2 Uppdelning av CAD-modeller i lager . . . . . . . . . . 3 2.1.3 Fused Deposition Modelling . . . . . . . . . . . . . . . 4 2.1.4 G-code . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 2.1.5 Arduino . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.2 Systembeskrivning industrirobot . . . . . . . . . . . . . . . . . 5 2.2.1 Industrirobot ABB 1600-8/1.45 . . . . . . . . . . . . . 5 2.2.2 RobotStudio - utvecklingsmiljö för robotprogrammering 5 2.2.3 RAPID - programmeringsspråk för ABB-robotar . . . . 6 2.2.4 Robotens konfiguration . . . . . . . . . . . . . . . . . . 6 2.2.5 Kalibrering av arbetsobjekt och verktyg . . . . . . . . 6 3 Metod 8 3.1 CAD-modeller för utskrift . . . . . . . . . . . . . . . . . . . . 8 3.2 Uppdelning av CAD-modeller i lager . . . . . . . . . . . . . . 9 3.3 G-code för utskrift . . . . . . . . . . . . . . . . . . . . . . . . 9 3.4 RAPID-kod för styrning av robot . . . . . . . . . . . . . . . . 10 3.5 Skrivarhuvud och upphängning . . . . . . . . . . . . . . . . . 10 3.6 Kommunikation mellan robot och styrning av skrivarhuvudet . 10 4 Resultat 12 4.1 Beskrivning av systemet . . . . . . . . . . . . . . . . . . . . . 12 4.1.1 Robotverktyg - skrivarhuvud . . . . . . . . . . . . . . . 13 4.1.2 Användargränssnitt för skrivarhuvud . . . . . . . . . . 13 4.1.3 Plattform för utskrift . . . . . . . . . . . . . . . . . . . 14 4.1.4 C# -kod och interface . . . . . . . . . . . . . . . . . . 15 4.1.5 RAPID-kod . . . . . . . . . . . . . . . . . . . . . . . . 16 4.1.6 Arduino-kod . . . . . . . . . . . . . . . . . . . . . . . . 17 4.2 Experiment . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 5 Diskussion 19 5.1 Systemets utformning . . . . . . . . . . . . . . . . . . . . . . . 19 Robot Prototyping INNEHÅLL 5.2 Industrirobotens lämplighet som 3D-skrivare . . . . . . . . . . 21 5.3 Potentiella användningsområden . . . . . . . . . . . . . . . . . 21 5.4 Vidareutveckling . . . . . . . . . . . . . . . . . . . . . . . . . 23 A Instruktioner för användning i B Kopplingsbeskrivning iii C Komponenter och kretsschema vi D RAPID-kod viii E Arduino-kod xii F C#-kod xviii Robot Prototyping 1 INLEDNING 1 Inledning 3D-skrivare är ett mycket aktuellt ämne. Från att tidigare ha kostat över hundra tusen kronor har de nu fallit kraftigt i pris och med enbart lite teknisk kunskap kan man idag bygga en egen enklare 3D-skrivare för ett par tusen kronor. 3D-skrivare används i dagsläget främst till att snabbt tillverka enklare prototyper men även för att tillverka specialiserade delar, till exempel delar till motorer eller implantat inom sjukvården. Många spekulerar i att 3D- skrivare är en disruptiv teknik som, när den är mogen, har potential att ersätta en stor del av dagens tillverkning. Chalmers prototyplabb har en 3D-skrivare, där modeller tillverkas i plast. Prototyperna blir bra, men begränsas storleksmässigt och inköpskostnaden för den typen av maskiner är mycket stor. De flesta 3D-skrivarna idag är baserade på FDM (Fused Deposition Modelling) och använder kartesiska ro- botar för mekanisk förflyttning av skrivarhuvud. Med kartesiska robotar sker förflyttning av skrivarhuvud linjärt i x-, y- och z-led. Fördelen med denna typ av robotar är att de är billiga och har en enkel konstruktion. I verkstads- industrin används ofta industrirobotar med sex frihetsgrader vilket möjliggör mer avancerade förflyttningar men också en mycket högre inköpskostnad. En tanke var att man skulle kunna använda dessa befintliga robotar för additiv tillverkning genom att använda ett skrivarhuvud som arbetsverktyg på ro- boten. Dessa robotar har helt andra egenskaper än kartesiska robotar vilket medför nya möjligheter men också eventuellt andra begränsningar. Till ex- empel är de inte lika begränsade i den volym de kan röra sig i vilket medför att de skulle kunna skriva ut större föremål. Kombinationen av FDM och industrirobotar kan vara av intresse för verk- stadsindustrin med flera olika potentiella applikationer. Ett exempel där det kan finnas ett intresse från industrin är vid nitning av flygplansvingar, där det uppstår mellanrum mellan vinge och stöd som idag fylls i manuellt. Istäl- let skulle en befintlig robot, som idag används för nitning, kunna fylla igen håligheten med hjälp av additiv tillverkning. 1.1 Syfte Kandidatarbetet ska analysera om en industrirobot av typen ABB IRB1600- 8/1.45 är lämplig att användas för additiv tillverkning. Detta genomförs ge- nom att en prototyp på en helhetslösning utformas och utvärderas. Projektets syfte kan sammanfattas till att 1 Robot Prototyping 1 INLEDNING • utvärdera möjligheten att använda en industrirobot som 3D-skrivare genom att bygga en prototyp på en helhetslösning, • utvärdera i vilken grad industrirobotar är lämpliga att använda som 3D-skrivare utifrån erfarenheter från projektet samt • diskutera vilka potentiella användningsområden tekniken skulle kunna ha. 1.2 Avgränsningar Projektets tidsram på 16 veckor medförde att flera avgränsningar för projek- tet gjordes. De flesta 3D-skrivare har ofta en begränsad storlek på föremålen de kan skriva ut, typiskt 20 × 20 × 20 cm. En industrirobot skulle kunna skriva ut mycket större föremål. Projektet avgränsades till att i första hand försöka skriva ut föremål i storleksordningen mindre än 20 × 20 × 20 cm. Som delsyfte skulle även de potentiella möjligheterna att skriva ut föremål i storleken 1 × 1 × 1 m utvärderas§. Flera antaganden och förenklingar har fått göras angående vissa aspekter hos systemet. Hastigheten på plastutmat- ningen varierades inte under körning och utskrifter gjordes med konstant hastighet. 1.3 Notationer För instruktioner i programmeringsspråken C#, RAPID, C och G-code an- vänds notationen “{kod}”, till exempel {MoveJ}. För längre kodavsnitt är texten kursiverad. 2 Robot Prototyping 2 SYSTEMBESKRIVNING 2 Systembeskrivning Projektet består av två system som ska kopplas samman, en 3D-skrivare och en industrirobot. Här presenteras en generell beskrivning av de två systemen. 2.1 Systembeskrivning 3D-skrivare Med 3D-skrivare avses ett helt system som tillhandahåller funktioner för att skriva ut ett fysiskt objekt utifrån en CAD-modell. Att skriva ut betyder i detta sammanhang att tillverka föremålet, benämningen kommer från likhe- ten i hur en vanlig skrivare skriver på papper. Tekniken kallas på svenska friformsframställning (Wikipedia 2013a). Andra benämningar är additiv tillverkning och rapid prototyping. Framställ- ning sker genom att föremålet skrivs ut lager för lager (Wikipedia 2013b). Att föremålet skrivs ut lagervis kan underlätta vid konstruktion av vissa typer av modeller. 2.1.1 STL-formatet Formatet som används för att representera 3D-modeller av solida föremål är Stereolithography (STL), även kallat Standard Tessellation Language. For- matet beskriver föremålet genom att definiera ett stort antal trianglar som tillsammans approximerar alla ytgeometrier (Wikipedia 2013c). Många mo- derna CAD-program har möjlighet att exportera CAD-modeller till STL- formatet. 2.1.2 Uppdelning av CAD-modeller i lager Geometrin över modellen som ska skrivas ut delas sedan upp i flera lager, en process som på engelska kallas slicing. Varje lager innehåller information av vilka regioner av lagret som innehåller material. Utifrån dessa regioner beräknas en lämplig bana för skrivarhuvudets förflyttning under utskriften (Makerbot 2013a). Processen har fått namnet slicing efter det första steget i processen. 3 Robot Prototyping 2 SYSTEMBESKRIVNING 2.1.3 Fused Deposition Modelling Det vanligaste sättet att skriva ut föremål är genom att successivt lägga till material till föremålet, så kallad additiv tillverkning. De populäraste skrivar- na idag för privatpersoner och mindre företag är baserade på additiv tillverk- ning och använder metoden Fused Deposition Modelling. Material i form av till exempel PLA (polylaktid) eller ABS (Akrylnitril-Butadien-Styren) upp- hettas till sin smältpunkt och extruderas genom ett strängsprutningsmun- stycke, också kallat skrivarhuvud eller extruder. Skrivarhuvudet förs meka- niskt med hjälp av ett CAM-program (Computer Aided Manufacturing) till olika positioner där material lämnas (Wikipedia 2013e). När materialet sval- nar och därmed stelnar, blir det en del av det solida föremålet. Utmatningen av material sker med hjälp av en stegmotor som driver ett kugghjul. Stegmotorn matar in plasten i ett värmeelement där det upphettas till sin smältpunkt. Temperaturen på processen mäts med ett termoelement som är en givare som används för att mäta temperatur. Dessa givare är base- rade på principen att då en metalltråd passerar genom en temperaturskillnad uppstår en potentialskillnad som går att mäta mellan de två ändpunkterna. Den vanligaste varianten är typ K som är lämplig för temperaturer inom intervallet -200 ◦C till +1350 ◦C (Wikipedia 2013i). Storleken på potential- skillnaden som uppstår är endast cirka 41 µV/◦C vilket innebär att signalen normalt behöver förstärkas innan den kan mätas med en analog ingång på en mikrokontroller. Utkriftsmaterialet PLA är en stärkelsebaserad, nedbrytningsbar termoplast som kan tillverkas av majsstärkelse eller rörsocker (Wikipedia 2013f). Plas- tens smältpunkt är 150-160 ◦C och plasten lämpar sig för formsprutning och extrudering (Wikipedia 2013g). Den har dålig tålighet för längre exponering mot vatten (Creative Tools 2013). 2.1.4 G-code Den mekaniska rörelsen av skrivarhuvud och utmatning styrs generellt med numeriska instruktioner i programmeringsspråket G-code. En typisk instruk- tion vid 3D-utskrift är G1 X169.050 Y169.630 F540.000 E0.06467. {G1} är instruktionen för kontrollerad rörelse, vilket innebär att rörelsen sker linjärt med en jämn hastighet (Wikipedia 2013h). {X169.050 Y169.630} beskriver att den nya målkoordinaten är x=169,05 mm samt y=160,630 mm. {F540} sätter hastigheten för rörelsen till 540 mm/min = 9 mm/s och 4 Robot Prototyping 2 SYSTEMBESKRIVNING {E0.06467} sätter att under tiden som rörelsen sker ska stegmotorn, som styr utmatningen av plast, ta sig till sin position E=0,0647 mm. Z-koordinaten är i exemplet oförändrad vilket är typiskt för 3D-skrivare eftersom förflyttning i z-led generellt bara sker vid byte mellan de lager som skrivs ut. 2.1.5 Arduino De flesta 3D-skrivarna som säljs till privatpersoner idag styrs av en mikro- kontroller av typen Arduino. Arduino-systemet består av ett kretskort med en mikrokontroller och tillhörande elektronik samt en programvara för att skriva och ladda program till kortet (Wikipedia 2013d). Dessa är utvecklade för att vara billiga och enkla att använda men ändå kunna utföra många olika typer av uppgifter. 2.2 Systembeskrivning industrirobot En industrirobot är en maskin som utför uppgifter inom industrin. De flesta industrirobotar från ABB utgörs av en ledad arm som kan röra sig kring sex axlar. På armen kan olika verktyg monteras. Eldrivna servomotorer och avancerade växellådor möjliggör en hög precision (ABB 2013a). 2.2.1 Industrirobot ABB 1600-8/1.45 På institutionen för produkt och produktionsutveckling vid Chalmers Tek- niska högskola finns ett antal industrirobotar från ABB. För att undersöka kombinationen av industrirobot och 3D-skrivare fick projektet tillgång till en industrirobot av typen ABB IRB 1600-8/1.45 som är en mångsidig högpre- standarobot med hög noggrannhet. Räckvidden är 1,45 m, den repeterbara noggrannheten 0,05 mm och laster upp till 8,5 kg kan hanteras (ABB 2013b). 2.2.2 RobotStudio - utvecklingsmiljö för robotprogrammering RobotStudio är programvara för att offlineprogrammera ABB-robotar och simulera robotens arbete. En så kallad virtual controller (VC) i RobotStudio agerar likt styrskåpet till en verklig robot och ger användaren möjlighet att programmera och simulera program utan att en robot är inkopplad (ABB 2012). RobotStudio kan även arbeta mot riktiga styrskåp och ladda upp kompletta program för roboten. 5 Robot Prototyping 2 SYSTEMBESKRIVNING 2.2.3 RAPID - programmeringsspråk för ABB-robotar RAPID är ett högnivåspråk utvecklat av ABB för styrning av ABB-robotar. Utöver att ha samma funktionalitet som i andra högnivåspråk har språket egna instruktioner speciellt designade för att styra robotar. Exempel på ett kommando är {MoveL} får roboten att röra arbetsverktyget i en linjär rörelse (ABB 2007). Syntax för {MoveL} är MoveL p10, v1000, z0, tool0; {MoveL} står för “move linear” och rör roboten i en rak linje, där {p10} är en fördefinierad så kallad {robtarget}. I en robtarget finns koordinaterna för den position som roboten ska röra sig till samt verktygets och robotaxlarnas orientering i nämnda position. {v1000} är hastigheten för rörelsen i mm/s och {z0} är ett zonedata-argument. {zonedata} anger hur nära roboten ska gå den programmerade positionen innan den utför nästa kommando. Att zonedata är {z0} betyder att när roboten är 0,3 mm ifrån den programmerade positionen börjar omorienteringen för nästa position, detta innebär alltså att roboten aldrig kommer att köra hela vägen fram till den programmerade positionen. Det sista argumentet, i detta fall {tool0}, specificerar vilket verktyg som ska röra sig fram till positionen. I kombinationen av industrirobot och 3D- skrivare är det spetsen på munstycket som är verktyget. I RAPID kan oönskade händelser hanteras med en felhanterare (ABB 2011b). I koden programmeras att när ett visst fel inträffar anropas felhanteraren och därifrån vidtas lämpliga åtgärder. Detta är viktigt för att undvika skador på roboten eller dess omgivning. 2.2.4 Robotens konfiguration Med robotens konfiguration menas den uppsättning av axelinställningar ro- boten har i en viss position (ABB 2007). Med sex frihetsgrader har roboten teoretiskt sett ett stort antal möjliga konfigurationer i de flesta positioner, undantaget är extrempunkter på randen av robotens arbetsområde. 2.2.5 Kalibrering av arbetsobjekt och verktyg För att definiera ett koordinatsystem i det fysiska rummet, som roboten kan utgå från vid beräkning av rörelser, görs en kalibrering. Kalibrering- 6 Robot Prototyping 2 SYSTEMBESKRIVNING en består av en rutin där robotens arbetsverktyg förflyttas till positioner i rummet. Utifrån dessa beräknas ett koordinatsystem för arbetsobjektet. En trepunktsmetod för att kalibrera arbetsobjektet utförs genom att först för- flytta robotens kalibreringsverktyg till en position som ska ligga på x-axeln, därefter till ytterligare en punkt som ska ligga på x-axeln och till sist en punkt som ska ligga på y-axeln. Därmed är ett koordinatsystem definierat. För att kalibrera robotens arbetsverktyg (skrivarhuvudet) används en lik- nande metod där en spets placeras i rummet och arbetsverktygets TCP (tool center point) förs så nära spetsen. Detta utförs med 3 till 9 olika rotationer eller konfigurationer. Utifrån dessa beräknas sedan en relativ position och rotation för TCP. Förflyttning av roboten under kalibreringen görs inte i RobotStudio utan av en FlexPendant. En FlexPendant är en liten fristående dator kopplad till roboten varifrån roboten kan styras för hand med knappar och reglage (ABB 2011a). 7 Robot Prototyping 3 METOD 3 Metod Projektet gick främst ut på att integrera flera delsystem. Här presenteras först en övergripande bild över alla delsystemen. Därefter beskrivs metoden som användes för att implementera en lösning av varje delsteg samt hur dessa integrerades. De funktioner som skulle ingå i 3D-skrivarsystemet identifiera- des och en hierarkisk uppgiftsanalys gjordes, se figur 1. Figur 1: Arbetsgången i systemet. Användaren börjar med en design i form av en CAD-modell. Slic3r skapar G-code som blir till koordinater samt in- struktioner för plastmatning i en textfil med hjälp av ett C#-program. Text- filen används av robotprogrammet vid körning. 3.1 CAD-modeller för utskrift Systemet konstruerades för att kunna skriva ut modeller som en designer har gjort i ett CAD-program och sedan exporterat i det vanligaste formatet STL. Projektet utvecklades så att en designer ska kunna göra egna CAD- modeller inom vissa begränsningar. Exempel på en vanlig begränsning är att om föremålet har en del som är vinklad utåt kan denna vinkel vara 8 Robot Prototyping 3 METOD högst 45 ◦. Vid större vinkel får nya lager svårt att fästa på föregående lager och strukturen faller ner. Begränsningen går ofta att kringgå genom att rotera föremålet och skriva ut hela föremålet i en annan riktning vilket görs automatiskt av mjukvaran, men flera stora vinklar i olika riktningar begränsas. Problematiken kan lösas med en stödstruktur som sedan tas bort. Automatisk stödstruktur implementerades inte i projektet utan designern får ha med detta i CAD-modellen. För att ha modeller att utvärdera systemet gjordes ett flertal CAD-modeller över lämpliga föremål att skriva ut för att testa och utvärdera systemet. CAD-programmet som användes var CATIA V5R19. 3.2 Uppdelning av CAD-modeller i lager STL-filen måste sedan skivas i lager, en process som på engelska kallas slicing. Till det behövdes programvara. Att implementera en egen programvara som gör detta hade varit onödigt då sådan programvara redan finns. Programmet Slic3r valdes eftersom det har öppen källkod och dessutom kan generera komplett G-code med instruktioner för hur utskriften skulle utföras (Slic3r 2013). 3.3 G-code för utskrift Den G-code som Slic3r producerade innehöll ett flertal instruktioner som till exempel hur skrivarhuvudet skulle värmas upp, skrivarhuvudets förflyttning- ar samt hur mycket plast som skulle matas ut. Koden tolkades och relevanta instruktioner identifierades. Instruktioner för förflyttning av skrivarhuvudet konverterades till robotens programmeringsspråk RAPID med hjälp av en rutin som programmerades i C#. Rutinen producerar en fil med koordinater och instruktioner för huruvida utmatning av plast ska ske under dessa. Inställningen av temperatur implementerades med hjälp av en mikrokontrol- ler. Värmeelementet startas manuellt, och styrs sedan av en mikrokontroller under körning. Eftersom denna styrning är gemensam för alla CAD-modeller behövdes den inte skapas till varje ny modell utan ändras manuellt vid even- tuell förändring av hårdvara, till exempel vid byte till en plast med annan smälttemperatur. 9 Robot Prototyping 3 METOD 3.4 RAPID-kod för styrning av robot RAPID-koden läser in de koordinater som genererats av C#-programmet ut- ifrån G-koden och låter roboten röra sig till dessa koordinater. Om det skall ske en utmatning av material under förflyttningen aktiveras en digital utsig- nal. Denna utsignal är förbunden med en digital ingång på den mikrokontrol- ler som styr stegmotorn i skrivarhuvudet. Koden skapades och simulerades i RobotStudio. För att ta reda på vilken konfiguration som roboten ska ha under körningen gjordes en kalibrering av robotens arbetsverktyg (skrivarhuvudet) och arbets- objektet (bordet). Utifrån kalibreringen av robotens arbetsverktyg valdes en lämplig konfiguration som sedan användes i RAPID-koden. 3.5 Skrivarhuvud och upphängning Utmatning och smältning av material görs av ett skrivarhuvud monterat på roboten. Ett skrivarhuvud av typen Stepstruder MK8 från tillverkaren Makerbot införskaffades. Det är ett skrivarhuvud som används i 3D-skrivarna från deras Replicator-serie som finns till försäljning i handeln. Skrivarhuvudet skruvades fast på en metallplatta tillsammans med ett infäste till roboten. Utmatningen av plast i skrivarhuvudet sker med en stegmotor som drar fram plasttråden genom en uppvärmningsanordning där plasten smälter. Stegmo- tornhar 200 så kallade “steg”, ett steg innebär att mellan en halv och en millimeter plast matas. Materialet som användes var PLA men skrivarhu- vudet klarar även att skriva ut med ABS. Temperaturen i skrivarhuvudet mättes av ett inbyggt termoelement av typ K. Signalen från denna förstärks med en termoelementsförstärkare MAX31855. Den utmatade plasten kyls av en fläkt och en annan fläkt kyler stegmotorn. Från skrivarhuvudet löper kablage upp på robotarmen till en mikrokontroller. Kablarna skyddades för att klara av de rörelser som förekommer under en utskrift. 3.6 Kommunikation mellan robot och styrning av skri- varhuvudet Styrningen av skrivarhuvudets funktioner sker med hjälp av en Arduino mikrokontroller placerad på roboten. Mikrokontrollern får en signal från 10 Robot Prototyping 3 METOD RAPID-programmet huruvida den ska låta stegmotorn köra framåt för att mata plast eller backa ett stycke, detta görs med hög, respektive låg signal. Backfunktionen minskar de trådar som kan uppstå av smält plast samt kom- penserar för att plast fortsätter rinna ut en bit efter att stegmotorn stannar på grund av övertryck i munstycket. Signalen från en utgång på roboten är på 24V vid hög signal och under 1.5V vid låg. Spänningen omvandlas med hjälp av en spänningsdelare till 5V som är hög signal för Arduino. Endast en insignal används som kommunikation mellan robot och Arduino. 11 Robot Prototyping 4 RESULTAT Figur 2: Skrivarhuvudet. Till höger syns en fläkt, värmeelementet inlindat i kaptontejp (värmeisolerande tejp) samt munstycket. 4 Resultat Här beskrivs systemet som har utvecklats i sin helhet. Därefter beskrivs hård- varan som den består samt den mjukvara som används. Sist presenteras de resultat som erhållits från tester på systemet. 4.1 Beskrivning av systemet Systemet som utvecklades är ett arbetsverktyg som monterat på en industri- robot. Detta verktyg kan sedan användas till att skriva ut föremål. Styrningen sker med hjälp av två mikrokontrollers varav den ena har digital insignal från robotens styrskåp. Med hjälp av ett RAPID-program styrs roboten utefter en förgenererad fil som RAPID-programmet läser av. 12 Robot Prototyping 4 RESULTAT 4.1.1 Robotverktyg - skrivarhuvud Robotverktyget består av en bärande metallplatta där ett skrivarhuvud av modellen Stepstruder MK8, tillverkad av Makerbot, är placerad. På metall- plattan är även en infästning för roboten monterad, se figur 2. Skrivarhuvu- dets munstycke är 0,4 mm. En Arduino mikrokontroller styr temperaturen på värmeelementet i skrivarhuvudet. Uppvärmningen kan stängas av och på med hjälp av en knapp inkopplad till mikrokontrollern. Mikrokontrollern är programmerad för att försöka hålla temperaturen runt börvärdet 220 ◦C. Ut- matningen styrs av en annan Arduino. En fläkt kyler stegmotorn och en fläkt kyler den utskrivna plasten, båda fläktarna kräver 12 V. För kretsschema och lista på elektriska komponenter till robotverktyget se appendix C. Figur 3: Schema över skrivarhuvudets kontrollpanel. 4.1.2 Användargränssnitt för skrivarhuvud Vid utskrift styrs elektroniken på skrivarhuvudet från en kontrollpanel, se figur 4 och figur 3. Kontrollpanelen har ett reglage för att starta uppvärm- ningen av värmeelementet, ett reglage för att välja riktning för plastmatning- 13 Robot Prototyping 4 RESULTAT en, en knapp för att mata plast samt ett reglage som kallas Clear-To-Run (CTR). CTR måste vara aktiverad för att automatisk matning via roboten skall vara tillåten, och för att manuell matning skall vara tillåten måste CTR vara låg. Detta för att förhindra att man råkar mata manuellt under automa- tiskkörning. Det finns fem LED-lampor som indikerar att värmeelementet är på, att värmeelementet har uppnått rätt temperatur, huruvida CTR är akti- verad samt att stegmotorfläkten och fläkten som är riktad mot den utmatade plasten är igång. Figur 4: Skrivarhuvudets kontrollpanel. Knappar och reglage till vänster och LED-lampor till höger. 4.1.3 Plattform för utskrift Systemet är byggt för att kunna skriva ut på en skiva av polykarbonat pla- cerad på en fixtur. På skivan fästes Scotch 2090-tejp som PLA enkelt fäster på vid rumstemperatur. Tejpen placerades tätt, men inte överlappande då ytan i så fall skulle ha blivit ojämn. Någon millimeter mellanrum som inne- bär exponerad yta av polykarbonatskivan är inget problem. Vid kalibrering av arbetsobjektet (bordet) kalibreras xy-planet så nära tejpen som möjligt och x-axeln kan lämpligtvis kalibreras så nära kanten närmast roboten som möjligt. Z-axeln kalibreras rakt uppåt ifrån bordet. Observera att en z-axel kalibrerad nedåt skulle innebära att roboten försöker köra igenom bordet vil- ket skulle skada robot, arbetsverktyg och plattform, och detta är ej önskvärt. I koden för konvertering av koordinater adderades några millimeter i x- och 14 Robot Prototyping 4 RESULTAT y-led för att utskriften inte skulle ske på kanten av bordet (som är origo i koordinatsystemet). 4.1.4 C# -kod och interface För fullständig C#-kod se appendix F och för figur över strukturen i C#- programmet se figur 5. Figur 5: Kodstruktur i C#-programmet. I C# programmerades en rutin som extraherar koordinaterna för utskrifts- banan, se figur 6. Programmet består av ett enkelt interface som tillåter användaren att välja en textfil med G-code och en utfil. Programmet skriver ut en textfil med koordinater samt instruktioner för matning av plast. En rad i textfilen ser ut som följande: “1;[10.5, 2.7, 5.0]”. Plastmatningsinstruktio- nen är “1” om skrivarhuvudet ska mata plast, annars “0”. Koordinaten anger sedan nästa position “[x,y,z]” i millimeter. Programmet har även möjlighet att translatera alla positioner i valfri riktning för att flytta utskriftsföremålet relativt utskriftsytan genom att göra modifikationer i koden. Tanken var att senare vidareutveckla programmet till att fungera på ett liknande vis, men med möjlighet att göra alla val direkt i programmet utan att behöva ändra i koden. För att generera G-code används mjukvaran Slic3r, se figur 7. Inställning- ar som gjordes i programmet var “filament=1,75 mm”, “nozzle= 0,4 mm” 15 Robot Prototyping 4 RESULTAT Figur 6: Användargränssnitt för C#- programmet. och “layer height=0,4 mm”. Inställningarna för “bed size” anpassades efter skrivytan. 4.1.5 RAPID-kod För fullständig RAPID-kod se appendix D. Koden är strukturerad i rutiner som gör olika delar i utskriften. Den första rutinen {Open_file} upprättar kommunikationen med textfilen där alla koor- dinater finns. Därefter upprättas en övervakningsprocess i {TriggStopProc} som sätter den digitala utsignalen för matning av plast till 0 i händelse av att körningen av programmet avbryts. Sedan anropas {Test_plastic} som skriver ut en sträng med plast för att säkerställa att plasten är frammatad i skrivarhuvudet. Slutligen exekveras {Move_to_all} som förflyttar roboten till koordinaterna och skickar signaler om att mata plast under tiden. I {Move_to_all} öppnar instruktionen {Open} kommunikationen med text- filen med koordinater och {ReadStr} läser in en rad i taget som en textsträng (ABB 2007). {StrToVal} tolkar och omvandlar strängen till vald datatyp, i detta fall en position. {SetDO} ändrar värdet på en digital utsignal och används i kommunikationen med en mikrokontroller som styr skrivarhuvudets utmatning (ABB 2007). Om utsignalen är 1 betyder det att skrivarhuvudet ska mata plast, om den är 0 ska den dra tillbaka plasten ett kort stycke. 16 Robot Prototyping 4 RESULTAT Figur 7: Användargränssnitt i Slic3r. Användaren laddar in sin CAD-modell i STL-format och Slic3r genererar G-code för utskriftsbanan. Därefter ges roboten instruktionen {MoveL} så att den flyttar skrivarhuvu- det till en annan position samtidigt som den matar eller inte matar plast. Programmet genomför inläsning av alla rader i textfilen tills det inte finns någon mer rad att läsa in. När slutet av filen nås, stängs kommunikationen med filen och programmets körning avslutas. 4.1.6 Arduino-kod För fullständig Arduino-kod se appendix E. Två stycken Arduino mikrokontroller programmerades, den ena styr matning- en av plast och den andra styr smältningen av plast. Rutinen för att smälta plast sätts igång genom att användaren manuellt får slå om en knapp för att sätta igång upphettningen av skrivarhuvudets värmeelement. Så länge tem- peraturen är under 220 ◦C är värmeelementet igång. Uppvärmningen stoppas då temperaturen är över 220 ◦C. Samtidigt indikerar en LED-lampa när vär- men är över 210 ◦C, så att användaren vet att plasten är tillräckligt varm för utskrift. 17 Robot Prototyping 4 RESULTAT Matningen av plast sker med hjälp av en stegmotor som drar fram plasttråden genom skrivarhuvudet. Stegmotorn styrs av en mikrokontroller som i sin tur har en ingång från robotprogrammet. Om roboten skickar en signal om att mata plast, tillåts stegmotorn att stega framåt tills signalen nollställs. När signalen nollställs byter stegmotorn håll och stegar tillbaka några steg för att dra tillbaka lite plast. 4.2 Experiment Ett antal föremål skrevs ut med 3D-skrivarsystemet. Se figur 8. Det första testet vi gjorde var de två sammansatta plattorna, det andra en liten py- ramid, det tredje var samma pyramid men uppskalad till dubbla storleken, det sista testet var ett glas. Vid de fyra testen användes olika värden på ro- botens hastighet, stegmotorns hastighet och fyllningsgraden för materialet. I det första testet där vi skrev ut två plattor hade vi en fördröjning mellan varje steg på stegmotorn 36 ms, begränsad hastighet v50 på roboten och kör- ning i 40% av hastigheten. Begränsad hastighet innebär att roboten inte kör i den programmerade hastigheten, utan med en reducerad hastighet. På de resterande tre testen hade vi en fördröjning på 19 ms, begränsad hastighet på v50 vid 80%. På det sista testet var skillnaden att fyllnadsgraden av plast var satt till 0.8 (80%) istället för 0.4 (40%). Ett koncentriskt fyllnadsmönster testades istället för ett rätlinjigt. En lägre hastighet på utskriften medförde ett jämnare lager plast och ett bättre resultat. Att plasten hann stelna innan nästa lager applicerades var viktigt, annars höll föremålet inte formen. Vid konstruktion av mindre de- taljer där det dröjer en kortare tid mellan lagren blev detta uppenbart och topparna på pyramiderna blev deformerade. Glasets väggar skrevs föga oväntat ut på höjden. Väggarna var designade att bli raka men deras form blev oregelbunden med något som ser ut som spår i väggarna. När material skrevs ut i en bågformad bana var det svårare för plasten att fästa mot underlaget då plasten utsattes för en kraft i sidled, och en utskriven cirkel liknade mer en polygon. Plasten fick endast fäste vid vissa punkter och däremellan blev det en rak linje med plast. Detta beror på att föregående lager var lika bristfälliga och underlaget för plasten att fästa på ej var intakt. 18 Robot Prototyping 5 DISKUSSION Figur 8: De första föremålen som skrevs ut. Ett glas, två pyramider, och två sammanhängande plattor. 5 Diskussion 5.1 Systemets utformning De alternativ vi hade gällande skrivarhuvuden var att antingen bygga ett eget, att köpa ett befintligt eller att köpa en hel 3D-skrivare och ta loss skri- varhuvudet. Då projektets omfattning var relativt stor valde vi att köpa en befintlig lösning så att kandidatarbetet kunde fokusera på att få systemet av delprocesser att fungera tillsammans. Detta medförde att vi fick ett ro- bust och välbeprövat skrivarhuvud som egentligen var anpassat för en annan befintlig skrivare. De vanligaste materialen vid 3D-printing är ABS och PLA. Båda fungerar utmärkt som material för projektets behov. ABS tål något högre temperatu- rer men behöver en uppvärmt byggplatta för att fästa. PLA behöver ingen uppvärmd byggplatta utan det räcker med en viss typ av tejp eller ett under- lag av polykarbonat. Då det slutgiltiga målet var att kunna skriva ut stora föremål valdes ABS bort till förmån för PLA. En stor uppvärmd skrivyta är på flera sätt problematiskt, med bland annat stora värmeförluster till omgiv- ningen. ABS avger vid upphettning en ånga som kan lukta något och irritera personer som är känsliga. PLA avger vid upphettning en ånga som generellt luktar och irriterar mindre än ABS. Då utskrifterna kommer att ske i en stor lokal över långa perioder är dessa egenskaper hos PLA en stor fördel. PLA 19 Robot Prototyping 5 DISKUSSION är dessutom mer miljövänligt då det tillverkas av biologiska material och är biologiskt nedbrytbart, till skillnad från ABS som tillverkas av olja. Då det inte fanns en uppenbar lösning från början uppstod det många hinder som var svåra att förutspå. Detta innebar att flera lösningar av tidiga del- problem behövde omarbetas. En del arbete visades sig vara överflödigt och användes inte. Ett exempel var att tid lades på PC SDK, som används för att styra en robot direkt via till exempel C#, vilket senare inte användes alls. Mycket testkod användes för att se hur senare problem skulle lösas innan slutgiltiga lösningar på de tidiga problemen kunde implementeras. Många av delproblemen var komplexa och hade krävt en stor arbetsinsats att lösa från grunden. Men det visade sig att det ofta fanns färdiga lösningar som relativt enkelt kunde användas, om än några behövde specialanpassas något. Forumen för hobbyanvändare av 3D-skrivare präglas av en öppen kultur och användarna delar gärna med sig av sitt kunnande. Även mikrokontrollerföre- taget Arduino delar med sig av sina lösningar och mycket av koden för att styra stegmotorer fanns väldokumenterad. I projektet användes flera programmeringsspråk såsom RAPID, Arduino, G- code samt C#. Då tiden var begränsad förenklades vissa avancerade funktio- ner. Utmatningen av material och styrningen av roboten skulle kunna skötas av samma program, men det hade krävt en mer avancerad kod i RAPID som i sig inte är anpassat för att styra stegmotorer på det sätt som Arduino är. Robotstyrskåpet har möjlighet att kommunicera seriellt med Arduino men att utveckla en kommunikation för mer avancerade instruktioner låg utanför tidsramen för projektet. Lösningen som valdes innebär att robotens styrskåp inte har möjlighet att ha kontroll över matningen utan får förlita sig på att Arduinon sköter detta själv. Då Arduinon inte vet vilken typ av rörelse ro- boten gör försvann möjligheter såsom att styra temperaturen från roboten eller att mata ut med varierande hastighet. Vissa problem med att anpassa utmatningen, exempelvis att göra första lagret tjockare, kunde lösas genom att köra roboten långsammare under utskriften av detta lager. För projektet räckte det med endast en robotkonfiguration, därför var det inte nödvändigt att ta fram en metod för att variera konfigurationen över volymen. Om roboten är tänkt att arbeta över en större volym kan konfi- gurationen skilja sig i olika positioner vilket innebär att roboten inte kan nå alla koordinater i samma konfiguration. En rutin för när roboten tvingas byta konfiguration skulle då behöva utvecklas. Mot slutet av projektet uppstod en del problem med elektroniken. Upp- värmningen av skrivarhuvudet gick långsamt och det var svårt att nå rätt 20 Robot Prototyping 5 DISKUSSION temperatu, detta antogs bero till stor del av att upphängningen av alumini- um verkade som en kylfläns och avledde värme. När plast matades ut under längre perioder föll temperaturen för snabbt för att processen skulle vara stabil. Detta kunde temporärt lösas genom att manuellt tillföra extra värme under processen. Felsökningen av elektronikfel medförde att flera av testerna inte kunde genomföras som planerat inom projektets tidsram. Experiment med utskrifter gick att genomföra men kvalitéten var för dålig för att skulle vara meningsfullt att analysera dem och det saknades tid att förfina proces- sen. FDM är en känslig teknik där plaststrålen från munstycket kan böja sig vilket påverkar hur raka strängarna blir. Projektets prototyp testades inte på ett större föremål men räckvidden på roboten är tillräcklig för att kunna skriva ut objekt som är flera gånger större än de som Makerbot Replicator 2 producerar. 5.2 Industrirobotens lämplighet som 3D-skrivare Industrirobotar har en stor massa vilket innebär ett större tröghetsmoment och större energiåtgång än i mindre 3D-skrivare. De har dock en hög repe- terbarhet, och en bra kalibrering av arbetsobjekt och verktyg kan leda till fina resultat. Beräkningar av rörelser i 6 frihetsgrader kräver mer beräkning- ar men för roboten innebär detta i allmänhet inga problem. En stor utskrift kommer att bestå av många förflyttningar men detta kommer bara att för- anleda i en längre textfil med koordinater. Att skriva ut stora föremål med hög noggrannhet tar lång tid. En kommer- siell 3D-skrivare av typen Makerbot Replicator har en utskriftshastighet på 24cm3/h (Makerbot 2013b). Att avsätta en robot för ett ändåmål en lång tid i produktionen innebär stora kostnader. En snabbare teknik som eventuellt har lägre noggrannhet kan fortfarande vara intressant vid utskrift av stora föremål. Vidare studier på alternativa material och 3D-tillverkningstekniker behövs. Med FDM skulle industrirobotar fortfarande vara lämpliga för stora föremål men med liten volym då tillverkningstiden kan förkortas. Ett exem- pel är utskrift av stora fast ej solida detaljer. 5.3 Potentiella användningsområden Ett syfte för projektet var att analysera potentiella användningsområden för tekniken. En möjlighet finns att använda tekniken för fyllnad av mellan- rum som uppstår vid nitning av flygplansvingar. Då olika material har olika 21 Robot Prototyping 5 DISKUSSION egenskaper är det främst materialvalet som styr vilken tillverkningsteknik som används. I projektet användes den additiva tillverkningstekniken FDM och materialet PLA. PLA fäster inte på aluminium som är det vanligaste materialet vid tillverkning av flygplan. En tunn film polykarbonat ovanpå aluminiumplåten skulle få PLA att fästa även vid rumstemperatur. Industrirobotar innebär en större inköpskostnad relativt kartesiska robotar, men då de har många användningsområden finns de ofta redan i de flesta fabriker. Ett robotverktyg för 3D-utskrifter skulle förvandla en industrirobot till en 3D-skrivare för relativt låg kostnad jämfört med att köpa ett helt 3D-skrivarsystem. För mindre projekt skulle en sådan lösning innebära en besparing, om en industrirobot redan innehavs. Genom att ha en robot med generell förmåga och möjlighet att byta verktyg kan roboten användas till flera aktiviteter i samma process. Ett exempel kan vara att dra en elledning i en cementvägg under tiden den byggs upp. Det räcker då att roboten byter mellan verktyg eller att flera robotar arbetar samtidigt. Att industriroboten har fler frihetsgrader än kartesiska robotar öppnar upp för att ha varierande orientering på arbetsverktyget. Då skulle det gå att skriva på ojämna ytor med arbetsverktyget fortfarande vinkelrätt mot ytan. Med ett utskriftsmaterial som fäster direkt skulle det gå att skriva ut på lutande ytor. En industrirobot behöver inte nödvändigtvis hålla i skrivarhuvudet utan kan istället hålla i föremålet eller plattformen som föremålet befinner sig på. Se- dan flyttas föremålet relativt ett fast skrivarhuvud som skriver ut material på plattformen. Det fasta skrivarhuvudet kan även bytas mot ett skrivarhuvud monterat på en annan robot. På så vis kan man under utskrift rotera föremå- let 90◦och därmed skriva ut rakt i föremålets sidled. Med FDM är en sådan utskrift i dagsläget inte möjligt utan stödmaterial. Stödmaterialet innebär andra begränsningar, till exempel måste materialet vara möjligt att komma åt efter utskrift i syfte att avlägsna det. Därför är det idag omöjligt att skri- va ut vissa former av ihåligheter såsom en ihålig kub. Om det vore möjligt hade tekniken lett till önskvärda egenskaper såsom minskad materialåtgång, viktbesparing, ökad yta för värmeavledning, minskad värmeledningsförmåga genom materialet, samt möjligheter till nya mekaniska strukturer. Tekniken behöver inte enbart begränsas till industrirobotar. Det finns flera andra typer av robotar med ledade armar som kan användas för additiv tillverkning. En ledad arm har flera attraktiva egenskaper, bland annat en stor arbetsvolym och en generell arbetsförmåga. Det byggs idag hus med hjälp 22 Robot Prototyping 5 DISKUSSION av stora kartesiska robotar som bygger upp cementväggar. En stor kartesisk robot körs till byggarbetsplatsen och bygger sedan ovanifrån. Här skulle det kunna vara intressant att kunna byta ut arbetsverktyget på grävskopan mot ett arbetsverktyg som gör om grävskopan till en 3D-skrivare som skriver ut i cement. Detta innebär att ingen extra byggplattform måste köras till byggarbetsplatsen, och att den möjliga arbetsytan blir större. Ofta behövs grävmaskinen redan för bygget och finns redan på plats. Ifyllnader av håligheter kan även vara intressant i andra sammanhang. Defek- ter uppstår ofta vid normal användning på produkter vars estetiska utseende är viktig för konsumenten. En 3D-skrivare skulle då kunna fylla igen dessa. Ett exempel är att fylla igen defekter på bilar. Om en bil kör in i ett rum likt en automatisk biltvätt, kan bilen bli avläst av en skanner. Därefter skulle en ledad arm kunna föras runt bilen och fylla i eller jämna ut alla defekter som har uppstått i plåt och plastdetaljer. Därefter kan armen byta arbetsverktyg och applicera färg på materialet. 5.4 Vidareutveckling RAPID-koden är anpassad för att flytta roboten i den hastighet som är lämplig beroende på stegmotorn som matar ut plast ur skrivarhuvudet. På så vis behöver inte stegmotorn ändra hastighet. En mer avancerad kommu- nikation, där stegmotorns hastighet sätts av roboten, lämnas till framtida vidareutveckling. Vilken vinkel på underlaget som det går att skriva ut olika material vid är intressant för vidare studier. Det munstycke som används i skrivarhuvudet är 0,4 mm i diameter. Att diametern är så liten innebär att föremål med väldigt jämna och fina ytor kan skrivas ut men också att utskrifterna tar en lång tid. För ändamålet att skriva ut stora föremål med lägre detaljnivå är ett skrivarhuvud med större munstycke att föredra. För att detta ska fungera behövs ett större munstycke, mindre förändringar i mjukvaran och en förnyad kalibrering av robotverktyget. Vid utskrift av större föremål med dimensioner som skiljer sig mycket från de kalibrerade kan roboten behöva byta konfiguration. Genom att analysera var i robotens koordinatsystem den behöver byta konfiguration skulle en konfi- guration för varje koordinat kunna erhållas och roboten skulle kunna byta konfiguration under utskriften. Eventuellt skulle detta medföra att roboten tvingas göra vissa komplicerade rörelser långsammare. Analys av noggrannhet och prestanda bör analyseras. 23 Robot Prototyping REFERENSER Referenser ABB (2007) Technical reference manual RAPID Instructions, Functions and Data types. RobotWare 5.0 Document ID: 3HAC16581-1 ABB (2011a) Operating manual IRC5 with FlexPendant. Document ID: 3HAC16590-1 ABB (2011b) Technical reference manual RAPID overview. RobotWare 5.14 Document-ID: 3HAC16580-1 ABB (2012) Operating Manual RobotStudio 5.14. Document ID: 3HAC032104-001 ABB (2013a) Industriroboten. http://www.abb.se/cawp/seabb361/ 1a2fa56f98d23270c1257251003027f7.aspx (2013-05-16) ABB (2013b) IRB1600 Data Sheet Document ID:PR10282EN_R7 Creative Tools (2013) Jämförelse av plaster för FFF 3D-skrivare. http:// www.creativetools.se/material-jamforelse-se (2013-05-16) Makerbot (2013a) 3D printing concepts. http://www.makerbot.com/ support/guides/printing/#slicing (2013-05-16) Makerbot (2013b) Makerbot Replicator http://store.makerbot.com/ replicator.html (2013-05-22) Rpworld (2013) Stereolithography Apparatus. http://rpworld.net/ cms/index.php/additive-manufacturing/rp-rapid-prototyping/ sla-stereo-lithography-apparatus.html (2013-05-21) Slic3r (2013) About Slic3r. http://slic3r.org/about (2013-05-16) Wikipedia (2013a) Friformsframställning. http://sv.wikipedia.org/ wiki/Friformsframst%C3%A4llning (2013-05-16) Wikipedia (2013b) 3D printing. http://en.wikipedia.org/wiki/3D_ printing (2013-05-16) Wikipedia (2013c) STL (file format). http://en.wikipedia.org/wiki/ STL_(file_format) (2013-05-16) Wikipedia (2013d) Arduino. http://en.wikipedia.org/wiki/Arduino (2013-05-16) Wikipedia (2013e) Fused deposition modeling. http://en.wikipedia.org/ wiki/Fused_deposition_modeling (2013-05-17) 24 http://www.abb.se/cawp/seabb361/1a2fa56f98d23270c1257251003027f7.aspx http://www.abb.se/cawp/seabb361/1a2fa56f98d23270c1257251003027f7.aspx http://www.creativetools.se/material-jamforelse-se http://www.creativetools.se/material-jamforelse-se http://www.makerbot.com/support/guides/printing/#slicing http://www.makerbot.com/support/guides/printing/#slicing http://store.makerbot.com/replicator.html http://store.makerbot.com/replicator.html http://rpworld.net/cms/index.php/additive-manufacturing/rp-rapid-prototyping/sla-stereo-lithography-apparatus.html http://rpworld.net/cms/index.php/additive-manufacturing/rp-rapid-prototyping/sla-stereo-lithography-apparatus.html http://rpworld.net/cms/index.php/additive-manufacturing/rp-rapid-prototyping/sla-stereo-lithography-apparatus.html http://slic3r.org/about http://sv.wikipedia.org/wiki/Friformsframst%C3%A4llning http://sv.wikipedia.org/wiki/Friformsframst%C3%A4llning http://en.wikipedia.org/wiki/3D_printing http://en.wikipedia.org/wiki/3D_printing http://en.wikipedia.org/wiki/STL_(file_format) http://en.wikipedia.org/wiki/STL_(file_format) http://en.wikipedia.org/wiki/Arduino http://en.wikipedia.org/wiki/Fused_deposition_modeling http://en.wikipedia.org/wiki/Fused_deposition_modeling Robot Prototyping REFERENSER Wikipedia (2013f) Polylaktid. http://sv.wikipedia.org/wiki/ Polylaktid (2013-05-16) Wikipedia (2013g) Polylactid acid. http://en.wikipedia.org/wiki/ Polylactic_acid (2013-05-16) Wikipedia (2013h) G-code. http://en.wikipedia.org/wiki/G-code (2013- 05-16) Wikipedia (2013i) Thermocouple. http://en.wikipedia.org/wiki/ Thermocouple#K (2013-05-19) 25 http://sv.wikipedia.org/wiki/Polylaktid http://sv.wikipedia.org/wiki/Polylaktid http://en.wikipedia.org/wiki/Polylactic_acid http://en.wikipedia.org/wiki/Polylactic_acid http://en.wikipedia.org/wiki/G-code http://en.wikipedia.org/wiki/Thermocouple#K http://en.wikipedia.org/wiki/Thermocouple#K Robot Prototyping A INSTRUKTIONER FÖR ANVÄNDNING A Instruktioner för användning 1. Designa den CAD-ritning som ska skrivas ut. 2. Spara CAD-ritning STL-format. 3. Starta Slic3r och kör Configuration Wizard. 4. Ange i inställningar:Makerbot, 1.75mm filament och 0,4 mm munstyc- ke. 5. Under Print Settings - Layers and Perimeters ange layer height = 0,4 mm. 6. Öppna STL-filen för CAD-ritningen i Slic3r. 7. Ändra eventuellt inställningarna för att ändra utskriftsbanan. 8. Klicka på Export G-code. 9. Konvertera filen med G-code till .txt-format. 10. Skapa en utfil (.txt) som du vill skriva till. 11. Om det behövs kan utskriftspositionen translateras i C#-koden. 12. Starta programmet (antingen genom exekveringsfilen eller via Visual Studio prjektet) 13. Klicka på “Input File” och välj textfilen med G-code. 14. Klicka på “Output File” och välj textfilen du vill skriva till. 15. Klicka på “Convert” och den valda utfilen innehåller nu koordinaterna för utskrift 16. Kalibrera work object och ändra bord3dprinter i MainModule. 17. Ändra koordinater i Test_plastic så att en sträng med plast skrivs ut på en tom yta. 18. Kontrollera konfigurationen inom utskriftsvolymen och ändra eventu- ellt i MainModule. 19. Kontrollera rätt sökväg till filen med koordinater. 20. På roboten: skapa ett nytt program, ladda upp MainModule till pro- grammet. 21. Håll robotverktyget positionerat mot robotens verktyg. i Robot Prototyping A INSTRUKTIONER FÖR ANVÄNDNING 22. På FlexPendant sätt DO10_1 till hög, verktyget sitter nu fast. 23. På FlexPendant sätt DO10_1 till låg igen, verktyget sitter fortfarande fast. För att senare ta loss verktyget, använd DO10_2. 24. På FlexPendant välj verktyget nozzle3dprinter som tool. 25. Utför en kalibrering av utskriftsytan. 26. Stega inkrementellt runt z=1mm i sidled och se vid vilken höjd som munstycket river upp tejp. Addera denna höjd till alla koordinater i C#-koden. River munstycket upp tejp vid z=0,9 så addera 0,9 mm så att första lagret (som är 0,4 mm i diameter) börjar vid 1,3mm. 27. Jogga roboten till en lämplig plats där filamentet har möjlighet att matas in i skrivarhuvudet. 28. Slå på uppvärmningen av skrivarhuvudets värmeelement. Vänta tills uppvärmningen temperaturen har nått 220 ◦C. 29. Tryck ner knappen för manuell matning och för samtidigt in filament i skrivarhuvudet tills stegmotorn får tag i filamentet. 30. Kör manuellt tills tillräcklig mängd plast har gått igenom skrivarhuvu- det för att gamla rester ska vara helt borta. Avbryt matningen. 31. På FlexPendant, välj Debug, Set PP to main, och för att slutligen starta programmet. ii Robot Prototyping B KOPPLINGSBESKRIVNING B Kopplingsbeskrivning Se figur 9. Figur 9: Kommunikationshub med kretskort. iii Robot Prototyping B KOPPLINGSBESKRIVNING A: D-Subkontakt till skrivarhuvudpaketet 1. Stegmotorfläkt, negativ pol 2. Stegmotorfläkt, positiv pol 3. Sidofläkt, negativ pol 4. Sidofläkt, positiv pol 5. Stegmotor D 6. Stegmotor B 7. Stegmotor A 8. Stegmotor C 9. Värmeelement, negativ pol 10. Värmeelement, positiv pol B: D-subkontakt till kontrollpanelen och industrirobot 1. LED, stegmotorfläkt 2. LED, Clear-To-Run 3. LED, värmeelement 4. LED, temperatur 5. LED, sidofläkt 6. Input ABB 7. Reglage , Clear-To-Run 8. Reglage , värmeelement 9. Spänningskälla, 12V, negativ pol 10. Spänningskälla, 12V, positiv pol 11. Jord ABB 12. 5V, Arduino 1 (stegmotorstyrning) 13. 5V, Arduino 2 (temperaturstyrning) 14. Reglage, mata plast 15. Reglage, matningriktning C: Adafruit - Thermocouple Amplifier MAX31855 D: Pololu - A4988 Stepper Motor Driver Carrier with Voltage Regulators iv Robot Prototyping B KOPPLINGSBESKRIVNING E: Kopplingar till Arduino 2 (Temperaturstyrning) [#: där siffran är ingången på Arduino] 1. 5V 2. 2: Utgång, sidofläktkontroll 3. 3: Adafruit, CLK 4. 4: Adafruit, CS 5. 5: Adafruit, DO 6. 6: Ingång, reglage, värmeelement 7. 10: Utgång, LED värmeelement på/av 8. 11: Utgång, LED temperatur uppnådd 9. 12: Utgång, värmeelement på/av 10. 13: Utgång, LED sidofläkt på/av 11. Jord F: Kopplingar till Arduino 1 (Stegmotorstyrning) [#: där siffran är ingången på Arduino] 1. 5V 2. 3: Ingång, från ABB 3. 2: Ingång, reglage för matning 4. 4: Ingång, reglage för matningsriktning 5. 11: Ingång, reglage för Clear-To-Run 6. 5: Utgång, stegmotorfläktkontroll 7. 7: Utgång, LED stegmotorfläkt på/av 8. 8: Utgång, matningsriktning 9. 12: Utgång, stega 10. 13: LED, Clear-To-Run 11. 11: Jord v Robot Prototyping C KOMPONENTER OCH KRETSSCHEMA C Komponenter och kretsschema Följande elektronisk hårdvara ingår i lösningen. • 2 st. Arduino Uno • 1 st. Pololu A4988 • 1 st. Thermocouple Amplifier MAX31855 • 3 st. NPN transistorer • 1 st. NO (normally open) knapp • 3 st. reglageknappar • 17 st. resistanser – 1 st 39 kΩ – 5 st. 10 kΩ – 3 st. 3.3 kΩ – 5 st. 1 kΩ – 3 st. 330 Ω • 5 st. spänningskällor (3 st. 9 V & 2 st. 12 V) vi Robot Prototyping C KOMPONENTER OCH KRETSSCHEMA P o lo lu A 4 9 8 8 G N D 5 V V D D 3 .3 V G N D R E F E N A B L E M S 1 M S 2 M S 3 R E S E T S L E E P S T E P D IR V M O T G N D 2 B 2 A 1 A 1 B V D D G N D M o to r S u p p ly ( 8 -3 5 V ) 9 1 2 V A rd u in o U N O 1 IO R E F R E S E T 3 .3 V 5 V G N D G N D V in A 0 A 1 A 2 A 3 A 4 A 5 A R E F G N D 1 3 1 2 ~ 1 1 ~ 1 0 ~ 9 8 7 ~ 6 ~ 5 4 ~ 3 2 T X > 1 R X < 0 P W R U S B in R e f < 0 .2 2 8 5 V F o r c o rr e c t c u rr e n t li m it e r 1 2 V P o w e r S o u rc e F e e d P la s ti c 1 0 k Ω 1 0 k Ω F e e d D ir e c ti o n T h e rm o c o u p le A m p . M A X 3 1 8 5 5 V in 3 V o G N D D O C S C L K R E D Y L W A rd u in o U N O 2 IO R E F R E S E T 3 .3 V 5 V G N D G N D V in A 0 A 1 A 2 A 3 A 4 A 5 A R E F G N D 1 3 1 2 ~ 1 1 ~ 1 0 ~ 9 8 7 ~ 6 ~ 5 4 ~ 3 2 T X > 1 R X < 0 P W R U S B in 1 2 V P o w e r S o u rc e N P N N P N F a n S u p p ly 1 2 V H e a te r S u p p ly 1 2 V N P N IN P U T A B B L E D T e m p e ra tu re L E D H e a te r o n /o ff 1 k Ω 1 k Ω L E D R u n n in g 1 k Ω L E D F A N 1 1 k Ω *D *E *D *E 1 0 k Ω H e a te r O n /O ff *F *F *G C le a r to r u n 1 0 k Ω *G A -C B -D H e a te r 1 0 M Ω + K -T h e rm o c o u p le + K -T h e rm o c o u p le - L E D F A N 2 1 k Ω F A N F A N 5 0 n F 3 3 0 Ω 3 3 0 Ω 3 3 0 Ω 3 .3 k Ω 3 .3 k Ω 3 .3 k Ω 3 9 k Ω 1 0 k Ω Figur 10: Kretsschema för elektroniken i 3D-skrivaren. vii Robot Prototyping D RAPID-KOD D RAPID-kod MODULE MainModule CONST confdata targetconfig := [1, -1, 0, 0]; !robot configuration VAR iodev file; !coordinate file VAR string str; VAR string savestr; !!the recent digital output VAR bool ok; !checking the StrToVal conversion VAR pos position; !modifiable position for robtarget VAR robtarget temprobtarget :=[[100, 100, 100],[0.0122162,0.98626, -0.164722,0.00290463],targetconfig, [9E9,9E9,9E9,9E9,9E9,9E9]]; !modifiable robtarget VAR num button_number; !flexpendant buttons CONST errnum unknown_str := 10; !unknown string in coordinate file CONST errnum illegal_z := 20; !error for z<0 PERS wobjdata table3dprinter := [FALSE,TRUE,"",[[-486.55,886.809,613.113], [0.999911,-0.00904704,0.000671354,0.00982808]], [[0.000357628,0.00166893,-0.00107288],[1,8.25185E-06,-1.87711E-06, -1.51781E-06]]]; !calibrated workobject PERS tooldata nozzle3dprinter := [TRUE,[[-24.4901,-66.269,86.1957],[1,0,0,0]], [0.5,[5,5,5],[1,0,0,0],0,0,0]]; !calibrated 3D-printer tool PERS restartdata restart; PROC main() Open_file; TriggStopProc restart\DO1:=DO11_4, DO11_4; !when robot stops, stop printing plastic Test_plastic; Move_and_print; ENDPROC !Prints a plastic string before printing an object to clear the extruder of other material PROC Test_plastic() position := [370, 86.3, 200]; temprobtarget.trans := position; MoveJ temprobtarget,v100,z10,nozzle3dprinter\WObj:=table3dprinter; position := [370, 86.3, 1.3]; temprobtarget.trans := position; MoveL temprobtarget,v100,fine,nozzle3dprinter\WObj:=table3dprinter; SetDO DO11_4, 1; WaitTime 0.1; position := [258, 86.3, 1.3]; temprobtarget.trans := position; MoveL temprobtarget,v100,fine,nozzle3dprinter\WObj:=table3dprinter; SetDO DO11_4, 0; WaitTime 0.1; position := [100, 10, 200]; viii Robot Prototyping D RAPID-KOD temprobtarget.trans := position; MoveL temprobtarget,v100,fine,nozzle3dprinter\WObj:=table3dprinter; ENDPROC !opens communication with coordinate file in chosen file path PROC Open_file() Open "/filepath/" \File:= "coordinatefile.txt", file \Read; ERROR IF ERRNO = ERR_FILEOPEN THEN TPWrite "Device Access Error nr 41676"; TPReadFK button_number, "What to do?", stEmpty, stEmpty, stEmpty,"TRYNEXT", "RETRY"; IF button_number = 4 THEN TRYNEXT; ELSEIF button_number = 5 THEN RETRY; ENDIF ENDIF ENDPROC ix Robot Prototyping D RAPID-KOD !reads coordinates, sets output to Arduino for printing plastic and moves robot PROC Move_and_print() savestr :=”0”; !the recent digital output WHILE (true) DO str := ReadStr(file \Delim:=";"); !reads a string to the delimiter ";" which is a 1 or 0 IF str="EOF" THEN !Finished if program has reached end of file. Move robot for easy access to the printer tool. TPWrite "End of file."; SetDO DO11_4, 0; WaitTime 0.5; position := [0, 0, 300]; temprobtarget.trans := position; MoveL temprobtarget,v100,fine,nozzle3dprinter\WObj:=table3dprinter; Close file; !closes the communication with the coordinate file RETURN; !break while loop ELSEIF str="1" THEN ! print plastic IF savestr=”0” THEN SetDO DO11_4, 1; WaitTime 0.1; ENDIF ELSEIF str ="0" THEN !stop printing plastic IF savestr=”1” THEN SetDO DO11_4, 0; WaitTime 0.1; ENDIF ELSE !if other unknown string, go to error handler TPWrite str; RAISE unknown_str; ENDIF str := ReadStr(file\Delim:="]"); !reads the position string to "]" str := str + "]"; !add a "]" to string ok := StrToVal(str,position); !converts string to position IF ok=FALSE THEN ! if not a position string, go to error handler TPWrite str; RAISE unknown_str; ENDIF IF position.z < 0 THEN !to prevent moving the extruder tool into the table RAISE illegal_z; ENDIF str := ReadStr(file); !reads the rest of the line, should contain nothing temprobtarget.trans := position; !set new position MoveL temprobtarget,v100,fine,nozzle3dprinter\WObj:=table3dprinter; !move to position ENDWHILE ERROR !error handler IF ERRNO = unknown_str THEN !if unknown string in coordinate file StopMove; SetDO DO11_4, 0; x Robot Prototyping D RAPID-KOD WaitTime 0.1; TPErase; TPWRite "Unknown String."; TPReadFK button_number, "What to do?", stEmpty, stEmpty, stEmpty ,"TRYNEXT", "RETRY"; IF button_number = 4 THEN TRYNEXT; ELSEIF button_number = 5 THEN RETRY; ENDIF ENDIF IF ERRNO = illegal_z THEN !if z < 0 StopMove; SetDO DO11_4, 0; WaitTime 0.1; TPErase; TPWRite "Position z less than 0."; TPReadFK button_number, "What to do?", stEmpty, stEmpty, stEmpty ,"TRYNEXT", "RETRY"; IF button_number = 4 THEN TRYNEXT; ELSEIF button_number = 5 THEN RETRY; ENDIF ENDIF ENDPROC ENDMODULE xi Robot Prototyping E ARDUINO-KOD E Arduino-kod Arduino 1: Stepper Control // Part of the controllsystem for a ABB-mounted 3D-printing head // Made for the Bachelor’s thesis on Chalmers Tekniska Högskola // // Made by: Tomas Nilson // Robin Lindholm // Markus Hägerstrand // // Date: 2013-05-22 // Constants declaring pin numbers const int feedPin = 2; // Feeds the plastic const int inputABBPin = 3; // Input from ABB const int feedDirectionPin = 4; // Direction const int fanCtrlPin = 5; // Fan on/off const int LEDFan1Pin = 7; // LED for one of the fans const int dirCtrlPin = 8; // Direction control const int comInputPin = 9; // Connected to the second Arduino (7) // Not used const int comOutputPin = 10; // Connected to the second Arduino (8) // Not used const int clrToRunPin = 11; // Clear to run switch const int stepperPin = 12; // Do one step. const int LEDRunPin = 13; // LED to indicate if it’s running & onboard ledPin // Constants const int delayTimeStep = 9; // Standard delay for a step const int steps = 200; // Number of steps (1.8 deg per steps results in 360/1.8 = 200 steps per revolution) [#] const int backFeedSteps = 5; // Nmber // Variables int feedButtonState = 0; // Variable to save the state of the feedbutton int inputABB = 0; // Variable to save the input from ABB int clrToRun = 0; // Save the switchstate of the Clear-to-Run switch int comInput = 0; // Input from the other Arduino that is supposed to communicate when the temperature is in range int doOnce = 0; // Do the backstep/forwardstep once at the switch of inputABB signal // Initial setup void setup() { // Define pins as INPUTS pinMode(feedPin, INPUT); // Pin2 pinMode(inputABBPin, INPUT); // Pin3 pinMode(feedDirectionPin, INPUT); // Pin4 xii Robot Prototyping E ARDUINO-KOD pinMode(comInputPin, INPUT); // Pin9 pinMode(clrToRunPin, INPUT); // Pin11 // Define pins as OUTPUTS pinMode(fanCtrlPin, OUTPUT); // Pin5 digitalWrite(fanCtrlPin, HIGH); // Turn the fan on pinMode(LEDFan1Pin, OUTPUT); // Pin7 pinMode(dirCtrlPin, OUTPUT); // Pin8 pinMode(comOutputPin, OUTPUT); // Pin10 pinMode(stepperPin, OUTPUT); // Pin12 pinMode(LEDRunPin, OUTPUT); // Pin13 } // Loop this, forever! void loop() { feedButtonState = digitalRead(feedPin); // Is the feed button pressed? inputABB = digitalRead(inputABBPin); // Input from ABBrobot comInput = digitalRead(comInputPin); // Reads the communicationport from the other Arduino comInput = HIGH; // Ignore communication between Arduinos clrToRun = digitalRead(clrToRunPin); // Reads if the clear to run button is switched digitalWrite(LEDFan1Pin, digitalRead(fanCtrlPin)); // Light the LED to indicate whether the stepperfan is on or not digitalWrite(LEDRunPin, clrToRun); // Light the LED to indicate what state the clear-to-run switch is in // Just allow manual feed if NOT clear to run and the heater is warm if((feedButtonState == HIGH) && (clrToRun == LOW) && (comInput == HIGH)) { digitalWrite(dirCtrlPin, digitalRead(feedDirectionPin)); // Write the direction doOneStep(); // Step once } // Just allow automatic feed if Clear-To-Run if((inputABB == HIGH) && (clrToRun == HIGH) && (comInput == HIGH)) { digitalWrite(dirCtrlPin, HIGH); // Write the direction if(doOnce == 0) // Just do it once when signal is switched { doStepFast(backFeedSteps); // Step ’backFeedSteps’ number of steps doOnce = 1; // Prepare for another signal switch } doOneStep(); } // If input is LOW, back the feed up ’backFeedSteps’ number of steps if(inputABB == LOW) { xiii Robot Prototyping E ARDUINO-KOD if(doOnce == 1) { digitalWrite(dirCtrlPin, LOW); // Write the direction doStepFast(backFeedSteps); doOnce = 0; } } } // Do one step void doOneStep() { digitalWrite(stepperPin, HIGH); delay(1); digitalWrite(stepperPin, LOW); delay(1); delay(delayTimeStep); } // Do one step, but with no delay void doOneStepFast() { digitalWrite(stepperPin, HIGH); delay(1); digitalWrite(stepperPin, LOW); delay(1); } // Do a number of steps void doStep(int numOfSteps) { int i; for(i=0; i< numOfSteps; i++) { doOneStep(); } } // Do a number of steps, but fast void doStepFast(int numOfSteps) { int i; for(i=0; i< numOfSteps; i++) { doOneStepFast(); } } xiv Robot Prototyping E ARDUINO-KOD Arduino 2: Heater Control #include "Adafruit_MAX31855.h" // Part of the controllsystem for a ABB-mounted 3D-printing head // Made for the Bachelor’s thesis on Chalmers Tekniska Högskola // // Made by: Tomas Nilsson // Robin Lindholm // Markus Hägerstrand // // Date: 2013-05-22 // Constants declaring pin numbers const int fanCtrlPin = 2; // Fan on/off const int thermoCLKPin = 3; // Adafruit Thermocouple Amplifier const int thermoCSPin = 4; // Adafruit Thermocouple Amplifier const int thermoDOPin = 5; // Adafruit Thermocouple Amplifier const int heaterSwitchPin = 6; // Switch for the heater const int comOutputPin = 7; // Connected to the second Arduino (9) // Not used const int comInputPin = 8; // Connected to the second Arduino (10) // Not used const int LEDHeaterPin = 10; // LED to indicate if the heater is on const int LEDTempPin = 11; // LED to indicate if the correct temperature is reached const int heaterCtrlPin = 12; // Turn the heater on/off const int LEDFan2Pin = 13; // LED to indicate if the fan is on // Variables int targetTemp = 235; // Target temperature to reach before running int targetTempVariance = 10; // Variance allowed int heaterSwitchState = 0; // The state of the heater switch Adafruit_MAX31855 thermocouple(thermoCLKPin, thermoCSPin, thermoDOPin); // Class for reading temperature via Adafruit Thermocouple Amplifier // Loop this forever! void setup() { // Begin a serial communication via USB Serial.begin(9600); Serial.println("MAX31855 test"); // Define pins as INPUTS pinMode(heaterSwitchPin, INPUT); // Pin6 pinMode(comInputPin, INPUT); // Pin8 // Define pins as OUTPUTS pinMode(fanCtrlPin, OUTPUT); // Pin2 pinMode(comOutputPin, OUTPUT); // Pin7 xv Robot Prototyping E ARDUINO-KOD pinMode(LEDHeaterPin, OUTPUT); // Pin10 pinMode(LEDTempPin, OUTPUT); // Pin11 pinMode(heaterCtrlPin, OUTPUT); // Pin12 pinMode(LEDFan2Pin, OUTPUT); // Pin13 // wait for MAX Adafruit chip to stabilize delay(500); } void loop() { double c = thermocouple.readCelsius(); // Read the thermocouple heaterSwitchState = digitalRead(heaterSwitchPin); // Read the heaterswitch state digitalWrite(LEDHeaterPin, heaterSwitchState); // Turn the LED on/off depending on the switch digitalWrite(LEDFan2Pin, digitalRead(fanCtrlPin)); // Turn the LED on/off depending on if the fan is on or not // If heaterswitch is on and the temperature too low, heat, otherwise do not if((c < targetTemp) && (heaterSwitchState == HIGH)) { digitalWrite(heaterCtrlPin, HIGH); } else { digitalWrite(heaterCtrlPin, LOW); } // Turn the LED and the fan on if we are at the correct temperature, within a certain variance // Communicate to the other Arduino that the temperature is within limits. if((c < (targetTemp + targetTempVariance)) && (c > (targetTemp - (targetTempVariance/2)))) { digitalWrite(LEDTempPin, HIGH); digitalWrite(fanCtrlPin, HIGH); digitalWrite(comOutputPin, HIGH); } else { digitalWrite(LEDTempPin, LOW); digitalWrite(fanCtrlPin, LOW); digitalWrite(comOutputPin, LOW); } // basic readout test, just print the internal temperature of the MAX adafruit chip and the current temp Serial.print("Internal Temp = "); Serial.println(thermocouple.readInternal()); if (isnan(c)) { xvi Robot Prototyping E ARDUINO-KOD Serial.println("Something wrong with thermocouple!"); } else { Serial.print("C = "); Serial.println(c); } delay(1000); } xvii Robot Prototyping F C#-KOD F C#-kod Robotprototyping.cs // Part of the controllsystem for a ABB-mounted 3D-printing head // Made for the Bachelor’s thesis on Chalmers Tekniska Högskola // // Made by: Tomas Nilsson // Robin Lindholm // Markus Hägerstrand // // Date: 2013-05-22 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO; namespace RobPro2 { public partial class RobotPrototyping : Form { public RobotPrototyping() { InitializeComponent(); } // Filenames for input/output files protected String inputFileName, outputFileName; /// /// Button clicked /// Method to specify the file to read G-Code from. /// It has to be in the ".txt" format. /// /// /// private void btn_LoadFile_Click(object sender, EventArgs e) { String inputGCodeFilePath = InputOutput.LoadFilePath(); if (inputGCodeFilePath != null && Path.GetExtension(inputGCodeFilePath) == ".txt") { xviii Robot Prototyping F C#-KOD lbl_InputFileLoaded.Text = inputGCodeFilePath; inputFileName = inputGCodeFilePath; } else { MessageBox.Show("Error loading the G-Code, have you made sure it is in .txt format?"); } } /// /// What to do when the form closes. /// Check for a close confirmation /// /// /// private void RobotPrototyping_FormClosing(object sender, FormClosingEventArgs e) { if (MessageBox.Show("Are you sure you want to close?", "Confirm Close", MessageBoxButtons.YesNo) == DialogResult.Yes) { e.Cancel = false; } else { e.Cancel = true; } } /// /// Closes the application /// /// /// private void RobotPrototyping_FormClosed(object sender, FormClosedEventArgs e) { Application.Exit(); } /// /// Button clicked /// Method to specify what file to write to. /// It has to be in the .txt format. /// /// /// private void btn_OutputFile_Click(object sender, EventArgs e) { String outputGCodeFilePath = InputOutput.LoadFilePath(); xix Robot Prototyping F C#-KOD if (outputGCodeFilePath != null && Path.GetExtension(outputGCodeFilePath) == ".txt") { lbl_OutputFileLoaded.Text = outputGCodeFilePath; outputFileName = outputGCodeFilePath; } else { MessageBox.Show("Error loading the outputfile, have you made sure it is in .txt format?"); } } /// /// Button clicked /// Method that calls the convert function. /// /// /// private void btn_ConvertCode_Click(object sender, EventArgs e) { if (inputFileName != null && outputFileName != null) { double[] XYZ = { double.Parse(txtB_X.Text), double.Parse(txtB_Y.Text), double.Parse(txtB_Z.Text) }; G_to_Rapid_Converter.GCodeToRapidConverter(inputFileName, outputFileName, XYZ); lbl_FileConverted.Text = "File Converted"; } else { MessageBox.Show("Error: There is something wrong with the input/output files, have you specified them?"); } } /// /// Button clicked /// Method that calls a class that generates a dummy code with coordinates /// /// Not used in anything but testing /// /// /// private void btn_GenerateCode_Click(object sender, EventArgs e) { if(outputFileName == null) { outputFileName = "C:\\Users\\Tomas\\Dropbox xx Robot Prototyping F C#-KOD \\Kandidat\\Program\\RobPro2\\RobPro2\\Resources\\OutputFile"; } G_to_Rapid_Converter.GenerateRapid(outputFileName, int.Parse(txtB_NumOfLines.Text)); lbl_NumOfRows.Text = InputOutput.NumberOfLines(outputFileName).ToString(); } } } xxi Robot Prototyping F C#-KOD G_to_Rapid_Converter.cs // Part of the controllsystem for a ABB-mounted 3D-printing head // Made for the Bachelor’s thesis on Chalmers Tekniska Högskola // // Made by: Tomas Nilsson // Robin Lindholm // Markus Hägerstrand // // Date: 2013-05-22 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Globalization; namespace RobPro2 { class G_to_Rapid_Converter { /// /// Converts GCode (from a .txt file) to pure coordinates and high/low signal depending on the stepstruder should feed or not /// /// Input filename /// Output filename public static void GCodeToRapidConverter(string inputFileName, string outputFileName, double[] XYZ) { // Load output file StreamWriter sw = new FileInfo(outputFileName).AppendText(); // Load input file StreamReader sr = new StreamReader(inputFileName); GetSetVariables variablesXYZEF = new GetSetVariables(); Dictionary result = new Dictionary(); int numLines = 0; // Read every line while (sr.Peek() >= 0) { numLines++; bool posChanged = false, feedForward = false; // double posOffsetX = 100, posOffsetY = 50, posOffsetZ = 0.9; // Change the position of the print double posOffsetX = XYZ[0], posOffsetY = XYZ[1], posOffsetZ = XYZ[2]; double varEOld = 0; string input = sr.ReadLine(); // Find and remove commented code (;) int index = input.IndexOf(";"); if (index >= 0) xxii Robot Prototyping F C#-KOD input = input.Substring(0, index); // Find G1 (coordinate information) and extract information and save it to X,Y,Z if (input != "" && input.Substring(0,2) == "G1") { input = input.Trim(); string[] pairs = input.Split(’ ’); // Go through the string pairs and find key values, if a pos. has changed, write a new one. foreach (string pair in pairs) { result.Add(pair.Substring(0, 1), double.Parse(pair.Substring(1), CultureInfo.InvariantCulture)); } if (result.ContainsKey("X")) { variablesXYZEF.varX = result["X"]; posChanged = true; } if (result.ContainsKey("Y")) { variablesXYZEF.varY = result["Y"]; posChanged = true; } if (result.ContainsKey("Z")) { variablesXYZEF.varZ = result["Z"]; posChanged = true; } if (result.ContainsKey("E")) { variablesXYZEF.varE = result["E"]; if (variablesXYZEF.varE > varEOld) feedForward = true; else feedForward = false; varEOld = variablesXYZEF.varE; } if (result.ContainsKey("F")) { variablesXYZEF.varF = result["F"]; } result.Clear(); CultureInfo customCulture = (System.Globalization.CultureInfo) System.Threading.Thread.CurrentThread. CurrentCulture.Clone(); customCulture.NumberFormat.NumberDecimalSeparator = "."; System.Threading.Thread.CurrentThread.CurrentCulture = xxiii Robot Prototyping F C#-KOD customCulture; // Just update the lines if a position has changed, and depending if the feedvalue is high or low if(posChanged && feedForward) sw.WriteLine("1;[" + (variablesXYZEF.varX + posOffsetX) + "," + (variablesXYZEF.varY + posOffsetY) + "," + (variablesXYZEF.varZ + posOffsetZ) + "]"); if (posChanged && !feedForward) sw.WriteLine("0;[" + (variablesXYZEF.varX + posOffsetX) + "," + (variablesXYZEF.varY + posOffsetY) + "," + (variablesXYZEF.varZ + posOffsetZ) + "]"); posChanged = false; } } sw.Flush(); sw.Close(); sr.Close(); } /// /// Generates Rapid Code targets and movecommands in the shape of a rectangle in a textfile. /// Starting coordinate is 0,0,0 (X, Y, Z) /// /// Only used for testing, when for example you don’t have a pregenerated G-code /// /// The file to write too /// Number of lines to generate public static void GenerateRapid(string outputFileName, int numOfLines) { StreamWriter sw = new FileInfo(outputFileName).AppendText(); const int length = 100, width = 100, speed = 100; double X = 0, Y = 0, Z = 0; for (int i = 0; i < numOfLines; i++) { sw.WriteLine("[" + X + "," + Y + "," + Z + "]"); if (Y == length) Y = 0; else Y = length; if (i % 2 != 0 && i != 0) X = X + 1; if (X == width) { Z = Z + 1; X = 0; xxiv Robot Prototyping F C#-KOD } } //for (int i = 0; i < numOfLines; i++) //{ // sw.WriteLine("\tMoveL target_" + i + ",v" + speed +",fine,Pen_TCP\\WObj:=Bord;"); //} sw.Flush(); sw.Close(); } } } xxv Robot Prototyping F C#-KOD GeSetVariables.cs // Part of the controllsystem for a ABB-mounted 3D-printing head // Made for the Bachelor’s thesis on Chalmers Tekniska Högskola // // Made by: Tomas Nilsson // Robin Lindholm // Markus Hägerstrand // // Date: 2013-05-22 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace RobPro2 { /// /// Gets and sets values needed for a print. /// class GetSetVariables { double _x, _y, _z, _e, _f; /// /// Get/Set value /// X coordinate /// public double varX { get { return this._x; } set { this._x = value; } } /// /// Get/Set value /// Y coordinate /// public double varY { get { return this._y; } set { this._y = value; } } /// xxvi Robot Prototyping F C#-KOD /// Get/Set value /// Z coordinate /// public double varZ { get { return this._z; } set { this._z = value; } } /// /// Get/Set value /// E variable coordinate /// public double varE { get { return this._e; } set { this._e = value; } } /// /// Get/Set value /// F variable /// public double varF { get { return this._f; } set { this._f = value; } } } } xxvii Robot Prototyping F C#-KOD InputOutput.cs // Part of the controllsystem for a ABB-mounted 3D-printing head // Made for the Bachelor’s thesis on Chalmers Tekniska Högskola // // Made by: Tomas Nilsson // Robin Lindholm // Markus Hägerstrand // // Date: 2013-05-22 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO; namespace RobPro2 { /// /// Handles input/output information /// class InputOutput { /// /// Starts a FileDialog and gets the filepath to the selected file. /// /// String containing the filepath. public static String LoadFilePath() { OpenFileDialog openFileDialog1 = new OpenFileDialog(); openFileDialog1.Multiselect = false; if (openFileDialog1.ShowDialog() == DialogResult.OK) { return openFileDialog1.FileName; } else { return null; } } public static int NumberOfLines(string filePath) { return File.ReadLines(filePath).Count(); } } } xxviii Inledning Syfte Avgränsningar Notationer Systembeskrivning Systembeskrivning 3D-skrivare STL-formatet Uppdelning av CAD-modeller i lager Fused Deposition Modelling G-code Arduino Systembeskrivning industrirobot Industrirobot ABB 1600-8/1.45 RobotStudio - utvecklingsmiljö för robotprogrammering RAPID - programmeringsspråk för ABB-robotar Robotens konfiguration Kalibrering av arbetsobjekt och verktyg Metod CAD-modeller för utskrift Uppdelning av CAD-modeller i lager G-code för utskrift RAPID-kod för styrning av robot Skrivarhuvud och upphängning Kommunikation mellan robot och styrning av skrivarhuvudet Resultat Beskrivning av systemet Robotverktyg - skrivarhuvud Användargränssnitt för skrivarhuvud Plattform för utskrift C# -kod och interface RAPID-kod Arduino-kod Experiment Diskussion Systemets utformning Industrirobotens lämplighet som 3D-skrivare Potentiella användningsområden Vidareutveckling Instruktioner för användning Kopplingsbeskrivning Komponenter och kretsschema RAPID-kod Arduino-kod C#-kod