Trustpilot -         •           FRI FRAGT VED KØB OVER 700 KR.         •           Skriv til os         •           30 dages returret

Reaktionsspil med Arduino og LED-matrix

Illustration: Reaktionsspil med Arduino og LED-matrix

To spillere, to knapper og en lysende matrix. Når den tænder, gælder det om at trykke først, men trykker du for tidligt, har du tabt. Spillet er hurtigt at bygge og en god måde at lære knapper, tilfældige tal og et LED-display at kende.

Det skal du bruge

327,70 kr.Samlet, inkl. moms

Har du allerede nogle af delene? Fjern fluebenet.

Du skal bruge en computer med Arduino IDE, som er gratis. USB-kablet til Uno’en følger med.

Sådan virker det

Matrixen styres af en MAX7219-chip. Den holder selv styr på alle 64 lysdioder, så Uno’en kun skal fortælle den, hvilke prikker der skal lyse. Det sker over tre ledninger, og biblioteket LedControl klarer kommunikationen.

Knapperne sidder mellem en pin og GND. Med INPUT_PULLUP holder Uno’en selv pinnen høj gennem en indbygget modstand, og når knappen trykkes ned, bliver pinnen lav. Derfor skal du ikke bruge ekstra modstande. Spillet venter et tilfældigt antal sekunder, så ingen kan regne ud, hvornår det er tid. Trykker en spiller, før matrixen lyser, går sejren til den anden.

Sådan bygger du det

  1. Forbind matrixens indgang, den ende med DIN, til Uno’en med han-hun-ledninger: VCC til 5V, GND til GND, DIN til pin 12, CS til pin 10 og CLK til pin 11.
  2. Sæt to trykknapper i breadboardet, hver over midterrillen og med god afstand, så to personer kan sidde ved dem.
  3. Knapperne har fire ben, der er forbundet parvis. Bruger du to ben, der sidder diagonalt over for hinanden, rammer du altid rigtigt. Det ene ben går til breadboardets GND-skinne, det andet til pin 2 (venstre spiller) eller pin 3 (højre spiller).
  4. Forbind GND-skinnen til en GND-pin på Uno’en med en han-han-ledning.
  5. Installer LedControl via bibliotekshåndteringen i Arduino IDE, og upload koden herunder.
  6. Spil: én prik i midten betyder klar. Når hele matrixen lyser, trykker I. Bagefter viser en pil, hvem der vandt. Peger pilen ikke mod vinderen, så drej modulet, til den gør. Når begge knapper er sluppet, starter en ny runde af sig selv.

Koden

#include <LedControl.h>
// DIN til pin 12, CLK til pin 11, CS til pin 10, ét modul
LedControl lc = LedControl(12, 11, 10, 1);
const int KNAP_V = 2;  // venstre spiller
const int KNAP_H = 3;  // højre spiller
const byte PIL_V[8] = {0x10, 0x30, 0x7F, 0xFF, 0xFF, 0x7F, 0x30, 0x10};
const byte PIL_H[8] = {0x08, 0x0C, 0xFE, 0xFF, 0xFF, 0xFE, 0x0C, 0x08};

void setup() {
  pinMode(KNAP_V, INPUT_PULLUP);  // trykket knap = LOW
  pinMode(KNAP_H, INPUT_PULLUP);
  lc.shutdown(0, false);          // tænd modulet
  lc.setIntensity(0, 4);          // lysstyrke 0-15
  randomSeed(analogRead(A0));
}

void loop() {
  lc.clearDisplay(0);
  lc.setLed(0, 3, 3, true);       // én prik: gør jer klar
  unsigned long start = millis();
  unsigned long vent = random(2000, 6000);
  int vinder = 0;                 // 1 = venstre, 2 = højre
  // trykker man før tid, vinder den anden
  while (millis() - start < vent && vinder == 0) {
    if (digitalRead(KNAP_V) == LOW) vinder = 2;
    else if (digitalRead(KNAP_H) == LOW) vinder = 1;
  }
  if (vinder == 0) {
    for (int r = 0; r < 8; r++) lc.setRow(0, r, 0xFF);  // NU
    while (vinder == 0) {
      if (digitalRead(KNAP_V) == LOW) vinder = 1;
      else if (digitalRead(KNAP_H) == LOW) vinder = 2;
    }
  }
  const byte *pil = (vinder == 1) ? PIL_V : PIL_H;
  for (int r = 0; r < 8; r++) lc.setRow(0, r, pil[r]);
  delay(3000);
  while (digitalRead(KNAP_V) == LOW || digitalRead(KNAP_H) == LOW) {}
  delay(500);                     // kort pause før næste runde
}

Byg videre

  • Tæl point og spil bedst af fem.
  • Mål reaktionstiden med millis() og skriv den i den serielle monitor.
  • Kobl flere matrixmoduler efter hinanden og vis point eller navne.
  • Sæt en buzzer på, der bipper ved start og ved snyd.

Sidder du fast? Vi hjælper gratis med kode og opsætning. Skriv til [email protected].

Share this post