Zahrajte si štýlovo s touto DIY elektronickou matricou D20

Zahrajte si štýlovo s touto DIY elektronickou matricou D20

Chcete pre svoju ďalšiu stolovú hru na hrdinov niečo trochu jedinečné? Čo hovoríte na elektronickú D20 s vlastnou grafikou pre kritické zásahy a omyly? Dnes vám ukážem, ako si postaviť vlastné pomocou Arduina a niekoľkých jednoduchých dielov.





Nebojte sa, ak ste nikdy predtým nepoužívali Arduino, máme sprievodca na začiatku .





Plán výstavby

Jedná sa o jednoduchý projekt. Arduino bude poháňať OLED displej a tlačidlo bude otáčať kockou. Zobrazí sa vlastná grafika pre kritické zásahy alebo kritické chyby. Kód môžete ľahko upraviť na D8, D10 alebo D12.





Čo potrebuješ

  • 1 x Arduino
  • 1 x 0,96 palca I2C OLED displej
  • 1 x tlačidlo
  • 1 x 10 000? Odpor
  • 1 x Breadboard
  • Rôzne zapojovacie vodiče
  • Úplný kód nájdete tu, ak nechcete postupovať podľa písomných pokynov.

To sú základné časti, ktoré potrebujete na zostavenie vlastného D20. Môžete ho nainštalovať do puzdra (popísané nižšie) a spájkovať obvod do trvalejšieho stavu. Tu sú ďalšie časti, ktoré budete na to potrebovať:

Tieto OLED displeje sú veľmi cool. Obvykle sa dajú kúpiť v bielej, modrej, žltej alebo v zmesi týchto troch. Kúpil som jeden v modrej farbe, aby zodpovedal môjmu prípadu. Uistite sa, že dostanete I2C model namiesto SPI .



Bude vhodné takmer akékoľvek Arduino. Vybral som Nano, pretože sú dostatočne malé, aby sa zmestili do puzdra. V našom sprievodcovi nákupom nájdete ďalšie informácie o modeloch Arduino.

Okruh

Tu je okruh, ktorý potrebujete:





Pripojte sa VCC a GND na OLED displeji do Arduina +5V a zem . Pripojte sa analóg 4 na Arduine na pin označený SDA . Pripojte sa analóg 5 do SCL špendlík. Tieto kolíky obsahujú obvody potrebné na pohon displeja pomocou zbernice I2C. Presné kolíky sa budú líšiť podľa modelu, ale na Nano a Uno sa používajú A4 a A5. Skontrolovať Dokumentácia z drôtovej knižnice pre váš model, ak nepoužívate Uno alebo Nano.

Pripojte batériu k uzemneniu a VÍNO špendlík. To znamená napätie v a akceptuje množstvo rôznych jednosmerných napätí - najskôr však skontrolujte svoj konkrétny model a ten sa niekedy môže mierne líšiť.





Pripojte tlačidlo k digitálny pin 2 . Všimnite si, ako 10 000? odpor je spojený so zemou. Toto je veľmi dôležité! Toto je známe ako sťahovací odpor a bráni Arduinu v detekcii falošných údajov alebo rušenia pri stlačení tlačidla. Slúži tiež na ochranu dosky. Ak by sa tento odpor nepoužíval, +5V by išlo rovno do zeme. Toto je známe ako a mŕtvy a je to ľahký spôsob, ako zabiť Arduino.

Ak spájkujete tento obvod, chráňte svoje spojenia teplom zmrštiteľnými hadičkami:

Uistite sa, že ho príliš nezahrievate a urobte to iba vtedy, ak ste si istí, že obvod funguje. Môžete tiež chcieť skrútiť káble do párov. To ich udržiava v poriadku a chráni ich pred neprimeraným stresom:

Test gombíkov

Teraz, keď ste vytvorili obvod, nahrajte tento testovací kód (uistite sa, že ste vybrali správnu dosku a port z Nástroje> Doska a Nástroje> Port ponuky):

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 nahraní ponechajte Arduino pripojené cez USB a otvorte sériový monitor ( Vpravo hore> Sériový monitor ). Mali by ste vidieť slová Funguje to sa zobrazí pri každom stlačení tlačidla.

Ak sa nič nestane, choďte a dvakrát skontrolujte svoj obvod.

Nastavenie OLED

Na ovládanie displeja musíte nainštalovať dve knižnice. Stiahnite si súbor Adafruit_SSD1306 a knižnice Adafruit-GFX [už nie je k dispozícii] z Githubu a uložte ich do priečinka knižnice. Ak si nie ste istí, kde sa priečinky knižnice nachádzate, prečítajte si môj návod na retro hry, kde podrobnejšie nakonfigurujem ten istý displej.

Reštartujte Arduino IDE a nahrajte testovací náčrt z Súbor> Príklady Ponuka. Vyberte Adafruit SSD1306 a potom ssd1306_128x64_i2c . Odošlite tento kód (bude to chvíľu trvať) a na displeji by ste mali vidieť veľa tvarov a vzorov:

Ak sa nič nestane, znova skontrolujte svoje pripojenia. Ak to po kontrole stále nefunguje, budete musieť upraviť ukážkový kód.

ako používať portrét na iphone 7

Zmeňte tento riadok (na začiatku nastaviť funkcia):

display.begin(SSD1306_SWITCHCAPVCC, 0x3D);

Do tohto:

display.begin(SSD1306_SWITCHCAPVCC, 0x3C);

To hovorí knižnici konkrétne podrobnosti o displeji, ktorý používate. Teraz by ste mali byť pripravení pokračovať v zostavovaní.

Púzdro

Ak to staviate na doske alebo si to neželáte, môžete tento krok preskočiť.

Túto skrinku som navrhol a 3D vytlačil. Zapnite súbory Thingiverse . Ak nemáte 3D tlačiareň - online služby, nie je dôvod sa znepokojovať 3D rozbočovače a Tvarovky poskytovať online tlačové služby.

Túto škatuľu môžete ľahko vyrobiť z dreva alebo kúpou plastu krabica projektu .

Veko má jednoduchý tvar, ktorý dobre prilieha, a obsahuje niekoľko výrezov pre hardvér:

Kód

Teraz, keď je všetko pripravené, je čas na kód. Takto to bude fungovať v Pseudokó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ávne, je potrebné vygenerovať náhodné číslo - toto je hod kockou. Arduino má generátor náhodných čísel s názvom náhodný , ale nemali by ste to používať. Aj keď je to dosť dobré na základné náhodné úlohy, na elektronickú matricu to nie je dosť náhodné. Dôvody sú trochu komplikované, ale v prípade záujmu si môžete prečítať viac boallen.com .

Stiahnite si súbor TrueRandom knižnica od sirleech na Githube. Pridajte to do priečinka knižnice a reštartujte IDE.

Teraz vytvorte nový súbor a nastavte svoj počiatočný kód (alebo jednoducho získajte 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 obsahuje všetky knižnice, ktoré s ním potrebujete komunikovať, spolu s novou knižnicou náhodných čísel. Teraz pridajte toto do hlavnej sluč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);
}
}

V tejto chvíli je to celkom základné, ale je to funkčná D20. Po každom stlačení tlačidla sa na obrazovke zobrazí náhodné číslo od 1 do 20:

Funguje to dobre, ale je to trochu nudné. Poďme to vylepšiť. Vytvorte dve nové metódy, drawDie a vymazaťDie :

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

Tie v strede obrazovky vytiahnu kocku. Možno to budete chcieť skomplikovať, napríklad nakreslením D20 alebo D12 a tak ďalej, ale je jednoduchšie nakresliť základnú šesťstrannú matricu. Tu je základné použitie:

drawDie();

Ďalej upravte svoju hlavnú slučku tak, aby nakreslila náhodné číslo, iba väčšie a uprostred. Zmeňte veľkosť textu a kurzor na toto:

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

Teraz to vyzerá oveľa lepšie:

Jediný problém je s číslami väčšími ako deväť:

Riešenie tohto problému je jednoduché. Akékoľvek čísla menšie ako 10 budú mať kurzor nastavený na inú pozíciu ako čísla 10 alebo väčšie. Nahradiť tento riadok:

ako resetovať safari na mac
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);
}

Takto to vyzerá teraz:

Teraz zostanú len obrázky, keď hodíte alebo miniete kritický zásah. Zahŕňa niekoľko krokov, ale je to dostatočne jednoduchý proces.

Nájdite vhodný obrázok, ktorý chcete použiť (čím jednoduchšie, tým lepšie, pretože displej je iba jednofarebný). Tu sú obrázky, ktoré som použil:

Kredit na obrázok: publicdomainvectors.org

Akýkoľvek obrázok, ktorý chcete použiť, bude potrebné previesť na pole HEX. Toto je reprezentácia obrázku v kódovej forme. Na to je k dispozícii mnoho nástrojov a niektoré sú navrhnuté špeciálne pre OLED displeje. Najľahšie je použiť PicturetoC_Hex online nástroj. Tu sú potrebné nastavenia:

vytvorenie zavádzacieho systému Windows 7 usb

Odovzdajte svoj obrázok a nastavte formát kódu na HEX: 0x . Nastaviť Používa do Čiernobiela funkcia kreslenia obrázka . Nechajte všetky ostatné možnosti ako predvolené. V prípade potreby tu môžete zmeniť veľkosť obrázka. Stlačte Získajte reťazec C. a mali by ste vidieť, ako sa zobrazujú údaje o obrázku:

Tieto vygenerované údaje budete potrebovať za minútu. Vytvorte dve funkcie tzv drawExplosion a drawSkull (alebo vhodný názov pre vašu verziu). Tu 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
}

Ak chcete použiť obrázky, ktoré som použil, pokračujte a skopírujte kód. Ak chcete použiť svoje vlastné obrázky, ktoré ste vytvorili predtým, skopírujte bajtový kód do súboru imSku a imExp polia podľa potreby.

Ako tieto obrázky vyzerajú na displeji:

Najdôležitejšou časťou tohto kódu je tento riadok:

static const unsigned char PROGMEM imSku[]

Arduinu to hovorí, aby ukladal vaše obrázky do EEPROM ( čo je EEPROM? ) namiesto pamäte RAM ( rýchly sprievodca RAM ). Dôvod je jednoduchý; Arduino má obmedzenú pamäť RAM a jeho úplné využitie na ukladanie obrázkov nemusí zanechať žiadne ďalšie na spustenie kódu

Upravte svoje hlavné keby príkaz na zobrazenie týchto nových grafík, keď padne jedna alebo 20. Všimnite si riadky kódu, aby ste uviedli aj číslo valcované vedľa obrázkov:

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 vyzerajú tieto nové kotúče:

To je z kódovej strany všetko (choďte a chyťte kód z GitHubu, ak ste to všetko preskočili). Môžete to ľahko upraviť tak, aby to bolo D12, D8 atď.

Konečné zhromaždenie

Teraz, keď je všetko ostatné hotové, je načase všetko zbaliť. Zaskrutkujte displej a dávajte pozor, aby ste skrutky neutiahli príliš. Toto je možno najťažšia časť. Praskol som tým displej, takže možno budete chcieť použiť nejaké plastové podložky. Vystrihol som niekoľko štvorcov Plasticard :

Pripojenie malých matíc a skrutiek je náročné. Tip: Na začiatok skrutiek použite malý kúsok Blu-Tack na konci skrutkovača:

Naskrutkujte tlačidlo, pripojte batériu a zatvorte veko. Dávajte pozor, aby ste nezachytili žiadne káble, ani ich príliš nespojte, aby nedošlo k skratu. V závislosti od dĺžky vašich koncových káblov budete možno musieť chrániť odhalené spojenia určitou izoláciou (sériový box funguje dobre):

Takto to vyzerá vo vnútri:

A tu je hotový výrobok:

Teraz by ste mali byť hrdým majiteľom elektronického fotoaparátu D20!

Aké úpravy ste urobili? Zmenili ste obrázky? Dajte nám vedieť v komentároch, radi by sme videli, čo ste urobili!

zdieľam zdieľam Tweet E -mail Príručka pre začiatočníkov k animovanej reči

Animovaná reč môže byť výzvou. Ak ste pripravení začať pridávať dialógy do svojho projektu, proces za vás rozložíme.

Čítajte ďalej
Súvisiace témy
  • DIY
  • Arduino
  • Stolná hra
  • Elektronika
O autorovi Joe Coburn(136 publikovaných článkov)

Joe je absolventom počítačových vied na University of Lincoln, UK. Je profesionálnym softvérovým vývojárom a keď nelieta s dronmi alebo nepíše hudbu, často ho zastihne fotografovanie alebo vytváranie videí.

Viac od Joe Coburn

prihlásiť sa ku odberu noviniek

Pripojte sa k nášmu bulletinu a získajte technické tipy, recenzie, bezplatné elektronické knihy a exkluzívne ponuky!

Kliknutím sem sa prihlásite na odber
Kategórie Diy