Muestra Agradecimiento a Conductores Cortéses con Pantalla LED Programable
Componentes y materiales
| Arduino MKR1000 | × | 1 |
| Módem Bluetooth SparkFun BlueSMiRF Silver | × | 1 |
| Conversor de Nivel Lógico Bidireccional 4 canales Adafruit (BSS138) | × | 1 |
| Matriz Flexible Adafruit DotStar 8x32 - 256 LEDs RGB | × | 1 |
| Set Cable Conector JST SM 4 pines Adafruit | × | 1 |
| Conector Barril DC 2.1 mm | × | 1 |
| Adaptador AC 5V @ 4A | × | 1 |
| Header Macho 4 posiciones (0.1") | × | 1 |
| Protoboard (genérica) | × | 1 |
| Caja de Proyecto | × | 1 |
| Contrachapado Báltico 1/4″ x 4.5″ x 15″ | × | 1 |
| Cinta de Carpintero 1″ x 50' | × | 1 |
Herramientas y máquinas necesarias
| Soldador (genérico) |
| Pistola de Pegamento Caliente (genérica) |
| Fresas Forstner |
| Taladro |
| Lija (grano 120 para eliminar bordes afilados) |
Aplicaciones y servicios online
| Arduino IDE |
| Virtual Shield for Arduino |
| Adafruit DotStar |
Sobre el proyecto
Desde que conduzco, siempre he querido comunicarme de forma más significativa con los conductores que me rodean. Me parecía que un destello de luces, un saludo con la mano, un gesto más elaborado, un claxon o una frenada brusca terminaban siendo mecanismos de comunicación muy rudimentarios.
La inspiración vino de una película de James Bond donde, en la escena inicial, mostraba texto en la luneta trasera de su Aston Martin. Pensé: podría decirle exactamente lo que pienso al conductor de atrás.
Aquí una demo en banco de pruebas y una demo casi en vivo:


Este proyecto tuvo un reto adicional: el MKR1000 era una placa pre-lanzamiento sin documentación formal. Un buen punto de partida en Hackster:
Arduino MKR1000 Getting Started
Paso 1: Hacer hablar al MKR1000
Tuve acceso al foro privado de Arduino.cc para propietarios de placas pre-lanzamiento. Tras un sábado entero, logré programar la placa y hacer funcionar todos los componentes.
Mi configuración actual usa Arduino IDE versión 1.6.9 hourly build. Cargué los drivers via Board Manager y las librerías via Library Manager: Adafruit DotStar, Adafruit DotStarMatrix, Adafruit GFX, ArduinoJson, y Windows Virtual Shields for Arduino.
Regla #1 de electrónica: ¡Nunca dejes escapar el humo mágico del circuito!
El MKR1000 es una placa de 3.3V. Sin documentación completa, no sabía si toleraba 5V. Algunos componentes necesitan 5V para niveles lógicos correctos. De ahí la necesidad del conversor de nivel lógico bidireccional de 4 canales de Adafruit. Tanto el módulo Bluetooth como la matriz DotStar prefieren 5V completos. ¡Ten cuidado al conectar!
Verificar que los componentes funcionan
Antes de integrar todo, verifiqué cada componente por separado.
Empecé con la matriz Adafruit 8x32 DotStar. Las conexiones eran inestables, así que soldé pines header para fijarlas.

Conecté Data y Clock In a los pines SPI marcados SDA y SCL en el MKR1000. Cargué el ejemplo "matrixtest" de Adafruit DotStarMatrix, ajusté DATAPIN=11 y CLOCKPIN=12, compilé y desplegué. Tras ajustar opciones de matriz, logré una pantalla funcional.
Luego, el Virtual Shield sobre Bluetooth. Fue sencillo siguiendo instrucciones en GitHub. Solo cambié pines TX/RX a 14 y 13 según mi placa. Ya no hace falta desconectar TX/RX para subir sketches nuevos.
Recorrido por el código
Includes necesarios:
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_DotStarMatrix.h>
#include <Adafruit_DotStar.h>
#include <ArduinoJson.h>
#include <VirtualShield.h>
#include <Text.h>
#include <Graphics.h>
#include <Recognition.h>
#include <Colors.h>
Los 5 primeros son explicativos. VirtualShield.h gestiona comunicación Bluetooth. Text.h mejora manejo de Strings. Graphics.h, Recognition.h, Colors.h dan acceso a pantalla virtual y reconocimiento de voz (pendiente para futuro).
Inicialización de matriz y shield:
Adafruit_DotStarMatrix matrix = Adafruit_DotStarMatrix(
32, 8, DATAPIN, CLOCKPIN,
DS_MATRIX_TOP + DS_MATRIX_LEFT + DS_MATRIX_COLUMNS + DS_MATRIX_ZIGZAG,
DOTSTAR_GBR
);
const uint16_t colors[] = {
matrix.Color(255, 0, 0), matrix.Color(0, 255, 0),
matrix.Color(0, 0, 255), matrix.Color(255, 0, 255),
matrix.Color(255, 0, 106), matrix.Color(255, 255, 255)
};
VirtualShield shield;
Graphics screen = Graphics(shield);
Recognition speech = Recognition(shield);
Método setup():
void setup() {
matrix.begin();
matrix.setTextWrap(false);
matrix.setBrightness(40);
matrix.setTextColor(colors[0]);
DisplayText("Initializing...", 4, 10);
shield.setOnRefresh(refresh);
speech.setOnEvent(onSpeech);
screen.setOnEvent(screenEvent);
shield.begin(); // asume 115200 baudios Bluetooth
DisplayText("Initializing...finished", 3, 10);
}
Bucle principal minimalista:
void loop() {
shield.checkSensors(); // comprueba eventos y llama callbacks
}
Método refresh() - se ejecuta al conectar Bluetooth, al iniciar shield.begin() o pulsar "refresh" en la app:
void refresh(ShieldEvent* shieldEvent) {
screen.clear(ARGB(123,86,204));
screen.drawAt(0,0, "");
thanksId = screen.addButton(10, 50, ". Thank you .");
welcomeId = screen.addButton(10, 100, ". Welcome .");
turnLeftId = screen.addButton(10, 150, ". Left .");
stoppingId = screen.addButton(175, 50, ". Stopping .");
startingId = screen.addButton(175, 100, ". Starting .");
turnRightId = screen.addButton(175, 150, ". Right .");
backoffId = screen.addButton(10, 225, ". Back Off .");
calling911Id = screen.addButton(175, 225, ". Calling 911 .");
}
Manejo de pulsaciones en screenEvent():
void screenEvent(ShieldEvent* shieldEvent) {
if(screen.isPressed(thanksId)) DisplayText("Thank You", 5, 100);
if(screen.isPressed(welcomeId)) DisplayText("You're welcome", 2, 100);
if(screen.isPressed(backoffId)) DisplayText("Please back off", 4, 100);
if(screen.isPressed(stoppingId)) DisplayText("...stopping...", 0, 100);
if(screen.isPressed(startingId)) DisplayText("...starting...", 1, 100);
if(screen.isPressed(turnLeftId)) DisplayText("Turning LEFT", 3, 100);
if(screen.isPressed(turnRightId)) DisplayText("Turning RIGHT", 3, 100);
if(screen.isPressed(calling911Id)) DisplayText("Calling 911", 0, 100);
}
Método DisplayText() para scroll en matriz:
void DisplayText(String message, int colorIndex, int currDelay) {
int x = matrix.width();
int maxX = -1 * (message.length() * 5 + message.length());
matrix.setTextColor(colors[colorIndex]);
while(x > maxX) {
matrix.fillScreen(0);
matrix.setCursor(x, 0);
matrix.print(message);
--x;
matrix.show();
delay(currDelay);
}
}
Construcción de la carcasa
Caja de tamaño adecuado, contrachapado báltico de 1/4″ cortado a medida.

Técnica: colocar matriz sobre madera, marcar centros de conexiones, conectar líneas para encontrar centros de agujeros. Usé fresas Forstner (cortan borde y escarifican centro) para agujeros limpios.
Lija grano 120 en toda la pieza, suaviza bordes y agujeros. Limpia polvo.
Taladra dos agujeros en la caja plástica (conector alimentación y conexión matriz). Aplica cinta doble cara, fija caja a madera, pon peso 24h. Taladra último agujero para alimentación auxiliar de matriz.

Electrónica en la caja
Protoboard recortada para dejar accesible USB del MKR1000.

Pega protoboard evitando agujero alimentación auxiliar. Fija matriz al frente con pegamento caliente.
Alimentación
Incluso al 40% brillo, 256 píxeles a tope consumen ~7.5A. La conexión auxiliar alimenta hasta 4A. No es sostenido ni estático, así que la fuente basta. Para el MKR1000 en coche, usé un adaptador 5V 4A ($5) + inversor AC que ya tenía. Lo simple es mejor.

Colocación en vehículo
Planeé usar cuerdas elásticas con ventosas para luneta trasera. Queda trabajo por hacer en este aspecto.

Código
Código "Say Thanks" en GitHub
https://github.com/pulcher/mkr1000_challenge
Esquemáticos
El MKR1000 es solo un micro (el real no había salido aún).

Proceso de manufactura
- UnifiedWater v1 – Kit completo de sensor de calidad de agua con Arduino
- Sistema de votación portátil con conectividad GSM
- Crea gafas inteligentes de match-making con Arduino 101 y tinyTILE BLE
- Juego Arcade Whac-A-Mole DIY (Edición Botones) – Proyecto Arduino
- Jukebox Moderna: Reproductor Musical Raspberry Pi + Arduino con LEDs Reactivos
- Smartwatch Arduino DIY: Construye tu Propio Reloj Estilo Apple Watch
- Radio Arduino Multibanda DIY con Si4730 (LW, MW, SW, FM) – Bajo Coste, Paso a Paso
- Replicador IR Wi-Fi: Controla dispositivos remotamente
- Guía completa de acabados PCB: Tipos, aplicaciones y mejores prácticas
- Electroerosión por Chispa (EDM) Explicada: Tecnología, Métodos y Aplicaciones
- Guía Completa de Rodamientos con Brida (Flange Bearings): Tipos, Características y Aplicaciones