IoT Arduino Dodge Led game.

Een verslag door Anna van de labserie voor het NDC: https://junioriot.nl/programma-ndc-2020/

 

Voor dit project heb je het volgende nodig:

  •  1 Arduino Nano
  • 1 USB kabel
  • 1 Klein breadboard
  • 1 Groot breadboard
  • 2 LED Matrices
  • 1 Joystick
  • 14 Male to male jumper kabels
  • 1 Female to male jumper kabel

In het kleine breadboard plaats je de Arduino en in het grote breadboard plaats je de LED matrices en de joystick naast elkaar net zoals ze in de foto staan.

De jumper kabeltjes verbind je als volgt:

Van LED Matrix 1 naar de Arduino:

  • VCC naar +5V
  • GND naar GND
  • DIN naar D8
  • CS naar D9
  • CLK naar D10

Van LED Matrix 1 naar LED Matrix 2:

  • VCC naar VCC
  • GND naar GND
  • DOUT (bovenaan) naar DIN
  • CS naar CS
  • CLK naar CLK

Van de joystick naar de Arduino:

  • GND naar GND
  • +5V naar +5V
  • VRx naar A0
  • VRy naar A1
  • SW naar TX1

Start nu de Arduino IDE op. Als je dit nog niet gedownload hebt, kan je dat hier doen: https://www.arduino.cc/en/main/software.

Voordat we gaan coderen, moeten we de LedControl library van Eberhard Fahle installeren. Dit kun je in de Arduino IDE doen door boven op Tools en daarna op Manage Libraries te klikken.

Nu alles klaar staat, kunnen we beginnen met het coderen van ons programma!

Als eerst voegen we de zojuist geïnstalleerde library toe aan ons programma en initialiseren we onze LED Matrix en variabels.

  #include "LedControl.h"
  #define NBR_MTX 4

  LedControl lc = LedControl(8, 10, 9, NBR_MTX);

  // vars initialiseren
  int UD = 0; // int voor boven en beneden
  int LR = 0; // int voor links en rechts
  int random_y; // int voor het genereren van monsters op scherm 1
  int random_x; // int voor het genereren van monsters op scherm 2
  int period = 1000; // int voor de millis functie
  unsigned long time_now = 0;

In de  void setup starten we de serial monitor met Serial.begin. De LED Matrices schakelen we aan, we passen de helderheid aan en we wissen het scherm. Dan gebruiken we de randomSeed functie om onze random functie te beïnvloeden.

void setup() {
  Serial.begin (9600);
  // voor elke led matrix zetten we het scherm aan, passen we de helderheid aan 
  //    en wissen we het scherm.
  for (int i=0; i< NBR_MTX; i++){
    lc.shutdown(i, false); // zet de led matrix aan
    lc.setIntensity(i, 1); // verander de 1 naar een ander getal om 
           //de helderheid aan te passen.
    lc.clearDisplay(i); // scherm wissen
  }

  // de randomSeed functie zorgt er voor dat de random functie bij elke game weer 
  //  anders werkt. zonder randomSeed, zou random na elke reset 
  //  dezelfde volgorde van getallen creëeren.
  // als niets is aangesloten op D12, zal het willekeurige ruissignalen ontvangen.
  randomSeed(analogRead(12));
  delay(100);
}

Setup is compleet, we kunnen nu doorgaan naar onze loop. In de loop kunnen we code plaatsen die uit zichzelf herhaald wordt.

Als eerst geven we de variabels UD en LR, die we eerder geïnitialiseerd hebben, de waardes van de x- en y-as van de joystick. Met deze variabels kunnen we ons led lampje laten bewegen.

De waardes van de assen van de joystick gaan van 0 tot 1021. Wanneer de joystick niet in gebruik is, staan de waardes voor zowel de x- als de y-as ongeveer op 500.

Deze waardes gaan we nu omrekenen naar de cijfers 0 t/m 7 met behulp van de map functie. Met deze 8 cijfers weet ons led lampje waar die licht moet geven.

  // UD en LR krijgen nu de waardes van de x en y as van de joystick.
  UD = analogRead(A0);
  LR = analogRead(A1);

  // 'map' rekent de waarde van de joystick om in de cijfers 0 t/m 7.
  char x_translate = map(LR, 1021, 0, 7, 0); // waarde voor links en rechts
  char y_translate = map(UD, 0, 1021, 0, 7); // waarde voor boven en beneden

  // met 0 geven we aan dat het om het eerste schermpje gaat. de waarde van 
  //          x_translate wordt gemanipuleerd door de joystick.
  lc.setLed(0, x_translate, 1, true); // speler op het linker scherm
  lc.setLed(0, x_translate, 1, false);

  // hier geldt hetzelfde als net, alleen gebruiken we hier 1 en y_translate.
  lc.setLed(1, 6, y_translate, true); // speler op het rechter scherm
  lc.setLed(1, 6, y_translate, false);

In plaats van dat we de delay functie gebruiken tijdens het creëren van onze random variabels, gebruiken we de millis functie. Als we de delay functie zouden gebruiken, zou ons hele spel bij elke stap met een seconde vertraagd worden. Met de millis functie kunnen we onze eigen delay maken die alleen gebeurt bij het genereren van random variabels.

Omdat we de Serial.print functie hebben gebruikt, kan je de waardes van de assen zien veranderen in de serial monitor die rechtsboven in de IDE staat.

De random variabels gebruiken we nu in de setLed functie om monsters op willekeurige plekken tevoorschijn te laten komen.

  // i.p.v. 'delay' maken we gebruik van 'millis', zodat al onze activiteiten 
  //  niet met een seconde vertraagd worden.
  if(millis() >= time_now + period){
    time_now += period;
    
    // de waardes van de variabels worden elke seconde (int period) weergeven in de
    //   serial monitor. klik rechtsboven in de arduino ide om dit te bekijken.
    Serial.print("LR = ");
    Serial.print(LR, DEC);

    Serial.print(", UD = ");
    Serial.print(UD, DEC);

    Serial.print(", x = ");
    Serial.print(x_translate, DEC);
    Serial.print(", y = ");
    Serial.print(y_translate, DEC);

    // met 'random' krijgen de variabels een willekeurig getal tussen de 0 en 8
    random_y = random(0, 8);
    random_x = random(0, 8);
    Serial.print(", random_y = ");
    Serial.print(random_y);
    Serial.print(", random_x = ");
    Serial.println(random_x);
  }

  lc.setLed(0, random_y, 7, true);
  lc.setLed(1, 0, random_x, true);

Helaas heb ik mijn spelletje niet af kunnen maken. Ik wilde er nog voor zorgen dat de monster led lampjes op het linker scherm naar beneden zouden scrollen en op het rechterscherm naar rechts zouden scrollen.

Wanneer de coördinaten van een monster met de coördinaten van de speler overeen komen, is de speler af en begint het spel opnieuw.

Door setLed op false te zetten, kan ik individuele lampjes beïnvloeden en de vorige stappen van de speler en de monsters uit zetten, zodat het hele veld niet vol komt te staan met schijnende lampjes.

Bij de speler was me dit al gelukt, maar helaas had ik niet meer genoeg tijd om dit bij de monsters voor elkaar te krijgen.