Mastersword

Mastersword

Maak het legendarische “Master Sword” uit “The legend of Zelda” na door middel van 3D-printing, lasercutting en arduino. Kennis van programmeren is niet vereist, maar het is wel aangeraden als je aanpassingen wilt maken.

Deze handleiding werd ontwikkeld door Steven van Durm voor Maakbib.

Benodigdheden

Materialen:

Gereedschap:

  • 3D Printer
  • Lijmpistool
  • Lasercutter
  • Soldeerbout
  • Kruis schroevendraaier
  • KnipTang
  • Knijptang
  • Strip tang
  • 3D-Printing

    We gaan ervan uit dat je reeds succesvol kan 3D printen en dat je de instellingen voor jouw toestel kent. Anders kan je voor de komende stappen terecht bij je lokale Fablab/Maker Space of MaakBib. Zij helpen je ook om te starten met 3D printing.

    Omdat we het wiel niet opnieuw moeten uitvinden, vertrekken we van een bestaand model dat gedeeltelijk aangepast wordt zodat de elektronica erin past. De aangepaste bestanden voor dit project kan je hier afhalen:
    https://www.thingiverse.com/thing:4414570

    Toppen van het blad (1x met gleuf, 1x zonder)
    Kleur: Wit
    3DPrinten1
    tussenstukken van het blad (1x met gleuf, 1x zonder)
    Kleur: Wit
    3DPrinten2
    Onderste deel van het blad (2x)
    Kleur: Wit
    3DPrinten3
    Guard (2x)
    Kleur: Goud
    3DPrinten4
    Diamond (2x)
    Kleur: Goud
    3DPrinten5
    Koppelstuk gevest
    Kleur: Eigen keuze
    3DPrinten6
    Pareerstang deel (2x)
    Kleur: Eigen keuze
    3DPrinten7
    Vleugels (2x)
    Kleur: Eigen keuze
    3DPrinten8
    Koppelstuk voor de greep
    Kleur: Eigen keuze
    3DPrinten9
    Koppelstuk voor de greep
    Kleur: Eigen keuze
    3DPrinten10
    Koppelstuk voor de greep
    Kleur: Eigen keuze
    3DPrinten11
    Greep
    Kleur: Eigen keuze
    3DPrinten12
    Greep
    Kleur: Eigen keuze
    3DPrinten13
    Knop (2x)
    Kleur: Eigen keuze
    3DPrinten14
    Knop
    Kleur: Eigen keuze
    3DPrinten15
    Deksel batterij
    Kleur: Eigen keuze
    3DPrinten17
    Knob (2x)
    Kleur: Eigen keuze
    3DPrinten18

    Het originele ontwerp voor het gevest van het zwaard kan je hier afhalen.

    Inspiratie voor de elektronica vind je hier:
    https://www.thingiverse.com/thing:2526427

    Lasercutting

    Via lasercutten maken we een versteviging van het blad van het zwaard, zodat deze minder snel kan breken. Hiervoor kan je terecht bij je lokale Fablab.

    Je snijdt uit een acrlyic plaat van 3mm dikte een vorm bestaande uit een rechthoek van 25mm x 85mm verenigd met een rechthoek van 37mmx 538mm. Klik op de figuur om de svg file te downloaden

    Lasercutting1 .

    Programmeren

    Voor het programmeer gedeelte moeten enkele bestanden en pakketten afgehaald en geïnstalleerd worden. Daarna kan je programmeren.

    Klaarmaken

    Begin met Arduino en de Adafruit packages.

    De Arduino IDE kun je downloaden van:
    https://www.arduino.cc/en/Main/Software

    Adafruit trinket support voeg je toe via de handleiding (werkt ook in recentere versies van de Arduino IDE):
    https://learn.adafruit.com/adafruit-arduino-ide-setup/arduino-1-dot-6-x-ide
    Je dient dus https://adafruit.github.io/arduino-board-index/package_adafruit_index.json toe te voegen als board manager URL, en via de board manager dan Adafruit AVR Boards installeren. Daarna installeer je ook nog de drivers indien dit niet automatisch gebeurt na koppelen van de trinket met je PC via usb kabel.

    Om onder windows bestanden te kunnen uploaden naar de trinket, moet men een bootloader installeren en enkele instellingen wijzigen onder de tab “Hulpmiddellen”. Hoe dit moet wordt aangegeven in de volgende handleidingen.

    Let op! We maken gebruik van USB en niet FTDI, let hiervoor op tijdens de tutorial van adafruit en voor de instellingen.

    Arduino Code

    Hieronder vind je de code terug van het project. Deze kan je kopieren en plakken in een lege sketch in de Arduino IDE. Je mag deze code uploaden naar de trinket.

    Voor diegene die geïnteresseerd zijn, wordt de code hieronder toegelicht. Zoniet, mag je naar Montage Deel 1 gaan.

    Code:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    
    #include <Adafruit_NeoPixel.h>
    #ifdef __AVR__
    #include <avr/power.h>
    #endif
    #define PIN 9
    #define PIN2 10
    #define NUMPIXELS 41
    Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
    Adafruit_NeoPixel pixels2 = Adafruit_NeoPixel(NUMPIXELS, PIN2, NEO_GRB + NEO_KHZ800);
    const int button1Pin = 4;
    const int button2Pin = 8;
    const int button3Pin = 12;
    boolean button2Pressed = false;
    boolean button3Pressed = false;
    int color = 0;
    uint32_t currentColor = pixels.Color(0, 0, 255);
    void setup() {
        #if defined (__AVR_ATtiny85__)
        if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
        #endif
        pinMode(button1Pin, INPUT_PULLUP);
        pinMode(button2Pin, INPUT_PULLUP);
        pinMode(button3Pin, INPUT_PULLUP);
        pixels.begin();
        pixels.setBrightness(50);
        pixels2.begin();
        pixels2.setBrightness(50);
    }
    void loop() {
        if (color == 0 ) {
            currentColor = pixels.Color(0, 0, 255);
        }
        else if (color == 1 ) {
            currentColor = pixels.Color(255, 0, 0);
        }
        else if (color == 2 ) {
            currentColor = pixels.Color(0, 255, 0);
        }
        else if (color == 3 ) {
            currentColor = pixels.Color(100, 100, 0);
        }
        else if (color == 4 ) {
            currentColor = pixels.Color(0, 255, 255);
        }
        else if (color == 5 ) {
            currentColor = pixels.Color(100, 0, 100);
        }
        else if (color == 6 ) {
            currentColor = pixels.Color(100, 100, 100);
        }
        if (digitalRead(button1Pin) != LOW) {
            for (int i = 0; i < NUMPIXELS; i++) {
                pixels.setPixelColor(i, pixels.Color(0, 0, 0)); // Moderately bright green color.
                pixels2.setPixelColor(i, pixels2.Color(0, 0, 0)); // Moderately bright green color.
                pixels.show(); // This sends the updated pixel color to the hardware.
                pixels2.show();
            }
        } else {
            for (int i = 0; i < NUMPIXELS; i++) {
                pixels.setPixelColor(i, currentColor); // Moderately bright green color.
                pixels2.setPixelColor(i, currentColor); // Moderately bright green color.
                pixels.show();
                pixels2.show();
                delay(10);
                if(digitalRead(button1Pin) != LOW){
                    break;
                }
            }
        }
        if (digitalRead(button2Pin) == LOW && button2Pressed == false) {
            button2Pressed = true;
            color--;
            if (color <= -1) {
                color = 7;
            }
        } else {
            button2Pressed = false;
        }
        if (digitalRead(button3Pin) == LOW && button3Pressed == false) {
            button3Pressed = true;
            color++;
            if (color >= 7) {
                color = 0;
            }
        }
        else {
            button3Pressed = false;
        }
    }
    

    Uitleg Code:

    1
    2
    3
    4
    
    #include <Adafruit_NeoPixel.h>
    #ifdef __AVR__
    #include <avr/power.h>
    #endif
    
    • Nodige code om de library voor de ledstrip te importeren en te doen werken
    1
    2
    3
    
    #define PIN 9
    #define PIN2 10
    #define NUMPIXELS 41
    
    • We kennen hier de Pins van de ledstrips toe en het aantal LEDs dat we gebruiken (Pixels = LEDS)
    1
    2
    
    Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
    Adafruit_NeoPixel pixels2 = Adafruit_NeoPixel(NUMPIXELS, PIN2, NEO_GRB + NEO_KHZ800);
    
    • Aanmaken van de ledstrip objecten met de namen “pixels” en “pixels2”
    1
    2
    3
    4
    5
    
    const int button1Pin = 4;
    const int button2Pin = 8;
    const int button3Pin = 12;
    boolean button2Pressed = false;
    boolean button3Pressed = false;
    
    • Aanmaken van de variabelen van de pinnen van de knoppen en toestand van de knoppen.
    1
    2
    
    int color = 0;
    uint32_t currentColor = pixels.Color(0, 0, 255);
    
    • Aanmaken van de variabelen voor de kleur van de ledstrip. (color = nummer in een kleur lijst, currentColor = specifieke kleurwaarde)
    1
    
    void setup() {
    
    • Setup code, deze wordt maar 1 keer uitgevoerd in het begin
    1
    2
    3
    
    #if defined (__AVR_ATtiny85__)
    if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
    #endif
    
    • Deze code is nodige omdat we met een trinket werken.
    1
    2
    3
    
    pinMode(button1Pin, INPUT_PULLUP);
    pinMode(button2Pin, INPUT_PULLUP);
    pinMode(button3Pin, INPUT_PULLUP);
    
    • We zeggen hoe we het signaal van de knoppen willen uitlezen
    1
    2
    3
    4
    
    pixels.begin();
    pixels.setBrightness(50);
    pixels2.begin();
    pixels2.setBrightness(50);
    
    • Opstarten van de ledstrips en de helderheid instellen (hoe groter, hoe sneller de batterij leegloopt)
    1
    
    void loop() {
    
    • Loop code, deze code blijft zich herhalen na de setup code.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    if (color == 0 ) {
        currentColor = pixels.Color(0, 0, 255);
    }
    else if (color == 1 ) {
        currentColor = pixels.Color(255, 0, 0);
    }
    else if (color == 2 ) {
        currentColor = pixels.Color(0, 255, 0);
    }
    else if (color == 3 ) {
        currentColor = pixels.Color(100, 100, 0);
    }
    else if (color == 4 ) {
        currentColor = pixels.Color(0, 255, 255);
    }
    else if (color == 5 ) {
        currentColor = pixels.Color(100, 0, 100);
    }
    else if (color == 6 ) {
        currentColor = pixels.Color(100, 100, 100);
    }
    
    • Een check doen welke kleur we moeten tonen en deze toekennen aan de variabele.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    if (digitalRead(button1Pin) != LOW) {
        for (int i = 0; i < NUMPIXELS; i++) {
            pixels.setPixelColor(i, pixels.Color(0, 0, 0));
            pixels2.setPixelColor(i, pixels2.Color(0, 0, 0));
            pixels.show();
            pixels2.show();
        }
    } else {
        for (int i = 0; i < NUMPIXELS; i++) {
            pixels.setPixelColor(i, currentColor);
            pixels2.setPixelColor(i, currentColor);
            pixels.show();
            pixels2.show();
            delay(10);
            if(digitalRead(button1Pin) != LOW){
                break;
            }
    }
    
    • Als we knop 1 indrukken zal de ledstrip de kleur van de variabele “currentColor” krijgen en zal dan LED per LED oplichten. Zoniet, zal de ledstrip uitgaan. We voegen een break toe, zodat de LEDs ook kunnen uitgaan terwijl ze 1 per 1 aangaan.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    if (digitalRead(button2Pin) == LOW && button2Pressed == false) {
        button2Pressed = true;
        color--;
        if (color <= -1) {
            color = 7;
        }
    } else {
        button2Pressed = false;
    }
    
    • Als we knop 2 indrukken zal de kleur veranderen afhangend van de “color” waarde. Om de drukknop maar een keer te detecteren na indrukken maken we gebruik van een boolean button2Pressed.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    if (digitalRead(button3Pin) == LOW && button3Pressed == false) {
        button3Pressed = true;
        color++;
        if (color >= 7) {
            color = 0;
        }
    } else {
        button3Pressed = false;
    }
    
    • Zelfde als wat knop 2 doet, maar in de tegenovergestelde richting van de kleurencyclus

    Montage Deel 1

    Als alle onderdelen geprint zijn en de verstevigingsplaat gesneden is, kan men het zwaard monteren. Alle stukken klaar hebben is nodig om de lengte van de kabels correct te kunnen inschatten. Je kiest zelf wat je begint te monteren: het blad of het gevest.

    Blad

    Voor het blad zorg je ervoor dat je 2 bijna identieke groepen hebt, 1 met een gleuf en 1 zonder. Je mag voor onderstaande stappen 1 van deze groepen nemen en een verstevigingslat bijnemen.

    Montage1

    We lijmen eerst het deel dat verbonden wordt met het gevest met het korte tussenstuk.

    Montage2

    Montage3

    Als dit vast zit, lijmen we de 2 tussenstukken vast en daarna de top van het blad met de tussenstukken.

    Vergeet niet om de mogelijk beschermfolie te verwijderen van de lat voor je gaat lijmen Montage4

    Lijm de verstevigingslat vast tegen de binnenkant van het blad. Deze lat zorgt niet enkel voor versteviging maar ook voor een betere overgang van de leds.

    Montage5

    Eens je klaar bent met deze stappen kan je hetzelfde doen voor de andere groep.

    Gevest

    Montage6 Montage7 Montage8

    Voor het gevest starten we met het lijmen van het stuk waar de greep in komt en waar het koppelstuk van het gevest in komt.

    Montage9

    Montage10 Montage11

    Daarna lijmen we de vleugels in de gleuven van de zijkanten van de panneerstang en lijmen we de zijkanten aan het kopppelstuk.

    Montage12

    Ten Slotte lijmen we deze 2 combinaties samen.

    Solderen Deel 1

    Vold het onderstaande schema voor het solderen van de componenten. En lees verder om te weten waar wat geplaatst moet worden.

    Solderen1

    Knoppen Start met de knoppen.

    (Als het gelukt is om de kleine knoppen te 3D printen, moet je deze knoppen afknippen op maat voordat je verder gaat)

    Solderen2

    Maak alle beentjes van alle knoppen plat. Dit kan makkelijke met een knijptang.

    Solderen3 Solderen4

    Lijm de 3 knoppen naast elkaar op de 2de balk van de onderkant van de greep. Deze komen overeen met de gaten in de bovenkant.

    Knip daarna 2 beentjes van elke knop zoals getoond in de afbeelding. en soldeer de grounds aan elkaar. Dit kan met een klein stukje zwarte kabel.

    Solderen5

    Solderen6

    Als alle pinnen vast zitten, kunnen we de laatste knop afknippen tot de juiste hoogte en plaatsen.

    Solderen7

    Je kan de hoogte uittesten door de ge-3D-printte knop in de bovenkant van de greep te leggen en deze op de onderkant van de greep te leggen. Als je de knop zonder probleem kan indrukken, is het in orde.

    Deze laatste knop soldeer je met 1 beentje aan de andere knoppen. Dan knip je net zoals bij de andere knoppen het beentje dat niet meer op de foto staat af.

    Soldeer nu een gekleurde kabel aan het overige beentje, zorg dat deze langer is dan de greep. Deze kabels gaan uiteindelijk in de Trinket komen die helemaal onderaan in het zwaard gaat zitten. Dus, lang genoeg maken!

    Test de knoppen uit! Verbind de trinket met een computer en de zwarte kabel (nog niet solderen) met 1 van de GND poorten. Verbind elke knop met de RST poort (rechts onderaan). De Trinket zou moeten resetten als je de knop indrukt, dat kan je zien doordat het rode ledje op de trinket knippert voor een aantal secondes.

    Switch

    Solderen8

    Het volgende dat we gaan monteren en solderen is de schakelaar. Deze mag je door het gat in de onderkant van de greep duwen. Deze hoeft niet gelijmd te worden.

    Solderen9

    Hier mag je dan ook 2 kabels aan solderen.

    Ledstrips

    Solderen10 Solderen11

    Voordat we de ledstrips kunnen solderen, moeten we de pinnen zichtbaar maken. Hiervoor knip je het begin van de omhulsel weg en maak je de pinnen schoon. Of je knipt 1 LED van de ledstrip af.

    Let op! Voor je knip, kijk waar de aanduiding, lijntje of schaartje, staat om te knippen.

    Leg de ledstrip daarna op 1 van de helften van het blad van het zwaard en knip de ledstrip af zodat je zoveel mogelijk leds in het blad krijgt. In ons voorbeeld was dit aantal 41 LEDS. Dit aantal kan varieren afhankelijk van de aangekochte ledstrip.

    Knip dan nog 1 identieke ledstrip.

    Solderen12

    Soldeer aan beide ledstrips de kabels om de connecies te maken met de trinket.

    Let op dat je soldeert aan de andere kant van waar de pijltjes naar toe wijzen, gezien dat de input zijde is van de LED-strip. De richting van het pijltje is van input naar output.

    Montage Deel 2

    Blad

    Montage13

    Lijm de ledstrips vast op de helften van het blad.

    Zorg dat de LEDs naar de buitenkant van het blad gericht zijn.

    Montage14

    Hierna kan je het blad afwerken door de 2 helften tegen elkaar te lijmen.

    Montage15

    Het is aangeraden om nog eens overal waar nodig lijm toe te voegen en deze delen tegen elkaar te duwen.

    Koppelstuk gevest

    Montage16

    We kunnen nu het blad in het koppelstuk schuiven en vastlijmen. De kabels kunnen door het gat van het koppelstuk.

    Montage17

    Lijm dan de gouden details vast.

    Montage18

    Haal de greep met de knoppen erbij, trek de kabels onder de 2 balkjes door.

    Greep

    Montage19

    Plaats de batterij in zijn vakje en plaats zijn deksel erop. (Het dekseltje voor de batterij is optioneel zodat de batterij vast zit)

    Daarna kunnen we het koppelstuk van de knop erbij nemen en de kabels erdoor trekken.

    Solderen Deel 2

    Solderen1

    Alle kabels lopen nu door naar de kop van het zwaard en kunnen gesoldeerd worden op de trinket, zoals in de afbeelding.

    Knoppen Soldeer de Linkse Knop met Pin 8, de knop die we afgeknipt (enkele knop) hebben met Pin 4, de Rechtse knop met Pin 12 en de Reset Knop met RST.

    Ledstrips Soldeer de Rode (5V) kabels van de ledstrips samen op de 5V die het dichtst bij de USB micro poort zit.

    Let op! De ledstrips werken niet op de batterij als je de andere 5V Pin gebruikt.

    Soldeer de Din kabels op Pin 9 en 10, de volgorde maakt niet uit.

    Als alles gesoldeerd is, test met de code.

    Lipoly Backpack

    Solderen13

    Als laatste, soldeer de Lipoly backpack op de Trinket. Deze komt vlak op de trinket te liggen, connectie via de BAT, G en 5V waar je draad of een connectie pin voor gebruikt.

    Solderen14

    Let op! de backpack mag niet tegen de micro USB poort gedrukt worden. Dat kan kortsluiting veroorzaken, zorg dus dat er plaats tussen de twee is na solderen.

    Switch

    Je kan op de backpack 2 Pins zien die verbonden zijn.
    Solderen14b
    Deze pinnen laten toe een schakelaar te gebruiken. Snij deze verbinding aan het oppervlak kapot met een kniptang of een breekmes en soldeer daarna de kabels van de schakelaar op deze pinnen. Zie de uitleg op de Adafruit site voor meer info

    Om de schakelaar te testen, kan je de batterij in de header op de backpack duwen en de schakelaar aan en uit zetten. Hierdoor zou de trinket en de backpack ook moeten aan en uit gaan.

    OPGELET: Gebruik enkel LiPo batterijen die geschikt zijn voor de Trinket battery backpack!

    De laatste Stappen

    Als alles getest en werkend is, kunnen we de laatste stukken toevoegen en het zwaard sluiten.

    Laatstestappen1

    Pak het bovenste deel van de greep en leg de ge-3D-printe knop(pen) in het/de overeenkomende gat(en). Leg deze op het onderste deel en schuif deze in het gevest.

    Dit kan gelijmd worden, maar het is mogelijk dat de greep er door de druk al stevig in zit

    Laatstestappen2

    Doe nu hetzelfde met de knop.

    Monteer daarna de trinket in de knop met een paar M2 boutjes en lijm de knop toe.

    Gefeliciteerd

    Je hebt nu je Master Sword gemaakt. Je kan deze nog wat afwerken door een groene lint rondom het handvat te doen en deze vast te lijmen.

    Verder kan je door de reset knop (in het midden) je zwaard herprogrammeren en zelf verschillende patronen en effecten toevoegen in de code.

    Weetjes

    Van waar komt het zwaard?

    linkmastersword
    Het Meesterzwaard (of Master Sword) is een van de meeste iconische elementen van de computerspelserie Legends of Zelda. In vele games in de serie is het zelfs het focuspunt van het verhaal.

    Het legendarische spel (in het Japans: ゼルダの伝説 Zeruda no Densetsu, letterlijk vertaald: De Legende van Zelda) werd bedacht door Shigeru Miyamoto, waarvan de eerste game in 1986 voor het Japanse Famicom Disk System uitkwam.

    De namen van het zwaard?

    Het zwaard staat bekend onder verschillenden namen zoals “Blade of Evil’s Bane”, “Sword of Legend”, “Sword that Seals the Darkness”, …

    Princes Zelda

    Princes Zelda is een van de drie belangrijkste personages uit de serie. Elke incarnatie van de prinses wordt door het lot gekozen om de bewaarder van de Triforce of Wisdom te zijn. In de hele serie heeft Princess Zelda verschillende krachten van magische tot fysieke, variërend van het hanteren van pijl en boog tot telepathie.

    STEM

    In deze high tech activiteit komen heel wat technieken aan bod! Je wordt uitgedaagd met 3D-printen, solderen, programmeren en laser snijden. Als je aan talenten training doet, ga je je vooral op nauwkeurigheid moeten concentreren.

    Hoe hebben we dit gemaakt?

    • Ooit gehoord van Reverse Engenering? Dit is een volledig domein binnen de ingenieurswetenschappen en dekt onder andere de technieken die nodig zijn om voorwerpen na te maken.

    • Als we het zwaard willen namaken moeten we eerst zien hoe het in elkaar zit en het originele zwaard onderzoeken. Zo kan je de verschillende stukken van het zwaard natekenen in 3D, bv in software zoals Blender.

    • Als we het ontwerp klaar hebben mag de 3D printer aan de slag.

    Hoe werkt 3D-printen?

    3DPrinterlagen

    Neem een kijkje hier

    Downloads

    Handleiding: Download


    Arduino Code: Download


    3D Bestanden: Download