Ontwerp Software tool De software tool is een programma dat op de pc van de gebruiker staat en waarmee instellingen en andere informatie naar de Cube doorgestuurd kan worden. De software tool zal in tegenstelling tot de Arduino code in C# geschreven worden.
Opbouw code Omdat de software tool een echt objectgeoriënteerd programma is, zal de code zo veel mogelijk worden opgedeeld in klassen. In dit geval minimaal acht klassen en drie interfaces. Daarnaast zal dit programma een multiple document interface (MDI) zijn, zodat je aan meerdere animaties tegelijk kan werken en het zal een menubalk hebben. Verder zullen we de interface grotendeels met de design tool van Visual studio maken. De klassen waaruit de software tool bestaat zijn: Class “Program” (heeft alleen de regel om het programma uit te voeren) Class “Ledcube” : Form (MDI parent) Class “Anim_scherm” : Form (MDI child voor animaties) Class “Setting_scherm” : Form (MDI child voor instellingen) Interface “Anim_obj” : UserControl (voor het scherm waarin je kunt klikken op de ledjes) Class “Anim_2d” : UserControl (voor 2d animatie, impliceert ook Anim_obj) Class “Anim_3d” : UserControl (voor 3d animatie, impliceert ook Anim_obj) Interface “Frame” (bevat de dingen die een frame moet hebben) Class “Frame_2d” (bevat de instellingen voor de ledjes in één 2d-frame, impliceert Frame) Class “Frame_3d” (bevat de instellingen voor de ledjes in één 3d-frame impliceert Frame) Interface “Anim_tool” (bevat de dingen die een tool moet hebben om frames te kunnen manipuleren) Bovendien krijgt elke tool nog zijn eigen klasse. Hierin is “Program” een losstaande class. “Frame” is een member van “Anim_obj” (dus ook van “Anim_2d” en “Anim_3d”) en “Anim_obj” is een member van “Setting_scherm” en “Anim_scherm”. Verder zijn “Anim_scherm” en “Setting_scherm” beide MDI child van de MDI parent “Ledcube”.
Interface voor gebruiker Het programma zal er voor de gebruiker als volgt uitzien: Bij het starten zal er alleen een menubalk te zien zijn met bestand, help etc. Hierin kan gekozen worden uit bepaalde opties zoals nieuw animatiescherm openen, nieuw instellingenscherm openen, afsluiten, help etc.
Een animatiescherm zal bestaan uit een afbeelding van de kubus in 2d of 3d (afhankelijk van de keuze) checkboxen voor 2d of 3d weergave, een schuifknop voor de tijd (frames) een lijst met animaties en andere opties voor animaties. Uiteraard zal er nu ook een optie uploaden zijn in de menubalk. Een instellingenscherm zal ook bestaan uit een afbeelding 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 en gewone tijd instellen, en de startpositie bepalen van de game of life (via de afbeelding van de kubus)
Prioriteiten Must-have Het programma moet in ieder geval instellingen kunnen versturen voor de klok functie van de cube. Het programma moet makkelijk in gebruik zijn en je moet kunnen uitvinden of de cube goed aangesloten zit op de pc. Ook moet het programma frames voor animaties kunnen versturen naar de arduino. Should-have Het programma kan instellingen voor de “game of life” kunnen versturen, zoals bijvoorbeeld leuke startposities. Via het programma kunnen makkelijk animaties gemaakt worden met behulp van tools die de frames manipuleren. Nice-to-have Het programma kan animaties opslaan op de computer. Het programma heeft meerdere taalmogelijkheden.
Communicatie met Kubus Deze tool gebruikt hetzelfde ethernet protocol als het Arduino programma. Deze twee programma’s moeten namelijk veel communiceren.
Ontwerp
Arduino-code De Arduino-code bestaat uit een hoofdprogramma waarmee doormiddel van ethernet en buttons tussen subprogramma’s kan worden gekozen. Hoofdprogramma Zet een TCP-listener op die constant kijkt of een commando binnen komt voor het starten van een programma (zie verderop). Wanneer dit gebeurt, start het het juiste subprogramma. Wanneer het subprogramma is geëindigd, wordt weer verder gegaan met de TCP-listener. Must-have Subprogramma 1: Cube of Life 2D Gebruikt de zijvlakken van de kubus om game of life op te spelen. Heeft een standaard beginpatroon, maar kan andere beginpatronen aannemen als het programma via ethernet wordt gestart (zie verderop) of hier via een knop voor gekozen word. Ook zal het patroon (willekeurig) veranderen als het object geschud word. De vlakken moeten met elkaar verbonden zijn. Een cel aan de rand van het bovenvlak is dus ook buur van een pixel op het zijvlak waar deze aan grenst. De pixels binnen in de kubus worden niet gebruikt. Het programma moet inzien als er een (ongewenst) herhalend patroon optreed, of als de kubus totaal niets weergeeft. [zie note 1] Should-have Subprogramma 2: Cube of Life 3D Voor dit programma worden de regels van Game of Life toegepast op de 3D wereld. In plaats van dat een cel acht buren heeft, heeft deze er nu 26. Heeft een standaard beginpatroon, maar kan andere beginpatronen aannemen als het programma via ethernet wordt gestart (zie verderop), als de kubus geschud word of als hier via een knop voor gekozen word. Het programma moet inzien als er een (ongewenst) herhalend patroon optreed, of als de kubus totaal niets weergeeft. [zie note 1] Must-have Subprogramma 3: Klok Laat een klok zien op de zijvlakken van de kubus. Vanwege de beperkte resolutie kunnen er maximaal 2 getallen op een zijde worden weergegeven. Om te voorkomen dat het onleesbaar word vanwege doorschijning aan de achterkant kunnen tegenovergestelde zeiden niet worden weergeven. Er zullen dus twee zijkanten gebruikt worden (uren en minuten). Als nice-to-have kan nog een ‘roterende’ klok toegevoegd worden, deze zal steeds 2 cijfers in het midden weergeven die ronddraaien, afwisselend de uren en de minuten. Ook is er de mogelijkheid om de gehele tijd van rechts naar links over één of twee zeides laten scrollen. Als tweede nice-to-have kan er een alarm worden toegevoegd, zodat de kubus op een bepaalde tijd een alarm af laat gaan, door alle ledjes langzaam aan te zetten zoals bij een wake-up-light. [zie note 1] Should-have Subprogramma 4: Laat frame zien (onderdeel van animaties) Via ethernet of vanuit een datachip wordt er aan de Arduino doorgegeven hoe het frame er op dit moment uit ziet. Bij ethernet zal vanwege het beperkte geheugen van de Arduino, de host die de frames doorgeeft, dit op de juiste framerate doen, zodat er geen “wachtlijst” hoeft te ontstaan op de Arduino, en de Arduino alleen maar per ontvangen frame de juiste pixels aan of uit hoeft te zetten. Via ethernet
zal er ook naar een chip een reeks frames kunnen worden geschreven die later, zonder ethernetverbinding, afgespeeld kunnen worden. [zie note 1] Nice-to-have Subprogramma 5: Text weergeven Via ethernet kan een bepaalde reeks tekens woorden doorgegeven die de arduino dan op een soortgelijke manier als bij de klok kan weergeven, dus per zeide, scrollend of roterend. [zie note 1] Nice-to-have Subprogramma 6: Sneeuweffect Bij het schudden van de kubus komt er een effect dat lijkt op het vallen van sneeuw. Tijdens het schudden gaan de bovenste LEDjes random branden, en zakken daarna langzaam naar beneden. [zie note 1] + eventueel nice-to-haves als extra subprogramma’s Knopconfiguratie De knoppen zullen in verschillende programmas verschillende functies hebben, waarbij de klok als uitgangspunt word gebruikt. In elk programma behalve de klok zal knop 2 het programma resetten. Om te wisselen van programma moet je dus eerst op knop 1 drukken (als je nog niet in klokmodus bent), en dan een nieuw programma kiezen. Zo kunnen knop 3 t/m 6 door het subprogramma gebruikt worden. Bij de Klok (default) - Knop 1 zal altijd terug gaan naar de klok, in wat voor status dan ook. - Knop 2 naar game of life 2D - Knop 3 naar game of life 3D - Knop 4 naar animatie modus - Knop 5 naar het sneeuweffect. - Knop 6 naar alarm en/of tijd instellen Bij game of life 2D en 3D - Knop 2 reset naar de laatste beginpositie - Knop 3, 4, 5 en 6 starten een interessante uitgangspositie (verschillend voor 2D en 3D) - Schudden een random patroon. In animatiemodus - Knop 2 reset de huidige animatie - Knop 3 vorige animatie - Knop 4 volgende animatie - Knop 5 willekeurige animatie - Knop 6 – Bij het sneeuweffect - Knop 2 herstart de huidige sneeuwanimatie - Knop 3 t/m 6 start sneeuw - Schudden start sneeuw
Bij de instelmodus - Knop 1 bevestigd en gaat terug naar de klok - Knop 2 wist de huidige invoer - Knop 3 zet uren voor het alarm - Knop 4 zet minuten voor het alarm - Knop 5 past de tijd in uren handmatig aan - Knop 6 past de tijd in minuten handmatig aan Note 1: Dit subprogramma moet te beëindigen zijn via ethernet (namelijk doordat een ander subprogramma wordt opgestart door één van de commando’s). In de loop()-functie moet daarom telkens gecheckt worden of er nieuw bericht van de PC is, en anders moet de normale code uitgevoerd worden. Hiervoor moet het zo zijn dat als er nieuw bericht is terwijl de Arduino in de rest van zijn code zit, deze dan nog afgehandeld wordt bij de volgende check op bericht. Ethernet Protocol Voor de communicatie over ethernet is er een protocol nodig. Hiervoor wordt het HTTP protocol gebruikt. Doormiddel van GET-parameters wordt doorgegeven welk programma moet worden gestart, en eventuele input voor dit programma meegegeven. De GET-parameter p is bedoeld voor het kiezen tussen programma’s. Voor de programmacode wordt 1 karakter gebruikt, zodat er 93 programma’s mogelijk zijn (er zijn 93 printable characters in ASCII, ruimte over voor nice-to-haves, en gebruikt 1 byte omdat dit gemakkelijk naar een character om te schrijven is). Na dit commando kan er input voor het programma worden meegegeven. Hoe deze eruit ziet verschilt per programma. 0 voor klok 1 (+296 karakters/bytes) voor Cube of Life 2D (de 296 karakters voor de beginposities) 2 (+512 karakters/bytes) voor Cube of Life 3D (de 512 karakters voor de beginposities) 3 (+514 karakters/bytes) voor animatieframe opslaan (2e karakter om aan te geven welke animatie dit is; 3e,4e,5e karakter om aan tegeven welk frame dit is, de 512 karakters om aan te geven hoe het frame er op dit moment uit ziet) Elk commando begint met één van deze karakters. Voor elk frame van de animatie moet dus opnieuw 3 worden doorgegeven met daarachter de 512 karakters van het frame. Opbouw code
Er moet een Array van 512 booleans zijn die aangeeft welke LED’jes aan, en welke uit staan Er moet een variabele zijn die bijhoud wel programma actief is (1 t/m 6) Er wordt gebruik gemaakt van de LedControl.h library, waarmee met de functie setLed(); een LED aan- of uitgezet kan worden Functie zetLEDs() Gaat de array af en zet de juiste LEDs aan of uit Functie gameOfLife2D() Voert een stap uit in de 2D game of life en controleerd of er nog iets weergegeven word en dit geen ongewenst patroon is
Functie gameOfLife3D() Voert een stap uit in de 3D game of life en controleerd of er nog iets weergegeven word en dit geen ongewenst patroon is Functie klok() Laat de huidige tijd zien op de kubus zoals beschreven hierboven Functie animatie() Gaat de ontvangen of opgeslagen bytereeks af en maakt de array van 512 booleans die aangeeft welke LED’jes aan, en welke uit staan Functie sneeuw() Voert het sneeuweffect uit zoals boven beschreven, na schudden of indrukken van een knop. Functie zetTijd () Zet afhankelijk van de ingedrukte knoppen een nieuwe tijd of een nieuw alarm Functie slaOp() Word aangeroepen bij een bytereeks voor een animatie die opgeslagen moet worden, en doet dit op de exterene datachip. In de loop() functie wordt gecheckt of er nieuw ethernet verkeer is, en wordt vervolgens de functie voor het juiste subprogramma aangeroepen. Als er geen verkeer is gaat hij door met het laatst actieve programma.
Matrix
Een is de mogelijkheid voor een tussenlaag van hout. Hierdoor worden de chips, draden en rasterboard voor het oog verhuld. De bekabeling word vrij direct weggewerkt met de sleuven in het hout.
Tweede mogelijkheid voor een tussenlaag van hout. De anodes/draad van de matrix worden direct door het hout geboord en de flatkabels gaan door aparte gaten.
De Led Matrices, in een kubus van 20 x20 cm. Tussen elke LED zit 2 cm ruimte. Tussen het plexiglas en de matrix zit 2 cm speling.
Front view
y-as
(0, 0, 0)
x-as
Side View z-as
De rijen worden verbonden met flatcable, en de kolommen met normaal draad.
gelijmd
Groeven om het plexiglas op z’n plaats te houden. plexiglas
In het midden word een pilaartje neergezet omde het kastje stevig te maken.
Kastje met de Arduino, bedrading, etc....
Het plexiglas is 4 a 5 mm dik. Het hout is min. 5 mm dik en zwart geverft. Achter de knoppen worden indien mogelijk rode leds ter verlichting geplaatst.
Rasterboard (10 bij 16 cm), waarop alle chips worden aangebracht.
Open gat voor het raster.
Maxim 7219 Chip
Arduino + Klokmodule + Ethernet Shield
Raster
Front view
Back view
Knop 1 , 2 , 3 , 4 , 5 , 6 Default Modus (default) Knop 2 naar game of life 2D Knop 3 naar game of life 3D Knop 4 naar animatie (modus) Knop 5 naar het sneeuweffect Knop 6 naar alarm en/of tijd instellen Bij het sneeuweffect Knop 3 t/m 6 start sneeuw Schudden start sneeuw
Bij game of life 2D en 3D Knop 1 naar default modus. Knop 3, 4, 5 en 6 starten een interessante uitgangspositie (verschillend voor 2D en 3D) Schudden een random patroon. Bij de instelmodus Knop 3 zet uren voor het alarm Knop 4 zet minuten voor het alarm Knop 5 past de tijd in uren handmatig aan Knop 6 past de tijd in minuten handmatig aan
In animatiemodus Knop 1 naar default modus. Knop 3 vorige animatie Knop 4 volgende animatie Knop 5 willekeurige animatie Knop 6 -
Ethernet Poort
Adapter/USB Aansluiting