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!
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 ;)
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 :(