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 :(




