Apprendre Python et l'électronique avec Minecraft Pi Edition

Apprendre Python et l'électronique avec Minecraft Pi Edition

Vous avez toujours voulu apprendre à coder mais vous ne saviez pas par où commencer ? Apprenez à contrôler Minecraft sur le Raspberry Pi en utilisant Python et quelques éléments électroniques simples. Voici le résultat final :





Vous aurez besoin d'un Pi 2 ou plus récent pour ce projet, et bien que vous puissiez effectuer la plupart de ces tâches via la ligne de commande via Secure Shell (SSH), ce didacticiel se concentrera sur le codage directement sur le Pi.





Nouveau sur Minecraft ? Ne vous inquiétez pas - voici notre Guide du débutant Minecraft .





Introduction à Minecraft Pi

Minecraft pour Raspberry Pi a été développé pour apprendre et bricoler (et c'est gratuit). Il est livré avec une interface de programmation d'applications (API) qui permet au code de communiquer facilement avec Minecraft. C'est génial pour apprendre à coder en Python, ainsi que pour s'initier à l'électronique.

Qu'est-ce que Python ?

Python est un langage de programmation. Il est interprété , ce qui signifie que lorsque vous exécutez un fichier ou un programme Python, l'ordinateur doit d'abord effectuer un petit travail sur le fichier. Les inconvénients sont qu'il peut être considéré comme lent par rapport aux langages compilés [URL cassée supprimée].



Les avantages des langues interprétées sont la rapidité de codage et leur convivialité. Vous n'avez pas besoin de dire à l'ordinateur Quel données que vous voulez stocker, juste que vous voulez stocker quelque chose et l'ordinateur saura quoi faire. Il y a des exceptions, bien sûr, et c'est une vue quelque peu simplifiée, mais la programmation doit être amusante ! Si vous commencez à creuser dans les détails techniques complexes, cela peut devenir un peu laborieux.

Python est sensible à la casse. Ceci est important à savoir, car Python ne reconnaîtra pas les objets même s'ils sont correctement orthographiés si le cas est faux. 'Dosomething()' ne fonctionnera pas si la méthode s'appelle réellement 'Dosomething()'. Python utilise également l'indentation . D'autres langages de programmation peuvent ne pas se soucier du nombre d'indentations de votre code, alors que Python Est-ce que se soucier. Les retraits sont utilisés pour indiquer à Python où appartient le code. D'autres langages peuvent utiliser des 'accolades' ({}) pour grouper le code -- Python ne les utilise pas. Python utilise un hachage (#) pour les commentaires, et les commentaires sont utilisés pour dire aux autres développeurs ou aux personnes qui consultent le code ce que fait une partie particulière ou pourquoi elle est nécessaire. Python ignore tout après un hachage.





Enfin, il existe deux versions principales de Python : Python 2.7.x et Python 3.x. Il y a quelques différences entre les deux ( quelles sont les différences? ). Ce tutoriel utilisera Python 3.

La configuration initiale

Fournir votre Pi est déjà configurer et exécuter Raspbian , il n'y a pas beaucoup de configuration initiale nécessaire.





Ouvrir le terminal ( Menu > Accessoires > Borne ) et exécutez cette commande. C'est toujours une bonne pratique de garder la liste des référentiels à jour, et cela téléchargera la dernière liste de programmes (cela ne téléchargera pas les programmes eux-mêmes, cela aide le Pi à savoir quels programmes sont appelés et où les trouver).

sudo apt-get update

Maintenant, mettez à jour le Pi (cela peut prendre un certain temps) :

sudo apt-get upgrade

Python et Minecraft Pi sont déjà installés, cependant si Minecraft Pi n'est pas installé pour une raison quelconque, c'est simple à installer :

sudo apt-get install minecraft-pi

Accédez aux documents et créez un nouveau dossier appelé « Minecraft » :

cd Documents/
mkdir Minecraft

Vous pouvez afficher le contenu de ce nouveau dossier :

ls

Voici une astuce : si vous commencez à taper et appuyez sur la touche TAB, la ligne de commande tentera de compléter automatiquement l'instruction pour vous.

Vous pouvez examiner le chemin d'accès au répertoire actuel à l'aide de pwd, qui signifie Print Working Directory :

pwd

Démarrez Minecraft en allant sur Menu > Jeux > Minecraft Pi . Vous aurez besoin de ce fonctionnement, mais vous y reviendrez plus tard.

Ouvrez Python 3 à partir de Menu > Programmation > Python 3 (IDLE) . Ce programme vous permet d'exécuter des commandes Python et d'écrire des programmes.

Vous pouvez maintenant taper vos commandes Python ici, mais ce n'est pas très pratique. Aller à Fichier > Nouveau fichier puis Fichier > Enregistrer et enregistrez-le dans le dossier que vous avez créé précédemment. ( Documents > Minecraft ). Appelons-le ' bonjour_monde.py '. Vous n'êtes pas obligé d'utiliser l'extension .py, elle sera ajoutée automatiquement, mais c'est une bonne pratique.

Si vous revenez au terminal et naviguez dans le dossier Minecraft, vous devriez voir le fichier que vous venez de créer :

cd Minecraft/
ls

Vous pouvez exécuter ce fichier comme ceci :

python hello_world

Remarquez comment 'python' est tout en minuscules. Cela doit être avant le nom du fichier, car il indique au Pi que le fichier suivant est Python, il doit donc être exécuté comme tel.

Revenez à l'éditeur Python et tapez :

print 'Hello, World!'

Enregistrez ce fichier et exécutez-le à nouveau - vous devriez maintenant voir « Hello, World ! » apparaissent dans la ligne de commande -- soigné ! La commande print indique simplement à Python d'afficher le texte suivant entre guillemets doubles. C'est bien, mais pas très utile pour Minecraft, relions-le :

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

Maintenant, si vous enregistrez et exécutez ce fichier, vous devriez voir « Hello, World ! » apparaissent dans le jeu Minecraft. Décomposons le code :

from mcpi.minecraft import Minecraft

Cette ligne indique à Python que vous souhaitez utiliser le code d'un autre fichier. Ce fichier mcpi.minecraft a été développé pour permettre un contrôle facile de Minecraft.

mc = Minecraft.create()

Cette ligne crée un objet appelé 'mc' (Minecraft). Vous devez le créer pour permettre la communication avec le jeu Minecraft - il ne suffit pas d'inclure le fichier.

mc.postToChat('Hello, World!')

Enfin, cette ligne indique à Minecraft d'écrire du texte dans le chat. Essayez de changer « Hello, World ! » à autre chose et voyez ce qui se passe, mais n'oubliez pas d'inclure les deux guillemets. Si vous rencontrez des problèmes logiciels, voici quelques erreurs courantes de Python et Minecraft Pi :

  • AttributeError -- il s'agit d'une faute de frappe, telle que pint ou prnt au lieu de print
  • NameError : le nom 'Minecraft' n'est pas défini -- n'oubliez pas d'importer les modules dont vous avez besoin
  • NameError : le nom 'true' n'est pas défini -- Python est sensible à la casse, remplacez-le par 'True'
  • socket.error : [Errno 111] Connexion refusée -- Assurez-vous que Minecraft est en cours d'exécution

Projets

Maintenant que vous connaissez les bases de Python et Minecraft, créons des projets sympas. Tout le code peut être téléchargé depuis Github.

Générateur de ponts automatisé

Ce programme construira efficacement un pont sur l'eau. Lorsque le joueur s'approche d'un plan d'eau, le programme convertira plusieurs blocs en pierre. Comme Minecraft utilise un système de coordonnées, il est très facile d'obtenir l'emplacement du joueur, ainsi que le type de blocs autour du joueur. Minecraft Pi est légèrement limité, il n'est donc pas possible de mettre à jour plusieurs blocs différents en bloc. Cependant, vous pouvez facilement coder ce comportement vous-même.

Créer un nouveau fichier ( Fichier > Nouveau fichier ) et enregistrez-le sous ' 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)

Remarquez comment la valeur y regarde réellement y - 1. Il s'agit du niveau du sol. Si la valeur de y était utilisée, le script chercherait des blocs à peu près au niveau du genou -- cela ne fonctionnerait pas très bien ! Mc.getBlock() renvoie l'identifiant d'un bloc pour les coordonnées données. Comme x, y et z sont les coordonnées du joueur, vous pouvez les ajouter ou les soustraire pour obtenir des positions autour du joueur. Vous n'êtes pas obligé d'utiliser les valeurs x, y et z, vous pouvez utiliser n'importe quel nombre, mais vous ne savez peut-être pas comment ce bloc particulier se rapporte au joueur - il est préférable d'utiliser des valeurs relatives au joueur. Exécutez ce fichier à partir de la ligne de commande et voyez ce qui se passe.

Vous devriez voir qu'une petite zone de sol se transforme en pierre une fois que le joueur atteint un plan d'eau. Ce n'est pas génial - vous êtes capable de marcher assez vite pour causer un problème. Vous pouvez résoudre ce problème en convertissant un plus grand volume d'eau en terre. La dernière partie de la méthode mc.setBlocks() est l'identifiant du bloc. L'un est l'identifiant de bloc pour la pierre. Vous pouvez changer cela en bois, en herbe ou n'importe quoi. Si vous le vouliez, vous pourriez assez facilement le convertir en un design complexe -- peut-être un pont suspendu !

Bouton Super Minage

Cet exemple fera un travail rapide de l'exploitation minière. Il se compose d'un bouton physique qui, lorsqu'il est enfoncé, extraira 10 blocs en cubes. Commençons par le bouton. Semblable aux boutons sur l'Arduino, vous aurez besoin d'une petite quantité d'électronique, qui devrait être trouvée dans un kit de démarrage de base :

  • 1 x planche à pain
  • 1 x interrupteur momentané
  • 1 résistance de 220 ohms
  • Câbles de saut femelle > mâle
  • Mâle > Câbles de saut mâles

Voici le circuit :

Pi-Bouton-Connexion

Cette résistance est appelée résistance « pull down ». Cela permet de s'assurer que ce que le Pi pense être le bouton enfoncé, est vraiment le bouton enfoncé. Vous n'êtes pas obligé de l'utiliser, mais il est recommandé, car vous pouvez trouver beaucoup de bruit et de fausses lectures sans cela.

Le bouton est connecté à la broche GPIO (General Purpose Input Output) 14. Vous pouvez utiliser n'importe quelle broche GPIO, mais regardez la brochage d'abord, car ils ne sont pas tous contrôlables depuis le Pi, et varient légèrement entre les modèles.

Maintenant que le bouton est connecté, il est temps de le tester. Créez un nouveau fichier et enregistrez-le sous le nom ' button_test.py '. Ajoutez ce code, enregistrez-le puis exécutez-le dans 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

presse Contrôle + C pour arrêter le script. Si tout fonctionne correctement, vous devriez voir « LE BOUTON FONCTIONNE ! » dans l'aérogare. Remarquez comment, comme le module Minecraft, ce test utilise les modules RPi.GPIO et time. Ceux-ci permettent au Pi d'accéder aux broches matérielles et fournissent des fonctions de synchronisation utiles.

Finissons maintenant le reste du code. Créez un nouveau fichier appelé ' super_mine.py '. Voici le 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() renvoie les coordonnées actuelles du joueur, qui sont ensuite stockées dans x, y et z. Les setBlocks() La méthode indique à Minecraft de remplir tous les blocs entre le début et la fin avec le bloc suivant. Zéro est l'identifiant de bloc pour l'air. Vous pouvez changer cela en un autre block-id pour remplir une zone en continu. Vous pouvez également modifier les coordonnées en +100 ou même +1000 blocs, mais le Pi peut commencer à avoir du mal si vous devenez trop fou. Remarquez comment y + 10 est le même pour les deux lignes. Vous pouvez changer cela en y - 10 si vous souhaitez supprimer des blocs sous terre.

Téléportation

Une autre utilisation simple de ce bouton pourrait être de se « téléporter ». L'API Minecraft Pi fournit un moyen de définir la position du joueur. Le code suivant va « téléporter » le joueur vers un emplacement prédéfini :

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

Notez que sa méthode accepte trois paramètres ; x, y et z - vous pouvez donc les définir sur n'importe quoi pour téléporter instantanément le joueur à cet endroit.

Créez une copie du fichier super_mine ( Fichier > Enregistrer la copie sous ) et modifiez-le en remplaçant le if par ce qui suit :

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

Ce fichier devrait maintenant ressembler à ceci :

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

Enregistrez-le sous ' teleport.py ' et courir.

Vous pouvez constater que le joueur reste coincé à l'intérieur de certains blocs lors de son utilisation, auquel cas vous devrez ajuster les coordonnées à un espace ouvert connu (le coin supérieur gauche de l'écran indique votre position actuelle).

Construire une maison

Une dernière tâche pour ce bouton est de construire une maison. Tout comme l'exemple d'extraction rapide ci-dessus, cela remplacera simplement les blocs entourant le joueur pour faire une maison. Différents block-ids seront utilisés pour différents matériaux (fenêtres, murs, etc.). Pour faciliter les choses à coder, un bloc solide sera créé, puis l'intérieur supprimé (définir le bloc sur air), cela créera une coque creuse. Vous pouvez ajouter des extras comme un lit ou une porte, mais le projet Minecraft Pi est un peu incomplet, et bien que ces objets fonctionnent lorsqu'ils sont placés par le joueur, ils ne sont pas brillants lors de l'utilisation de 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

Enregistrez-le sous ' maison.py ' et courir. Tout va bien, vous devriez voir apparaître une petite maison (vous devrez peut-être faire demi-tour pour la trouver). C'est très simple, une ouverture et quelques fenêtres. En théorie, il n'y a pas de limite à la taille ou à la complexité d'un bâtiment que vous pourriez construire.

Faire un mini-jeu

Ensuite, créons un mini-jeu ! Ce sera assez simple, lorsque le joueur marchera sur un bloc de sable, il se transformera en lave après un laps de temps aléatoire. C'est un bon jeu à faire, car vous pouvez concevoir vos propres niveaux ou le modifier pour rendre les choses plus difficiles. Vous n'aurez pas besoin du bouton pour cet exemple.

Créez un nouveau fichier et enregistrez-le sous le nom ' mini_jeu.py '. Voici le 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

Ce code est un bon début sur le Aléatoire() fonction: aléatoire.uniforme(0.1, 2.5) générera un nombre aléatoire entre 0,1 (1/10e seconde) et 2,5 (2 1/2 secondes). L'augmentation de ces nombres rendra le jeu plus facile.

Essaye le! Tenez-vous sur un bloc de sable, et il se transformera bientôt en lave. Cela pourrait être la base d'un jeu plus complexe.

Faire un autre mini-jeu

Le principe de ce jeu est simple : ne restez pas debout sur le plancher en bois lorsque le temps est écoulé. Le joueur est téléporté dans une « arène ». Ils sont obligés de rester immobiles jusqu'à ce que le jeu commence. Une fois démarré, le sol se transformera en eau une fois le temps écoulé. Le joueur doit se tenir dans la zone de sécurité (blocs de diamant) pour survivre. Chaque niveau réduit la minuterie d'une seconde. Après chaque niveau réussi, la zone de sécurité s'agrandit. Découvrez le code ci-dessous :

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

Enregistrez-le sous ' mini_game_2.py ' et lancez-vous.

Le Pi 2 a des problèmes de performances lors de l'exécution de Minecraft. Le graphique d'utilisation de l'unité centrale de traitement (CPU) ( le coin supérieur droit ) ne montre jamais de charge lourde, cela doit donc être dû à une mauvaise conception et à des optimisations de la part des développeurs. Ces problèmes ne sont pas liés à l'exécution de code (car ils persistent lorsque Python n'est pas en cours d'exécution), mais ils sont aggravés par ce mini-jeu. Si votre Pi a vraiment du mal, vous voudrez peut-être réduire la taille de l'arène ou overclocker votre Pi.

nintendo switch joy con vendredi noir

Détecteur de diamant

Faisons un autre circuit. Cela utilisera une diode électroluminescente (DEL) pour s'allumer lorsqu'il y a des diamants en dessous (dans les 15 blocs). Voici ce dont vous avez besoin :

  • 1 x planche à pain
  • 1 LED
  • 1 résistance de 220 ohms
  • Câbles de saut femelle > mâle
  • Mâle > Câbles de saut mâles

Voici le circuit :

Connectez l'anode (jambe longue) à la broche GPIO 14. Cette broche agit comme +5v. Connectez la cathode (jambe courte) à la terre.

J'ai utilisé un jouet de minerai bon marché et je l'ai modifié en retirant le capot arrière et l'électronique, j'ai ensuite placé une LED en dessous. Vous pouvez facilement rendre cela permanent avec de la colle chaude ou quelque chose de similaire.

Enregistrez ce code sous ' diamants.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

Lorsqu'il y a un bloc de minerai de diamant sous le joueur (à moins de 15 blocs), la lumière clignote.

Minerai de diamant en pierre bleue illuminée de Minecraft de ThinkGeek - Sûr d'éloigner les Pigmen ACHETEZ MAINTENANT SUR AMAZON

Avez-vous fait quelque chose de cool avec Minecraft Pi ? Faites-moi savoir dans les commentaires ce que vous avez fait ou jusqu'où vous êtes parvenu dans les jeux.

Nous espérons que vous aimez les articles que nous recommandons et dont nous discutons ! MUO a des partenariats affiliés et sponsorisés, nous recevons donc une part des revenus de certains de vos achats. Cela n'affectera pas le prix que vous payez et nous aide à offrir les meilleures recommandations de produits.

Partager Partager Tweeter E-mail Cela vaut-il la peine de passer à Windows 11 ?

Windows a été repensé. Mais est-ce suffisant pour vous convaincre de passer de Windows 10 à Windows 11 ?

Lire la suite
Rubriques connexes
  • DIY
  • La programmation
  • Minecraft
  • Tarte aux framboises
  • Électronique
  • Python
A propos de l'auteur Joe Coburn(136 articles publiés)

Joe est diplômé en informatique de l'Université de Lincoln, au Royaume-Uni. C'est un développeur de logiciels professionnel, et lorsqu'il ne pilote pas de drones ou n'écrit pas de musique, on le trouve souvent en train de prendre des photos ou de produire des vidéos.

Plus de Joe Coburn

Abonnez-vous à notre newsletter

Rejoignez notre newsletter pour des conseils techniques, des critiques, des ebooks gratuits et des offres exclusives !

Cliquez ici pour vous abonner
Catégorie Diy