Rull i stil med denne DIY Electronic D20 Die

Rull i stil med denne DIY Electronic D20 Die

Vil du ha noe litt unikt for ditt neste bordspill? Hva med en elektronisk D20 med tilpasset grafikk for kritiske treff og glipp? I dag skal jeg vise deg hvordan du bygger din egen med en Arduino og noen få enkle deler.





Ikke bekymre deg hvis du aldri har brukt en Arduino før, vi har en komme i gang guide .





Bygg plan

Dette er et enkelt prosjekt. En Arduino vil kjøre et OLED -display, og en knapp vil rulle terningen. Egendefinert grafikk vises for kritiske treff eller kritiske miss -ruller. Du kan enkelt endre koden til å være en D8, D10 eller D12.





Hva trenger du

  • 1 x Arduino
  • 1 x 0,96 ' I2C OLED -skjerm
  • 1 x trykknapp
  • 1 x 10k? Motstand
  • 1 x brødbrett
  • Assorterte tilkoblingsledninger
  • Full kode her, hvis du ikke vil følge hele den skriftlige instruksjonen.

Det er kjernedelene du trenger for å bygge din egen D20. Det kan være lurt å installere det i et etui (diskutert nedenfor) og lodde kretsen til en mer permanent tilstand. Her er de ekstra delene du trenger for å gjøre det:

  • 4 x M2 x 10 mm (0,4 tommer) bolter
  • 4 x M2 muttere
  • 4 x 7 mm (0,28 tommer) skiver
  • 9V batteriknapp (eller passende alternativ)
  • Assortert varmekrympeslange

Disse OLED -skjermene er veldig kule. De kan vanligvis kjøpes i hvitt, blått, gult eller en blanding av de tre. Jeg har kjøpt en i blått, for å matche saken min. Sørg for at du får en I2C modell i stedet for SPI .



Nesten hvilken som helst Arduino vil være egnet. Jeg har valgt en Nano, da de er små nok til å passe inn i saken. Sjekk vår kjøpsguide for mer informasjon om Arduino -modeller.

Kretsen

Her er kretsen du trenger:





Koble VCC og GND på OLED -skjermen til Arduino +5V og bakke . Koble analog 4 på Arduino til pinnen merket SDA . Koble analog 5 til SCL pin. Disse pinnene inneholder kretsene som trengs for å drive skjermen ved hjelp av I2C -bussen. De eksakte pinnene vil variere etter modell, men A4 og A5 brukes på Nano og Uno. Undersøk Dokumentasjon for trådbibliotek for din modell hvis du ikke bruker en Uno eller Nano.

Koble batteriet til bakken og VIN pin. Dette står for spenning i og godtar en rekke forskjellige DC -spenninger - men sjekk din spesifikke modell først, og den kan noen ganger variere noe.





Koble knappen til digital pin 2 . Legg merke til hvordan 10k? motstanden er koblet til jord. Dette er veldig viktig! Dette er kjent som en nedtrekksmotstand, og det forhindrer at Arduino oppdager falske data eller forstyrrelser ved et knappetrykk. Det tjener også til å beskytte brettet. Hvis denne motstanden ikke ble brukt, ville +5V gå rett i bakken. Dette er kjent som en død kort og er en enkel måte å drepe en Arduino.

Hvis du lodder denne kretsen, må du beskytte tilkoblingene med varmekrympeslanger:

Pass på at du ikke varmes opp for mye, og bare gjør det når du er sikker på at kretsen fungerer. Det kan også være lurt å vri kablene i par. Dette holder dem ryddige og beskytter dem mot unødig stress:

Knapptest

Nå som du har bygget kretsen, last opp denne testkoden (sørg for å velge riktig kort og port fra Verktøy> Brett og Verktøy> Port menyer):

const int buttonPin = 2; // the number of the button pin
void setup() {
pinMode(buttonPin, INPUT); // setup button
Serial.begin(9600); // setup serial
}
void loop(){
if(digitalRead(buttonPin) == HIGH) {
Serial.print('It Works');
delay(250);
}
}

Når den er lastet opp, må du holde Arduino tilkoblet via USB og åpne den serielle skjermen ( Øverst til høyre> Seriell monitor ). Du bør se ordene Det fungerer vises hver gang du trykker på knappen.

Hvis ingenting skjer, gå og sjekk kretsen din.

OLED -oppsett

Du må installere to biblioteker for å kjøre skjermen. Last ned Adafruit_SSD1306 og Adafruit-GFX [Ikke lenger tilgjengelig] biblioteker fra Github, og lagre dem i bibliotekmappen. Hvis du ikke er sikker på hvor biblioteksmappene dine er, kan du lese min retro -spillopplæring, der jeg konfigurerer den samme skjermen mer detaljert.

Start Arduino IDE på nytt og last opp en testskisse fra Fil> Eksempler Meny. Plukke ut Adafruit SSD1306 og så ssd1306_128x64_i2c . Last opp denne koden (det vil ta en stund), og du bør se mange former og mønstre på skjermen:

Hvis ingenting skjer, dobbeltsjekk tilkoblingene dine. Hvis det fortsatt ikke fungerer etter kontroll, må du endre prøvekoden.

kan du bruke bluetooth -hodetelefoner på xbox one

Endre denne linjen (i begynnelsen av oppsett funksjon):

display.begin(SSD1306_SWITCHCAPVCC, 0x3D);

Til dette:

display.begin(SSD1306_SWITCHCAPVCC, 0x3C);

Dette forteller bibliotekets spesifikke detaljer om skjermen du bruker. Du bør nå være klar til å fortsette med byggingen.

Saken

Hvis du bygger dette på et brødbrett, eller ikke ønsker å bokse det opp, kan du hoppe over dette trinnet.

Jeg designet og 3D -trykte denne boksen. Få på filene Thingiverse . Ikke bekymre deg hvis du ikke har en 3D -skriver - online -tjenester 3D -hubber og Shapeways tilby utskriftstjenester på nettet.

Du kan enkelt lage denne boksen av tre, eller ved å kjøpe en plast prosjektboks .

Lokket er en enkel push -fit design, og inneholder noen utskjæringer for maskinvaren:

Koden

Nå som alt er klart, er det på tide med koden. Slik fungerer det Pseudokode :

if button is pressed
generate random number
if random number is 20
show graphic
else if random number is 1
show graphic
else
show number

For at dette skal fungere skikkelig må et tilfeldig tall genereres - dette er terningkastet. Arduino har en tilfeldig tallgenerator kalt tilfeldig , men skal ikke bruke den. Selv om det er godt nok for grunnleggende tilfeldige oppgaver, er det bare ikke tilfeldig nok for en elektronisk dør. Årsakene til det er litt kompliserte, men du kan lese mer hvis du er interessert i det boallen.com .

Last ned TrueRandom bibliotek av sirleech på Github. Legg dette til bibliotekmappen din og start IDE på nytt.

Lag nå en ny fil og konfigurer den første koden (eller bare hent den ferdige koden fra GitHub):

#include
#include
#include
#include
#include
Adafruit_SSD1306 display(4);
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // setup the OLED
pinMode(buttonPin, INPUT); // setup button
}
void loop() {

}

Denne koden konfigurerer OLED, og ​​inkluderer alle bibliotekene du trenger for å kommunisere med den, sammen med det nye biblioteket for tilfeldige tall. Legg nå dette til hovedløkken:

if(digitalRead(buttonPin) == HIGH) {
delay(15);
if(digitalRead(buttonPin) == HIGH) {
display.fillScreen(BLACK); // erase the whole display
display.setTextColor(WHITE);
display.setTextSize(2);
display.setCursor(0, 0);
display.println(TrueRandom.random(1, 21)); // print random number
display.display(); // write to display
delay(100);
}
}

Dette er ganske grunnleggende for øyeblikket, men det er en fungerende D20. Når du trykker på knappen, vises et tilfeldig tall mellom en og 20 på skjermen:

Dette fungerer bra, men det er litt kjedelig. La oss gjøre det bedre. Lag to nye metoder, drawDie og sletteDie :

void drawDie() {
display.drawRect(32, 0, 64, 64, WHITE);
}

Disse vil tegne en dør i midten av skjermen. Du vil kanskje gjøre dette mer komplisert, kanskje ved å tegne en D20 eller en D12 og så videre, men det er enklere å tegne en grunnleggende sekssidig terning. Her er den grunnleggende bruken:

drawDie();

Deretter endrer du hovedsløyfen for å tegne det tilfeldige tallet, bare større og i midten. Endre tekststørrelsen og markøren til dette:

display.setTextColor(WHITE);
display.setCursor(57, 21);

Det ser mye bedre ut nå:

Det eneste problemet er med tall større enn ni:

Løsningen for dette er enkel. Alle tall mindre enn 10 vil ha markøren satt til en annen posisjon enn tallene 10 eller større. Erstatt denne linjen:

hvordan kopiere filer fra android til pc
display.setCursor(57, 21);

Med dette:

int roll = TrueRandom.random(1, 21); // store the random number
if (roll <10) {
// single character number
display.setCursor(57, 21);
}
else {
// dual character number
display.setCursor(47, 21);
}

Slik ser det ut nå:

Alt som er igjen nå er for bildene når du ruller et kritisk hit eller savner. Det er noen få trinn involvert, men det er en enkel nok prosess.

Finn et passende bilde du vil bruke (jo enklere jo bedre ettersom displayet bare er enfarget). Her er bildene jeg brukte:

Bildekreditt: publicdomainvectors.org

Ethvert bilde du ønsker å bruke må konverteres til en HEX -matrise. Dette er en representasjon av bildet i kodeform. Det er mange verktøy tilgjengelig for dette, og noen er skrevet spesielt for OLED -skjermer. Den enkleste måten er å bruke BildeC_Hex online verktøy. Her er innstillingene som trengs:

hvordan du slår av mobildata for bestemte apper i Android

Last opp bildet ditt, og angi kodeformatet til HEX: 0x . Sett Brukes til til Svart/hvit for alle tegnefunksjoner . La alle de andre alternativene stå som standard. Du kan endre størrelsen på bildet her hvis du trenger det. trykk Få C -streng og du bør se bildedataene vises:

Du trenger disse genererte dataene på et minutt. Lag to funksjoner kalt drawExplosion og drawSkull (eller et passende navn for din versjon). Her er koden:

void drawExplosion() {
// store image in EEPROM
static const unsigned char PROGMEM imExp[] = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x78,0x7f,0xff,0xc0,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xf0,0x00,0x00,0x00,0x3f,0xff,0xff,0xff,0xfb,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xc0,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0x00,0x01,0xff,0xff,0xff,0xff,0xff,0xff,0x80,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0x80,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0x80,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x1f,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x1f,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x01,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0xfe,0x00,0x00,0x07,0xff,0xff,0xf9,0xff,0xd8,0x00,0x00,0x00,0x3f,0xff,0xf0,0x0f,0x00,0x00,0x00,0x00,0x1f,0x1f,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0xff,0x00,0x00,0x00,0x00,0x00,0x0f,0xff,0xff,0xff,0x00,0x00,0x00,0x07,0xff,0xff,0xff,0xff,0xf0,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0xfc,0x00,0x00,0x01,0xbf,0xff,0xff,0xff,0x30,0x00,0x00,0x00,0x13,0xf7,0xb8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
display.drawBitmap(0, 0, imExp, 64, 62, 1); // draw mushroom cloud
}
void drawSkull() {
// store image in EEPROM
static const unsigned char PROGMEM imSku[] = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x78,0x00,0x07,0xf0,0x00,0x00,0x00,0x00,0xfc,0x00,0x07,0xf8,0x00,0x00,0x00,0x00,0xfe,0x00,0x07,0xf8,0x00,0x00,0x00,0x01,0xfe,0x00,0x07,0xfc,0x00,0x00,0x00,0x01,0xfe,0x00,0x07,0xfe,0x00,0x3f,0xc0,0x03,0xfe,0x00,0x01,0xff,0x81,0xff,0xfc,0x07,0xec,0x00,0x00,0x3f,0xc7,0xff,0xff,0x1f,0xc0,0x00,0x00,0x0f,0xcf,0xff,0xff,0xdf,0x00,0x00,0x00,0x07,0xbf,0xff,0xff,0xee,0x00,0x00,0x00,0x01,0x7f,0xff,0xff,0xf0,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xf8,0x00,0x00,0x00,0x01,0xff,0xff,0xff,0xf8,0x00,0x00,0x00,0x03,0xff,0xff,0xff,0xfc,0x00,0x00,0x00,0x07,0xff,0xff,0xff,0xfe,0x00,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x1e,0x3f,0xff,0x3f,0xc7,0x80,0x00,0x00,0x1e,0x0c,0x0f,0x00,0x07,0x80,0x00,0x00,0x1e,0x00,0x0f,0x00,0x0f,0x80,0x00,0x00,0x1e,0x00,0x19,0x80,0x0f,0x00,0x00,0x00,0x0f,0x00,0x19,0x80,0x0f,0x00,0x00,0x00,0x0d,0x00,0x30,0xc0,0x1f,0x00,0x00,0x00,0x05,0x80,0x70,0xc0,0x1e,0x00,0x00,0x00,0x05,0xf0,0xe0,0xe0,0x36,0x00,0x00,0x00,0x01,0xff,0xe0,0x7f,0xf0,0x00,0x00,0x00,0x03,0xff,0xc4,0x7f,0xf0,0x00,0x00,0x00,0x03,0xff,0xcc,0x7f,0xf0,0x00,0x00,0x00,0x03,0xff,0xcc,0x7f,0xf0,0x00,0x00,0x00,0x03,0xff,0x9e,0x7f,0xf0,0x00,0x00,0x00,0x00,0xff,0xfe,0x7f,0xc0,0x00,0x00,0x00,0x00,0x01,0xff,0xf8,0x1c,0x00,0x00,0x00,0x03,0xe0,0x3f,0x01,0xbf,0x00,0x00,0x00,0x07,0xa6,0x40,0x09,0x9f,0x80,0x00,0x00,0x1f,0x27,0x5a,0x39,0x9f,0xf8,0x00,0x01,0xff,0x27,0xdb,0x39,0x0f,0xfc,0x00,0x03,0xfe,0x31,0x7f,0x39,0x07,0xfc,0x00,0x03,0xfc,0x10,0x1a,0x02,0x03,0xf8,0x00,0x03,0xf8,0x10,0x00,0x02,0x01,0xf0,0x00,0x01,0xf8,0x10,0x00,0x02,0x01,0xe0,0x00,0x00,0x78,0x10,0x00,0x02,0x00,0xe0,0x00,0x00,0x70,0x30,0x00,0x02,0x00,0x00,0x00,0x00,0x30,0x20,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x64,0x00,0x1b,0x00,0x00,0x00,0x00,0x00,0x73,0x55,0x63,0x00,0x00,0x00,0x00,0x00,0xf9,0x55,0x4f,0x00,0x00,0x00,0x00,0x00,0x7f,0x14,0x1f,0x00,0x00,0x00,0x00,0x00,0x1f,0xe0,0xfe,0x00,0x00,0x00,0x00,0x00,0x0f,0xff,0xfc,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x03,0xff,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
display.drawBitmap(0, 0, imSku, 60, 64, 1); // draw skull cloud
}

Hvis du ønsker å bruke bildene jeg har brukt, så fortsett og kopier koden. Hvis du vil bruke dine egne bilder du genererte tidligere, kopier du byte -koden til imSku og imExp matriser etter behov.

Slik ser bildene ut på skjermen:

Den viktigste delen av denne koden er denne linjen:

static const unsigned char PROGMEM imSku[]

Dette forteller Arduino å lagre bildene dine i EEPROM ( hva er EEPROM? ) i stedet for RAM ( rask guide til RAM ). Grunnen til dette er enkel; Arduino har begrenset RAM, og hvis du bruker alt for å lagre bilder, vil det ikke være igjen noen rester for koden din å utføre

Endre hoveddelen hvis uttalelse for å vise denne nye grafikken når en eller 20 rulles. Legg merke til kodelinjene for å vise nummeret som er rullet sammen med bildene også:

if(roll == 20) {
drawExplosion();
display.setCursor(80, 21);
display.println('20');
}
else if(roll == 1) {
display.setCursor(24, 21);
display.println('1');
drawSkull();
}
else if (roll <10) {
// single character number
display.setCursor(57, 21);
display.println(roll); // write the roll
drawDie(); // draw the outline
}
else {
// dual character number
display.setCursor(47, 21);
display.println(roll); // write the roll
drawDie(); // draw the outline
}

Og slik ser de nye rundstykkene ut:

Det er alt for kodesiden (ta tak i koden fra GitHub hvis du hoppet over alt det). Du kan enkelt endre dette til å være en D12, D8, og så videre.

Sluttmontering

Nå som alt annet er ferdig, er det på tide å bokse alt opp. Skru på skjermen, og pass på at du ikke strammer boltene for mye. Dette er muligens den vanskeligste delen. Jeg sprakk en skjerm som gjorde det, så du vil kanskje bruke noen plastskiver. Jeg kuttet noen firkanter ut av Plasticard :

De små mutrene og boltene kan være vanskelige å koble til. Tips: Bruk et lite stykke Blu-Tack på enden av en skrutrekker for å sette muttere i utgangspunktet:

Skru på knappen, koble til batteriet og lukk lokket. Vær forsiktig så du ikke fanger noen ledninger, eller bunter dem for tett, noe som kan forårsake kortslutning. Avhengig av lengden på de bakre ledningene, må du kanskje beskytte utsatte forbindelser med litt isolasjon (en seriell boks fungerer bra):

Slik ser det ut inne:

Og her er det ferdige produktet:

Du bør nå være den stolte eieren av en elektronisk D20!

Hvilke endringer gjorde du? Endret du bildene? Gi oss beskjed i kommentarene, vi vil gjerne se hva du gjorde!

Dele Dele kvitring E -post En nybegynnerguide for animering av tale

Å animere tale kan være en utfordring. Hvis du er klar til å begynne å legge til dialog i prosjektet ditt, bryter vi ned prosessen for deg.

Les neste
Relaterte temaer
  • DIY
  • Arduino
  • Brettspill
  • Elektronikk
Om forfatteren Joe Coburn(136 artikler publisert)

Joe er utdannet i informatikk fra University of Lincoln, Storbritannia. Han er en profesjonell programvareutvikler, og når han ikke flyr droner eller skriver musikk, kan han ofte bli funnet å ta bilder eller produsere videoer.

Mer fra Joe Coburn

Abonner på vårt nyhetsbrev

Bli med i vårt nyhetsbrev for tekniske tips, anmeldelser, gratis ebøker og eksklusive tilbud!

Klikk her for å abonnere