Inleiding
Kolonisten van catan, risk, yahtzee en cluedo. Het zijn allemaal spelletjes waarvoor je één of meerdere
dobbelstenen nodig hebt. Natuurlijk kun je hiervoor een gewone ouderwetse houten dobbelsteen gebruiken maar
voor iemand die geïnteresseerd is in elektronica, is een LED dobbelsteen natuurlijk veel leuker om te
gebruiken. En er zitten ook een paar voordelen aan een LED dobbelsteen. Deze kan bijvoorbeeld niet van de tafel
afrollen en het getal is ook nog zichtbaar als het spel in een donkere ruimte wordt gespeeld. Een jaar geleden is al een keer een
LED dobbelsteen project geweest. Deze nieuwe mini LED dobbelsteen
is gebasseerd op de vorige LED dobbelsteen project maar heeft enkele aanpassingen ondergaan. Zoals de naam doet vermoeden is de nieuwe LED dobbelsteen
een stuk kleiner zodat deze een stuk goedkoper geproduceerd kan worden. Ook is er in de software een aanpassing gemaakt zodat de LED-dobbelsteen
in slaapstand gaat als deze een tijdje niet gebruikt wordt. Dit zorgt voor energiebesparing waardoor de batterij langer mee kan gaan.
Benodigdheden
Schakeling
Hieronder staat het schema en de print-layout van de mini LED dobbelsteen


Onderdelen
Code voor PIC
/**************************************************************
* Auteur: K.J. Kok *
* Copyright: (c) Digibytez, 2007-2011. *
* Datum: 22-07-2011 *
* Chip: PIC12F629 *
* Omschrijving: Code voor de PIC van de mini LED dobbelsteen *
* project. *
* Zie http://www.digibytez.nl *
**************************************************************/
// Declaraties
int aantal_ogen; // Variabele voor huidige aantal ogen
int aantal_ogen_vorige = 0; // Variabele voor vorige aantal ogen
int teller; // Variabele voor de teller
int s_ingedrukt = 0; // Variabele voor de stand van de schakelaar
unsigned int sleep_timer = 0; // Variabele voor het bijhouden van de tijd voor slaapstand
void refresh_display(); // Functie voor het updaten van de dobbelsteen
// Hoofdprogramma
void main()
{
TRISIO = 0b00001000; // Poort GP3 als ingang instellen
GPIO = 0b00010111; // Alle LEDs van de dobbelsteen aanzetten
CMCON = 0x07; // Comparators uitzetten
OPTION_REG = 0x87; // Geen pull-ups, instellen prescaler 1:256
INTCON = 0xA0; // Timer0 interrupt aanzetten
Delay_ms(100); // Kleine delay voor stabilisatie voeding
// Start programma
while(1)
{
if(GPIO.B3==1) // Als de drukschakelaar wordt ingedrukt
{
delay_ms(25); // 25ms wachten -> ter voorkoming van contactdender
s_ingedrukt = 1; // Drukschakelaar is ingedrukt
while(s_ingedrukt==1) // Zolang schakelaar ingedrukt is
{
refresh_display(); // Updaten van de dobbelsteen
s_ingedrukt = GPIO.B3; // Controleren stand drukschakelaar.
delay_ms(50); // 50ms wachten
}
for(teller=0;teller<20;teller++) // 20 keer de loop doorlopen
{
refresh_display(); // Updaten van de dobbelsteen
delay_ms(60); // 60ms wachten
}
}
else // Drukschakelaar wordt niet ingedrukt
{
}
}
}
// Functie voor het updaten van de dobbelsteen
void refresh_display()
{
aantal_ogen = rand()%6+1; // Random getal tussen 1 en 6 genereren
while(aantal_ogen_vorige==aantal_ogen) // Als de huidige aantal ogen gelijk is aan
{ // de vorige aantal ogen
aantal_ogen = rand()%6+1; // Random getal tussen 1 en 6 genereren
}
switch (aantal_ogen) // Juiste aantal LEDs aanzetten
{
case 1: GPIO = 0b00000001; break; // Cijfer 1 tonen op dobbelsteen
case 2: GPIO = 0b00000100; break; // Cijfer 2 tonen op dobbelsteen
case 3: GPIO = 0b00000101; break; // Cijfer 3 tonen op dobbelsteen
case 4: GPIO = 0b00010100; break; // Cijfer 4 tonen op dobbelsteen
case 5: GPIO = 0b00010101; break; // Cijfer 5 tonen op dobbelsteen
case 6: GPIO = 0b00010110; break; // Cijfer 6 tonen op dobbelsteen
}
aantal_ogen_vorige = aantal_ogen; // Huidige aantal ogen opslaan
sleep_timer = 0; // sleep_timer voor slaapstand op 0 zetten
}
// Interrupt functie
void interrupt()
{
if(INTCON.T0IF) // Als Timer0 interrupt optreedt
{
sleep_timer++; // sleep_timer verhogen met 1
if(sleep_timer==320) // Als dobbelsteen 20 seconden inactief is
{
GPIO = 0b00000000; // Alle LEDs uitzetten
INTCON = 0x08; // Timer0 interrupt uitzetten en IOC interrupt aanzetten
IOC = 0x08; // IOC alleen voor GPIO.B3
asm SLEEP; // PIC in slaapstand brengen
delay_ms(25); // 25ms wachten -> ter voorkoming van contactdender
IOC = 0x00; // IOC register leegmaken
sleep_timer = 0; // sleep_timer op 0 zetten
INTCON = 0xA0; // IOC interrupt uitzetten en Timer0 interrupt aanzetten
GPIO = 0b00010111; // Alle LEDs van de dobbelsteen aanzetten
while(GPIO.B3) // Zolang de druk schakelaar nog is ingedrukt in loop blijven
{
sleep_timer = 0; // sleep_timer op 0 zetten
}
delay_ms(25); // 25ms wachten -> ter voorkoming van contactdender
}
else // Geen Timer0 interrupt -> niks doen
{
}
INTCON.T0IF = 0; // TOIF bit voor Timer0 interrupt op 0 zetten
}
else
{
}
}
Werking
De 7 LEDs geven aan welk getal is gegooid net zoals dat op een echte dobbelsteen wordt aangegeven. Als de
drukschakelaar ingedrukt wordt dan begint de PIC met random getallen te
kiezen die worden weergeven. Als vervolgens de drukschakelaar losgelaten wordt dan stopt de dobbelsteen bij een
bepaald getal. De PIC is zo geprogrammeerd dat je als gebebruiker van de dobbelsteen geen
invloed hebt op het getal wat gegooid wordt.
Deze schakeling werkt op een 9V batterij
Downloads
Film
Hieronder staat een film van de mini LED dobbelsteen.
Bestellen
De volgende producten kun je bestellen:
Advertentie