Saltar al contenido

Mapamundi de madera para la pared con leds

Hemos hecho un mapamundi de madera gigante para la pared y además le hemos puesto LEDS para que destaque todo lo posible. La verdad es que este proyecto queda espectacular como decoración para el hogar. Necesitas pocos materiales para hacerlo, aunque si que es verdad que lleva bastante trabajo, sobre todo si lo quieres hacer grande.

En nuestro canal de YouTube subimos vídeos como este dónde explicamos como crear todo tipo de proyectos DIY, así que si no quieres perderte ningún proyecto, ¡suscríbete al canal!

Resumen del proyecto mapamundi de madera para la pared

Este proyecto se puede dividir en 5 actividades principales: dibujar, cortar, poner espigas, colocar los LEDs y montar. Cada tarea puede llevar bastante tiempo, sobre todo cortar la madera, pero con paciencia puedes conseguir un muy buen resultado.

Nosotros hemos querido ir un poco más lejos y a varios países le hemos puesto un botón táctil. Cuando tocas uno de estos países, el mapamundi «habla» y te cuenta algo interesante del país que has pulsado. Para ello hemos utilizado un DFPlayer Mini, que es un reproductor MP3, y un altavoz.

Vamos a tratar de darte toda la información que necesitas para que puedas hacer la versión de mapamundi que más te guste. Las opciones son: sin iluminación, con leds, y por último, con leds y botones táctiles.

Materiales necesarios para crear el mapamundi de madera

  • Tablón de MDF en crudo de 120x60x1 cm.
  • Tablón de aglomerado y melamina de 120x60x1,6 cm.
  • Mapamundi impreso en diferentes hojas de A4 que cubran todo el tablón de madera.
  • Papel de calco.
  • Espigas de 3 cm de longitud y 6 mm de diámetro.
  • LEDS RGB, WS2811 o WS2812B (opcional)
  • Controlador de los LEDS. En nuestro caso Arduino Nano. Si no sabes programar puedes comprar un controlador comercial (opcional)
  • Fuente de alimentación (opcional)
  • Botones táctiles TTP223 (opcional).
  • DFPlayer Mini (opcional).
  • Altavoz (opcional).

Si quieres hacer el mapamundi más grande o más pequeño simplemente compra los tablones de madera de las medidas que necesites. El proceso de creación será exactamente igual. También tienes que asegurarte de imprimir el mapa en hojas de A4 con el tamaño indicado, para que cubran justo tu tablón de madera, y así puedas calcar el mapa.

Como puedes ver, hay varios materiales que son opcionales. Para la opción más básica del mapamundi solo necesitas madera, papel de calco, el mapa impreso y espigas. No estamos incluyendo las herramientas, ya que cada uno cuenta con las suyas. Nosotros principalmente hemos utilizado un taladro, una herramienta multiusos para fresar y una sierra caladora.

En cuanto a los LEDS, puedes elegir el tipo que más te guste. Una vez hayas elegido que tipo de leds quieres, asegúrate de comprar el controlador y la fuente de alimentación adecuados, porque no todos necesitan lo mismo. Por ejemplos los leds WS2811 necesitan 12 Voltios y los WS2812B  trabajan con 5 Voltios. 

Esquema Eléctrico

Esquema eléctrico del mapamundi

Aquí tienes el esquema eléctrico del proyecto para que te sea más fácil realizar las conexiones. Por cierto, aquí estamos utilizando un Arduino Nano el cual hay que programar. Si quieres hacer la versión extendida del proyecto, con los botones táctiles, es totalmente necesario utilizar el Arduino.

Si por el contrario solo quieres ponerle leds, nosotros te recomendamos que compres un controlador comercial para éstos, el cual es muy fácil de conectar y utilizar. Suelen ser 3 o 4 cables y llevan instrucciones. Además, muchos te permiten controlar los leds con un mando o una aplicación móvil.

Código

Aquí te dejo el código para que lo puedas utilizar en tu Arduino y así te ahorramos trabajo. Aún así, siempre te recomendamos que lo revises, te tomes tu tiempo para entenderlo, y en que caso de que quieras algún otro resultado diferente al nuestro, hagas las modificaciones necesarias. Si no sabes como subir el programa, puedes revisar este tutorial

#include <SoftwareSerial.h>
#include <FastLED.h>
#include <DFPlayer_Mini_Mp3.h>

///////////////////CONFIGURACIÓN//////////////////////
//Pines de los botones de cada país
#define CHINA  4
#define ESPANA  5
#define ARGENTINA  6
#define MEXICO  7
#define EEUU  8
#define CANADA  9

#define DFPlayerRX  10     //Pin RX del módulo de altavoz DFPlayer
#define DFPlayerTX  11     //Pin TX del módulo de altavoz DFPlayer

#define LED_PIN  3         //Pin de datos de la tira
#define NUM_LEDS   68      //Numero de LEDS (si se utiliza la matriz WS2811 se debe de poner número de grupos de 3)
#define BRIGHTNESS  150    //Brillo máximo 0-255
#define LED_TYPE    WS2811 //Modelo de tira LED (lo más habitual WS2811 o WS2812B)
#define COLOR_ORDER GBR    //Orden de colores

////////PARA DESARROLLADORES//////////////////
CRGB leds[NUM_LEDS];

#define UPDATES_PER_SECOND 100

const int threshold = 200;
volatile int lastTime = 0;
volatile bool nextSong = false;

SoftwareSerial DFPlayerSerial(DFPlayerRX, DFPlayerTX);

CRGBPalette16 currentPalette;
TBlendType    currentBlending;

extern CRGBPalette16 myRedWhiteBluePalette;
extern const TProgmemPalette16 myRedWhiteBluePalette_p PROGMEM;

void setup() {
  delay(2000); // power-up safety delay
  FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
  FastLED.setBrightness(BRIGHTNESS);
  currentPalette = RainbowColors_p;
  currentBlending = LINEARBLEND;

  Serial.begin(9600);
  DFPlayerSerial.begin(9600);
   mp3_set_serial(DFPlayerSerial);
   mp3_set_volume(20);

  pinMode(CHINA, INPUT);
  pinMode(ESPANA, INPUT);
  pinMode(ARGENTINA, INPUT);
  pinMode(MEXICO, INPUT);
  pinMode(EEUU, INPUT);
  pinMode(CANADA, INPUT);

}

void loop() {
  ChangePalettePeriodically();
  
  static uint8_t startIndex = 0;
  startIndex = startIndex + 1; /* motion speed */

  FillLEDsFromPaletteColors( startIndex);

  FastLED.show();
  FastLED.delay(1000 / UPDATES_PER_SECOND);
  ComprobarBotones();
}

void ComprobarBotones(){
  if(digitalRead(CHINA)){
    mp3_play(random(1,3));
  }
  else if(digitalRead(ESPANA)){
    mp3_play(random(4,6));
  }
  else if(digitalRead(ARGENTINA)){
    mp3_play(random(7,9));
  }
  else if(digitalRead(MEXICO)){
    mp3_play(random(10,12));
  }
  else if(digitalRead(EEUU)){
    mp3_play(random(13,15));
  }
  else if(digitalRead(CANADA)){
    mp3_play(random(16,18));
  }
}

void FillLEDsFromPaletteColors( uint8_t colorIndex)
{
    uint8_t brightness = 255;
    
    for( int i = 0; i < NUM_LEDS; ++i) {
        leds[i] = ColorFromPalette( currentPalette, colorIndex, brightness, currentBlending);
        colorIndex += 3;
    }
}


// There are several different palettes of colors demonstrated here.
//
// FastLED provides several 'preset' palettes: RainbowColors_p, RainbowStripeColors_p,
// OceanColors_p, CloudColors_p, LavaColors_p, ForestColors_p, and PartyColors_p.
//
// Additionally, you can manually define your own color palettes, or you can write
// code that creates color palettes on the fly.  All are shown here.

void ChangePalettePeriodically()
{
    uint8_t secondHand = (millis() / 1000) % 60;
    static uint8_t lastSecond = 99;
    
    if( lastSecond != secondHand) {
        lastSecond = secondHand;
        if( secondHand ==  0)  { currentPalette = RainbowColors_p;         currentBlending = LINEARBLEND; }
        if( secondHand == 10)  { currentPalette = RainbowStripeColors_p;   currentBlending = NOBLEND;  }
        if( secondHand == 15)  { currentPalette = RainbowStripeColors_p;   currentBlending = LINEARBLEND; }
        if( secondHand == 20)  { SetupPurpleAndGreenPalette();             currentBlending = LINEARBLEND; }
        if( secondHand == 25)  { SetupTotallyRandomPalette();              currentBlending = LINEARBLEND; }
        if( secondHand == 30)  { SetupBlackAndWhiteStripedPalette();       currentBlending = NOBLEND; }
        if( secondHand == 35)  { SetupBlackAndWhiteStripedPalette();       currentBlending = LINEARBLEND; }
        if( secondHand == 40)  { currentPalette = CloudColors_p;           currentBlending = LINEARBLEND; }
        if( secondHand == 45)  { currentPalette = PartyColors_p;           currentBlending = LINEARBLEND; }
        if( secondHand == 50)  { currentPalette = myRedWhiteBluePalette_p; currentBlending = NOBLEND;  }
        if( secondHand == 55)  { currentPalette = myRedWhiteBluePalette_p; currentBlending = LINEARBLEND; }
    }
}

// This function fills the palette with totally random colors.
void SetupTotallyRandomPalette()
{
    for( int i = 0; i < 16; ++i) {
        currentPalette[i] = CHSV( random8(), 255, random8());
    }
}

// This function sets up a palette of black and white stripes,
// using code.  Since the palette is effectively an array of
// sixteen CRGB colors, the various fill_* functions can be used
// to set them up.
void SetupBlackAndWhiteStripedPalette()
{
    // 'black out' all 16 palette entries...
    fill_solid( currentPalette, 16, CRGB::Black);
    // and set every fourth one to white.
    currentPalette[0] = CRGB::White;
    currentPalette[4] = CRGB::White;
    currentPalette[8] = CRGB::White;
    currentPalette[12] = CRGB::White;
    
}

// This function sets up a palette of purple and green stripes.
void SetupPurpleAndGreenPalette()
{
    CRGB purple = CHSV( HUE_PURPLE, 255, 255);
    CRGB green  = CHSV( HUE_GREEN, 255, 255);
    CRGB black  = CRGB::Black;
    
    currentPalette = CRGBPalette16(
                                   green,  green,  black,  black,
                                   purple, purple, black,  black,
                                   green,  green,  black,  black,
                                   purple, purple, black,  black );
}


// This example shows how to set up a static color palette
// which is stored in PROGMEM (flash), which is almost always more
// plentiful than RAM.  A static PROGMEM palette like this
// takes up 64 bytes of flash.
const TProgmemPalette16 myRedWhiteBluePalette_p PROGMEM =
{
    CRGB::Red,
    CRGB::Gray, // 'white' is too bright compared to red and blue
    CRGB::Blue,
    CRGB::Black,
    
    CRGB::Red,
    CRGB::Gray,
    CRGB::Blue,
    CRGB::Black,
    
    CRGB::Red,
    CRGB::Red,
    CRGB::Gray,
    CRGB::Gray,
    CRGB::Blue,
    CRGB::Blue,
    CRGB::Black,
    CRGB::Black
};