Ζάρι LED με Arduino

arduino_dice_2sm_1693558688
arduino_dice_2sm_1693558688arduino_dice_1smdice_1smdice_2smdice_3smdice_4smdice_5smdice_6sm


Το ζάρι LED, είναι μία απλή εφαρμογή που μπορείτε να φτιάξετε ακόμη και σε μία πλακέτα πρωτοτύπων (breadboard). Θα χρειαστείτε 7 LED, 7 αντιστάσεις των 220Ωμ, ένα διακόπτη τύπου μπουτόν (push – on), μία πλακέτα Arduino και μερικά καλώδια.

Το απλοποιημένο διάγραμμα βαθμίδων του Ζαριού LED
Εικόνα 1. Το απλοποιημένο διάγραμμα βαθμίδων του Ζαριού LED

Όπως μπορείτε να δείτε στις εικόνες 1,2 και 3, τα LED τοποθετούνται πάνω στην πλακέτα σε μία διάταξη που αντιστοιχεί με τις κουκίδες σε ένα πραγματικό ζάρι. Μόλις πατηθεί το πλήκτρο και όση ώρα αυτό κρατείται πατημένο, το ζάρι «ρολάρει». Μόλις αφεθεί το πλήκτρο ελεύθερο, εμφανίζεται ψευδοτυχαία στα LED μία διάταξη φωτεινών κουκίδων που αντιπροσωπεύει μία από τις έξι έδρες ενός ζαριού. Η ένδειξη «παγώνει» - παραμένει έως το επόμενο «ρολάρισμα» του ζαριού.

Τα LED στο ζάρι
Εικόνα 2. Mία διάταξη φωτεινών κουκίδων αντιπροσωπεύει μία από τις έξι έδρες ενός ζαριού

 

Η κυκλωματική διάταξη

Το κύκλωμα του ζαριού LED με Arduino παρουσιάζεται στην εικόνα 3. Τα 7 LED τοποθετούνται σε μία συγκεκριμένη διάταξη όπως στην εικόνα και συνδέονται σε ακροδέκτες εισόδου – εξόδου (I/O) της πλακέτας του Arduino μέσω 7 αντιστάσεων των 220Ωμ. Τα LED Α, Β, C, D, E, F  και G συνδέονται στους ακροδέκτες 6,7,8,9,10,11 και 12, αντίστοιχα του Arduino. Οι αντιστάσεις περιορίζουν το ρεύμα σε κάθε LED, στα 20mA περίπου (δεδομένου ότι η τάση τροφοδοσίας είναι 5V).

Το κύκλωμα του Ζαριού LED με Arduino
Εικόνα 3. Το κύκλωμα του Ζαριού LED με Arduino

Ο ένας ακροδέκτης του διακόπτη συνδέεται απευθείας, χωρίς αντίσταση, στον ακροδέκτη 5 του Arduino.  Ο άλλος ακροδέκτης του διακόπτη συνδέεται στη γη (GND). Όταν ο διακόπτης πατηθεί, ο ακροδέκτης 5 του Arduino συνδέεται με τη γη (μεταβαίνει σε λογικό 0). Όσο ο διακόπτης παραμένει ανοικτός, ο ακροδέκτης 5 του Arduino βρίσκεται σε λογικό 1 μέσω μίας αντίστασης πρόσδεσης (pull-up resistor) με την τροφοδοσία  (που ενεργοποιούμε εσωτερικά του μικροελεγκτή).
 

Ο κώδικας

Ο κώδικας υλοποιεί το διάγραμμα ροής της εικόνας 4. Στις πρώτες γραμμές του κώδικα κι εντός της συνάρτησης setup(), αρχικοποιούμε τη λειτουργία των ακροδεκτών εισόδου – εξόδο. Οι ακροδέκτες 6 έως 12 αρχικοποιούνται για λειτουργία ως έξοδοι ενώ ο ακροδέκτης 5 αρχικοποιείται για λειτουργία ως είσοδος με εσωτερική αντίσταση πρόσδεσης (internal pull-up) με την τροφοδοσία. Χρησιμοποιούμε και μία μεταβλητή ως μετρητή καταστάσεων. Τη μεταβλητή αυτή την ονομάζουμε “i” και της δίνουμε την αρχική τιμή 1.

Όση ώρα τα πλήκτρο παραμένει πατημένο, εκτελείται κώδικας σε έναν ατέρμονο βρόχο (loop). Σε κάθε επανάληψη, η τιμή του μετρητή, i, απεικονίζεται (αποστέλλεται) στα LED και έπειτα ο μετρητής αυξάνεται κατά μία μονάδα. Η τιμή που προκύπτει μετά από κάθε αύξηση, απεικονίζεται στα LED στον επόμενο κύκλο. Μόλις η τιμή του μετρητή υπερβεί το 6, επιστρέφει και πάλι στο μηδέν.

Καθόσον εκτελείται ο κώδικας στον ατέρμονα βρόχο, το ζάρι «ρολάρει». Μόλις το πλήκτρο αφεθεί ελεύθερο, η εκτέλεση του κώδικα που βρίσκεται εντός του βρόχου αναστέλλεται και ο μικροελεγκτής απλώς περιμένει πότε θα πατηθεί εκ νέου το πλήκτρο. Στη διάρκεια της αναμονής, τα LED απεικονίζουν την τελευταία κατάσταση του μετρητή (του Ζαριού). Η ταχύτητα με την οποία «ρολάρει» το ζάρι καθορίζεται από το χρονισμό του μικροελεγκτή κι από την εντολή delay() που υπάρχει στην τελευταία γραμμή του κώδικα που βρίσκεται εντός του ατέρμονα βρόχου.

Επειδή οι 6 διαφορετικές απεικονίσεις στο ζάρι εναλλάσσονται με σχετικά μεγάλη ταχύτητα όση ώρα παραμένει πατημένο το πλήκτρο κι επειδή ο χρόνος που κρατάει πατημένο το πλήκτρο ο χρήστης (μετρημένος σε κύκλους ρολογιού του μικροελεγκτή) ποικίλει από «ζαριά» σε «ζαριά», το ζάρι μεταβαίνει τελικώς κάθε φορά σε μία τυχαία κατάσταση ή ακριβέστερα σε μία ψευδοτυχαία κατάσταση. Η τυχαιότητα δεν προκύπτει λόγω του αλγόριθμου αλλά λόγω των αργών αντανακλαστικών του χρήστη, σε σχέση πάντα με την ταχύτητα που εκτελείται ο κώδικας. Προφανώς, αν «ρολάρετε» το ζάρι με μία άλλη μηχανή (π.χ με έναν μονοσταθή), θα φέρνεται πάντοτε την ίδια ζαριά.

Το διάγραμμα ροής του κώδικα
Εικόνα 4. Το διάγραμμα ροής του κώδικα του ζαριού LED

 
Εδώ παρατίθεται ο κώδικας:    

//Simple LED Dice based on Arduino
/*circuitlib.com*/
//By G. Adam

int i;
int button=5;
int A=6;
int B=7;
int C=8;
int D=9;
int E=10;
int F=11;
int G=12;

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital IO direction
  pinMode(button, INPUT_PULLUP);
  pinMode(A, OUTPUT);
  pinMode(B, OUTPUT);
  pinMode(C, OUTPUT);
  pinMode(D, OUTPUT);
  pinMode(E, OUTPUT);
  pinMode(F, OUTPUT);
  pinMode(G, OUTPUT);

  // initialize counter value
  i=1;
  
}

// Turn on LEDs for mode 6
void turn_on_6 ()
 {
    digitalWrite(A,HIGH);
    digitalWrite(B,HIGH);
    digitalWrite(C,HIGH);
    digitalWrite(D,HIGH);
    digitalWrite(E,HIGH);
    digitalWrite(F,HIGH);
 }

// Turn on LEDs for mode 5
 void turn_on_5 ()
 {
    digitalWrite(A,HIGH);
    digitalWrite(C,HIGH);
    digitalWrite(D,HIGH);
    digitalWrite(F,HIGH);
    digitalWrite(G,HIGH);
  }

// Turn on LEDs for mode 4
void turn_on_4 ()
 {  
    digitalWrite(A,HIGH);
    digitalWrite(F,HIGH);
    digitalWrite(D,HIGH);
    digitalWrite(C,HIGH);
  }

// Turn on LEDs for mode 3
void turn_on_3 ()
 {  
    digitalWrite(C,HIGH);
    digitalWrite(G,HIGH);
    digitalWrite(F,HIGH);
 }

// Turn on LEDs for mode 2
void turn_on_2 ()
 {  
    digitalWrite(F,HIGH);
    digitalWrite(C,HIGH);
 }

// Turn on LEDs for mode 1
void turn_on_1 ()
 {  
  digitalWrite(G,HIGH);
 }

// Turn off all LEDs
 void turn_off_all ()
 {  
    digitalWrite(A,LOW);
    digitalWrite(B,LOW);
    digitalWrite(C,LOW);
    digitalWrite(D,LOW);
    digitalWrite(E,LOW);
    digitalWrite(F,LOW);
    digitalWrite(G,LOW);
 }

// the loop function runs over and over again forever
void loop() 
{
  bool state;
  state=digitalRead(button);   
  if (state==LOW) // Button is pressed?
  {
    turn_off_all();
    if (i==1) turn_on_1();
    if (i==2) turn_on_2();      
    if (i==3) turn_on_3();
    if (i==4) turn_on_4();
    if (i==5) turn_on_5();
    if (i==6) turn_on_6();
  }
 
 i=i+1;
 if (i>6) i=1;
 delay(15);
 
 }