Zoeken in deze blog

vrijdag 12 november 2010

HamKlok One vervolg 3

Zo vandaag de start van een nieuw deel van onze klok. We gaan het LED matrix display aansturen om de tijd weer te geven. Leuk om de tijd in het terminal venster van de PC te zien maar dat was niet echt de bedoeling!
Nee het moet hier opkomen !!! Lijkt duur maar voor rond de 15,00 euro te koop op Ebay en binnen twee weken via de post bij je thuis afgeleverd. Valt dus wel mee!
Dit display is opgebouwd uit 6 blokjes van elk 8 maal 8 ledjes
en via de aanwezige stuur elektronica is elke led separaat aan te sturen. Gelukkig heeft niet elke led zijn eigen aansluiting want dan hadden we 6*8*8 aansluitingen nodig! Nee de stuur elektronica is zo slim dat drie draadjes en wat software genoeg is om dit voor elkaar te krijgen!
(een CS, een WR en een DATA aansturing is al voldoende.)

Verder is het van belang dat we een groep ledjes zo groeperen dat er een cijfer 0 tot en met 9 gevormd kan worden. Zo'n groepje leds noemen we een sprite.
Hier een voorbeeld van zo'n sprite:
Als je goed telt zie je dat zo'n sprite,in ons geval, uit 5 ledjes breed en 7 ledjes hoog bestaat. Dit geeft ons de kans maximaal 24/5 sprites naast elkaar te zetten, en 16/7 sprites boven elkaar te zetten. 
Ons display was toch 3 maal 8 led's breed en 2 maal 8 led's hoog ?
In de praktijk betekend dit, met wat tussenruimte, 4 sprites naast elkaar en twee sprites boven elkaar.
Genoeg om op de bovenkant van ons display de tijd b.v. 20:10 te plaatsen.( : plaatsen we op een van de 4 overgebleven plaatsen)
Nu is de bovenste regel van het display bezet en kunnen we de onderste regel voor andere doeleinden gebruiken.
Het opbouwen van zo,n sprite doen we in de software door in het het raster van 5 maal 7 leds een logische "1" naar de ledjes die we aan willen hebben te sturen en een logische "0" naar de ledjes die we uit willen sturen. Nog even moeilijk te volgen ? Ik zal een voorbeeld voor het cijfer 0 geven.

Sprite cijfer 0 
Als we naar de ledjes kijken en we beginnen bovenaan dan zien we van links naar rechts en daarna elke keer een regel zakken:
    1. regel  led uit-led aan-led aan-led aan-led uit of logisch gezien 01110
    2. regel  led aan-led uit-led uit-led uit- led aan of logisch gezien  10001
    3. regel  led aan-led uit-led uit-led uit- led aan of logisch gezien  10001
    4. regel  led aan-led uit-led uit-led uit- led aan of logisch gezien  10001
    5. regel  led aan-led uit-led uit-led uit- led aan of logisch gezien  10001
    6. regel  led aan-led uit-led uit-led uit- led aan of logisch gezien  10001
    7. regel  led uit-led aan-led aan-led aan-led uit of logisch gezien 01110
In de door ons gebruikte microprocessor is het mogelijk deze sprites op te slaan en elke keer als we een cijfer nodig hebben deze op te roepen en op de juiste plaats van het display te laten verschijnen. Met andere woorden als je voor de cijfers 0 tot en met 9 eenmaal een sprite maakt kan je ze eindeloos gebruiken!
Een leuke bijkomstigheid is dat je ook andere vormen als sprite kunt aanmaken en laten zien op het display. Later als we vorderingen maken met de klok kom ik hierop terug.

Sprites aanmaken in de software.
De Arduino werkt met de Atmel mega 328 processor. Deze werkt met 8 bits (byte) informatie en elke geheugenplaats neemt hierdoor 8 bits(byte) in beslag.
Alle bewerkingen(de programma opdrachten ofwel de syntax genoemd) hebben betrekking op het manipuleren van deze 8 bits.
Willen we sprites aanmaken dan moeten we dus een groepje van 7 bytes vullen met enen en nullen overeenkomstig het cijfer dat we willen maken.
  • Opmerking we zijn een beetje aan het verspillen want we hebben per byte 5 bits nodig !!
Het aanmaken van de sprites gaat als volgt:
  • stap 1 het reserveren van de geheugenruimte
  • stap 2 het vullen van de geheugenplaatsen met de juiste nullen en enen
reserveren van de geheugenruimte         uint8_t Fig5[7];
vullen van de geheugenplaatsen             Fig5[0] = B11110;
                                                           Fig5[1] = B00010;
                                                           Fig5[2] = B00010;
                                                           Fig5[3] = B01110;
                                                           Fig5[4] = B10000;
                                                           Fig5[5] = B10000;
                                                           Fig5[6] = B01110;
Met deze wijsheid in pacht zullen we eens gaan proberen of we werkelijk het cijfer 5 op het display kunnen krijgen !
Dus eerst maar even terug naar het schema en kijken hoe we het display aan moeten sluiten op de Arduino.
Als dit gelukt is gaan we het programma schrijven. Start de Pc en laad de Arduino programmeer omgeving.
Kopieer onderstaand programma en compuleer en upload het naar het Arduino board !


/* HamKlok One uitleg sprite
 * Sure 2416 display 24*16 leds
 * pa0akv 2010
 * -----------------------------------
 * Historie 
 * versie 0.0 oktober 2010
 * -----------------------------------
 */


// Eerst even de juiste bibliotheken ophalen
// Sure libraries
#include "MatrixDisplay.h"
#include "DisplayToolbox.h"
#include <WProgram.h>


// Het display heeft nog wat aanvullende info nodig
// Easy to use function
#define setMaster(dispNum, CSPin) initDisplay(dispNum,CSPin,true)
#define setSlave(dispNum, CSPin) initDisplay(dispNum,CSPin,false)


// We hebben maar 1 display! De bibliotheek kan er meer aansturen
// 1 = Number of displays
// Data = 10
// WR == 11
// False - we dont need a shadow buffer for this example. saves 50% memory!


// Initaliseer Shure display met juiste aansluitingen!
MatrixDisplay disp(4,11,10, false);
// Pass a copy of the display into the toolbox
DisplayToolbox toolbox(&disp);


// In totaal 3 groepen van 8 leds = 24
// De eerste is positie 0 de laatste = 23
// Twee groepen hoog dus rechts boven is 0
// Rechts onder is dan 15
uint8_t X_MAX = 23;
uint8_t Y_MAX = 15;


// Dit voorbeeld heeft 1 Array Fig5 !
uint8_t Fig5[7];


void setup()
{
  disp.setMaster(0,4);


  // Opbouwen van de sprite !


  Fig5[0] = B11111;
  Fig5[1] = B00001;
  Fig5[2] = B00001;
  Fig5[3] = B01111;
  Fig5[4] = B10000;
  Fig5[5] = B10000;
  Fig5[6] = B01111;   
}


// Hier begint het eigenlijke programma !
void loop()

  for (int i = 0; i < 7; i ++)
  {
    shiftIt(Fig5[i],1,1+i);
  }
}
// Hier eindigd het eigenlijke programma !


/* Functie voor het opbouwen van de sprite
 * deze functie wordt elke keer opgeroepen
 * als we een cijfer op het display zetten
 * opgave welke sprite SpriteIn
 * en de plaats op het display 0,0 Xin,Yin
 */
void shiftIt(byte SpriteIn,int Xin,int Yin)
{
  // Shift out 8 bits LSB first
  boolean LedStatus;


  // for each bit in SpriteIn test a bit
  for (int i=0; i<5; i++)
  {
    // if the value of SpriteIn and (logical AND) a bitmask
    // are true, set LedStatus to 1 (HIGH)
    if ( SpriteIn & (1<<i) )
    {
      LedStatus = HIGH;
      toolbox.setPixel(Xin+i, Yin, LedStatus, true);
    }
    else 
    {
      LedStatus = LOW;
      toolbox.setPixel(Xin+i, Yin, LedStatus, true);
    }
  }
}  

Het resultaat moet er zo uitzien.
Ook kunnen we natuurlijk losse leds aansturen op het display met de volgende commando's:
                                   toolbox.setPixel(12,2,1,true);
Hierbij gaat het ledje 13 posities van links en 3 van boven aan !
of uit met  toolbox.setPixel(12,2,0,true);
Speel maar eens met zowel de sprite instellingen als het setPixel commando.


// Hier begint het eigenlijke programma !
void loop()

  for (int i = 0; i < 7; i ++)
  {
    shiftIt(Fig5[i],1,1+i);
  }
  toolbox.setPixel(12,2,1,true);
}
// Hier eindigd het eigenlijke programma !


Zo dat was wel even genoeg voor deze keer ! Oh ja, en wie bedenkt even een leuke sprite en geeft mij een berichtje ?

Succes met de spelerij !!
P.S. de sprite 5 is door mij naderhand aangepast zodat er werkelijk een 5 maal 7 cijfer ontstaat !







Geen opmerkingen:

Een reactie posten