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ę.
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:
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:
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!
Warning: Use of undefined constant st_related_posts - assumed 'st_related_posts' (this will throw an Error in a future version of PHP) in /home/platne/serwer135737/public_html/tomszom.com/wp-content/themes/zdark/single.php on line 17
4 Responses.
Prawidłowe połonczenie diod jest tylko na zdjęciu. Oba schematy zawierają błąd w postaci połączenia diod LED. Diody mają mieć zamienione nóżki A z K Reszta pięknie działa.
Witam, mam pewien problem.
Do programu wykorzystałem arduino mega. Zmienione zostały numery pinów gdyż inaczej musiałem diody podłączyć i wszystko działa poza tym że diody świecą strasznie słabo. Ledwo widać. Nie jest to wina diod ani rezystorów gdyż wykorzystując program typu BLINK diody świecą sie bardzo ładnie. Tak jakby problem stał po stronie programu. Jakieś sugestie?
Hmm, może jest to kwestia słabego zasilania?
Gdy potrzebujemy więcej mocy często zastosowanie znajduje tranzystor.
Atmega wykorzystana w Arduino pozwala ustawiać rezystor na wyjścia programowo, może tutaj znajdziesz jakiś trop?
Pytanie czy jak podłączysz tylko 1 LED to czy będzie mocniej świecić?
Pozdrawiam i życzę sukcesów w majsterkowaniu!
Problem chyba leży właśnie po stronie programu, gdyż wszystkie diody palą się świetnie wykorzystując prosty programik który nimi mruga 🙂 A w tym przypadku nie mam pojęcia co tu można zmodyfikować w programie do tej kostki by świeciły odpowiednio 🙁