Introduzione al Progetto di Dadi
Se sei un appassionato di elettronica e programmazione, un progetto interessante da realizzare è un sistema di lancio dei dadi utilizzando Arduino. Questo progetto non solo è divertente, ma offre anche una grande opportunità per apprendere e mettere in pratica competenze di programmazione e utilizzo di sensori.
Materiali Necessari
Per completare questo progetto, avrai bisogno di alcuni materiali essenziali. Innanzitutto, procurati una scheda Arduino, un sensore di movimento (come un accelerometro), LED e resistori. Inoltre, un piccolo contenitore o scatola per montare il sistema dei dadi sarà utile per un aspetto finale più professionale.
Realizzazione del Sistema
Inizia assemblando i componenti. Collega il sensore di movimento ad Arduino e testa la connessione. Dovrai programmare Arduino per rilevare il movimento del sensore e, una volta attivato, accendere i LED per simulare il lancio dei dadi. Puoi utilizzare una semplice funzione casuale per generare un numero tra 1 e 6, rappresentando i risultati del lancio.
Successivamente, personalizza il sistema aggiungendo suoni o altri effetti visivi per rendere l’esperienza più coinvolgente. Sperimenta e divertiti a modificare il codice per ottenere risultati diversi e sorprendenti!
Questo progetto rappresenta un ottimo modo per migliorare le tue abilità pratiche e teoriche in materia di elettronica. Buon divertimento con il tuo sistema di lancio dei dadi!
Ecco uno sketch Arduino completo per un dado elettronico con 7 LED disposti “a H” e un pulsante: genera numeri casuali 1–6, gestisce il debounce, semina la sequenza casuale e mostra i puntini corretti su ogni lancio.
Schema e collegamentiDisporre 7 LED come sui classici dadi: tre in alto, uno centrale, tre in basso; usare resistori in serie e collegare ogni anodo a un pin digitale, i catodi a GND; collegare il pulsante a un pin con INPUT_PULLUP e l’altro capo a GND per lettura attiva-bassa .
La disposizione tipica dei “pip” usa 7 LED per comporre tutte le facce da 1 a 6; la forma “H” consente accensioni simmetriche e facilmente mappabili nel codice con una tabella di pattern.
// Dado elettronico con 7 LED e pulsante (attiva-basso con INPUT_PULLUP)
// Disposizione LED (vista frontale “a H”):
// idx: 0 1 2
// 3 4 5
// 6 7 8 <-- useremo 7 LED (mappati sotto) lasciando solo i necessari
//
// Qui mappiamo 7 LED fisici ai “pip” necessari: TL, TM, TR, ML, C, MR, BL, BM, BR
// Per semplicità usiamo solo gli indici richiesti da un dado classico: TL, TR, ML, C, MR, BL, BR
const int buttonPin = 9; // pulsante a GND, INPUT_PULLUP
const int ledPins[7] = {2, 3, 4, 5, 6, 7, 8};
// Mappatura leggibile dei 7 LED in stile dado:
// 0: TL (top-left), 1: TR (top-right), 2: ML (mid-left), 3: C (center),
// 4: MR (mid-right), 5: BL (bottom-left), 6: BR (bottom-right)
// Pattern per le facce 1..6: elenchi di indici LED da accendere
// 1: C
// 2: TL, BR
// 3: TL, C, BR
// 4: TL, TR, BL, BR
// 5: TL, TR, C, BL, BR
// 6: TL, TR, ML, MR, BL, BR
const byte faces[6][7] = {
/*1*/ {3, 255, 255, 255, 255, 255, 255},
/*2*/ {0, 6, 255, 255, 255, 255, 255},
/*3*/ {0, 3, 6, 255, 255, 255, 255},
/*4*/ {0, 1, 5, 6, 255, 255, 255},
/*5*/ {0, 1, 3, 5, 6, 255, 255, 255},
/*6*/ {0, 1, 2, 4, 5, 6, 255}
};
// Nota: 255 come sentinella “fine elenco”
// Parametri di gestione pulsante
const unsigned long debounceMs = 30;
const unsigned long spinMinMs = 400; // durata minima animazione “rotolamento”
const unsigned long spinMaxMs = 900; // durata massima animazione “rotolamento”
const unsigned long frameMs = 40; // velocità di rotolamento
// Stato pulsante (debounce semplice)
bool lastStable = HIGH;
unsigned long lastChange = 0;
void clearAll() {
for (int i = 0; i < 7; i++) digitalWrite(ledPins[i], LOW);
}
void showFace(int n) {
clearAll();
const byte* patt = faces[n - 1];
for (int i = 0; i < 7; i++) {
if (patt[i] == 255) break;
digitalWrite(ledPins[patt[i]], HIGH);
}
}
bool buttonPressed() {
bool raw = digitalRead(buttonPin); // HIGH: rilasciato, LOW: premuto
unsigned long now = millis();
if (raw != lastStable && (now - lastChange) > debounceMs) {
lastStable = raw;
lastChange = now;
}
// Evento “pressed” su transizione a LOW stabile
static bool prev = HIGH;
bool pressed = (prev == HIGH && lastStable == LOW);
prev = lastStable;
return pressed;
}
void seedRandomOnce() {
static bool seeded = false;
if (seeded) return;
// Semina usando rumore analogico su un pin flottante (es. A0); alternativa: combinare più letture
unsigned long s = 0;
for (int i = 0; i < 16; i++) {
s ^= ((unsigned long)analogRead(A0) & 0x3FF) << (i % 22);
delay(1);
}
randomSeed(s);
seeded = true;
}
void spinAnimation(unsigned long durationMs) {
unsigned long start = millis();
int face = 1;
while (millis() - start < durationMs) {
face = 1 + (millis() / frameMs) % 6;
showFace(face);
delay(frameMs);
}
}
void setup() {
for (int i = 0; i < 7; i++) {
pinMode(ledPins[i], OUTPUT);
digitalWrite(ledPins[i], LOW);
}
pinMode(buttonPin, INPUT_PULLUP);
// Iniziale: mostra 1
showFace(1);
// Precarica stato pulsante
lastStable = digitalRead(buttonPin);
lastChange = millis();
// Semina PRNG
seedRandomOnce();
}
void loop() {
if (buttonPressed()) {
// Effetto “rotolamento” prima del risultato
unsigned long spinMs = spinMinMs + (unsigned long)random(spinMaxMs - spinMinMs + 1);
spinAnimation(spinMs);
// Estrai numero 1..6 e visualizza
int n = 1 + (int)random(6);
showFace(n);
}
}
