cartel para mi setup

Cartel táctil personalizado para mi SETUP

En este proyecto voy a construir un cartel personalizado con el logo del canal y que posteriormente colocaré en mi setup. El logo se iluminará con las diferentes animaciones que se programen y se podrá cambiar entre ellas fácilmente tocando el marco del cartel.

Boceto del cartel

boceto

El cartel va a estar formado por una pieza de metacrilato con el logo grabado, el cual será iluminado por una tira de leds RGB, esta será controlada por una placa de control que tendrá un microcontrolador y el sensor táctil. Este sensor estará conectado a un muelle que va a estar en contacto con el marco de aluminio del cartel.

También se va a tener una pieza intermedia que va a servir de anclaje para el metacrilato así con de alojamiento para la tira de leds y la placa de control. Estos alojamientos se cerrarán con dos tapas y por último el marco de aluminio cubrirá todo lo anterior.

La alimentación del cartel se hará mediante un conector USB.

Fabricación de la parte mecánica

Para la fabricación de la parte mecánica se ha cortado el marco de aluminio haciéndole 4 taladros, dos de ellos para sujetarlo a la pieza interior y los otros dos para poder colgarlo en la pared. En el caso de la pieza de metacrilato, se ha cortado y taladrado con la forma necesaria para encajarla y atornillarla en la pieza intermedia, además se ha grabado el logo con una Dremel utilizando una plantilla pegada con la imagen.

Diseño en tres dimensiones y fabricación en impresora 3D

En este proyecto se han diseñado, la pieza de anclaje de metacrilato y alojamiento de electrónica, así como las dos tapas para cerrar los alojamientos. Después de tener el diseño listo se ha impreso todo en una impresora 3D.

Roscado y pegado de piezas

Después de tener la piezas impresas ha habido que hacerles roscas a los agujeros pasándoles un macho, además, como en la impresora se ha impreso la pieza en dos mitades, ha habido que pegarlas para formar la pieza final.

Tira de leds

Para conseguir la tira de leds de la longitud que se necesita, ha habido que soldar tres tiras más pequeñas de 8 leds cada una para formar una tira final de 24 leds y unos 15 cm de longitud.

Esquema electrónico

esquema electrónico

En el esquema hay un dos terminales para la alimentación y otros cuatro que se utilizarán para alimentar y controlar la tira de leds, así como para conectar el sensor táctil. Como componentes principales tenemos un microcontrolador Attiny 85 conectado a unos pines para su programación y un controlador táctil AT42QT1010-TSHR para registrar cuando se toca el marco del cartel.

PCB y vista 3D de la placa de control

Partiendo del esquema electrónico se ha diseñado la PCB para poder introducirla en el alojamiento de la pieza intermedia. También se puede ver como ha quedado en 3D.

Soldado de componentes

En este proyecto se han utilizado dos tipos de componentes, unos, SMD que al ser muy pequeños se han soldado aplicando pasta de soldadura en la PCB y metiéndolos en un horno de reflow, por otro lado, los de tamaño más grande, como el controlador principal, los pines y el muelle, se han soldado manualmente. Por último, se han unido la tira de leds y la placa de control mediante cables y se ha soldado el cable USB de alimentación.

Código fuente

#include <Adafruit_NeoPixel.h>
                                 
#define PIN_LEDS      3   //Define el pin 3 para controlar los leds
#define PIN_PULSADOR  4   //Definición del pin 4 para la entrada del pulsador                                 
#define NUMLEDS 24        //Define el número de leds que se van a utilizar en el cartel
#define BRILLO 150        //Define el brillo deseado entre 1 y 255
#define BRILLO_MAX 255    //Define el brillo máximo
#define NUM_ESTADOS 8     //Define el número de estados que va a tener el programa
                                
Adafruit_NeoPixel leds(NUMLEDS, PIN_LEDS, NEO_GRB + NEO_KHZ800);  //Creación del objeto de tipo neopixel

int pulsado = 0;            //A 1 si se toca el marco
bool reposo = false;        //Indica si en el instante anterior se estaba tocando el marco o no
int estado = 0;             //Indica el estado en el que se encuentra el programa
int duracionPulsacion = 0;  //Cuenta la duración de la pulsación del marco


int combiAleatoria; //Combinación aleatoria de colores
int rAleatorio;     //Valor aleatorio de la componente R del color
int gAleatorio;     //Valor aleatorio de la componente G del color
int bAleatorio;     //Valor aleatorio de la componente B del color
int ledAleatorio;   //Valor aleatorio de led


//Configuración incial de pines, valores etc..
void setup() {
                                
  pinMode(PIN_PULSADOR, INPUT); //Inicializa el pin del pulsador como entrada
  pinMode(A1, INPUT);           //Inicializa el pin A1 como entrada (no está conectado) para usarlo como semilla en el random
  randomSeed(analogRead(A1));   //Establece el valor del pin A1 como semilla
  leds.begin();                 //Inicializa el objeto de tipo neopixel
  
}
void loop() {
                                
  //Deja el cartel apagado y pasa al siguiente estado
  while(estado == 0){Apagado();}

  //Espera hasta que se toca por primera vez el marco
  while(estado == 1){Esperando();}

  //Todo azul y pasa al siguiente estado
  while(estado == 2){Azul();}

  //Espera hasta que se toque el marco de nuevo
  while(estado == 3){Esperando();}

  //Coche fantástico
  while(estado == 4){CocheFantastico();}

  //Todo encendido cambiando los colores
  while(estado == 5){CambioColores();}

  //Encendido desde el centro y apagado hacia el centro (cambio de color en cada ciclo)
  while(estado == 6){OnOffRandom();}

  //Encendido de leds random con colores random
  while(estado == 7){ColoresRandom();}

}
//Comprueba si se ha tocado el marco
void ComprobarToque(int para_duracion)
{
  pulsado = digitalRead(PIN_PULSADOR);  //Lee el pin de entrada

  if(pulsado == HIGH) //Si se está tocando el marco
  {
    if(reposo == true) //Si en el instante anterior no se estaba tocando el marco
    {
      if(duracionPulsacion >= para_duracion)  //Si se ha estado tocando el marco el tiempo necesario
      {
        if(estado == NUM_ESTADOS-1) 
        {
          estado = 0; //Si ya se está en el último estado, se pasa al inicial
        } 
        else{estado++;} //Si no, se incrementa el estado

        duracionPulsacion = 0;  //Reseteo de la duración de la pulsación
        reposo = false;         //El estado anterior ya no es de reposo
      }
      else{duracionPulsacion++;} //Si el tiempo no ha sido el suficiente, se incrementa el contador
    }
  }
  else //Si no se está tocando el marco
  {
    duracionPulsacion = 0;  //Reseteo de la duración de pulsación
    reposo = true;          //El estado anterior es de reposo
  }
}
//Apaga todos los leds
void Apagado()
{
  leds.clear();
  leds.show();
  estado++; //Se pasa al siguiente estado
}
//Espera a que se toque el marco
void Esperando()
{
  delay(100);
  ComprobarToque(0);
}
//Enciende todos los leds en azul
void Azul()
{
  for(int i=0; i<NUMLEDS; i++) {
    leds.setPixelColor(i, leds.Color(0, 0, BRILLO));
  }
  leds.show();
  estado++;
  delay(200);
}
//Imita las luces del coche fantástico
void CocheFantastico()
{
    //Secuencia ascendente de las luces
    for(int i=0; i<NUMLEDS-2; i++) {
      if(estado!=4){break;}
      leds.clear(); //Apaga todos los leds
      //Se enciende el led actual y los dos siguientes
      leds.setPixelColor(i, leds.Color(BRILLO_MAX, 0, 0));
      leds.setPixelColor(i+1, leds.Color(BRILLO_MAX, 0, 0));
      leds.setPixelColor(i+2, leds.Color(BRILLO_MAX, 0, 0));
      leds.show();
      delay(100);
      ComprobarToque(0);   
    }
    
    //Secuencia descendente de las luces
    for(int j=NUMLEDS-1; j>1; j--) {
      if(estado!=4){break;}
      leds.clear(); //apaga todos los leds
      //Se enciende el led actual y los dos siguientes
      leds.setPixelColor(j, leds.Color(BRILLO_MAX, 0, 0));
      leds.setPixelColor(j-1, leds.Color(BRILLO_MAX, 0, 0));
      leds.setPixelColor(j-2, leds.Color(BRILLO_MAX, 0, 0));
      leds.show();
      delay(100);
      ComprobarToque(0);  
    }
}
//Ilumina todos los leds y va cambiando de color
void CambioColores()
{
  //Con el led rojo encendido va aumentando el verde
  for(int i=0; i<BRILLO; i++) {
    ComprobarToque(0);
    if(estado!=5){break;}
      
    for(int j=0; j<NUMLEDS; j++) {
      leds.setPixelColor(j, leds.Color(BRILLO, i, 0));
    }
    leds.show();
    delay(50);
  }

  //Con el led verde encendido va disminuyendo el rojo
  for(int i=BRILLO; i>-1; i--) {
    ComprobarToque(0);
    if(estado!=5){break;}
      
    for(int j=0; j<NUMLEDS; j++) {
      leds.setPixelColor(j, leds.Color(i, BRILLO, 0));
    }
    leds.show();
    delay(50);
  }

  //Con el led verde encendido va aumentando el azul
  for(int i=0; i<BRILLO; i++) {
    ComprobarToque(0);
    if(estado!=5){break;}
      
    for(int j=0; j<NUMLEDS; j++) {
      leds.setPixelColor(j, leds.Color(0, BRILLO, i));
    }
    leds.show();
    delay(50);
  }

  //Con el led azul encendido va disminuyendo el verde
  for(int i=BRILLO; i>-1; i--) {
    ComprobarToque(0);
    if(estado!=5){break;}
      
    for(int j=0; j<NUMLEDS; j++) {
      leds.setPixelColor(j, leds.Color(0, i, BRILLO));
    }
    leds.show();
    delay(50);
  }

  //Con el led azul encendido va aumentando el rojo el rojo
  for(int i=0; i<BRILLO; i++) {
    ComprobarToque(0);
    if(estado!=5){break;}
      
    for(int j=0; j<NUMLEDS; j++) {
      leds.setPixelColor(j, leds.Color(i, 0, BRILLO));
    }
    leds.show();
    delay(50);
  }

  //Con el led rojo encendido va disminuyendo el azul
  for(int i=BRILLO; i>-1; i--) {
    ComprobarToque(0);
    if(estado!=5){break;}
      
    for(int j=0; j<NUMLEDS; j++) {
      leds.setPixelColor(j, leds.Color(BRILLO, 0, i));
    }
    leds.show();
    delay(50);
  }   
}
//Enciende y apaga progresivamente los leds desde y hacia el centro cambiando de color en cada ciclo
void OnOffRandom()
{
  leds.clear(); //apaga todos los leds
  leds.show();

  combiAleatoria = random(1,6); //Produce un número aleatorio para elegir entre las 6 posibles combinaciones de colores

  switch(combiAleatoria)
  {
    case 1: //Rojo intenso y verde
    {
      rAleatorio = random(100,BRILLO);
      gAleatorio = random(50,BRILLO);
      bAleatorio = 0;
      break;
    }
    case 2: //Rojo intenso y azul
    {
      rAleatorio = random(100,BRILLO);;
      gAleatorio = 0;
      bAleatorio = random(50,BRILLO);
      break;
    }
    case 3: //Rojo y verde intenso
    {
      rAleatorio = random(50,BRILLO);
      gAleatorio = random(100,BRILLO);;
      bAleatorio = 0;
      break;
    }
    case 4: //Verde intenso y azul
    {
      rAleatorio = 0;
      gAleatorio = random(100,BRILLO);;
      bAleatorio = random(50,BRILLO);
      break;
    }
    case 5: //Rojo y azul intenso
    {
      rAleatorio = random(50,BRILLO);
      gAleatorio = 0;
      bAleatorio = random(100,BRILLO);;
      break;
    }
    case 6: //Verde y azul intenso
    {
      rAleatorio = 0;
      gAleatorio = random(50,BRILLO);
      bAleatorio = random(100,BRILLO);;
      break;
    }
    default:
    {
      break;
    }
  }
         
  //Encendido de los leds desde los dos centrales hacia los estremos
  for(int i=0; i<12; i++) {
    if(estado!=6){break;}
    leds.setPixelColor(12+i, leds.Color(rAleatorio, gAleatorio, bAleatorio)); //enciende el led actual en rojo
    leds.setPixelColor(11-i, leds.Color(rAleatorio, gAleatorio, bAleatorio)); //enciende el led actual en rojo
    leds.show();
    delay(100);
    ComprobarToque(0);   
  }
    
  //Apagado de los leds desde los estremos hacia el centro
  for(int j=0; j<12; j++) {
    if(estado!=6){break;}
    leds.setPixelColor(23-j, leds.Color(0, 0, 0)); //enciende el led actual en rojo
    leds.setPixelColor(j, leds.Color(0, 0, 0)); //enciende el led actual en rojo
    leds.show();
    delay(100);
    ComprobarToque(0);  
  }
}
//Ilumina leds random de colores random
void ColoresRandom()
{
  combiAleatoria = random(1,6); //Produce un número aleatorio para elegir entre las 6 posibles combinaciones de colores

  switch(combiAleatoria)
  {
    case 1: //Rojo intenso y verde
    {
      rAleatorio = random(100,BRILLO);
      gAleatorio = random(50,BRILLO);
      bAleatorio = 0;
      break;
    }
    case 2: //Rojo intenso y azul
    {
      rAleatorio = random(100,BRILLO);;
      gAleatorio = 0;
      bAleatorio = random(50,BRILLO);
      break;
    }
    case 3: //Rojo y verde intenso
    {
      rAleatorio = random(50,BRILLO);
      gAleatorio = random(100,BRILLO);;
      bAleatorio = 0;
      break;
    }
    case 4: //Verde intenso y azul
    {
      rAleatorio = 0;
      gAleatorio = random(100,BRILLO);;
      bAleatorio = random(50,BRILLO);
      break;
    }
    case 5: //Rojo y azul intenso
    {
      rAleatorio = random(50,BRILLO);
      gAleatorio = 0;
      bAleatorio = random(100,BRILLO);;
      break;
    }
    case 6: //Verde y azul intenso
    {
      rAleatorio = 0;
      gAleatorio = random(50,BRILLO);
      bAleatorio = random(100,BRILLO);;
      break;
    }
    default:
    {
      break;
    }
  }
    
  ledAleatorio = random(0,NUMLEDS-1); //Genera un número aleatorio que decide el led a encender

  //Enciende el led aleatorio con el color aleatorio
  leds.setPixelColor(ledAleatorio, leds.Color(rAleatorio, gAleatorio, bAleatorio));
  leds.show();
  delay(100);
  ComprobarToque(0);
}

Montaje del cartel

Con todos los componentes preparados se ha realizado el montaje final del cartel. Se han introducido las placas en los alojamientos y cerrado estos con las tapas, después se ha unido el metacrilato grabado a la pieza intermedia mediante dos tornillos y por último se ha cubierto esta con el marco de aluminio mediante otros dos tornillos.

Funcionamiento final

En las imágenes se pueden ver instantáneas del cartel mostrando el logo en diferentes colores, no obstante, para disfrutar de las animaciones sería recomendable ver el vídeo.

Vídeo

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Carrito de compra