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

Da las gracias a todos los conductores corteses

Componentes y suministros

Arduino MKR1000
× 1
Módem Bluetooth SparkFun - BlueSMiRF Silver
× 1
Convertidor de nivel lógico bidireccional seguro I2C de 4 canales Adafruit - BSS138
× 1
Adafruit Flexible Adafruit DotStar Matrix 8x32 - 256 RGB LED Pixels
× 1
Juego de cables de enchufe + receptáculo JST SM de 4 pines Adafruit
× 1
Conector cilíndrico CC de 2,1 mm
× 1
Adaptador de corriente CA 5V @ 4A
× 1
Posición del encabezado masculino 4 (0.1 ")
× 1
Breadboard (genérico)
× 1
Cuadro de proyecto
Elija uno lo suficientemente grande para contener todas las cosas más la altura del Bluetooth.
× 1
Contrachapado de abedul báltico de 1/4 "x 4.5" x 15 "
× 1
Cinta para trabajar la madera, 1 "x 50 '
× 1

Herramientas y máquinas necesarias

Soldador (genérico)
Pistola de pegamento caliente (genérica)
Forestner bits
Ejercicio
Papel de lija
Grano 120 para eliminar los bordes afilados.

Aplicaciones y servicios en línea

Arduino IDE
Virtual Shield para Arduino
Adafruit DotStar

Acerca de este proyecto

Durante el tiempo que he estado conduciendo, he querido poder comunicarme de una manera más significativa con los conductores aleatorios que me rodean. Me pareció que un destello de luces, un movimiento de la mano, un gesto que involucraba mucho más que un movimiento de la mano, un bocinazo o un golpe en los frenos terminaron siendo un mecanismo de comunicación muy tosco. / P>

La inspiración para esto fue una película de James Bond donde, en la escena de apertura, tenía un texto que se mostraba en la ventana trasera de su Austin Martin. Pensé, realmente podía decirle (no solo expresar con manos onduladas) al conductor del otro vehículo exactamente lo que estaba pensando.

Aquí hay una demostración de banco:

Y una demostración de acción casi en vivo:

Aquí está el bosquejo del concepto:

Este proyecto tuvo un desafío adicional porque el MKR1000 es una placa de prelanzamiento y no hay documentación formal. Hay un muy buen punto de partida en Hackster:

https://www.hackster.io/charifmahmoudi/arduino-mkr1000-getting-started-08bb4a

Entonces, en el primer paso del proyecto:

Haz que el MKR1000 hable

Tuve la suerte de entrar al foro patrocinado por http://arduino.cc, que tenía un foro privado para nosotros, los propietarios de los foros. Después de un sábado sólido, logré poder programar la placa y hacer que todos los componentes funcionen.

Mi configuración actual implica la compilación por hora de la versión 1.6.9 de Arduino IDE. Si usted es como yo, entonces usar compilaciones "por horas" en un proyecto lo hace "incómodo" al menos.

Una vez que tuve el IDE instalado, descargué los controladores para la placa con el administrador de la placa del IDE. También cargué las siguientes bibliotecas usando el administrador de bibliotecas IDE:Adafruit DotStar, Adafruit DotStarMatrix, Adafruit GFX, ArduinoJson y Windows Virtual Shields para Arduino.

Cuando esta placa se lance oficialmente, el proceso será mucho más simple. Entonces, no lo voy a detallar aquí. Hay una referencia a un proyecto para ayudarlo a hacer esto al final del artículo.

Regla número 1 de la electrónica de construcción: ¡Nunca dejes que el humo mágico salga del circuito!

La MKR100 es una placa basada en 3v3. Al no tener toda la documentación que me gustaría, no sabía si eran tolerantes a 5 voltios. No solo que algunos de los componentes realmente quieren tener 5 voltios disponibles para establecer la lógica adecuada 1 y 0.

Esto puso de manifiesto la necesidad del cambio de nivel bidireccional de 4 canales de Adafruit. Tanto a la tarjeta bluetooth como a la matriz DotStar les gustan mucho los 5 voltios completos. Por lo tanto, tenga cuidado al conectar estas cosas.

Asegúrese de que los componentes funcionen

Antes de preocuparme por hacer que todo funcione en conjunto, quiero asegurarme de que todos los componentes funcionen.

Comencé con la matriz Adafruit 8x32 DotStar. Descubrí que las conexiones que tenía eran un poco inestables. Para que esto no sea un problema, utilicé algunos pines de encabezado que tenía por ahí y simplemente los soldé.

Con las clavijas del cabezal firmemente fijadas. Enrute los datos y el reloj a los pines SPI marcados como SDA y SCL en el MKR1000.

Con las clavijas del cabezal firmemente fijadas. Enrute los datos y el reloj a los pines SPI marcados como SDA y SCL en el MKR1000.

Cargué el boceto de ejemplo "Archivo> Ejemplos> Adafruit DotStarMatric> matrixtest" en el IDE. Ajustó DATAPIN a 11 y CLOCKPIN a 12 en el código. Construyó e implementó la solución. Después de un poco de opción para la matriz, terminé con una pantalla que funciona.

El siguiente paso fue hacer que Virtual Shield funcionara a través del adaptador Bluetooth. Fue realmente sencillo. Seguí las instrucciones mencionadas en el repositorio de github https://github.com/ms-iot/virtual-shields-arduino. El único cambio que tuve que hacer fueron los pines TX y RX. Esos son los pines 14 y 13 como están marcados en mi tablero.

Sin embargo, señalaría que en encarnaciones anteriores tuve que desconectar los pines TX / RX para cargar nuevos bocetos. Me complace informar que este ya no es el caso.

Recorrer el código

Ahora que todo está funcionando, me tomaré un momento y repasaré el código específico de este proyecto.

Para acceder a todas las funciones, debe incluir lo siguiente:

  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include   

Las primeras 5 inclusiones deberían ser bastante explicativas.

VirtualShield.h contiene la funcionalidad básica para la comunicación a través del adaptador bluetooth. Esto es necesario sin importar a cuál de los sensores desee acceder.

El archivo Text.h obtiene su mejor texto, es decir, manejo de cadenas.

Graphics.h, Recognition.hy Colors.h contienen la funcionalidad que necesita para acceder a la pantalla virtual y habilitar el reconocimiento de voz. Aunque no he terminado para este desafío, codificaré las funciones de voz en el futuro.

A continuación, en la lista de líneas importantes de código, inicializando la matriz DotStar e inicializando el objeto Shield:

  Adafruit_DotStarMatrix matrix =Adafruit_DotStarMatrix (32, 8, DATAPIN, CLOCKPIN, DS_MATRIX_TOP + DS_MATRIX_LEFT + DS_MATRIX_COLUMNS + DS_MATRIX_ZIGZAGR, constolor 16); matriz [u. Color (0, 255, 0), matriz.Color (0, 0, 255), matriz.Color (255, 0, 255), matriz.Color (255, 0, 106), matriz.Color (255, 255, 255)}; Escudo de VirtualShield; Pantalla de gráficos =Gráficos (escudo); Reconocimiento de voz =Reconocimiento (escudo);  

La primera línea le dice a la biblioteca DotStar el tamaño y diseño de la matriz. Consulte el ejemplo de matrixtest o el archivo Adafruit_DotStarMatrix.h para conocer las diversas opciones.

Los colores son para la biblioteca DotStar.

Las últimas 3 líneas activan el escudo e inicializan los objetos para que funcionen con los sensores del teléfono.

A continuación, como todos los bocetos de Arduino, necesitamos manejar el método setup ()

  void setup () {matrix.begin (); matrix.setTextWrap (falso); matrix.setBrightness (40); matrix.setTextColor (colores [0]); DisplayText ("Inicializando ...", 4, 10); // configurar eventos de escudo virtual:shield.setOnRefresh (actualizar); speech.setOnEvent (onSpeech); screen.setOnEvent (screenEvent); // comienza la comunicación del escudo (también llama a refresh ()). shield.begin (); // asume 115200 velocidad en baudios de Bluetooth DisplayText ("Inicializando ... terminado", 3, 10);}  

Las líneas de la "matriz" se explican por sí mismas y, con esas líneas en ejecución, esto me da la capacidad de enviar algunos mensajes informativos a la matriz.

Las líneas de "escudo" ahora configuran métodos de devolución de llamada. Estos métodos se llamarán según sea necesario cuando ocurran eventos.

Ahora, para el método más complicado de todo el boceto

  void loop () {// checkSensors () busca eventos de retorno y los maneja (llamadas de retorno). Este es el método de bucle único () de VirtualShield. shield.checkSensors ();}  

Sí, lo tienes. Verificamos continuamente si alguno de los sensores se ha disparado y si hay un evento que deba solucionarse.

Ok ahora, realmente manejemos algunos eventos. El primero es el método refresh (). Se llamará cuando sucedan varios eventos diferentes. El único evento que nos importa en este momento es cuando el bluetooth está conectado. Necesitamos un evento para poder volver a dibujar la pantalla para que se vea como debería.

  void refresh (ShieldEvent * shieldEvent) {// ponga su código de actualización aquí // esto se ejecuta siempre que se conecta Bluetooth, siempre que se ejecuta shield.begin () o se presiona el botón 'actualizar' en la aplicación:screen.clear (ARGB (123,86,204)); screen.drawAt (0,0, ""); thanksId =screen.addButton (10, 50, ". Gracias."); welcomeId =screen.addButton (10, 100, ". Bienvenido."); turnLeftId =screen.addButton (10, 150, ". Izquierda."); stopId =screen.addButton (175, 50, ". Deteniendo"); initialId =screen.addButton (175, 100, ". Iniciando."); turnRightId =screen.addButton (175, 150, ". Derecha"); backoffId =screen.addButton (10, 225, ". Retroceder."); llamando al 911Id =screen.addButton (10, 290, ". Llamando al 911.");}  

Este método borra la pantalla con un fondo violeta claro y procede a colocar los distintos botones en la pantalla. Observe el espacio entre las palabras. Esta es una limitación actual de la funcionalidad del escudo virtual, ya que realmente quería centrar las cosas para que se vieran bien.

Entonces, ¿qué sucede cuando toco uno de esos botones? Se dispara un evento y se maneja en el siguiente código.

  void screenEvent (ShieldEvent * shieldEvent) {if (screen.isPressed (thanksId)) {DisplayText ("Gracias", 5, 100); } if (screen.isPressed (welcomeId)) {DisplayText ("De nada", 2, 100); } if (screen.isPressed (backoffId)) {DisplayText ("Por favor, retroceda", 4, 100); } if (screen.isPressed (stopId)) {DisplayText ("... deteniendo ...", 0, 100); } if (screen.isPressed (initialId)) {DisplayText ("... comenzando ...", 1, 100); } if (screen.isPressed (turnLeftId)) {DisplayText ("Girando a la IZQUIERDA", 3, 100); } if (screen.isPressed (turnRightId)) {DisplayText ("Girando a la DERECHA", 3, 100); } if (screen.isPressed (llamando al 911Id)) {DisplayText ("Llamando al 911", 0, 100); }}  

Llega un evento, el código verifica qué botón se presiona y llamamos al método DisplayText con las cosas para mostrar.

Y finalmente, ¿cómo llega el texto a la matriz? El método DisplayText se encargará de eso por usted.

  void DisplayText (Mensaje de cadena, 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 (mensaje); --X; matrix.show (); delay (currDelay); }}  

Este método determina qué tan ancha es realmente esta cadena. Necesitamos saberlo, para poder asegurarnos de que la cadena esté completamente desplazada dentro y fuera de la vista. Las letras son 5 de ancho + 1 para el espacio entre las letras.

Construye el recinto

La construcción fue bastante sencilla. Encontré una caja de tamaño decente que era más grande que la huella de la matriz. Conseguí un trozo de abedul báltico de 1/4 "que era más grande de lo que necesitaba y lo corté a la medida.

Utilizando la misma técnica que la sierra de mesa. Comience colocando la matriz sobre la madera contrachapada. Una vez colocado, marque los centros horizontales y verticales de las conexiones (incluida la conexión de alimentación auxiliar). Todo lo que necesita hacer ahora es conectar las líneas para encontrar el centro de los agujeros que está a punto de perforar.

Sí, dije "taladrar", no "taladrar". La última vez que "taladré" agujeros en plástico, obtuve resultados realmente insatisfactorios. Esta vez utilicé brocas Forestner . Tengo una foto de ellos a continuación. Observe que el borde es para cortar y el centro tiene un raspador para sacar la madera no deseada. Hace un "agujero" mucho mejor. Ahora, pase a 'aburrido' y probablemente quiera seguir adelante y perforar los orificios de suspensión.

Consigue un trozo de papel de lija de grano 120 y lija ligeramente toda la pieza. Asegúrese de que la "suavidad" de los bordes de la tabla incluya todos los agujeros que se acaban de hacer. Asegúrese de limpiar la placa para que no quede polvo de sierra de otras "cosas" en la placa.

Ahora es el momento de trabajar en la caja de plástico.

Haz dos agujeros en cada extremo de la caja. Son para el conector de alimentación y la conexión a la matriz. No perfore el orificio de alimentación auxiliar de la matriz todavía.

Ahora, aplique un par de tiras de cinta adhesiva de doble cara en la parte posterior de la caja y fije la caja a la madera contrachapada. Dado que se trata de una cinta "reposicionable", realmente quería que se pegara para siempre. Dejé algunos libros pesados ​​encima y los dejé durante 24 horas. ¿Por qué 24 horas? Las instrucciones de la cinta dicen que no. Esa fue una buena razón para mí.

Es hora de ese último hoyo. Ahora debería tener una posición exacta para el orificio de conexión de alimentación auxiliar. Aburre eso, disfrute de su trabajo de aspecto "preciso".

Ponga la inteligencia en la caja

Parece que la placa de pruebas tenía el tamaño adecuado para la caja, pero quería poder enchufar / desenchufar el conector USB del MKR1000. Entonces, tuve que acortar la placa de pruebas.

Bien, después de ese trauma, despegue la parte posterior de la placa y péguela. Asegúrese de evitar el orificio de conexión de alimentación auxiliar.

Coloque la matriz en la parte delantera de la madera contrachapada pasando las conexiones a través de los orificios. Asegure la matriz con un poco de pegamento caliente.

Hablemos de poder

Aunque tengo el brillo configurado en 40%, la corriente máxima si enciendo los 256 píxeles es de aproximadamente 7.5 amperios. Mucho más de lo que el MKR1000 podría proporcionar. Afortunadamente para mí, ninguna parte de la pantalla es estática y no estoy iluminando ninguna cerca de la matriz completa. La conexión de alimentación auxiliar viene al rescate. Suministro hasta 4A. Supongo que, dado que no es sostenido ni estático, la fuente de alimentación debería ser buena.

También tenía una verruga de pared de repuesto que usé en el extremo para proporcionar energía al MKR1000 cuando estaba encendido en el vehículo.

Estaba pensando en construir un convertidor de energía en el proyecto para tomar la energía del automóvil de 12 V y entregar los 5 V al proyecto. Después de pensarlo mucho, fue mejor en todos los aspectos conseguir un adaptador de CA de 5 V 4 A por $ 5,00 y usar un convertidor de CA que ya tengo. Lo simple suele ser mejor cuando se trata de estas cosas.

Colgar el cartel

Había planeado usar "cordones elásticos de bolas" y algunas ventosas para asegurar esto al parabrisas trasero. Digamos que tengo más trabajo que hacer en la zona.

Código

El código de agradecimiento
https://github.com/pulcher/mkr1000_challenge

Esquemas

El MKR1000 es solo un micro, ya que el MKR1000 real aún no se ha lanzado.

Proceso de manufactura

  1. UnifiedWater v1
  2. Cuadro de votación móvil
  3. Arduino101 / tinyTILE BLE:Gafas de sol para combinar
  4. Whac-A-Mole (Edición Botón)
  5. Jukebox moderno
  6. Arduino Apple Watch
  7. Arduino casero, receptor de todas las bandas Si4730 (LW, MW, SW, FM)
  8. Replicador de infrarrojos conectado a Internet
  9. Todo sobre los acabados de PCB, explicado
  10. Erosión por chispa EDM:¿De qué se trata?
  11. Cojinetes de brida explicados en todas sus variedades