Roulez avec style avec cette matrice électronique DIY D20

Roulez avec style avec cette matrice électronique DIY D20

Vous voulez quelque chose d'un peu unique pour votre prochain jeu de rôle sur table ? Que diriez-vous d'un D20 électronique avec des graphiques personnalisés pour les coups et les ratés critiques ? Aujourd'hui, je vais vous montrer comment créer le vôtre avec un Arduino et quelques pièces simples.





Ne vous inquiétez pas si vous n'avez jamais utilisé d'Arduino auparavant, nous avons un Guide de Démarrage .





Plan de construction

C'est un projet simple. Un Arduino pilotera un écran OLED et un bouton lancera le dé. Des graphiques personnalisés s'afficheront pour les coups critiques ou les lancers manqués critiques. Vous pouvez facilement modifier le code pour qu'il soit un D8, D10 ou D12.





De quoi as-tu besoin

  • 1 x Arduino
  • 1x0.96' Écran OLED I2C
  • 1 x bouton poussoir
  • 1 x 10k ? Résistance
  • 1 x planche à pain
  • Fils de branchement assortis
  • Code complet ici, si vous ne voulez pas suivre toutes les instructions écrites.

Ce sont les pièces essentielles dont vous avez besoin pour construire votre propre D20. Vous pouvez l'installer dans un boîtier (discuté ci-dessous) et souder le circuit dans un état plus permanent. Voici les pièces supplémentaires dont vous aurez besoin pour le faire :

Ces écrans OLED sont très cool. Ils peuvent généralement être achetés en blanc, bleu, jaune ou un mélange des trois. J'en ai acheté un en bleu, pour correspondre à mon cas. Assurez-vous d'obtenir un I2C modèle au lieu de SPI .



Presque tous les Arduino conviendront. J'ai choisi un Nano, car ils sont assez petits pour tenir dans le boîtier. Consultez notre guide d'achat pour plus d'informations sur les modèles Arduino.

Le circuit

Voici le circuit dont vous avez besoin :





Relier VCC et GND sur l'écran OLED à l'Arduino +5V et sol . Relier analogique 4 sur l'Arduino à la broche étiquetée ADD . Relier analogique 5 à la SCL épingler. Ces broches contiennent les circuits nécessaires pour piloter l'affichage à l'aide du bus I2C. Les broches exactes varient selon le modèle, mais A4 et A5 sont utilisées sur les Nano et Uno. Vérifier la Documentation de la bibliothèque de fils pour votre modèle si vous n'utilisez pas un Uno ou un Nano.

Connectez la batterie à la terre et le VIN épingler. Cela représente la tension d'entrée et accepte une variété de tensions CC différentes - mais vérifiez d'abord votre modèle spécifique, et il peut parfois varier légèrement.





Connectez le bouton à broche numérique 2 . Remarquez comment le 10k ? la résistance est reliée à la terre. C'est très important! Ceci est connu sous le nom de résistance de tirage, et il empêche l'Arduino de détecter des données parasites ou des interférences en appuyant sur un bouton. Il sert également à protéger la planche. Si cette résistance n'était pas utilisée, +5V irait directement à la terre. Ceci est connu comme un à mort et est un moyen facile de tuer un Arduino.

Si vous soudez ce circuit, protégez vos connexions avec une gaine thermorétractable :

Assurez-vous de ne pas trop le chauffer et ne le faites qu'une fois que vous êtes sûr que le circuit fonctionne. Vous pouvez également souhaiter torsader vos câbles en paires. Cela les maintient propres et aide à les protéger du stress excessif :

Test des boutons

Maintenant que vous avez construit le circuit, téléchargez ce code de test (assurez-vous de sélectionner la bonne carte et le bon port dans le Outils > Tableau et Outils > Port menus):

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

Une fois téléchargé, gardez l'Arduino connecté via USB et ouvrez le moniteur série ( En haut à droite > Moniteur série ). Tu devrais voir les mots Ça marche apparaissent à chaque fois que vous appuyez sur le bouton.

Si rien ne se passe, allez vérifier votre circuit.

Configuration OLED

Vous devez installer deux bibliothèques pour piloter l'affichage. Téléchargez le Adafruit_SSD1306 et les bibliothèques Adafruit-GFX [Non Longer Available] de Github, et enregistrez-les dans votre dossier de bibliothèque. Si vous ne savez pas où se trouvent les dossiers de votre bibliothèque, allez lire mon tutoriel de jeu rétro, où je configure ce même affichage plus en détail.

Redémarrez votre IDE Arduino et téléchargez une esquisse de test à partir du Fichier > Exemples menu. Sélectionner Adafruit SSD1306 puis ssd1306_128x64_i2c . Téléchargez ce code (cela prendra un certain temps), et vous devriez voir beaucoup de formes et de motifs à l'écran :

Si rien ne se passe, revérifiez vos connexions. Si, après vérification, cela ne fonctionne toujours pas, vous devrez modifier l'exemple de code.

Installation de confidentialité "Windows 10"

Modifiez cette ligne (au début de la mettre en place fonction):

display.begin(SSD1306_SWITCHCAPVCC, 0x3D);

Pour ça:

display.begin(SSD1306_SWITCHCAPVCC, 0x3C);

Cela indique à la bibliothèque des détails spécifiques sur l'affichage que vous utilisez. Vous devriez maintenant être prêt à continuer avec la construction.

L'affaire

Si vous le construisez sur une maquette ou si vous ne souhaitez pas l'emballer, vous pouvez ignorer cette étape.

J'ai conçu et imprimé en 3D cette boîte. Obtenez les fichiers sur Thingiverse . Ne vous inquiétez pas si vous n'avez pas d'imprimante 3D -- services en ligne Centres 3D et Formes fournir des services d'impression en ligne.

Vous pouvez facilement fabriquer cette boîte en bois ou en achetant un plastique boîte de projet .

Le couvercle est une conception à ajustement simple et contient quelques découpes pour le matériel :

Le code

Maintenant que tout est prêt, il est temps pour le code. Voici comment cela fonctionnera dans 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

Pour que cela fonctionne correctement, un nombre aléatoire doit être généré - c'est le lancer du dé. Arduino a un générateur de nombres aléatoires appelé Aléatoire , mais ne devrait pas l'utiliser. Bien que ce soit assez bon pour les tâches aléatoires de base, ce n'est tout simplement pas assez aléatoire pour une matrice électronique. Les raisons sont un peu compliquées, mais vous pouvez en savoir plus si vous êtes intéressé par boallen.com .

Téléchargez le VraiAléatoire bibliothèque par sirleech sur Github. Ajoutez ceci à votre dossier de bibliothèque et redémarrez l'IDE.

Créez maintenant un nouveau fichier et configurez votre code initial (ou récupérez simplement le code fini sur 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() {

}

Ce code configure l'OLED et inclut toutes les bibliothèques dont vous avez besoin pour communiquer avec lui, ainsi que votre nouvelle bibliothèque de nombres aléatoires. Ajoutez maintenant ceci à la boucle principale :

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

C'est assez basique à la minute, mais c'est un D20 qui fonctionne. Chaque fois que vous appuyez sur le bouton, un nombre aléatoire compris entre un et 20 s'affiche à l'écran :

Cela fonctionne bien, mais c'est un peu ennuyeux. Améliorons-le. Créer deux nouvelles méthodes, dessinerMourir et effacerMourir :

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

Ceux-ci dessineront un dé au milieu de l'écran. Vous voudrez peut-être rendre cela plus compliqué, peut-être en tirant un D20, ou un D12 et ainsi de suite, mais il est plus simple de dessiner un dé de base à six faces. Voici l'utilisation de base :

drawDie();

Ensuite, modifiez votre boucle principale pour dessiner le nombre aléatoire, seulement plus grand et au milieu. Remplacez la taille du texte et le curseur par ceci :

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

Ca a l'air beaucoup mieux maintenant :

Le seul problème concerne les nombres supérieurs à neuf :

La solution à ce problème est simple. Tous les nombres inférieurs à 10 auront le curseur placé à une position différente de ces nombres 10 ou plus. Remplacez cette ligne :

comment transférer un texte sur android
display.setCursor(57, 21);

Avec ça:

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

Voici à quoi cela ressemble maintenant :

Il ne reste plus que les images lorsque vous obtenez un coup ou un échec critique. Il y a quelques étapes impliquées, mais c'est un processus assez simple.

Trouvez une image appropriée que vous souhaitez utiliser (plus c'est simple, mieux c'est car l'affichage n'est qu'une seule couleur). Voici les images que j'ai utilisées :

Crédit d'image : publicdomainvectors.org

Toute image que vous souhaitez utiliser devra être convertie en un tableau HEX. Il s'agit d'une représentation de l'image sous forme de code. Il existe de nombreux outils disponibles pour ce faire, et certains sont écrits spécifiquement pour les écrans OLED. Le moyen le plus simple est d'utiliser le ImageversC_Hex outil en ligne. Voici les paramètres nécessaires :

comment utiliser le crédit paypal en magasin

Téléchargez votre image et définissez le format du code sur HEX : 0x . Régler Utilisé pour à Noir/Blanc pour toutes les fonctions d'image de dessin . Laissez toutes les autres options par défaut. Vous pouvez redimensionner l'image ici si vous en avez besoin. presse Obtenir la chaîne C et vous devriez voir les données de l'image apparaître :

Vous aurez besoin de ces données générées dans une minute. Créez deux fonctions appelées dessinerExplosion et dessinerCrâne (ou un nom approprié pour votre version). Voici le 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
}

Si vous souhaitez utiliser les images que j'ai utilisées, alors allez-y et copiez le code. Si vous souhaitez utiliser vos propres images que vous avez générées précédemment, copiez le byte code dans le imSku et imExp tableaux selon les besoins.

Voici à quoi ressemblent ces images à l'écran :

La partie la plus importante de ce code est cette ligne :

static const unsigned char PROGMEM imSku[]

Cela indique à l'Arduino de stocker vos images dans l'EEPROM ( qu'est-ce que l'EEPROM ? ) au lieu de sa RAM ( guide rapide de la RAM ). La raison en est simple ; l'Arduino a une RAM limitée, et l'utiliser pour stocker des images peut ne pas en laisser pour que votre code s'exécute

Modifiez votre principal si déclaration pour montrer ces nouveaux graphiques lorsqu'un un ou un 20 est obtenu. Notez les lignes de code pour afficher également le numéro à côté des images :

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
}

Et voici à quoi ressemblent ces nouveaux rouleaux :

C'est tout pour le côté code (allez récupérer le code sur GitHub si vous avez sauté tout ça). Vous pouvez facilement le modifier en D12, D8, etc.

L'assemblage final

Maintenant que tout le reste est terminé, il est temps de tout ranger. Vissez l'écran en veillant à ne pas trop serrer les boulons. C'est peut-être la partie la plus difficile. J'ai craqué un écran en le faisant, vous pouvez donc utiliser des rondelles en plastique. J'ai coupé des carrés Plastique :

Les petits écrous et boulons peuvent être difficiles à connecter. Conseil: Utilisez un petit morceau de Blu-Tack sur l'extrémité d'un tournevis pour placer initialement les écrous :

Vissez le bouton, connectez la batterie et fermez le couvercle. Veillez à ne pas coincer les fils ou à les enrouler trop étroitement, ce qui pourrait provoquer un court-circuit. Selon la longueur de vos fils de fuite, vous devrez peut-être protéger les connexions exposées avec une certaine isolation (un boîtier série fonctionne bien) :

Voici à quoi cela ressemble à l'intérieur :

Et voici le produit fini :

Vous devriez maintenant être l'heureux propriétaire d'un D20 électronique !

Quelles modifications avez-vous apportées ? As-tu changé les images ? Faites-nous savoir dans les commentaires, nous aimerions voir ce que vous avez fait!

Partager Partager Tweeter E-mail Guide du débutant pour animer un discours

Animer un discours peut être un défi. Si vous êtes prêt à commencer à ajouter du dialogue à votre projet, nous allons décomposer le processus pour vous.

Lire la suite
Rubriques connexes
  • DIY
  • Arduino
  • Jeu de plateau
  • Électronique
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