Rol in stijl met deze doe-het-zelf elektronische D20-matrijs

Rol in stijl met deze doe-het-zelf elektronische D20-matrijs

Wil je iets unieks voor je volgende rollenspel op tafel? Wat dacht je van een elektronische D20 met aangepaste graphics voor kritieke hits en missers? Vandaag laat ik je zien hoe je je eigen kunt bouwen met een Arduino en een paar eenvoudige onderdelen.





Maak je geen zorgen als je nog nooit een Arduino hebt gebruikt, we hebben een aan de slag gids .





Bouwplan

Dit is een eenvoudig project. Een Arduino stuurt een OLED-display aan en een knop laat de dobbelsteen rollen. Aangepaste afbeeldingen worden weergegeven voor kritieke treffers of kritieke missers. U kunt de code eenvoudig wijzigen in een D8, D10 of D12.





Wat je nodig hebt

  • 1 x Arduino
  • 1x 0,96 ' I2C OLED-display
  • 1 x drukknop
  • 1x 10k? Weerstand
  • 1 x Breadboard
  • Diverse aansluitdraden
  • Volledige code hier, als u de schriftelijke instructies niet helemaal wilt volgen.

Dat zijn de kernonderdelen die je nodig hebt om je eigen D20 te bouwen. Misschien wilt u het in een behuizing installeren (hieronder besproken) en het circuit in een meer permanente staat solderen. Dit zijn de extra onderdelen die je daarvoor nodig hebt:

  • 4 x M2 x 10 mm (0,4 inch) bouten
  • 4 x M2 moeren
  • 4 x 7 mm (0,28 inch) ringen
  • 9V batterij snap (of geschikt alternatief)
  • Diverse krimpkousen

Deze OLED-schermen zijn erg gaaf. Ze kunnen meestal worden gekocht in wit, blauw, geel of een combinatie van de drie. Ik heb er een in het blauw gekocht, passend bij mijn hoesje. Zorg dat je een I2C model in plaats van SPI .



Bijna elke Arduino zal geschikt zijn. Ik heb gekozen voor een Nano, omdat ze klein genoeg zijn om in de behuizing te passen. Bekijk onze koopgids voor meer informatie over Arduino-modellen.

Het circuit

Dit is het circuit dat je nodig hebt:





Aansluiten VCC en GND op het OLED-display naar de Arduino +5V en grond . Aansluiten analoog 4 op de Arduino naar de pin met het label SDA . Aansluiten analoog 5 naar de SCL pin. Deze pinnen bevatten de schakelingen die nodig zijn om het display aan te sturen met behulp van de I2C-bus. De exacte pinnen verschillen per model, maar A4 en A5 worden gebruikt op de Nano en Uno. Controleer de Documentatie over de draadbibliotheek voor uw model als u geen Uno of Nano gebruikt.

Sluit de batterij aan op aarde en de WIJN pin. Dit staat voor spanning in en accepteert een verscheidenheid aan verschillende gelijkspanningen - maar controleer eerst uw specifieke model, en het kan soms enigszins variëren.





Verbind de knop met digitale pin 2 . Merk op hoe de 10k? weerstand is verbonden met aarde. Dit is erg belangrijk! Dit staat bekend als een pull-down-weerstand en het voorkomt dat de Arduino valse gegevens of interferentie detecteert als een knop wordt ingedrukt. Het dient ook om het bord te beschermen. Als deze weerstand niet werd gebruikt, zou +5V rechtstreeks de grond in gaan. Dit staat bekend als a dood kort en is een gemakkelijke manier om een ​​Arduino te doden.

Als u deze schakeling soldeert, bescherm dan uw verbindingen met krimpkous:

Zorg ervoor dat je hem niet te veel opwarmt en doe dit pas als je zeker weet dat de schakeling werkt. Misschien wilt u uw kabels ook in paren draaien. Dit houdt ze netjes en helpt ze te beschermen tegen overmatige stress:

Knoptest

Nu je het circuit hebt gebouwd, upload je deze testcode (zorg ervoor dat je het juiste bord en de juiste poort selecteert uit de Gereedschappen > Bord en Hulpmiddelen > Poort menu's):

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

Houd de Arduino na het uploaden aangesloten via USB en open de seriële monitor ( Rechtsboven > Seriële Monitor ). Je zou de woorden moeten zien Het werkt verschijnen elke keer dat u op de knop drukt.

Als er niets gebeurt, ga dan en controleer uw circuit nogmaals.

OLED-configuratie

U moet twee bibliotheken installeren om het beeldscherm aan te sturen. Download de Adafruit_SSD1306 en Adafruit-GFX [niet langer beschikbaar] bibliotheken van Github, en sla ze op in uw bibliotheekmap. Als je niet zeker weet waar je bibliotheekmappen zijn, lees dan mijn retro gaming-tutorial, waar ik hetzelfde scherm in meer detail configureer.

Start uw Arduino IDE opnieuw en upload een testschets van de Bestand > Voorbeelden menu. Selecteer Adafruit SSD1306 en dan ssd1306_128x64_i2c . Upload deze code (het duurt even) en je zou veel vormen en patronen op het scherm moeten zien:

Als er niets gebeurt, controleer dan nogmaals uw verbindingen. Als het na controle nog steeds niet werkt, moet u de voorbeeldcode wijzigen.

gratis films online kijken zonder te registreren

Wijzig deze regel (aan het begin van de opstelling functie):

display.begin(SSD1306_SWITCHCAPVCC, 0x3D);

Hierop:

display.begin(SSD1306_SWITCHCAPVCC, 0x3C);

Dit vertelt de bibliotheek specifieke details over het beeldscherm dat u gebruikt. U zou nu helemaal klaar moeten zijn om door te gaan met de build.

De zaak

Als u dit op een breadboard bouwt, of het niet wilt inpakken, kunt u deze stap overslaan.

Deze box heb ik ontworpen en 3D geprint. Zet de bestanden aan Thingiverse . Maak je geen zorgen als je geen 3D-printer hebt -- online diensten 3D-hubs en Shapeways online afdrukservices aanbieden.

Je zou deze doos gemakkelijk van hout kunnen maken, of door een plastic te kopen projectdoos .

Het deksel is een eenvoudig push-fit ontwerp en bevat een paar uitsparingen voor de hardware:

De code

Nu alles klaar is, is het tijd voor de code. Zo werkt het in Pseudocode :

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

Om dit goed te laten werken, moet een willekeurig getal worden gegenereerd - dit is de worp van de dobbelsteen. Arduino heeft een generator voor willekeurige getallen genaamd willekeurig , maar zou het niet moeten gebruiken. Hoewel het goed genoeg is voor willekeurige basistaken, is het gewoon niet willekeurig genoeg voor een elektronische dobbelsteen. De redenen waarom zijn enigszins ingewikkeld, maar u kunt meer lezen als u geïnteresseerd bent in: boallen.com .

Download de TrueRandom bibliotheek door sirleech op Github. Voeg dit toe aan uw bibliotheekmap en start de IDE opnieuw.

Maak nu een nieuw bestand en stel je eerste code in (of pak gewoon de voltooide code van 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() {

}

Deze code configureert de OLED en bevat alle bibliotheken die u nodig hebt om ermee te communiceren, samen met uw nieuwe bibliotheek met willekeurige getallen. Voeg dit nu toe aan de hoofdlus:

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

Dit is op dit moment vrij eenvoudig, maar het is een werkende D20. Telkens wanneer op de knop wordt gedrukt, wordt een willekeurig getal tussen één en 20 op het scherm weergegeven:

Dit werkt goed, maar het is een beetje saai. Laten we het beter maken. Maak twee nieuwe methoden, tekenenDie en wissenDie :

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

Deze zullen een dobbelsteen in het midden van het scherm tekenen. Misschien wil je dit ingewikkelder maken, misschien door een D20 of een D12 enzovoort te tekenen, maar het is eenvoudiger om een ​​eenvoudige zeszijdige dobbelsteen te tekenen. Hier is het basisgebruik:

drawDie();

Pas vervolgens je hoofdlus aan om het willekeurige getal te tekenen, alleen groter en in het midden. Verander de tekstgrootte en cursor in dit:

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

Het ziet er nu een stuk beter uit:

Het enige probleem is met getallen groter dan negen:

De oplossing hiervoor is eenvoudig. Bij alle getallen onder de 10 wordt de cursor op een andere positie gezet dan bij de getallen 10 of hoger. Vervang deze regel:

hoe i/o-apparaatfout op te lossen
display.setCursor(57, 21);

Hiermee:

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

Zo ziet dat er nu uit:

Het enige dat nu nog over is, zijn de afbeeldingen wanneer je een kritieke hit of miss gooit. Er zijn een paar stappen bij betrokken, maar het is een eenvoudig genoeg proces.

Zoek een geschikte afbeelding die u wilt gebruiken (hoe eenvoudiger, hoe beter, aangezien het scherm alleen in één kleur is). Dit zijn de afbeeldingen die ik heb gebruikt:

Afbeelding tegoed: publicdomainvectors.org

Elke afbeelding die u wilt gebruiken, moet worden geconverteerd naar een HEX-array. Dit is een weergave van de afbeelding in codevorm. Er zijn veel tools beschikbaar om dit te doen, en sommige zijn speciaal geschreven voor OLED-schermen. De gemakkelijkste manier is om de AfbeeldingnaarC_Hex online hulpmiddel. Dit zijn de benodigde instellingen:

klok watchdog time-out windows 10 installeren

Upload uw afbeelding en stel het codeformaat in op HEX:0x . Set Gebruikt voor tot Zwart/Wit voor alle functie voor tekenen van afbeeldingen . Laat alle andere opties als standaard. Indien nodig kunt u de afbeelding hier verkleinen. druk op C-snaar ophalen en je zou de afbeeldingsgegevens moeten zien verschijnen:

U hebt deze gegenereerde gegevens zo nodig. Maak twee functies genaamd tekenenExplosie en tekenenSchedel (of een geschikte naam voor uw versie). Hier is de code:

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
}

Als je de afbeeldingen wilt gebruiken die ik heb gebruikt, ga je gang en kopieer de code. Als u uw eigen afbeeldingen wilt gebruiken die u eerder hebt gegenereerd, kopieert u de bytecode naar de imSku en imExp arrays zoals vereist.

Zo zien die afbeeldingen eruit op het scherm:

Het belangrijkste deel van die code is deze regel:

static const unsigned char PROGMEM imSku[]

Dit vertelt de Arduino om uw afbeeldingen op te slaan in de EEPROM ( wat is EEPROM? ) in plaats van zijn RAM ( beknopte handleiding voor RAM ). De reden hiervoor is simpel; de Arduino heeft een beperkt RAM-geheugen en als je het allemaal gebruikt om afbeeldingen op te slaan, blijft er mogelijk geen rest over om je code uit te voeren

Wijzig je hoofd indien statement om deze nieuwe afbeeldingen te tonen wanneer een één of 20 wordt gegooid. Let op de coderegels om het nummer ook naast de afbeeldingen weer te geven:

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
}

En zo zien die nieuwe rollen eruit:

Dat is alles voor de codekant (pak de code van GitHub als je dat allemaal hebt overgeslagen). U kunt dit eenvoudig wijzigen in een D12, D8, enzovoort.

Eindmontage

Nu al het andere klaar is, is het tijd om alles op te ruimen. Zet het display vast met bouten en zorg ervoor dat u de bouten niet te vast aandraait. Dit is misschien wel het moeilijkste deel. Ik heb daarbij een scherm gekraakt, dus misschien wilt u wat plastic sluitringen gebruiken. Ik heb er wat vierkantjes uit gesneden Plasticard :

De kleine moeren en bouten kunnen lastig aan te sluiten zijn. Tip: Gebruik een klein stukje Blu-Tack op het uiteinde van een schroevendraaier om de moeren eerst vast te zetten:

Draai de knop erop, sluit de batterij aan en sluit het deksel. Pas op dat u geen draden klemt of te strak bundelt, waardoor er mogelijk kortsluiting ontstaat. Afhankelijk van de lengte van uw sleepkabels, moet u mogelijk blootgestelde verbindingen beschermen met wat isolatie (een seriële doos werkt goed):

Zo ziet het er van binnen uit:

En hier is het eindproduct:

U zou nu de trotse eigenaar moeten zijn van een elektronische D20!

Welke aanpassingen heb je gedaan? Heb je de afbeeldingen veranderd? Laat het ons weten in de comments, we zijn heel benieuwd wat je hebt gedaan!

Deel Deel Tweeten E-mail Een beginnershandleiding voor het animeren van spraak

Het animeren van spraak kan een uitdaging zijn. Als u klaar bent om dialoog aan uw project toe te voegen, zullen we het proces voor u opsplitsen.

Lees volgende
Gerelateerde onderwerpen
  • doe-het-zelf
  • Arduino
  • Bordspel
  • Elektronica
Over de auteur Joe Coburn(136 gepubliceerde artikelen)

Joe is afgestudeerd in computerwetenschappen aan de Universiteit van Lincoln, VK. Hij is een professionele softwareontwikkelaar en als hij niet met drones vliegt of muziek schrijft, is hij vaak te vinden om foto's te maken of video's te maken.

Meer van Joe Coburn

Abonneer op onze nieuwsbrief

Word lid van onze nieuwsbrief voor technische tips, recensies, gratis e-boeken en exclusieve deals!

Klik hier om je te abonneren