El Proyecto Tricorder ODROID-GO

Figura 1 - Tricorder

Para aquellos que no saben qué es un Tricorder, permitirme que lo explique: En la nueva serie de Star Trek, los personajes a menudo llevan un dispositivo móvil que se usa para medir desgarros en el continuo espacio-tiempo y decir “Está muerto, Jim.”

Figurea2 - Tricorder del Star Trek

Aunque gano dinero trabajando con software, siempre he tenido una cierta afinidad por el hardware: los chips cableados y otros componentes digitales integrados. Empecé con circuitos basados en chips lógicos TTL y CMOS estándar. Un día, descubrí la serie programable ATMEL AVR. Mi viaje continuó y descubrí la chulada del ESP8266 de Espressif. Después de un tiempo, busque el ESP32 (WROOM32) para mis proyectos.

Ya había hecho proyectos con sensores (es decir, BME280) utilizando el bus I2C. También he tenido proyectos que usaban pantallas y botones para la visualización y el control. Lo que nunca he tenido es una buena combinación de todo esto, reunido en un único dispositivo con una batería.

Luego Hardkernel apareció con su ODROID-GO, la combinación perfecta para mí. Me ha estado rondando durante mucho tiempo la idea de un dispositivo multisensorial. Ahora era el momento de embarcarse en el proyecto.

Conceptos básicos

El ODROID-GO tiene un cabezal de expansión con 10 pines. Tres de ellos son de alimentación, uno no está conectado y otros son para SPI (lo cual podría interferir con el rendimiento de la pantalla). Al menos dos de los pines, GIO15 y GPIO4, no han sido utilizados por ninguna otra cosa. Solo lo suficiente para I2C. Con el ESP32, I2C se puede asignar a casi cualquier pin IO. No existe mapeo estático. ¡I2C era la clave!

Ahora tenía que averiguar qué sensores funcionan con I2C. Hay muchos de ellos. Después de echarle un rato a google terminé eligiendo estos:

  • BNO055 para la orientación (balanceo, inclinación, giro) y la aceleración.
  • BME280 para la presión, temperatura y humedad del ambiente.
  • VL53L0X para medir la distancia (0-120cm).
  • VEML6040 para medir la LUZ (RGB, LUX).
  • VEML6075 para medir el UV (UVA, UVB => Índice UV).
  • CCS811 para medir las concentraciones de CO2 y gas COV.
  • Mics6417 para medir ocho gases más y su concentración.
  • MLX90416 para medir la temperatura (IR) de objetos de -70 a 300 grados Celsius (como los termómetros sin contacto).

Comprar los sensores

¿Dónde comprar los sensores? Decidí recurrir a eBay y a sus innumerables vendedores chinos.

Los sensores tardan aproximadamente un mes en llegar, pero tienden a tener los precios más bajos. Por supuesto, compre varios de cada tipo por si acaso quemaba alguno de ellos. No quería esperar otro mes a que me llegaran los reemplazos. Por lo general, el coste ronda los 3-6 € por sensor. La excepción estaba en los micrófonos, unos 50 €.

Desarrollo de prototipos

Una vez que los sensores me llegaron de China, los revisé conectándolos al ODROID-GO a través de una placa de pruebas. Escribí un pequeño programa de prueba para producir una salida en serie y mostrar los valores en la pantalla del ODROID.

Figura 3 – Placa de pruebas

También decidí crear algunas placas para hacer experimentos con el fin tener una mejor idea de cómo sería el resultado final.

Figura 4 - Placa experimental 1

Figura 5 - Placa experimental 2

Esquemas (cableado general)

Por lo general, cablear los sensores I2C es bastante simple. I2C es una interfaz tipo bus. Simplemente conecta todos los pines SCL y SCK juntos y conecta estas 2 conexiones a VCC a través de resistencias (Pullup).

Además, proporciona energía (VCC, GND). El voltaje estándar para los sensores es 3.3V. Afortunadamente, el ODROID-GO ofrece 5V y 3.3V. Cada dispositivo en un bus I2C tiene su propio ID. De esta forma, el controlador (maestro) puede atender a cada sensor (esclavos) en el bus. Además de los cuatro pines mencionados, algunos sensores tienen pines adicionales que influyen en su comportamiento o les permiten responder a diferentes direcciones I2C.

En mi caso, no fue tan sencillo conectar todos los sensores ya que los sensores VEML usan la misma dirección I2C de 0x10. En lugar de usar una complicada lógica para evitarlo, decidí usar un Switch I2C (TCA9543a). El que elegí tiene tres puertos I2C. Un puerto se comunica con el ESP32 y es el puerto de "entrada", mientras que los otros dos están conectados a los sensores. Los VEMLs se colocan en diferentes puertos. El switch puede programarse para pasar la comunicación I2C al puerto 1 o al 2.

Desde la perspectiva de la programación, debes indicar al switch que active el puerto 1 o el puerto 2 y luego consultar los sensores conectados a ese puerto. Cambia al otro puerto y consulta el resto de sensores. Realmente no es gran cosa.

Al final se me ocurrió este esquema:

Figura 6 – Esquema

Utilicé DesignSparkPCB para todos mis esquemas y más tarde para transformar los esquemas en un diseño PCB. Es gratis y lo recomiendo encarecidamente. Se te pedirá que te registres, aunque esto parece ser algo obligatorio para la mayoría de las cosas hoy en día y por el valor que obtiene a cambio, el registro vale la pena.

Un factor importante del software de la PCB es la capacidad de ésta para aceptar tus propios componentes. Intenté encontrar las librerías de los componentes para los sensores que utilicé, pero no logré encontrar ninguna que fuera gratuita. Me di por vencido y simplemente las diseñé, lo cual es posible con este programa.

Placa de circuito impreso (PCB)

Partiendo de los esquemas pude crear una PCB en DesignSparkPCB. Debido al exceso de cableado, no creo que una PCB de una única capa sea posible. Parece ser necesario una PCB de dos caras.

Muchas herramientas de PCB ofrecen el cableado automático. Con bastante frecuencia esto produce conexiones extrañas, así que opté por canalizar los cables yo mismo. DesignsparkPCB, como todas las herramientas, ayuda a evitar que te olvides de los cables.

Figura 7 - Diseño de PCB

El rojo y cian indican el cableado en la capa superior e inferior. El amarillo y el azul tienen fines de documentación y se pueden imprimir en la PCB. De esta forma, podrás ver con facilidad qué dispositivo se colocarán y se soldarán y en qué posición.

Una vez completado el diseño de PCB, ahora se debe fabricar. Algunas personas hacen esto por su cuenta. En el pasado yo también lo hice por mi cuenta, pero nunca me gustó la química que hay detrás de ello. Además, hay 2 capas involucradas, lo cual requiere una alineación muy precisa de las mismas. Dudo que pueda hacerlo por mi cuenta. Decidí entonces recurrir a una empresa profesional que lo hizo por unos 25 €.

Figura 8 - PCB 1

Figura 9 - PCB 2

Para reducir los costes de producción, decidí no usar material de soldadura e imprimir la documentación.

Tiempo de montaje

Finalmente, teniendo la PCB en la mano, el montaje de los sensores recurriendo a la soldadura fue sencillo.

Figura 10 - Asamblaje

Haciendo mis primeras pruebas con el software para ver si ESP32 podía encontrar todos los sensores, me di cuenta que cometí un error en el diseño. Tenía la intención de tener el BME280 en la parte inferior de la PCB. Al tenerlo soldado en el lugar equivocado, VCC y GND fueron conectados a los pines incorrectos. El BME dejó de fumar. A veces las cosas salen mal, 4€ tirados a la basura. Por eso se suele pedir más de uno. Por suerte, este error no afectó a los otros sensores o al ODROID-GO. El sensor de gas Mics cuesta unos 50€ y solo dispongo de uno. Quemar éste te dolería bastante más. El problema fue resuelto fácilmente. El siguiente BME280 simplemente lo soldé sobre el sensor de orientación BNO055.

Software (el diseño de la interfaz de usuario)

No soy diseñador. Hacer las cosas bonitas no es lo mío. Normalmente trabajo más bien a un nivel funcional. En este caso en concreto, quería demostrarme a mí mismo que estaba equivocado y deseaba hacer una buena interfaz de usuario para el Tricorder.

Desde un punto de vista funcional, estaba bastante claro que no era técnicamente posible realizar un repintado completo de la pantalla (320x240 píxeles) simplemente para actualizar algunos valores de medición, probablemente varias veces por segundo. La pantalla no es lo suficientemente rápida para ello. El resultado sería un continuo parpadeo. Sin embargo, estaría bien incluir algunos elementos gráficos en la interfaz de usuario. Esto me llevó a diseñar completas pantallas con imágenes de fondo JPG y áreas gráficas vacías que sirvieran como marcadores de posición. En el caso donde la pantalla fuera trazada por primera vez, se dibujaría la imagen completa de fondo y luego se pegarían los valores del sensor. Para el resto de valores posteriores, solo se deberían volver a trazar las áreas de los marcadores de posición. Esto mejora notablemente la capacidad de respuesta de la interfaz de usuario.

También era obvio que existían demasiados valores de medición para ponerlos todos en una única pantalla al mismo tiempo. Introduje pantallas que podrían alternarse usando los botones "A" y "B".

Lo más difícil fue crear un estilo particular para las imágenes de la pantalla. Hice varios intentos y ninguno me convencía. Entonces tuve una idea. Es un Tricorder de Star Trek, así que lo haría al estilo del Star Trek. Busqué en Google Images del tricorder de Star Trek y aparecieron toneladas de imágenes interesantes. Fue a partir de entonces cuando el estilo del diseño me quedó claro.

Probé con varios programas de dibujo disponibles de forma gratuita, pero terminé con paint.net, que suelo usar para la mayoría de mis proyectos gráficas.

Software (la lógica de control)

Puedes programar el ESP32 usando el SDK de Espressif (ESP-IDF) directamente en C ++, pero la funcionalidad que proporciona parece estar a un nivel muy básico. Arduino es un ecosistema muy popular que proporciona algo de abstracción desde el nivel más bajo mientras siga siendo C/C++. Otra ventaja a la hora de usar Arduino es el hecho de que existe una gran cantidad de librerías para todos los sensores, lo cual facilita su uso.

Para Arduino puedes usar el Arduino IDE, con el que empecé hace unos años. Fue entonces cuando me topé con PlatformIO. Viene como un plugin para el editor ATOM o VS-CODE. Usé ambos y descubrí que me gustaba más VS-CODE.

Entrar en detalles sobre cómo programar para ESP32 en el mundo de Arduino con VS-CODE puede hacer que este artículo se extienda demasiado. ODROID Magazine ya cuenta con artículos sobre programación con ODROID-GO. Puede ser más interesante centrarnos en las cosas que normalmente no suele hacerse en una implementación de ESP32.

Nunca he tenido que lidiar con archivos binarios en mi código para el ESP32. La forma de hacerlo para ODROID-GO (y ESP32 en general) es con SPIFF. SPIFF es un sistema de archivos para ESP32. Puedes cargar archivos binarios en un área especial de la memoria flash del ESP32 (la partición SPIFF).

Para el ODROID-GO, existe una colección de librerías que puedes utilizar para hacer frente al hardware del GO (altavoz, botones, pantalla, incluso sensores potenciales). La librería de la pantalla admite la visualización de archivos JPG almacenados en la partición SPIFF

Lo que tienes que hacer es cargar los JPG en el ESP usando PlatformIO. Después de hacer esto, puedes programar el ESP y acceder a los archivos cargados en tu código proporcionando los nombres de archivo. Esto hace que sea relativamente fácil rellenar la pantalla de GO con un archivo JPG; se necesita una única línea de código.

Otra cosa que tenía que hacer era modificar algunas librerías de sensores. Estas librerías a menudo se escriben para trabajar con más de un controlador, gracias a la abstracción de Arduino. Esto conlleva algunos problemas si el ESP32 funciona de un modo diferente en algunas áreas. Los cambios que tenía que hacer no eran demasiados.

El estado actual del software

Las siguientes imágenes muestran las diferentes pantallas que ya he diseñado. Como he mencionado anteriormente, pueden cambiar de una pantalla a otra con el botón A o B.

Fase de inicialización

Figura 11 - Pantalla de inicio

Los sensores necesitan ser activados. Un buen momento para la pantalla de bienvenida. Probablemente debería haber limpiado la pantalla antes de haber tomado la foto.

Sensores ambientales

Figura 12 - Pantalla ambiental

La pantalla ambiental contiene los valores del sensor de BME, VEML6040 y VEML6075. Estos son la temperatura (en grados centígrados), la humedad (en%), la presión (en hPa), la intensidad de la luz (en LUX) y el índice UV (es un número que indica cuanto de peligroso es el nivel actual de UV)

Sensor de luz (RGB)

Figura 13 - Pantalla de luz

La vista de luz proporciona información detallada sobre la distribución del color rojo, verde y azul en la luz visible. Las longitudes de onda exactas medidas por el sensor se pueden verificar en las especificaciones técnicas de VEML.

La distribución se presenta en un gráfico de barras con los coleres rojo, verde y azul.

La intensidad de la luz en LUX ya estaba presente en la pantalla ambiental y se puede ver aquí nuevamente.

La temperatura del color indica si la luz es "cálida" o "fría". Los valores más altos indican luz fría (azul), los más bajos indican luz cálida (rojo)

La vista de los gases

Figura 14 - Pantalla de gases

La vista de gases presenta mediciones del sensor Mics y de CCS811. Diez gases en total.

La unidad de las medidas es partes por millón (ppm). Los gases aparecen por sus fórmulas químicas, ya que los nombres no caben en la pantalla.

  • CO - monóxido de carbono: puede causar asfixia con facilidad. Difícil de recuperar de la exposición.
  • H2 - Hidrógeno: Junto con el oxígeno, tienes una alta probabilidad de que tu casa salte por los aires. También se utiliza en los propulsores de los cohetes.
  • NO2 - Dióxido de nitrógeno: Tóxico.
  • C2O5OH - Etanol: Alcohol. Me gustan estos compuestos en diversos formatos
  • NH3 - Amoniaco: Olor intenso. Uno fuente puede ser la mierda. No saludable por supuesto.
  • CH4 - Metano: peor que el CO2 en términos de gases de efecto invernadero. Inflamable si O2 está presente.
  • C3H8 - Propano: La gente lo usa para disparar cosas.
  • C4H10 - Butano: También inflamable. Gas de camping.
  • CO2 - Dióxido de carbono: esto es lo que expiramos y lo que las plantas necesitan para vivir. Causa problemas como el gas de efecto invernadero.
  • COV - Gases compuestos volátiles: sustancias en forma gaseosa a temperatura ambiente. No se define con precisión qué gases se detectan. Es solo un indicador. Cuanto mayor sea el valor, peor es.

En la captura de pantalla que ves parece haber propano y butano alrededor del Tricorder. Esto se debe al hecho de que el sensor de gas Mics necesita algo de tiempo para que se calentase antes de proporcionar valores precisos. No quería esperar 10 minutos para tomar la foto.

Distancia

Figura 15 - Pantalla de distancia

La distancia entre el Tricorder y un objeto al que se apunte puede variar entre 0 y 120 cm. Se muestra en forma de un gráfico de barras con un número (la barra blanca).

Temperatura

Figura 16 - Pantalla de temperatura

La temperatura de un objeto se muestra de la misma forma que la distancia. Se proporciona con un número y un gráfico de barras (barra roja). La unidad es Celsius

Orientación

Figura 17 - Pantalla de orientación

La orientación fue lo más difícil para diseñar una página. Los simples números no proporcionan un significado intuitivo. La solución actual posiblemente no sea la mejor. Espero poder encontrar algunas ideas mejores.

A la izquierda, se muestra un rollo. Si el Tricorder se gira en el sentido contrario a las agujas del reloj, el número azul a la izquierda se muestra en la posición inferior (como en la captura de pantalla). Si se gira en el sentido de las agujas del reloj, el número se mostrará en la posición superior, tal y como un ángulo en grados (0-180).

Para la inclinación, es lo mismo. Si el Tricorder apunta hacia arriba, el número que indica el ángulo de rotación se muestra en la posición superior (como en la captura de pantalla). Si apunta hacia abajo, el número se muestra en la posición inferior.

La dirección (amarillo) sólo es el ángulo al que apunta el Tricorder (norte, sur, este, oeste), de 0 a 359.9 grados. Esto puede ser usado como un compás.

Calibración

Los sensores envían valores de medición. ¿Cómo de exactas son estas mediciones? Sin una referencia es complicado saberlo. Es fácil cotejar la medición de la distancia. La temperatura es algo más complicado. La intensidad de la luz también requiere más esfuerzo, por ejemplo, habría que buscar un dispositivo de medición que nos diera una referencia. Casi imposible son de verificar las concentraciones de gas. Tengo la intención de investigar cómo puedo mejorar en este aspecto.

Implementar cosas como hold/min/max

Si conoces los multímetros, sabrás que estos dispositivos a menudo tienen la capacidad de rastrear valores mínimos, máximos o promedios. También es muy común congelar la pantalla para que muestre una medición durante más tiempo. El Tricorder también podría necesitar esto, lo cual requerirá un mayor uso de los botones del ODROID.

¿Exportar las mediciones de forma inalámbrica?

Actualmente las mediciones solo se muestran en la pantalla del ODROID. El ESP32 puede funcionar con WiFi y Bluetooth (BLE y SPP clásico). El Tricorder podría mejorarse para que envíe las mediciones "por el aire". MQTT y BLE son los candidatos. Ambos son válidos para el ESP32.

Actualmente no le veo el uso a este proyecto. Un posible proyecto sería una "dispositivo de medición". Sus mediciones podrían mostrarse utilizando tu dispositivo móvil. Sin embargo, para esto, no sería necesario el ODROID-GO.

Aceleración

Actualmente solo uso el sensor BNO055 para el balanceo, inclinación y dirección. Es capaz de hacer más, como medir la aceleración (fuerzas g).

Carcasa

Dispongo de una impresora 3D. Seguramente me planteé crear una carcasa para la electrónica del Tricorder que de alguna manera se ajuste a la carcasa del ODROID-GO.

Be the first to comment

Leave a Reply