Cuprins:

Ciclon LED Arcade Joc: 4 pași
Ciclon LED Arcade Joc: 4 pași

Video: Ciclon LED Arcade Joc: 4 pași

Video: Ciclon LED Arcade Joc: 4 pași
Video: how automatic mahjong table works 2024, Septembrie
Anonim
Image
Image
Instalați în dispozitiv
Instalați în dispozitiv

Intenția acestui proiect a fost de a crea un joc simplu folosind un Arduino care să fie interactiv și distractiv pentru copii. Îmi amintesc că jocul arcade Cyclone era unul dintre jocurile mele arcade preferate când eram mai tânăr, așa că am decis să îl reproduc. Acesta este un proiect foarte simplu care constă dintr-un Arduino, un șir de LED-uri adresabile individual și un buton.

Scopul jocului este de a opri lumina de ciclism când atinge LED-ul indicat (roșu). Dacă aveți succes, nivelul de dificultate va crește. Dacă nu reușește, ciclul de lumină va reporni la nivelul curent de dificultate.

Acest instructable a fost o resursă imensă pentru nucleul codării mele.

Pasul 1: Strângeți consumabilele

  • Componentele principale:

    • Arduino (am folosit un UNO)
    • Șir de LED-uri adresabile individual (am folosit link)
    • Buton de apăsare (am folosit link)
    • Placă de circuite imprimate (PCB) sau panou de testare
    • Sursa de alimentare (am folosit două surse de alimentare separate, s-ar putea să scapi de una dacă ești creativ)

      • 5V 3A pentru LED-uri
      • 9V 1A pentru Arduino
  • Cadru:

    • Carcasă electronică (am modificat un corp de iluminat din lemn din Goodwill)
    • Carcasă cu LED (V-am modificat ceasul de perete standard și găurile găurite folosind identificatorii de minute ca marcaje ale găurilor. Folosiți un ceas din lemn, dacă este posibil, pentru a ușura găurirea.)
    • Carcasă buton (am folosit o țeavă din cot cot)
  • Unelte / Alte materiale:

    • Cablare de rezervă pentru circuitul dvs.
    • Rezistențe de 10K (rezistență pull-down pentru comutator) și 470 ohm (pentru firul de date pe LED-uri)
    • Găuri pentru a crea găuri pentru adăpostirea LED-urilor dvs. și pentru a face orificiile necesare în dispozitivul dvs. pentru a trece firele
    • Fier de lipit pentru lipirea circuitului pe un PCB
    • Pistol de lipit fierbinte pentru fixarea LED-urilor la corpul dvs.
    • Velcro sau unele mijloace de securizare a cadrului împreună
    • Garnituri opționale pentru găurile forate pentru trecerea firelor

Pasul 2: Încărcați codul

Asigurați-vă că descărcați și adăugați biblioteca „FastLED”

Nucleul codului (bucla nulă) este alcătuit din două stări: apăsarea butonului înalt (Încheierea jocului) și apăsarea butonului joasă (Joc). Odată ce utilizatorul apasă butonul, adresa LED-ului pe care a fost oprită lumina este comparată cu adresa LED-ului central. Dacă nu sunt la fel, toate luminile clipesc roșu de două ori și nivelul curent repornește. Dacă sunt la fel, cylon (scriptul de bibliotecă FastLED) rulează de două ori, nivelul de dificultate crește și redarea se reia. Odată ce jucătorul bate ultimul nivel, cylon rulează de opt ori și jocul repornește la nivelul 1.

// Joc de ciclon

#includeți "FastLED.h" // până la 50 #define NUM_LEDS 40 #define CENTER_LED 21 #define DATA_PIN 7 #define LED_TYPE WS2811 #define COLOR_ORDER RGB // interval 0-64 #define LUMINOSITATE 50 // Definirea nivelurilor de dificultate #define EASY 1 #define MEDIUM 2 #define HARD 3 #define ON_SPEED 4 #define SONIC_SPEED 5 #define ROCKET_SPEED 6 #define LIGHT_SPEED 7 #define MISSION_IMPOSSIBLE 8 // Dificultate inițială int difficult = 1; // Definiți matricea de leduri CRGB [NUM_LEDS]; // A câștigat jucătorul această rundă? Această etichetă este utilizată pentru parametrii de dificultate. bool wonThisRound = false; // Locația de pornire a lămpii de ciclism int LEDaddress = 0; // Jocul rulează? bool Joc = adevărat; // Este prima victorie? bool CycleEnded = adevărat; // Detalii buton const int buttonPin = 9; int buttonState = 0; // Inițializați funcțiile bibliotecii led și arduino void setup () {FastLED.addLeds (led-uri, NUM_LEDS); FastLED.setBrightness (LUMINOSITATE); pinMode (buttonPin, INPUT); Serial.begin (9600); } // Carnea și cartofii // Două moduri - Jocul și sfârșitul jocului bucla nulă () {// ÎNCHEI JOC butonulStat = digitalRead (buttonPin); if (buttonState == HIGH) {Redare = false; // Utilizatorul a apăsat butonul, iar LED-ul s-a oprit pe adresa câștigătoare. for (int i = 0; i <NUM_LEDS; i ++) {leds = CRGB:: Black; } leduri [CENTER_LED] = CRGB:: Red; leduri [LEDaddress] = CRGB:: Verde; FastLED.show (); if (CycleEnded = true) {int diff = abs (CENTER_LED - LEDaddress); // Găsește distanța dintre ledul aprins și ledul central dacă (diff == 0) {wonThisRound = true; // Jucătorul a reușit să bată nivelul dacă (dificultate! = MISSION_IMPOSSIBLE) {for (int i = 0; i <2; i ++) {cylon (); }} if (dificultate == MISSION_IMPOSSIBLE) {for (int i = 0; i <8; i ++) {cylon (); } dificultate = 0; } mărireDificultate (); wonThisRound = false; } else {delay (1000); for (int i = 0; i <2; i ++) {flash (); }} CycleEnded = false; } LEDaddress = 0; întârziere (250); buttonState = digitalRead (buttonPin); if (buttonState == LOW) {Redare = true; }} // PLAYING if (Playing) {for (int i = 0; i <NUM_LEDS; i ++) {leds = CRGB:: Black; // Oprește toate ledurile} leduri [CENTER_LED] = CRGB:: Red; // Setează culoarea ledului central pe ledurile verzi [LEDaddress] = CRGB:: Green; // Setează culoarea led-ului cilindru la roșu FastLED.show (); // Inițializează LED-ul ciclului de lumină ++; // Setează ciclul de lumină la un led la un moment dat dacă (LEDaddress == NUM_LEDS) {LEDaddress = 0; } întârziere (getTime (dificultate)); buttonState = digitalRead (buttonPin); if (buttonState == HIGH) {Redare = false; CycleEnded = adevărat; }}} // Parametri de nivel int getTime (int diff) // Returnează întârzierea timpului pentru mișcarea bazată pe dificultate {int timeValue = 0; switch (diff) {caz EASY: timeValue = 100; pauză; caz MEDIU: timeValue = 80; pauză; caz HARD: timeValue = 60; pauză; caz ON_SPEED: timeValue = 40; pauză; caz SONIC_SPEED: timeValue = 30; pauză; caz ROCKET_SPEED: timeValue = 20; pauză; caz LIGHT_SPEED: timeValue = 13; pauză; caz MISSION_IMPOSSIBLE: timeValue = 7; } return timeValue; // Returnează suma de întârziere} // Câștigarea dificultății crește parametrii void increaseDifficulty () {if (dificultate! = MISSION_IMPOSSIBLE && wonThisRound) {difficult ++; }} // Lost LED Show void flash () {fill_solid (leds, NUM_LEDS, CRGB:: Red); FastLED.show (); întârziere (500); fill_solid (led-uri, NUM_LEDS, CRGB:: Negru); FastLED.show (); întârziere (500); } // Won LED Show void fadeall () {for (int i = 0; i <NUM_LEDS; i ++) {leds .nscale8 (250); }} void cylon () {static uint8_t hue = 0; Serial.print ("x"); // Glisați mai întâi ledul într-o direcție pentru (int i = 0; i = 0; i--) {// Setați ledul i'th la leduri roșii = CHSV (nuanță ++, 255, 255); // Afișați ledurile FastLED.show (); // acum că am arătat led-urile, resetați ledul i'th la negru // leds = CRGB:: Black; fadeall (); // Așteptați puțin înainte de a face o buclă și faceți-o din nou întârziere (10); }}

Pasul 3: Instalați în dispozitiv

Instalați în dispozitiv
Instalați în dispozitiv
Instalați în dispozitiv
Instalați în dispozitiv

Nu voi intra în detalii în această secțiune. Există o mie de moduri diferite de a parcurge această parte și cred că ar trebui să fii creativ pentru a face să arate cum îți place. Acestea fiind spuse, ceasul a fost destul de convenabil de utilizat pentru adăpostirea LED-urilor, deoarece avea indicatori de minute pe care i-am putut folosi ca marcaje de foraj. De asemenea, capacul de sticlă îmi permite, de asemenea, să folosesc acest lucru ca masă.

Velcro-ul a fost foarte util și pentru fixarea corpului cu LED-uri la corpul electronic al carcasei. Am folosit și velcro pe Arduino. Acest lucru a făcut-o foarte convenabilă pentru extragerea Arduino dacă vreodată vreau să modific codul.

Recomandat: