Roll style with this DIY Electronic D20 Die

Roll style with this DIY Electronic D20 Die

Chcete něco trochu jedinečného pro vaši příští stolní hru na hrdiny? Co třeba elektronická D20 s vlastní grafikou pro kritické zásahy a chyby? Dnes vám ukážu, jak si vytvořit vlastní pomocí Arduina a několika jednoduchých částí.





Nebojte se, pokud jste nikdy předtím nepoužívali Arduino, máme průvodce pro začátek .





Plán stavby

Jedná se o jednoduchý projekt. Arduino bude řídit OLED displej a tlačítko bude házet kostkou. U kritických zásahů nebo kritických chybných hodů se zobrazí vlastní grafika. Kód můžete snadno upravit na D8, D10 nebo D12.





Co potřebuješ

  • 1 x Arduino
  • 1 x 0,96 ' I2C OLED displej
  • 1 x tlačítko
  • 1 x 10k? Odpor
  • 1 x prkénko
  • Různé připojovací vodiče
  • Úplný kód zde, pokud nechcete postupovat podle písemných pokynů.

To jsou základní části, které potřebujete k sestavení vlastního D20. Možná budete chtít nainstalovat do pouzdra (popsaného níže) a pájet obvod do trvalejšího stavu. Zde jsou další součásti, které k tomu budete potřebovat:

Tyto OLED displeje jsou velmi cool. Obvykle je lze zakoupit v bílé, modré, žluté nebo ve směsi těchto tří. Koupil jsem jeden v modré barvě, aby odpovídal mému případu. Ujistěte se, že dostanete I2C model místo SPI .



Bude vhodné téměř jakékoli Arduino. Vybral jsem Nano, protože jsou dostatečně malé, aby se vešly do pouzdra. Další informace o modelech Arduino najdete v našem nákupním průvodci.

Okruh

Zde je okruh, který potřebujete:





Připojit VCC a GND na OLED displeji k Arduinu +5V a přízemní . Připojit analogový 4 na Arduinu na pin označený SDA . Připojit analog 5 do SCL kolík. Tyto kolíky obsahují obvody potřebné k pohonu displeje pomocí sběrnice I2C. Přesné kolíky se budou lišit podle modelu, ale na Nano a Uno se používají A4 a A5. Zkontrolovat Dokumentace drátové knihovny pro váš model, pokud nepoužíváte Uno nebo Nano.

Připojte baterii k uzemnění a VÍNO kolík. To znamená napětí v a přijímá řadu různých stejnosměrných napětí - nejprve však zkontrolujte svůj konkrétní model a někdy se může mírně lišit.





Připojte tlačítko k digitální pin 2 . Všimněte si, jak 10k? odpor je připojen k zemi. Tohle je velmi důležité! Toto je známé jako stahovací odpor a brání Arduinu detekovat podvržená data nebo rušení při stisknutí tlačítka. Slouží také k ochraně desky. Pokud by tento odpor nebyl použit, +5V by šlo rovnou do země. Toto je známé jako a mrtvý a je to snadný způsob, jak zabít Arduino.

Pokud pájíte tento obvod, chraňte svá spojení smršťovací bužírkou:

Ujistěte se, že jej příliš nezahříváte, a to až poté, co jste si jisti, že obvod funguje. Můžete také chtít zkroutit kabely do párů. To je udržuje v pořádku a pomáhá je chránit před zbytečným stresem:

Tlačítko test

Nyní, když jste vytvořili obvod, nahrajte tento testovací kód (ujistěte se, že jste vybrali správnou desku a port z Nástroje> Deska a Nástroje> Port nabídky):

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);
}
}

Po nahrání ponechejte Arduino připojené přes USB a otevřete sériový monitor ( Vpravo nahoře> Sériový monitor ). Měli byste vidět slova Funguje to se zobrazí pokaždé, když stisknete tlačítko.

Pokud se nic nestane, jděte a zkontrolujte svůj obvod.

Nastavení OLED

K ovládání displeje je třeba nainstalovat dvě knihovny. Stáhněte si soubor Adafruit_SSD1306 a knihovny Adafruit-GFX [již není k dispozici] z Githubu a uložte je do složky knihovny. Pokud si nejste jisti, kde máte složky knihovny, přečtěte si můj retro herní návod, kde podrobněji konfiguruji stejný displej.

Restartujte své Arduino IDE a nahrajte testovací skicu z Soubor> Příklady Jídelní lístek. Vybrat Adafruit SSD1306 a pak ssd1306_128x64_i2c . Nahrajte tento kód (bude to chvíli trvat) a na displeji byste měli vidět spoustu tvarů a vzorů:

Pokud se nic nestane, zkontrolujte připojení. Pokud po kontrole stále nefunguje, budete muset upravit ukázkový kód.

jak převést knihu kindle na pdf

Změňte tento řádek (na začátku založit funkce):

display.begin(SSD1306_SWITCHCAPVCC, 0x3D);

K tomuto:

display.begin(SSD1306_SWITCHCAPVCC, 0x3C);

To sděluje knihovně konkrétní podrobnosti o displeji, který používáte. Nyní byste měli být připraveni pokračovat v sestavování.

Pouzdro

Pokud to stavíte na prkénku nebo si to nepřejete zabalit, můžete tento krok přeskočit.

Tuto krabici jsem navrhl a 3D vytiskl. Zapněte soubory Thingiverse . Pokud nemáte 3D tiskárnu - online služby, nedělejte si starosti 3D rozbočovače a Tvary poskytovat online tiskové služby.

Tuto krabici můžete snadno vyrobit ze dřeva nebo zakoupením plastu krabice projektu .

Víko je jednoduše navrženo tak, aby pasovalo a obsahuje několik výřezů pro hardware:

Kód

Nyní, když je vše připraveno, je čas na kód. Tady to bude fungovat Pseudo kód :

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

Aby to fungovalo správně, je třeba vygenerovat náhodné číslo - toto je hod kostkou. Arduino má generátor náhodných čísel náhodný , ale neměl by to používat. I když je to dost dobré pro základní náhodné úkoly, není to dost náhodné pro elektronickou kostku. Důvody jsou poněkud komplikované, ale pokud vás zajímá, můžete si přečíst více boallen.com .

Stáhněte si soubor TrueRandom knihovna od sirleech na Githubu. Přidejte to do složky knihovny a restartujte IDE.

Nyní vytvořte nový soubor a nastavte svůj počáteční kód (nebo jen uchopte hotový kód z 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() {

}

Tento kód konfiguruje OLED a zahrnuje všechny knihovny, které s ním potřebujete komunikovat, spolu s vaší novou knihovnou náhodných čísel. Nyní přidejte toto do hlavní smyčky:

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);
}
}

To je v tuto chvíli celkem základní, ale je to funkční D20. Po každém stisknutí tlačítka se na obrazovce zobrazí náhodné číslo od 1 do 20:

Funguje to dobře, ale je to trochu nudné. Pojďme to zlepšit. Vytvořte dvě nové metody, drawDie a vymazatDie :

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

Ty vytáhnou kostku uprostřed obrazovky. Možná to budete chtít zkomplikovat, třeba nakreslením D20 nebo D12 a tak dále, ale je jednodušší nakreslit základní šestistrannou matrici. Zde je základní použití:

drawDie();

Dále upravte svou hlavní smyčku tak, aby nakreslila náhodné číslo, pouze větší a uprostřed. Změňte velikost textu a kurzor na toto:

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

Teď to vypadá mnohem lépe:

Jediný problém je u čísel větších než devět:

Oprava je jednoduchá. Jakákoli čísla menší než 10 budou mít kurzor nastavena na jinou pozici než tato čísla 10 nebo větší. Nahradit tento řádek:

jak odstranit soubor v linuxu
display.setCursor(57, 21);

S tím:

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);
}

Nyní to vypadá takto:

Teď už zbývají jen obrázky, když hodíte nebo zasáhnete kritický zásah. Existuje několik kroků, ale je to dostatečně jednoduchý proces.

Najděte vhodný obrázek, který chcete použít (čím jednodušší, tím lepší, protože displej je pouze jednobarevný). Zde jsou obrázky, které jsem použil:

Obrázek kreditu: publicdomainvectors.org

Jakýkoli obrázek, který chcete použít, bude nutné převést na HEX pole. Toto je reprezentace obrázku ve formě kódu. K tomu je k dispozici mnoho nástrojů a některé jsou napsány speciálně pro displeje OLED. Nejjednodušší způsob je použít PicturetoC_Hex online nástroj. Zde jsou potřebná nastavení:

mohu obnovit smazané zprávy z Facebooku?

Nahrajte svůj obrázek a nastavte formát kódu na HEX: 0x . Soubor Používá na Funkce černého/bílého kreslení obrazu . Ponechte všechny ostatní možnosti jako výchozí. Zde můžete v případě potřeby změnit velikost obrázku. lis Získejte řetězec C. a měli byste vidět obrazová data:

Tato vygenerovaná data budete potřebovat za minutu. Vytvořte dvě funkce s názvem drawExplosion a drawSkull (nebo vhodný název pro vaši verzi). Zde je kód:

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
}

Pokud chcete použít obrázky, které jsem použil, pokračujte a zkopírujte kód. Pokud chcete použít vlastní obrázky, které jste vytvořili dříve, zkopírujte bajtový kód do souboru imSku a imExp pole podle potřeby.

Jak tyto obrázky vypadají na displeji:

Nejdůležitější částí tohoto kódu je tento řádek:

static const unsigned char PROGMEM imSku[]

To říká Arduinu, aby ukládal vaše obrázky do EEPROM ( co je EEPROM? ) namísto RAM ( rychlý průvodce RAM ). Důvod je prostý; Arduino má omezenou paměť RAM a jeho využití k ukládání obrázků nemusí zanechat žádné zbývající pro spuštění vašeho kódu

Upravte své hlavní -li prohlášení k zobrazení těchto nových grafik, když padne jedna nebo 20. Všimněte si řádků kódu a zobrazte také číslo, které se valí vedle obrázků:

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
}

A takto vypadají tyto nové role:

To je pro kódovou stránku vše (jděte chytit kód z GitHubu, pokud jste to všechno přeskočili). Můžete to snadno upravit tak, aby to bylo D12, D8 atd.

Konečné shromáždění

Nyní, když je vše ostatní hotové, je čas vše zabalit. Přišroubujte displej a dávejte pozor, abyste šrouby neutáhli příliš. To je možná nejtěžší část. Rozbil jsem tím displej, takže možná budete chtít použít nějaké plastové podložky. Vystřihl jsem několik čtverečků Plasticard :

Připojení malých matic a šroubů může být obtížné. Spropitné: Pomocí malého kousku Blu-Tacku na konci šroubováku nejprve usaďte matice:

Zašroubujte tlačítko, připojte baterii a zavřete víko. Dávejte pozor, abyste nezachytili žádné dráty nebo je nesvazovali příliš pevně, což by mohlo způsobit zkrat. V závislosti na délce vašich koncových vodičů budete možná muset chránit nechráněná připojení nějakou izolací (sériový box funguje dobře):

Jak to vypadá uvnitř:

A tady je hotový výrobek:

Nyní byste měli být hrdým majitelem elektronického D20!

Jaké úpravy jste provedli? Změnili jste obrázky? Dejte nám vědět v komentářích, rádi bychom viděli, co jste udělali!

Podíl Podíl tweet E-mailem Průvodce pro začátečníky k animované řeči

Animovaná řeč může být výzva. Pokud jste připraveni začít s přidáváním dialogu do projektu, proces za vás rozdělíme.

Číst dále
Související témata
  • DIY
  • Arduino
  • Desková hra
  • Elektronika
O autorovi Joe Coburn(136 publikovaných článků)

Joe je absolventem informatiky na University of Lincoln, UK. Je profesionálním vývojářem softwaru, a když zrovna neletí drony nebo nepíše hudbu, často ho lze zastihnout při fotografování nebo produkci videí.

Více od Joe Coburn

Přihlaste se k odběru našeho zpravodaje

Připojte se k našemu zpravodaji a získejte technické tipy, recenze, bezplatné elektronické knihy a exkluzivní nabídky!

Kliknutím sem se přihlásíte k odběru
Kategorie Diy