Arduino – “sześcienna” kostka do gry

Arduino – “sześcienna” kostka do gry

INFORMACJA: Poniższy post nie wydostał się z Poczekalni :(

Siemanko!

Jako, że jest to mój pierwszy artykuł, chciałbym się z Wami przywitać.

Jestem Łukasz, mam 20 lat. W tym roku skończyłem technikum informatyczne, a od października zaczynam studia na kierunku Mechanika i Budowa Maszyn na Politechnice Śląskiej.

“Zabawą” z Arduino zajmuję się od jakiegoś tygodnia ;)

Chciałbym pochwalić się jednym z moich pierwszych projektów, czyli…

Kostką do gry

Założenia były proste. Projekt miał:

  • Losować liczby z przedziału od 1 do 6 (jak na kostkę do gry przystało :D ),
  • Losowanie ma się odbywać po wciśnięciu przycisku,
  • Symulować toczenie się kostki (zanim pojawi się końcowa liczba oczek, liczba ta zmieni się kilka razy),
  • Symulować tępo toczenia się kostki (oczka zmieniają się coraz wolniej (film poniżej wszystko wyjaśni ;) )),
  • Być w miarę prosty do wykonania ;)

Myślę, że wszystkie powyższe cele zostały spełnione :)

Co będzie nam potrzebne?

Projekt składa się z kilku podstawowych elementów:

  • Arduino (w moim przypadku Leonardo),
  • 7 diod LED (w moim przypadku czerwone 5 mm),
  • 7 rezystorów do diod (w moim przypadku 220Ω),
  • 1 rezystor 10kΩ (do podciągnięcia przycisku do masy),
  • 1 tact switch,
  • garść kabelków połączeniowych,
  • płytka stykowa.

Wszystkie te elementy znajdują się w praktycznie każdym zestawie startowym i są na tyle ogólnodostępne, że nie ma sensu dodawania odnośników do sklepów ;)

Łączymy to wszystko!

kostka_bb

Mam nadzieję, że nie zaszlachtujecie mnie za Fritzinga, ale robienie schematu do tak prostego projektu, to chyba przerost formy nad treścią ;)

PS. To mój pierwszy projekt w Fritzingu, więc mam nadzieję, że jest przynajmniej trochę czytelny ;)

Klepiemy kod!

Najpierw cały kod:

void setup() {
//DIODY LED
pinMode(1,OUTPUT);
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
//PRZYCISK
pinMode(12,INPUT);
}
int oczka=0;
int przeskok=0;
void loop() {
randomSeed(millis());
if(digitalRead(12)==HIGH){
  delay(20);
przeskok=random(3,15);
  while(digitalRead(12)==HIGH);
delay(20);
}
int czas=50;
for(int i=1; i<=przeskok; i++){
digitalWrite(1,LOW);
  digitalWrite(2,LOW);
digitalWrite(3,LOW);
  digitalWrite(4,LOW);
digitalWrite(5,LOW);
  digitalWrite(6,LOW);
digitalWrite(7,LOW);
  oczka=random(1,7);
switch (oczka){
  case 1:
digitalWrite(4,HIGH);
  break;
case 2:
    digitalWrite(1,HIGH);
digitalWrite(7,HIGH);
  break;
case 3:
    digitalWrite(1,HIGH);
digitalWrite(4,HIGH);
    digitalWrite(7,HIGH);
break;
  case 4:
digitalWrite(1,HIGH);
    digitalWrite(3,HIGH);
digitalWrite(5,HIGH);
    digitalWrite(7,HIGH);
break;
  case 5:
digitalWrite(1,HIGH);
    digitalWrite(3,HIGH);
digitalWrite(4,HIGH);
    digitalWrite(5,HIGH);
digitalWrite(7,HIGH);
  break;
case 6:
    digitalWrite(1,HIGH);
digitalWrite(2,HIGH);
    digitalWrite(3,HIGH);
digitalWrite(5,HIGH);
    digitalWrite(6,HIGH);
digitalWrite(7,HIGH);
  break;
default:
  break;
}
  delay(czas);
czas+=40;
}
while(digitalRead(12)==LOW);
}

Teraz postaram się wytłumaczyć linijka po linijce:

void setup() {
//DIODY LED
pinMode(1,OUTPUT);
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
//PRZYCISK
pinMode(12,INPUT);
}

Ustawiamy piny od 1 do 7 jako wyjścia dla diod, pin 12 jest wejściem dla przycisku.

int oczka=0; – zmienna, która będzie przechowywała liczbę wylosowanych oczek,

int przeskok=0;  – zmienna, która będzie określała liczbę przeskoków przed pokazaniem właściwego wyniku,

randomSeed(millis());  –  ta linijka odpowiada za ziarno dla generatora liczb pseudolosowych. W tym przypadku ziarnem jest funkcja millis(), która zwraca liczbę milisekund, które upłynęły od momentu rozpoczęcia wykonywania programu. Zastosowanie tej funkcji gwarantuje nam, że wyniki będą możliwie niepowtarzalne. Umieściłem tę funkcję w loop(), aby ziarno było różne dla każdego “rzutu” kostką.

if(digitalRead(12)==HIGH){
delay(20);
  przeskok=random(3,15);
while(digitalRead(12)==HIGH);
  delay(20);
}

Po wciśnięciu przycisku losujemy liczbę przeskoków z przedziału od 3 do 15. Sens umieszczania delay’ów i while’a jest ładnie wytłumaczony TUTAJ ;).

int czas=50;  – czas przerwy między pierwszym, a drugim wynikiem w trakcie “toczenia” się kostki,

for(int i=1; i<=przeskok; i++)  – pętla, która wykonuje się tyle razy, ile jest przeskoków,

  digitalWrite(1,LOW);
  digitalWrite(2,LOW);
digitalWrite(3,LOW);
  digitalWrite(4,LOW);
digitalWrite(5,LOW);
  digitalWrite(6,LOW);
digitalWrite(7,LOW);

Ustawianie wszystkich wyjść w stan niski (wyłączanie diod).

oczka=random(1,7);  – losowanie liczby oczek,

switch (oczka){
...
}

Switch, który w zależności od liczby oczek zapala określone diody.

delay(czas);   – opóźnienie przed ponownym wykonaniem pętli,

czas+=40;  – zwiększenie opóźnienia o 40 milisekund (spowolnienie “toczenia” się kostki),

while(digitalRead(12)==LOW);  – czeka na ponowne wciśnięcie przycisku.

Wykonanie i sposób działania

Czas pokazać, jak wygląda i działa kostka ;)
DSC_0014

DSC_0010

No i film ;)

To tyle!

Być może w przyszłości przeniosę to na osobną płytkę i zamknę w ładnej obudowie, ale zanim to nastąpi muszę podszlifować moje programistyczne i elektroniczne umiejętności.

Mam nadzieję, że się Wam podoba ;) Wiem, że ani kod, ani wykonanie nie są idealne, ale pamiętajcie, że jestem początkujący :)

Jeśli zauważyliście gdzieś błąd, napiszcie o tym w komentarzu. Krytyka i porady również mile widziane :) 

Pozdrawiam.

INFORMACJA: Poniższy post nie wydostał się z Poczekalni :(

Ocena: 3.42/5 (głosów: 12)

Podobne posty

Odpowiedz

anuluj

Masz uwagi?