Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

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:

Muestra Agradecimiento a Conductores Cortéses con Pantalla LED Programable
Muestra Agradecimiento a Conductores Cortéses con Pantalla LED Programable

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.

Muestra Agradecimiento a Conductores Cortéses con Pantalla LED Programable

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.

Muestra Agradecimiento a Conductores Cortéses con Pantalla LED Programable

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.

Muestra Agradecimiento a Conductores Cortéses con Pantalla LED Programable

Electrónica en la caja

Protoboard recortada para dejar accesible USB del MKR1000.

Muestra Agradecimiento a Conductores Cortéses con Pantalla LED Programable

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.

Muestra Agradecimiento a Conductores Cortéses con Pantalla LED Programable

Colocación en vehículo

Planeé usar cuerdas elásticas con ventosas para luneta trasera. Queda trabajo por hacer en este aspecto.

Muestra Agradecimiento a Conductores Cortéses con Pantalla LED Programable

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).

Muestra Agradecimiento a Conductores Cortéses con Pantalla LED Programable

Proceso de manufactura

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