Leer Python en elektronica met Minecraft Pi Edition

Leer Python en elektronica met Minecraft Pi Edition

Heb je altijd al willen leren coderen, maar weet je niet waar je moet beginnen? Leer hoe je Minecraft op de Raspberry Pi bestuurt met Python en wat eenvoudige elektronica. Hier is het eindresultaat:





Je hebt een Pi 2 of nieuwer nodig voor dit project, en hoewel je de meeste van deze taken via de opdrachtregel via Secure Shell (SSH) zou kunnen voltooien, zal deze tutorial zich richten op het rechtstreeks coderen op de Pi.





Nieuw bij Minecraft? Maak je geen zorgen - hier is onze Minecraft-handleiding voor beginners .





Inleiding tot Minecraft Pi

Minecraft voor de Raspberry Pi is ontwikkeld om te leren en te knutselen (en het is gratis). Het wordt geleverd met een Application Programming Interface (API) waarmee code gemakkelijk met Minecraft kan praten. Het is geweldig om te leren coderen in Python en om aan de slag te gaan met elektronica.

Wat is Python?

Python is een programmeertaal. Het is geïnterpreteerd , wat betekent dat wanneer u een Python-bestand of -programma uitvoert, de computer eerst een klein beetje werk aan het bestand moet doen. De nadelen zijn dat het als traag kan worden beschouwd in vergelijking met gecompileerde talen [Broken URL Removed].



De voordelen van geïnterpreteerde talen zijn de snelheid van coderen en hun vriendelijkheid. U hoeft het niet aan de computer te vertellen wat gegevens die u wilt opslaan, alleen dat u iets wilt opslaan en de computer zal uitzoeken wat hij moet doen. Er zijn natuurlijk uitzonderingen en dit is een enigszins vereenvoudigde weergave, maar programmeren moet leuk zijn! Als je begint te graven in de complexe technische details, kan het een beetje omslachtig worden.

Python is hoofdlettergevoelig. Dit is belangrijk om te weten, omdat Python geen objecten herkent zelfs als ze correct zijn gespeld als de zaak niet klopt. 'Dosomething()' zal niet werken als de methode daadwerkelijk 'DoSomething()' heet. Python gebruikt ook inspringen . Het kan andere programmeertalen niet schelen hoeveel inspringingen uw code heeft, terwijl Python doet zorg. Inspringingen worden gebruikt om Python te vertellen waar de code thuishoort. Andere talen kunnen 'Curly Braces' ({}) gebruiken om code te groeperen -- Python gebruikt deze niet. Python gebruikt een hekje (#) voor opmerkingen en opmerkingen worden gebruikt om andere ontwikkelaars of mensen die naar de code kijken te vertellen wat een bepaald onderdeel doet, of waarom het nodig is. Python negeert alles na een hash.





Ten slotte zijn er twee hoofdversies van Python: Python 2.7.x en Python 3.x. Er zijn enkele verschillen tussen de twee ( wat zijn de verschillen? ). In deze zelfstudie wordt Python 3 gebruikt.

Initiële setup

Het verstrekken van uw Pi is al Raspbian instellen en uitvoeren , er is niet veel initiële installatie nodig.





Terminal openen ( Menu > Accessoires > Terminal ) en voer deze opdracht uit. Het is altijd een goede gewoonte om de repositorylijst up-to-date te houden, en hierdoor wordt de nieuwste lijst met programma's gedownload (de programma's zelf worden niet gedownload, dit helpt de Pi te weten welke programma's heten en waar ze ze kunnen vinden).

sudo apt-get update

Update nu de Pi (dit kan even duren):

sudo apt-get upgrade

Python en Minecraft Pi zijn al geïnstalleerd, maar als Minecraft Pi om welke reden dan ook niet is geïnstalleerd, is het eenvoudig te installeren:

sudo apt-get install minecraft-pi

Navigeer naar documenten en maak een nieuwe map aan met de naam 'Minecraft':

cd Documents/
mkdir Minecraft

U kunt de inhoud van deze nieuwe map bekijken:

ls

Hier is een tip: als u begint te typen en op de TAB-toets drukt, zal de opdrachtregel proberen de instructie automatisch voor u aan te vullen.

U kunt het pad naar de huidige map onderzoeken met pwd, wat staat voor Print Working Directory:

pwd

Start Minecraft door naar . te gaan Menu > Games > Minecraft Pi . Je hebt dit hard nodig, maar kom er later op terug.

Open Python 3 vanuit Menu > Programmeren > Python 3 (IDLE) . Dit programma biedt u een manier om Python-commando's uit te voeren en programma's te schrijven.

Nu zou je hier je Python-commando's kunnen typen, maar dat is niet erg praktisch. Ga naar Bestand > Nieuw bestand en dan Bestand > Opslaan en sla deze op in de map die je eerder hebt aangemaakt. ( Documenten > Minecraft ). Laten we het noemen ' hallo_world.py '. U hoeft de .py-extensie niet te gebruiken, deze wordt automatisch toegevoegd, maar het is een goede gewoonte.

Als u terugschakelt naar de terminal en naar de Minecraft-map navigeert, ziet u het bestand dat u zojuist hebt gemaakt:

cd Minecraft/
ls

U kunt dit bestand als volgt uitvoeren:

python hello_world

Merk op hoe 'python' allemaal kleine letters is. Dit moet vóór de bestandsnaam staan, omdat het de Pi vertelt dat het volgende bestand Python is, dus het moet als zodanig worden uitgevoerd.

Schakel terug naar de Python-editor en typ:

print 'Hello, World!'

Sla dit bestand op en voer het opnieuw uit - u zou nu 'Hallo, wereld!' moeten zien. verschijnen in de opdrachtregel -- netjes! Het print-commando vertelt Python eenvoudig om de volgende tekst tussen dubbele aanhalingstekens uit te voeren. Dit is goed, maar niet erg handig voor Minecraft, laten we het koppelen:

from mcpi.minecraft import Minecraft
mc = Minecraft.create()
mc.postToChat('Hello, World!')

Als u dit bestand nu opslaat en uitvoert, zou u 'Hallo, wereld!' moeten zien. verschijnen in het Minecraft-spel. Laten we de code opsplitsen:

from mcpi.minecraft import Minecraft

Deze regel vertelt Python dat je code uit een ander bestand wilt gebruiken. Dit mcpi.minecraft-bestand is ontwikkeld om Minecraft gemakkelijk te kunnen bedienen.

mc = Minecraft.create()

Deze regel creëert een object genaamd 'mc' (Minecraft). Je moet dit maken om communicatie met het Minecraft-spel mogelijk te maken - het is niet voldoende om alleen het bestand op te nemen.

mc.postToChat('Hello, World!')

Ten slotte vertelt deze regel Minecraft om wat tekst naar de chat te schrijven. Probeer 'Hallo wereld!' te wijzigen. naar iets anders en kijk wat er gebeurt, maar vergeet niet om beide dubbele aanhalingstekens op te nemen. Als je softwareproblemen hebt, zijn dit enkele veelvoorkomende Python- en Minecraft Pi-fouten:

  • AttributeError -- dit is een typfout, zoals pint of prnt in plaats van print
  • NameError: naam 'Minecraft' is niet gedefinieerd -- vergeet niet om de modules te importeren die je nodig hebt
  • NameError: naam 'true' is niet gedefinieerd -- Python is hoofdlettergevoelig, verander in 'True'
  • socket.error: [Errno 111] Verbinding geweigerd -- Zorg ervoor dat Minecraft actief is

Projecten

Nu je de basis van Python en Minecraft kent, gaan we een paar coole projecten maken. Alle code kan worden gedownload van Github.

Geautomatiseerde Bruggenbouwer

Met dit programma wordt effectief een brug over water gebouwd. Wanneer de speler in de buurt van een water komt, zal het programma verschillende blokken in steen veranderen. Omdat Minecraft een coördinatensysteem gebruikt, is het heel gemakkelijk om de locatie van de speler te achterhalen, samen met het type blokken rond de speler. Minecraft Pi is enigszins beperkt, dus het is niet mogelijk om meerdere verschillende blokken in bulk bij te werken. U kunt dit gedrag echter eenvoudig zelf coderen.

Maak een nieuw bestand ( Bestand > Nieuw bestand ) en sla het op als ' bridge_builder.py '.

from mcpi.minecraft import Minecraft
mc = Minecraft.create() # create Minecraft Object
while True:
x, y, z = mc.player.getPos() # store player position

# store the surrounding blocks
a = mc.getBlock(x, y - 1, z + 1)
b = mc.getBlock(x, y - 1, z - 1)
c = mc.getBlock(x - 1, y - 1, z)
d = mc.getBlock(x + 1, y - 1, z)
if a == 8 or a == 9 or b == 8 or b == 9 or c == 8 or c == 9 or d == 8 or d == 9:
# 8 or 9 is water. Set surrounding blocks on floor to a solid (stone) if water is found
mc.setBlocks(x, y - 1, z, x + 1, y - 1, z + 1, 1)
mc.setBlocks(x, y - 1, z, x - 1, y - 1, z - 1, 1)
mc.setBlocks(x, y - 1, z, x - 1, y - 1, z + 1, 1)
mc.setBlocks(x, y - 1, z, x + 1, y - 1, z - 1, 1)

Merk op hoe de y-waarde in werkelijkheid naar y - 1 kijkt. Dit is het vloerniveau. Als de waarde van y werd gebruikt, zou het script naar blokken zoeken op ongeveer kniehoogte -- het zou niet erg goed werken! Mc.getBlock() geeft de id van een blok terug voor de gegeven coördinaten. Omdat x, y en z de coördinaten van de speler zijn, kun je ze optellen of aftrekken om posities rond de speler te krijgen. Je hoeft de x-, y- en z-waarden niet te gebruiken, je zou elk willekeurig getal kunnen gebruiken, maar je weet misschien niet hoe dat specifieke blok zich verhoudt tot de speler - het is beter om waarden te gebruiken die gerelateerd zijn aan de speler. Voer dit bestand uit vanaf de opdrachtregel en kijk wat er gebeurt.

Je zou moeten zien dat een klein stukje grond in steen verandert zodra de speler een waterlichaam bereikt. Het is niet geweldig - je kunt snel genoeg lopen om een ​​probleem te veroorzaken. Je zou dit kunnen oplossen door een grotere hoeveelheid water om te zetten in land. Het laatste deel van de methode mc.setBlocks() is de blok-ID. Een daarvan is de blok-ID voor steen. Je zou dit kunnen veranderen in hout, gras of wat dan ook. Als je zou willen, zou je dit vrij gemakkelijk kunnen omzetten in een complex ontwerp -- misschien een hangbrug!

Super mijnbouwknop

Dit voorbeeld maakt korte metten met mijnbouw. Het bestaat uit een fysieke knop, die, wanneer erop wordt gedrukt, 10 blokjes in blokjes zal delven. Laten we beginnen met de knop. Net als bij knoppen op de Arduino, heb je een kleine hoeveelheid elektronica nodig, die allemaal in een basisstartpakket moeten zitten:

  • 1 x Breadboard
  • 1 x momentschakelaar
  • 1 x 220 ohm weerstand
  • Vrouwelijk > mannelijke startkabels
  • Man > Mannelijke startkabels

Hier is de schakeling:

Pi-knop-verbinding

Deze weerstand wordt een 'pull down'-weerstand genoemd. Het helpt ervoor te zorgen dat wat de Pi denkt dat de knop is die wordt ingedrukt, ook echt de knop is die wordt ingedrukt. U hoeft dit niet te gebruiken, maar het wordt wel aanbevolen, omdat u zonder dit apparaat veel ruis en foutieve metingen kunt aantreffen.

De knop is verbonden met General Purpose Input Output (GPIO) pin 14. U kunt elke GPIO-pin gebruiken, maar kijk naar de pinout ten eerste, omdat ze niet allemaal bestuurbaar zijn vanaf de Pi en enigszins variëren tussen modellen.

Nu de knop is aangesloten, is het tijd om hem te testen. Maak een nieuw bestand aan en sla het op als ' button_test.py '. Voeg deze code toe, sla hem op en voer hem uit in Terminal.

import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM) # tell the Pi what headers to use
GPIO.setup(14, GPIO.IN) # tell the Pi this pin is an input
while True:
if GPIO.input(14) == True: # look for button press
print 'BUTTON WORKS!' # log result
time.sleep(0.5) # wait 0.5 seconds

druk op Controle + C om het script te stoppen. Als alles correct werkt, zou u 'BUTTON WORKS!' moeten zien. in de Terminal. Merk op hoe, net als de Minecraft-module, deze test de RPi.GPIO- en tijdmodules gebruikt. Deze geven de Pi toegang tot de hardware-pinnen en bieden handige timingfuncties.

Laten we nu de rest van de code afmaken. Maak een nieuw bestand aan met de naam ' super_mine.py '. Hier is de code:

import RPi.GPIO as GPIO
import time
from mcpi.minecraft import Minecraft
mc = Minecraft.create() # create Minecraft Object
GPIO.setmode(GPIO.BCM) # tell the Pi what headers to use
GPIO.setup(14, GPIO.IN) # tell the Pi this pin is an input
while True:
if GPIO.input(14) == True: # look for button press
x, y, z = mc.player.getPos() # read the player position
mc.setBlocks(x, y, z, x + 10, y + 10, z + 10, 0) # mine 10 blocks
mc.setBlocks(x, y, z, x - 10, y + 10, z - 10, 0) # mine 10 blocks
time.sleep(0.5) # wait 0.5 seconds

mc.player.getPos() geeft de huidige coördinaten van de speler terug, die vervolgens worden opgeslagen in x, y en z. De setBlocks() methode vertelt Minecraft om alle blokken tussen het begin en het einde te vullen met het volgende blok. Nul is de blok-id voor lucht. Je zou dit kunnen veranderen in een ander blok-ID om een ​​gebied effen te vullen. Je kunt de coördinaten ook veranderen in +100 of zelfs +1000 blokken, maar de Pi kan het moeilijk krijgen als je te gek wordt. Merk op hoe y + 10 hetzelfde is voor beide lijnen. Je zou dit kunnen veranderen in y - 10 als je blokken ondergronds wilt verwijderen.

Teleporteren

Een ander eenvoudig gebruik van deze knop zou kunnen zijn om te 'teleporteren'. De Minecraft Pi Api biedt een manier om de positie van de speler in te stellen. De volgende code zal de speler 'teleporteren' naar een vooraf ingestelde locatie:

mc.player.setPos(0, 0, 0)

Merk op dat zijn methode drie parameters accepteert; x, y en z - dus je kunt deze op alles instellen om de speler onmiddellijk naar die locatie te teleporteren.

Maak een kopie van het super_mine-bestand ( Bestand > Kopie opslaan als ) en wijzig het door de if te vervangen door het volgende:

if GPIO.input(14) == True: # look for button press
mc.player.setPos(0, 0, 0) # teleport player
time.sleep(0.5) # wait 0.5 seconds

Dit bestand zou er nu als volgt uit moeten zien:

import RPi.GPIO as GPIO
from mcpi.minecraft import Minecraft
import time
mc = Minecraft.create() # create Minecraft Object
GPIO.setmode(GPIO.BCM) # tell the Pi what headers to use
GPIO.setup(14, GPIO.IN) # tell the Pi this pin is an input
while True:
if GPIO.input(14) == True: # look for button press
mc.player.setPos(0, 0, 0) # teleport player
time.sleep(0.5) # wait 0.5 seconds

Sla het op als ' teleport.py ' en loop.

Het kan zijn dat de speler vast komt te zitten in een aantal blokken wanneer je dit gebruikt, in welk geval je de coördinaten moet aanpassen aan een bekende open ruimte (linksboven in het scherm wordt je huidige locatie weergegeven).

Bouw een huis

Een laatste taak voor deze knop is het bouwen van een huis. Net als het voorbeeld van een snelle mijnbouw hierboven, vervangt dit eenvoudig blokken rond de speler om een ​​huis te maken. Er worden verschillende blok-id's gebruikt voor verschillende materialen (raam, muren, enz.). Om het coderen gemakkelijker te maken, wordt een massief blok gemaakt en vervolgens wordt de binnenkant verwijderd (zet het blok op lucht), dit zal een holle schaal creëren. Je zou extra's kunnen toevoegen, zoals een bed of deur, maar het Minecraft Pi-project is een beetje onvolledig, en hoewel deze objecten werken wanneer ze door de speler worden geplaatst, zijn ze niet briljant bij het gebruik van Python.

from mcpi.minecraft import Minecraft
import RPi.GPIO as GPIO
import time
mc = Minecraft.create() # create Minecraft Object
GPIO.setmode(GPIO.BCM) # tell the Pi what headers to use
GPIO.setup(14, GPIO.IN) # tell the Pi this pin is an input
while True:
if GPIO.input(14) == True:
x, y, z = mc.player.getPos()
mc.setBlocks(x + 2, y - 1, z + 2, x + 7, y + 3, z + 8, 5) # make shell
mc.setBlocks(x + 3, y, z + 3, x + 6, y + 2, z + 7, 0) # remove inside
mc.setBlocks(x + 2, y, z + 5, x + 2, y + 1, z + 5, 0) # make doorway
mc.setBlocks(x + 4, y + 1, z + 8, x + 5, y + 1, z + 8, 102) # make window 1
mc.setBlocks(x + 4, y + 1, z + 2, x + 5, y + 1, z + 2, 102) # make window 2
mc.setBlocks(x + 7, y + 1, z + 4, x + 7, y + 1, z + 6, 102) # make window 3

Bewaar dit als ' huis.py ' en loop. Als alles goed gaat, zou je een klein huis moeten zien verschijnen (je moet je misschien omdraaien om het te vinden). Het is heel eenvoudig, een opening en enkele ramen. In theorie is er geen limiet aan hoe groot of complex een gebouw kan worden gebouwd.

Maak een minigame

Laten we vervolgens een minigame maken! Dit zal vrij eenvoudig zijn, wanneer de speler op een blok zand stapt, zal het na een willekeurige tijd in lava veranderen. Dit is een goed spel om te maken, omdat je je eigen levels kunt ontwerpen of aanpassen om het moeilijker te maken. Voor dit voorbeeld heeft u de knop niet nodig.

Maak een nieuw bestand aan en sla het op als ' mini_game.py '. Hier is de code:

from mcpi.minecraft import Minecraft
import random
import time
mc = Minecraft.create() # create Minecraft Object
while True:
x, y, z = mc.player.getPos()
block_under_player = mc.getBlock(x, y - 1, z)

if block_under_player == 12:
# player standing on sand, start the timer
random_time = random.uniform(0.1, 2.5) # generate random number
time.sleep(random_time); # wait
mc.setBlock(x, y - 1, z, 11) # turn it into lava

Deze code is een goede starter op de willekeurig() functie: willekeurig.uniform(0.1, 2.5) genereert een willekeurig getal tussen 0,1 (1/10e seconde) en 2,5 (2 1/2 seconde). Door deze aantallen te verhogen, wordt het spel gemakkelijker.

Probeer het! Ga op een blok zand staan ​​en het zal binnenkort in lava veranderen. Dit zou de basis kunnen zijn van een complexer spel.

Maak nog een minigame

Het uitgangspunt van dit spel is simpel: sta niet op de houten vloer als de tijd om is. De speler wordt geteleporteerd naar een 'arena'. Ze worden gedwongen stil te staan ​​totdat het spel begint. Eenmaal gestart, zal de vloer in water veranderen zodra de timer afloopt. De speler moet in de veilige zone (diamantblokken) staan ​​om te overleven. Elk niveau vermindert de timer met één seconde. Na elk succesvol level wordt het veilige gebied groter. Bekijk de onderstaande code:

import time
import random
from mcpi.minecraft import Minecraft
mc = Minecraft.create() # create Minecraft Object
# clear area
mc.setBlocks(-10, 1, -10, 25, 5, 25, 0)
# create arena shell
mc.setBlocks(0, 0, 0, 25, 10, 25, 17)
# hollow out arena
mc.setBlocks(1, 1, 1, 24, 10, 24, 0)
# move player to arena
mc.player.setPos(14, 25, 20) # teleport player
# make them stay put
# teleport player to start position every 1/10th second.
# do this for 5 seconds then start the game
time.sleep(2)
total_wait = 0
mc.postToChat('Waiting to Start')
while total_wait <5:
mc.player.setPos(14, 1, 20) # teleport player
time.sleep(0.1)
total_wait += 0.1
mc.postToChat('BEGIN!')
# 10 levels
for level in range(10):
x, y, z = mc.player.getPos()
level_time = 10 - level # reduce time by 1 second for each level
mc.postToChat('Level - ' + str(level + 1) + ' start')
# build floor
mc.setBlocks(0, 0, 0, 25, 0, 25, 17)
# make safe area
safe_area_start = random.uniform(0, 22)
safe_area_end = random.uniform(0, 22)
mc.setBlocks(safe_area_start, 0, safe_area_end, safe_area_start + level, 0, safe_area_end + level, 57)
elapsed_time = 0
while elapsed_time <10:
x, y, z = mc.player.getPos()
time.sleep(0.25)
elapsed_time += 0.25
# check player is still on floor
if y <0.75:
mc.postToChat('Game Over')
break;
else:
# remove floor
mc.setBlocks(-10, 0, -10, 25, 0, 25, 8)
# put safe area back
mc.setBlocks(safe_area_start, 0, safe_area_end, safe_area_start + level, 0, safe_area_end + level, 57)
time.sleep(2.5)
continue
break

Bewaar dit als ' mini_game_2.py ' en geef het een kans.

De Pi 2 heeft enkele prestatieproblemen tijdens het uitvoeren van Minecraft. De gebruiksgrafiek van de Central Processing Unit (CPU) ( rechter bovenhoek ) vertoont nooit een zware belasting, dus dit moet te wijten zijn aan een slecht ontwerp en optimalisaties door de ontwikkelaars. Deze problemen hebben niets te maken met het uitvoeren van code (omdat ze doorgaan wanneer Python niet actief is), maar ze worden verergerd door deze minigame. Als je Pi het echt moeilijk heeft, wil je misschien de grootte van de arena verkleinen of je Pi overklokken.

waar kan ik een puppy bij mij in de buurt krijgen

Diamant Detector

Laten we een ander circuit maken. Dit zal een Light Emitting Diode (LED) gebruiken om op te lichten wanneer er diamanten onder zitten (binnen 15 blokken). Dit is wat je nodig hebt:

  • 1 x Breadboard
  • 1 x LED
  • 1 x 220 ohm weerstand
  • Vrouwelijk > mannelijke startkabels
  • Man > Mannelijke startkabels

Hier is de schakeling:

Sluit de anode (lange poot) aan op GPIO-pin 14. Deze pin werkt als +5v. Sluit de kathode (korte poot) aan op aarde.

Ik heb een goedkoop ertsspeelgoed gebruikt en het aangepast door de achterklep en elektronica te verwijderen, ik heb er toen een LED onder geplaatst. Je zou dit gemakkelijk permanent kunnen maken met hete lijm of iets dergelijks.

Bewaar deze code als ' diamanten.py ':

import RPi.GPIO as GPIO
import time
from mcpi.minecraft import Minecraft
mc = Minecraft.create() # create Minecraft Object
led_pin = 14 # store the GPIO pin number
GPIO.setmode(GPIO.BCM) # tell the Pi what headers to use
GPIO.setup(14, GPIO.OUT) # tell the Pi this pin is an output
while True:
# repeat indefinitely
x, y, z = mc.player.getPos()
for i in range(15):
# look at every block until block 15
if mc.getBlock(x, y - i, z) == 56:
GPIO.output(led_pin, True) # turn LED on
time.sleep(0.25) # wait
GPIO.output(led_pin, False) # turn LED off
time.sleep(0.25) # wait

Als er een diamantertsblok onder de speler ligt (binnen 15 blokken), gaat het lampje knipperen.

ThinkGeek Minecraft Light-Up Blue Stone Diamond Ore - Zeker om varkens weg te houden KOOP NU OP AMAZON

Heb je iets cools gemaakt met Minecraft Pi? Laat me in de reacties weten wat je hebt gemaakt of hoe ver je bent gekomen in de games.

We hopen dat je de items die we aanbevelen en bespreken leuk vindt! MUO heeft gelieerde en gesponsorde partnerschappen, dus we ontvangen een deel van de inkomsten van sommige van uw aankopen. Dit heeft geen invloed op de prijs die u betaalt en helpt ons de beste productaanbevelingen te doen.

Deel Deel Tweeten E-mail Is het de moeite waard om te upgraden naar Windows 11?

Windows is opnieuw ontworpen. Maar is dat genoeg om u te overtuigen om over te stappen van Windows 10 naar Windows 11?

Lees volgende
Gerelateerde onderwerpen
  • doe-het-zelf
  • Programmeren
  • Minecraft
  • Raspberry Pi
  • Elektronica
  • Python
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