Cube of Life Universiteit Utrecht `ta Wetenschappen — Departement Informatica Faculteit Be
27 januari 2011
Willem den Besten Milan Boers Frank Dedden Johan Dorland Rutger Kerkhoff Ruber Peters
Inhoudsopgave 1 Arduino Code 1.0.1 Ethernet . . . . . . . . . . . . . . . . 1.1 Programma 0: Klok . . . . . . . . . . . . . 1.2 Programma 1: Game of Life 2D . . . . . . . 1.3 Programma 2: Game of Life 3D . . . . . . . 1.4 Programma 3: Animaties . . . . . . . . . . 1.5 Programma 4: Sneeuw . . . . . . . . . . . . 1.6 Programma 5: Klok instelmodus . . . . . . 1.7 Programma 6: Alarm instelmodus . . . . . 1.8 Programma 7: Alarm . . . . . . . . . . . . 1.9 Programma 8: Tekst weergeven . . . . . . . 1.10 Programma 9: Programmeertaal interpreter
. . . . . . . . . . .
3 3 4 4 4 4 4 5 5 5 5 5
2 Programmeertaal ontwerp 2.1 Commando’s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 Basis commando’s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3 Voorbeelden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6 6 6 6
3 Pc-Tool 3.1 Interface voor de gebruiker 3.1.1 Animatiescherm . . 3.1.2 Instellingenscherm . 3.2 Requirements . . . . . . . . 3.2.1 Must-have . . . . . . 3.2.2 Should-have . . . . . 3.2.3 Nice-to-have . . . . 3.3 Opbouw code . . . . . . . . 3.4 Keuzes . . . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . .
8 8 8 9 9 9 9 10 10 11
4 Behuizing 4.1 Plexiglas Kap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2 Houten kast . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
12 12 12
5 Elektronica 5.1 Probleem met 5.2 De I2 C bus . 5.3 Knoppen . . . 5.4 Voeding . . .
13 13 14 14 14
het aantal . . . . . . . . . . . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
aansluitingen . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . .
. . . .
. . . . . . . . .
. . . .
. . . . . . . . .
. . . .
. . . . . . . . .
. . . .
. . . . . . . . .
. . . .
. . . . . . . . .
. . . .
. . . . . . . . .
. . . .
. . . . . . . . .
. . . .
. . . . . . . . .
. . . .
. . . . . . . . .
. . . .
. . . . . . . . .
. . . .
. . . . . . . . .
. . . .
. . . . . . . . .
. . . .
. . . . . . . . .
. . . .
. . . . . . . . .
. . . .
. . . . . . . . .
. . . .
. . . . . . . . .
. . . .
. . . . . . . . .
. . . .
. . . . . . . . .
. . . .
. . . . . . . . .
. . . .
. . . . . . . . .
. . . .
. . . . . . . . .
. . . .
. . . . . . . . .
. . . .
. . . .
Inleiding Bij het kiezen van een onderwerp kwamen we als groep na enige discussie al snel op de LED-Kubus uit. We vonden het een interessant onderwerp om een aantal redenen. Ten eerste omdat we een fysiek object konden maken, we zouden niet alleen software schrijven maar ook iets tastbaars maken. Ook het feit dat het door middel van een Arduino aangestuurd zou worden sprak ons aan, vanwege de vele uitbreidingsmogelijkheden en het feit dat we hier compleet onze eigen code op konden laten draaien. Maar om het ´echt interssant te maken hebben we het project uitgebreid. We hebben ten eerste besloten om een 3D kubus te maken, met een matrix van 8x8x8 LEDjes, de oorspronkelijke opdracht was om geleverde matrices te gebruiken en een 2D kubus te maken. Dit bracht de nodige uitdagingen mee, omdat deze 512 LEDjes aangesloten en aangestuurd moeten worden. Vooral het solderen van alle elektronica bleek meer tijd te kosten dan oorspronkelijk gedacht. Daarnaast hebben we ook besloten om in plaats van een kubus te maken die simpelweg een Game of Life laat zien hem v´e´el meer opties te geven. De kubus kan onder andere animaties weergeven, de tijd laten zien, functioneren als een wekker, en vele andere opties die verderop in dit document zijn beschreven. Ook konden we door ons eerdere besluit tot het maken van een 3D matrix ook een 3D versie van John Conway’s Game of Life toevoegen. Tot slot hebben we besloten om een complete PC-tool toe te voegen aan het project. In de opdracht stond dat we eventueel een webpagina op de Arduino konden laten draaien, maar we hebben dit uitgebreid en er een tool van gemaakt die via ethernet met de Arduino communiceert. Met behulp van de tool zijn talloze animaties te maken, beginsituaties voor de Game’s of Life te sturen, de wekker in te stellen en nog vele andere opties die ook verderop in het document te lezen zijn. Als laatste extra feature hebben we een simpele programmeertaal ontworpen om simpele programma’s te schrijven, die met behulp van de PC-tool naar de Arduino gestuurd kunnen worden. De Arduino kan deze programma’s interpreteren en uitvoeren. Normaal kan een Arduino alleen nieuwe code ontvangen door het hele basisprogramma aan te passen en dit via USB te versturen, maar op deze manier hebben wij daar dus omheen gewerkt. In dit verslag zullen de verschillende onderdelen van het project besproken worden. Er zal worden uitgelegd welke keuzes we hebben gemaakt en wat we uiteindelijk geproduceerd hebben. Dit zal aan de hand van vier delen gaan, waarin we ons project hebben opgedeeld. De delen zijn: De Arduino code, de pc-tool, de elektronica en tot slot de behuizing.
1
Arduino Code
De arduino-code is, zoals beschreven in het ontwerpdocument, opgebouwd uit verschillende subprogramma’s. De globale variabele ”bits”, waar elk programma toegang tot heeft, is een array van 512 booleans die bepaalt welk ledje aan, en welke uit staat. De relatie tussen co¨ ordinaten en de positie in de array is bepaald zoals in het ontwerpdocument: volgens de formule positienummer = 64x + 8y + z. Verder zijn er onder andere de functies zetLEDs() en clearLEDs() beschikbaar voor elk programma, waarbij zetLEDs() de juiste ledjes aan of uit zet aan de hand van de bits-array, en clearLEDs alle waarden in de bits-array op false zet. Ook hebben alle programma’s toegang tot de handige functie karakterReeks() waar een karakter aan moet worden meegegeven, en die vervolgens een array van 18 booleans teruggeeft, die een 3x6 vlak representeert waarop dat karakter is getekend. Zo kan deze vervolgens gemakkelijk op een bepaalde plaats op de kubus worden getekend. In het ontwerp zijn zes programma’s beschreven, waarvan twee must-haves, twee should-haves en twee nice-to-haves. Al deze programma’s zijn in het uiteindelijke product gekomen, plus nog een programmeertaal voor de kubus. Er zijn twee manieren om van subprogramma te wisselen: via ethernet, of via de buttons. De buttonconfiguratie is voor elk programma anders. Daarom zijn deze niet in het hoofdprogramma opgenomen, maar in de subprogramma’s. Elk programma definieert een functie met welke button wat moet doen, en op elk moment dat het subprogramma moet checken of een button is ingedrukt, doet deze dit zelf. Voor de vertraging tussen de updates van de LEDs bij bijvoorbeeld animaties of de game of life, kan niet een simpele enkele delay() worden gebruikt, omdat er in die tijd niet meer gekeken wordt naar de buttonconfiguratie. Daarom wordt op alle momenten dat normaal delay() zou worden gebruikt, nu een functie wacht() aangeroepen waaraan wordt meegeven welke functie op dat moment de buttonconfiguratie specificeert, en de wachttijd. De functie wacht() breeks deze wachttijd vervolgens op in delays in van 5 milliseconde, waarbij tekens de buttons tussendoor worden gecheckt. 1.0.1
Ethernet
Ethernet hoeft niet overgelaten te worden aan de subprogramma’s, omdat de ethernet ten eerste voor elk subprogramma hetzelfde doet, en een request vanaf de PC gestuurd blijft worden, totdat er door de arduino gereageerd wordt, zolang deze maar binnen de timeout valt. Bij elke request die de ethernet-code binnen krijgt wordt gekeken naar de (eerste en enige) get-parameter. Het eerste karakter hiervan specificeert het programma waarvoor deze parameter bedoeld is. Afhankelijk van welke dit is bekijkt de ethernet-code de rest van de parameter en voert de juiste dingen uit. Voor het opslaan van paramters om later te gebruiken in het programma wordt een tweede globale array gebruikt. Deze heet param, en bestaat uit 512 characters. Deze worden gebruikt voor Game of Life (beginsituaties doorgeven), de programmeertaal (de code doorgeven), het tekst weergeven (de juiste tekst doorgeven) en de animaties (het frame doorgeven). Voor een aantal programma’s wordt binnen de code voor ethernet, de parameter al verwerkt. Dit is bijvoorbeeld bij de animaties, waarbij direct het frame naar het EEPROM wordt gestuurd, zodat het subprogramma alleen de animatie hoeft uit te voeren, en dus niet meer te doen krijgt dan nodig. Ook voor Game Of Life (beginsituatie / random), klok (tijd naar chip schrijven), alarm (wekker tijd naar EEPROM schrijven) en functietaal (naar EEPROM schrijven) wordt dit gedaan.
1.1
Programma 0: Klok
De klok is het standaardprogramma waar de kubus naar opstart. Dit subprogramma leest de tijd uit van de klok-module. Het checkt of deze overeenkomt met de tijd die ingesteld staat als alarm, en als dat zo is wordt naar programma 7 (alarm) geschakeld. Anders wordt de tijd op de kubus weergeven door middel van de functie tijdWeegeven(), die weer de aparte karakters van de uren en minuten op de juiste plek op de kubus tekent doormiddel van de functie karakterReeks()
1.2
Programma 1: Game of Life 2D
Het tweede programma is Conway’s Game of Life in 2D. De simpele leefregels moeten hier aan alle kanten van de kubus uitgevoerd worden, wat zorgt voor een heleboel manieren waarop een LED buren kan hebben. Een nadeel van de kubusvorm is dat de LEDjes op de hoeken twee buren minder hebben dan de rest, maar hier is helaas niets aan te doen. Er zijn een aantal interessante animaties voorgeprogrammeerd die ook zo veel mogelijk deze hoeken ontwijken. Het programma gaat langs alle mogelijkheden van buren en zet vervolgens de gewenste LEDjes aan. Er zijn ook stukken code die controleren of de simulatie nog interessant is. Zo is er een minimum aantal LEDjes dat aan moet staan, en is er een stuk code om herhalingen te voorkomen. Hierbij slaat het programma ook een frame op op de EEPROM vanwege het gelimiteerde geheugen van de Arduino.
1.3
Programma 2: Game of Life 3D
Game of life 3D is een aanpassing van het traditionele Conway’s Game of Life. In de 3D versie heeft een LEDje v´e´el meer buren en daarom zijn de regels van de simulatie wat aangepast. Het principe is wel hetzelfde als de 2D versie. De code gaat alle LEDjes langs en wederom zijn er ook een aantal interessante beginsituaties voorgeprogrammeerd en is er een mechanisme dat controleert of het nog wel een interessante simulatie is. Ook hier word een frame op het EEPROM opgeslagen en uitgelezen om te bekijken of het nog wel interessant is.
1.4
Programma 3: Animaties
Tijdens de communicatie over ethernet wordt de juiste frame al op de juiste plaats naar het EEPROM geschreven. Hierbij wordt per frame de array van 512 karakters (’0’ of ’1’) per 8 karakters omgezet in 1 byte (voorbeeld: ”00001000”wordt 8) en vervolgens naar EEPROM geschreven. Op welk adres deze wordt geschreven hangt af van het nummer van de animatie. Voor elke animatie is 16kB beschikbaar. Animatienummer 0 begint dus bij 0, animatienummer 1 bij 16384 etc. De eerste twee bytes zijn gereserveerd om het aantal frames van de animatie aan te geven, de rest zijn gewoon de frames. Als het huidige programma 3 is, wordt de animatie laten zien. Dit gebeurt doordat er in een while-loop wordt gegaan die constant de frames uit het EEPROM haalt en ze in de bitsarray zet en zetLEDs() aanroept. Tussendoor wordt natuurlijk wel telkens de functie voor de buttonconfiguratie aangeroepen, zodat de buttons in de tussentijd blijven werken. De buttons zijn zo geconfigureerd als in het ontwerp beschreven staat.
1.5
Programma 4: Sneeuw
Voor het sneeuweffect worden de statussen van alle ledjes ´e´en omlaag gebracht (door de positie in de bits-array 8 te verplaatsen). Vervolgens wordt op het bovenste vlak random ledjes aan en
uit gezet (dat wil zeggen, in de bits-array) als de schakelaar voor het detecteren of de kubus op de kop staat inderdaad op de kop staat.
1.6
Programma 5: Klok instelmodus
De instelmodus voor de klok is een apart programma. Dit is het makkelijkst omdat deze ook een aparte buttonconfiguratie heeft, en er moet iets anders op de kubus worden weergeven dan normaal. Als de juiste button wordt ingedrukt als beschreven in het ontwerp wordt de ingestelde tijd veranderd. Bij het bevestigen van de invoer wordt de ingestelde tijd naar de klokmodule gestuurd.
1.7
Programma 6: Alarm instelmodus
Deze werkt eigenlijk hetzelfde als de klok instelmodus, behalve dat hier de ingestelde tijd naar het interne EEPROM (op de microcontroller zelf) wordt geschreven (de eerste byte voor de uren, de tweede byte voor de minuten)
1.8
Programma 7: Alarm
Dit is het programma waar de klok naartoe schakelt als het alarm af moet gaan. Het enige wat dit programma doet is checken of er al een animatie op animatienummer 7 staat. Als dit niet zo is, wordt er een standaard animatie in gezet op animatienummer 7. Daarna wordt naar programma 3 (animaties) geschakeld, met animatienummer 7. Deze animatie wordt dan uitgevoerd als alarm.
1.9
Programma 8: Tekst weergeven
In dit programma wordt er een rij van karakters op de kubus afgebeeld. Voor elk karakter wordt er 4 keer geloopt. De eerste drie keer wordt telkens een kolom van het karakter (verkregen met karakterReeks()) de kubus op gestuurd. Vervolgens wordt er bij alle vier de keren, alle ledjes ´e´en doorgeschoven (schuiVerder(), met de klok mee, als je de kubus van bovenaf ziet). Per vlak verschilt het dus hoe de positie in de bits-array veranderd wordt.
1.10
Programma 9: Programmeertaal interpreter
Deze vertaalt de bytecode die in het interne EEPROM staat opgeslagen naar de commando’s die uitgevoerd moeten worden, en voert deze direct uit. Er wordt een grote loop uitgevoerd die alle bytes af gaat (currentByte om de huidige positie vast te houden). Voor elke byte geldt er een commando, en wordt er via een case-statement bepaald welke dit is. Soms heeft zo’n commando parameters nodig. Dan worden de volgende bytes dus uitgelezen en currentByte een stuk omhoog gezet, zodat de loop gewoon daarna weer verder gaat. Een uitgebreide beschrijving van de bytecode staat verderop in dit verslag.
2
Programmeertaal ontwerp
2.1
Commando’s
Types code 00000001 00000010
type int ( 16 bits ) ( -32768 tot 32768 ) char ( 8 bits ASCII ) ( 0 tot 255 )
Expressies code 00000000 00000001 00000010 00000011
2.2
operator + * /
Basis commando’s
code (byte dec) 00000010 00000001
functie Variabele declaratie Variabele toekenning
00000011 00000100 10000001 10000010 10000011
Kopieer variabele Bewerking Afsluiten naar programma Led aan/uit Pauzeren
2.3
voorbeeld code int x; x = 3; x = ’a’; x = y; x=y+z exit x; led(x,y,z) = true; delay(x);
lengte (bytes) 3 4 3 3 5 2/4 5-8 2/4
Voorbeelden
int x; 00000010 x = 3; 00000001 x = -3; 00000001 x = ’a’; 00000001 x = y; 00000011
00000001 int
00000000 x (nr v/d var)
00000000 x (nr v/d var)
00000000 00000011 3
00000000 x (nr v/d var)
11111111 11111101 -3
00000000 x (nr v/d var)
01100001 a (97)
00000000 x (nr v/d var)
00000001 y (nr v/d var)
x = y + z; 00000100 00000000 + exit x;
00000000 x (nr v/d var)
00000001 y (nr v/d var)
00000010 z (nr v/d var)
10000001 exit 4; 10000001
00000000 x (nr v/d var)
11111111 00000000 00000100 non-variabele 4 led(x,y,z) = true; 10000010 11111111 00000000 00000001 00000010 true x y z delay(x); 10000011 00000000 x delay(1000); 10000011 11111111 00000011 11101000 non-variabele 1000
3
Pc-Tool
De Pc-tool is een programma dat instellingen en animaties kan overzetten naar de Ledcube. Dit programma draait op de PC van de gebruiker en heeft een eenvoudige interface voor de gebruiker. Voor het weergeven van de kubus in 3D is gebruik gemaakt van TrueVision. Dit is een gratis 3D engine en game development SDK, waarmee je 3D omgevingen kan maken. Het programma heeft een multiple document interface (MDI) wat inhoudt dat je meerdere schermpjes open kan laten staan in het hoofdscherm. Verder heeft het programma een menubalk waarin gekozen kan worden voor een nieuw instellingenscherm, een nieuw animatiescherm, het overzetten naar de Ledcube en het detecteren van de ledcube. Het animatiescherm is bedoeld om animaties te maken en het instellingenscherm om instellingen over te zetten, zoals de startpositie van de game of life en de wekker.
3.1
Interface voor de gebruiker
Het programma zal er voor de gebruiker als volgt uitzien: Bij het starten zal er alleen een menubalk te zien zijn met bestand, exporteren en help. Hierin kan gekozen worden uit bepaalde opties zoals nieuw animatiescherm openen, nieuw instellingenscherm openen, afsluiten, help, detecteren van Ledcube en Overzetten naar Ledcube. 3.1.1
Animatiescherm
Figuur 1: Het animatiescherm Een animatiescherm zal bestaan uit een 3D weergave van de kubus, checkboxen voor 2D (er kan alleen geklikt worden op de buitenste rand) of 3D weergave, een schuifknop voor de tijd (frames) een lijst met animaties en andere opties voor animaties. Dit schermpje is dus bedoeld om zelf
eenvoudig animaties te maken voor de Ledcube. In de afbeelding van de kubus kan de gebruiker met de muis afzonderlijke ledjes aan of uit zetten en verschillende effecten maken. 3.1.2
Instellingenscherm
Figuur 2: Het instellingenscherm Een instellingenscherm zal ook bestaan uit een 3D weergave van de kubus en checkboxen voor 2D en 3D (voor de game of life). Verder heeft het scherm ook speciale opties voor de instellingen van de klok en de game of life. Zoals de wekkertijd instellen, en de startpositie bepalen van de game of life (via de 3D weergave van de kubus)
3.2 3.2.1
Requirements Must-have
• Het programma moet instellingen kunnen versturen voor de klok functie van de cube en instellingen voor de startpositie van de 2D game of life • Het programma moet makkelijk in gebruik zijn • De gebruiker moet kunnen uitvinden of de cube goed aangesloten zit op de pc 3.2.2
Should-have
• Het programma kan instellingen voor de 3D game of life kunnen versturen • Het programma kan aparte frames voor animaties op de cube versturen
• Het programma kan effecten voor animaties gebruiken om het voor de gebruiker makkelijker te maken om animaties te maken (bijvoorbeeld een animatie van het ene ledje naar het andere ledje in een bepaald aantal frames) 3.2.3
Nice-to-have
• Het programma kan animaties opslaan op de computer. • Het programma heeft meerdere taalmogelijkheden. • Het programma kan een preview tonen van de animatie en de game of life • Er is een goede helpfunctie aanwezig voor het vereenvoudigen van het gebruik.
3.3
Opbouw code
De Pc Tool wordt geschreven in C#. Omdat het een echt objectgeorinteerd programma is, zal de code zo veel mogelijk worden opgedeeld in klassen. In dit geval zeven klassen en ´e´en interface. We zullen de interface grotendeels met de design tool van Visual studio maken. De klassen waaruit de software tool bestaat zijn: • Klassen voor uiterlijk van het programma class Ledcube : Form De MDI parent. class Scherm : Form De klasse voor een scherm. bevat ook de code voor TrueVision class Anim scherm : Scherm Een scherm om animaties mee te maken. class Setting scherm : Scherm Een scherm om de instellingen van game of life en de wekker te veranderen. • Klassen voor het veranderen van ledjes en frames abstracte class Anim Obj klasse die de lijst met frames en de lijst met ledjes bijhoudt. class Anim 2d : Anim Obj 2D versie van Anim Obj. class Anim 3d : Anim Obj 3D versie van Anim Obj. class Frame Bevat de instellingen voor de ledjes in n frame. class Ledje Bevat de instellingen voor elk afzonderlijk Ledje. • Klassen en interfaces voor effecten op animaties interface ILedAnimTool Interface voor animatietools. class EnkelTool : ILedAnimTool Tool voor animatie van ene ledje naar het andere. class LijnTool : ILedAnimTool Tool voor animatie van ene ledje naar het andere. class BoxTool : ILedAnimTool Tool voor maken van een vierkant. class PijlTool : ILedAnimTool Tool voor animatie van ene ledje naar het andere. class SlangTool : PijlTool Tool voor animatie van ene ledje naar het andere. interface ILedEffectTool Interface voor effecttools. class GolEffect : ILedEffectTool Tool om een stap te maken met de regels van de game of life.
class RandomLedjeEffect : ILedEffectTool Tool om random ledjes aan te zetten. class CopyFrameEffect : ILedEffectTool Tool om frames te kopieren. class LeegVeldEffect : ILedEffectTool Tool om een geselecteerd stukje uit te zetten. class VulVeldEffect : ILedEffectTool Tool om een geselecteerd stukje aan te zetten. class VerplaatsVeldEffect : ILedEffectTool Tool om een geselecteerd stukje te verplaatsen. class LeegFrameEffect : ILedEffectTool Tool om in een frame alle Ledjes uit te zetten. class ScaleEffect : ILedEffectTool Tool om een geselecteerd stukje te scalen. class InverseEffect : ILedEffectTool Tool om alle ledjes die aan staan uit te zetten en andersom. class EffectTools klasse voor de effecttools. • Overige klassen struct Point3d Voor de positie van elk ledje. class Program Voert het programma uit. class ExportDialog : Form Een invoerdialoog voor het exporteren naar de Ledcube. class Inputdialoog : Form Een invoerdialoog voor het verbinding maken met de Ledcube. class FramesDialoog : Form Een invoerdialoog voor het instellen van effecten op frames.
3.4
Keuzes
Voor dit deel van het project zijn meerdere keuzes gemaakt. Maar de keuze om TrueVision te gebruiken is toch wel de belangrijkste. We hebben gkozen voor TrueVision, omdat het mooier en handiger is voor de gebruiker als hij de kubus in 3D kan zien. Dit kan echter alleen met behulp van een 3D engine. We hebben toen voor TrueVision gekozen, omdat TrueVision redelijk makkelijk in gebruik is en toch vrij krachtig, bovendien is het gratis om te gebruiken. Een andere belangrijke keuze die we gemaakt hebben is het gebruik van een MDI. Dit heeft tot erg veel problemen geleid in combinatie met TrueVision, omdat er altijd maar ´e´en TrueVision object actief kan zijn. Maar deze problemen zijn gelukkig wel opgelost. Ook hebben we bewust gekozen voor een pc-tool in plaats van een tool op internet, omdat we vonden dat we met een pc-tool meer konden.
4
Behuizing
De behuizing van Cube of Life bestaat uit zwart kastje van MDF en een plexiglas kap.
4.1
Plexiglas Kap
Het plexiglas (5mm dik) is met de kleine lasersnijder bij protospace gesneden. Daarvoor moesten .cdr tekeningen worden gemaakt. Die werden gegenereerd met een SPL script van de site thingiverse. http://www.thingiverse.com/thing:1541 De zogenaamde parametrische doos is steviger en mooier dan een doos met twee lange en korte platen.
4.2
Houten kast
Het kastje bestaat vijf platen MDF van 1,8cm dik, waarvan de vier zijkanten een gefreesde inkeping hebben. Daarin word de plexiglas kap gemonteerd. het rasterboard met de electronica rust op drie dunne randen die in de kubus zijn gelijmd. Door middel van een tussenlaag van dun MDF word de bedrading van de matrices verborgen. Door de 8 spleten worden alle draden weggeleid. Voorop de behuizing is een zinkplaatje met gaten voor de knoppen gemonteerd. Aan de zijkant zijn gaten geboord voor de stroom, COM en ethernet aansluiting. Het kastje is vervolgens zwart gespoten.
5
Elektronica
De elektronica van deze LED-kubus bestaat hoofdzakelijk uit de Arduino Duemilanove, met daaraan 8 Maxim 7219 chips. De Arduino is een programmeerbare microcontroller, welke via een tool op de pc geprogrammeerd kan worden. De Maxim chips zjn chips speciaal gemaakt om 7-segment displays aan te sturen. Het is echter ook mogelijk om met deze chip een matrix van 8x8 LEDs aan sturen, mits deze matrix volgens het common-cathode principe is ontworpen. Dit principe houdt in dat de cathodes van een serie leds aaneengesloten worden. Zoals te zien is in de onderstaande afbeelding, zijn per rij de pluspolen van de leds aaneengesloten en per kolom zijn de minpolen van de leds aan elkaar aangesloten. Op deze manier is het mogelijk door op de juiste rijen en kolomen ofwel een spanning van 0 volt ofwel een spanning van 5 volt te zetten. Het is zo dus mogelijk om elk ledje afzonderlijk aan en uit te zetten. Op deze manier kan dus in een matrix van 8x8 ledjes elke led afzonderlijk aangestuurd worden.
Figuur 3: De opbouw van de LED-matrix
5.1
Probleem met het aantal aansluitingen
Elke matrix heeft zestien aansluitingen nodig, om deze volledig te kunnen bedienen. In de kubus zitten totaal acht matrices, wat dus een totaal geeft van minstens 128 benodigde aansluitingen op de Arduino. Omdat de door ons gebruikte Arduino niet afdoende aansluitingen heeft, moest er dus een oplossing bedacht worden. De oplossing was voor ons de Maxim 7219 chip. Dit is een chip welke speciaal gemaakt is voor het aansturen van 7-segment led schermpjes, deze schermpjes hebben 7 balkjes en een punt, zoals te zien is in bijvoorbeeld een wekkerradio. Het is mogelijk om 8 van deze schermpjes op ´e´en Maxim 7219 chip aan te sluiten. Wat wij hebben gedaan is eigenlijk hetzelfde, echter hebben we niet acht segment displays gebruikt, maar een 8x8
LED-matrix. We gebruiken dus acht Maxim 7219 chips om acht matrices aan te sturen, welke in een kubusvorm zijn geplaatst. We hadden voor dit probleem ook zelf chips kunnen kopen en programmeren, maar dit zou erg veel werk geweest zijn. De Maxim chips zijn erg uitgebreid, ze zorgen er bijvoorbeeld voor dat ongeacht het aantal LEDs dat brandt, het display altijd even fel brandt. Om dit soort problemen zelf helemaal te programmeren in een chip zou te veel werk zijn, en te veel afwijken van het oorspronkelijke idee achter de Cube of Life.
5.2
De I2 C bus
I2 C is een seri¨ele bus standaard, welke meerdere componenten via slechts 2 signaaldraden kan aansturen. Bij de Cube of Life maken wij gebruik van I2 C voor de klokmodule en het EEPROM geheugen. De klokmodule is een klein chipje dat de tijd onthoudt, nadat deze is ingesteld. Om het geheugen onder spanning te houden wordt gebruik gemaakt van een knoopbatterijtje. Het EEPROM geheugen gebruiken we als een locatie om gegevens in op te slaan, anders dan de gecompileerde programma code (hiervoor is immers in de Arduino stukje geheugen). Er valt bij de data te denken aan bijvoorbeeld de zogenaamde frames van de animaties. Deze frames nemen redelijk veel geheugenruimte in, en moeten tijdens het draaien van de Arduino aangepast kunnen worden. Deze twee criteria leidden tot het gebruik van EEPROM geheugen.
5.3
Knoppen
De knoppen worden gebruikt om interactie te krijgen met de gebruiker van de kubus. Zes knoppen zijn vanaf de buitenkant te bereiken, en de zevende knop is een schudschakelaar. Met de schudschakelaar is het mogelijk om te detecteren of iemand de kubus schudt of op zijn kop houdt, hierachter kunnen dan weer speciale acties, zoals een sneeuweffect, geprogrammeerd worden. De knoppen worden alle zeven op dezelfde manier aangesloten op de Arduino. Als de schakelaar open staat (er is dus geen verbinding), zal de ground door een 10 kOhm weerstand verbonden zijn met de input pin op de Arduino. Dit zorgt ervoor dat er altijd een laag signaal staat op de pin. Als de schakelaar gesloten wordt, gaat er een stroom lopen van de +5V naar de input pin, dit zorgt voor een hoog signaal op de pin.
5.4
Voeding
De voeding die wij gebruiken, bestaat uit een 5 Volt 2,5 Amp`ere adapter. Deze sluiten we direkt aan op het door ons ontworpen bordje, dus niet direkt op de Arduino. We sluiten de Arduino aan op de stroom van het bordje, zo komt er geen 2,5 Amp`ere te staan op de Arduino.
Figuur 4: Het aansluiten van een schakelaar (Bron: http://arduino.cc/en/uploads/Tutorial/button schem.png)