Zdobyłem ostatnio Arduino UNO wraz z zestawem podstawowych elektronicznych elementów (Starter-kit). Jest to mikrokontroler ATmega328 z  programatorem, emulacją portu szeregowego na USB i wyprowadzeniami na jednej płytce (dla niewtajemniczonych jest to taki mały “komputerek” do sterowania elektroniką).

Jako, że z kolegami urządziliśmy sesję “Magii i Miecza”, postanowiłem wykorzystać Arduino do rzucania kością. W dalszej części pokazuję jak zbudować sobie taką K6-tkę.

Fotografia arduino i diód imitujących kostkę do gry

Arduino wyrzucił 6!

Po pierwsze potrzebne nam będą:

  • Arduino,
  • 7 świecących diod (LED),
  • 7 rezystorów do podłączenia diod (np. po 220 Ω)
  • przycisk,
  • płytka stykowa i kabelki.

Wszystko powinniśmy podłączyć według sporządzonego w programie Fritzing rysunku:

Rysunek podłączenia "kostki"

Rysunek podłączenia “kostki”

Płytka stykowa łączy osobno długie rzędy (+ i  ) oraz kolumny po 5 pinów oddzielone  rowkiem po środku płytki.

Dla pełniejszej czytelności dołączam jeszcze schemat:

Schemat podłączenia "kostki"

Schemat podłączenia “kostki”

Warto pamiętać, że diody podłączamy katodą (dłuższą nóżką) do masy (GND), a anodą przez rezystor do odpowiedniego wejścia w Arduino. Rezystory podpinamy dowolnie,  zapobiegają przepaleniu diod.  W przycisku nóżki naprzeciwko siebie są połączone, a obok rozłączone do czasu wciśnięcia. Do podłączenia masy diod i przycisku użyłem zszywek do papieru – doskonale nadają się do połączeń.

Ok, mamy już podłączony “hardware”, program prezentuje się następująco:

//Dice - simple Arduino dice simulator
//       by pressing button you can "roll a dice"
//Author: tsm (tomszom.com)

// Dice LEDs:
//    A   B
//    C D E
//    F   G
// Defined pins:
#define LED_A 8
#define LED_B 6
#define LED_C 9
#define LED_D 7
#define LED_E 5
#define LED_F 10
#define LED_G 4

//Button:
#define BUT1 2

int faces[][6] = {{},        //schema of pips in faces
                 {LED_D},
                 {LED_F,LED_B},
                 {LED_F,LED_D,LED_B},
                 {LED_A,LED_B,LED_F,LED_G},
                 {LED_A,LED_B,LED_D,LED_F,LED_G},
                 {LED_A,LED_B,LED_C,LED_E,LED_F,LED_G}
               };

int result = 0;

void clearall(){
  for(int i=0;i<6;i++){
    digitalWrite(faces[6][i],LOW); //clear SIX...
  }
  digitalWrite(faces[1][0],LOW); //... and the ONE in the middle
}

void showface(int pips){
  for(int i=0;i<pips;i++){  //show all pips from faces array
    digitalWrite(faces[pips][i],HIGH);
  }
}

void demo(){ // try all faces
  for(int i=1;i<=6;i++){
    clearall();
    delay(300);
    showface(i);
    delay(700);
  }
  clearall();
}

void setup() {
  pinMode(BUT1, INPUT); //BUT1 pin as input (button state)
  digitalWrite(BUT1, HIGH); //set up build-in resistor
  demo();  //show demo
  randomSeed(analogRead(0)); //seed initialized by unconnected pin
}

void loop(){
  while(digitalRead(BUT1)==LOW){ //while button pressed ...
    result=random(1,7); //... get random result ...
    showface(random(1,7)); //... and show ANOTHER random face
    delay(70);
    clearall();
  }
  showface(result);
}

Na początku przypisujemy diody do odpowiednich pinów (jeśli diody zostały podpięte inaczej niż w schemacie to tu jest dobre miejsce, żeby to zmienić); #define sprawia, że oszczędzamy pamięć na zmienne wstawiając w ich miejsce gotowe wartości stałe. Następnie mamy dwuwymiarową tablicę faces[][6] przechowującą układ oczek na “ściankach” kostki.

Funkcja clearall() gasi wszystkie diody poprzez zgaszenie “6” i “1” (pozwala to dowolnie modyfikować piny podpiętych LEDów). Funkcja showface() wyświetla odpowiednią “ściankę” kostki, a demo() sprawdza wyświetlanie wszystkich ścianek.

Każdy program dla Arduino powinien posiadać dwie funkcje: setup() i loop(). Pierwsza wykonywana jest tylko raz, na początku, po czym następuje wykonywanie w kółko tej drugiej. I tak w setup() ustawiamy pin przycisku jako wejście i ustawiamy wbudowany w mikrokontroler rezystor na tym pinie; odpalamy demko i inicjujemy generator liczb pseudolosowych przez zczytanie z niepodpiętego wejścia analogowego jakiejś wartości (może się ona zmieniać np. poprzez pole elektromagnetyczne ręki, innych urządzeń lub fluktuacji wszechświata ;), można też podpiąć do tego wejścia np fotorezystor). W loop() odbywa się cała magia: tak długo jak wciśniemy przycisk co 70 mikrosekund będzie losowana kolejna liczba i wyświetlana INNA losowa, po zwolnieniu przycisku wyświetli się wylosowana wartość. Wydaje mi się, że po paru wstępnych losowaniach nikt nie jest w stanie przewidzieć i sterować wynikami losowania.

Program należy wprowadzić do Arduino IDE a następnie po podłączeniu Arduino do USB wrzucić na urządzenie  przyciskiem “Upload” (Ctrl+U). Chwilę później diody powinny zamrugać we wszystkich 6-ściu kombinacjach, po czym przyciskiem będziemy mogli losować kolejne “rzuty”. Miłej zabawy!