This is an old revision of the document!
Table of Contents
Protocolo de comunicación
Para transmitir datos entre los dispositivos se usa una trama de 96 bits.
uint8_t frame[12]
El frame se interpreta de esta manera:
x | x x x x | x x x x | x x x [Ctrl] | [pA1] [pA2] [pA3] [pA4] | [pB1] [pB2] [pB3] [pB4] | [pC1] [pC2] [pC3]
- 1 byte de control
- 4 bytes del payload A
- 4 bytes del payload B
- 3 bytes del payload C
Si bien el payload es genérico, según el byte de control los payload pA; pB y pC adquieren distintas funciones.
En cada dispositivo hay un switch case que procesa este byte y dependiendo del contenido, decide cómo procesar la carga de la trama.
case 0x00 (ctrl frame [0000 0000]):
Esta trama proviene del gateway, hay que probar a qué dispositivo iba dirigida. Para esto solamente es necesario comparar los 32 bits del payload B (pB) con el identificador único (devID) del dispositivo receptor.
0000 | x x x x | id0 id1 id2 id3 | x x x [Ctrl]|[pA1][pA2][pA3][pA4]|[pB1][pB2][pB3][pB4]|[pC1][pC2][pC3]
case 0x10 (sensor data frame [0001 0000]):
A station just sent a packet to the server. We should ignore it.
case 0x20 (register frame [0010 0000]):
Another station is broadcasting its 32 bit ID string, attempting to register itself in a gateway with its ID.
GND del OrangePi
Reforzar las líneas de GND, tanto del STM como de las Orange. Sin la masa extra se desconecta aleatoriamente.
Dejitter de entrada
La señal de entrada es la salida del mezclador de RF, después de acondicionar la amplitud a Vmax < 5v, la señal recibida tiene la particularidad que cuando no hay objetos en movimiento, el mezclador devuelve la portadora modulada de forma aleatoria (o al menos no es consistente como cuando hay un objetivo).
Por lo tanto se implementó por código un filtro, para únicamente tomar como válidas las lecturas de objetos en movimiento y de alguna forma descartar el ruido del radar en “reposo”.
La lógica es la siguiente, tipo autocorrelador de medias-longitudes de onda:
- Entra en un bucle
forde n repeticiones - con dos o más bucles
whilese detectan los pulsos de la señal de entrada- se incrementa un contador durante un nivel alto de la señal
- el valor corresponde al tiempo que se mantiene el nivel alto
- se introduce una espera, actualmente tiene hardcodeados 20 ms
- el bucle corre nuevamente y guarda el valor del contador en otra variable
- se comparan los valores más alto y más bajo de los que fueron capturados, para obtener el jitter de la señal
El código:
while (1){ /* * ############################################## * CHECK FOR TIME CONSISTENCY * ############################################## * NO SÉ QUÉ MIERRRRDA HICEEEEEEEEEEEEEEEEE 😅😅😅😅😅😅 * podría tener dos variables auxiliares * auxA y auxB * espero al nivel alto/bajo * incremento auxA mientras dure el nivel * espero los 20ms y espero que termine el nivel donde caí * cuento de vuelta incrementando auxB con el ancho del puso * comparo A - B las veces que haga falta, mientras no me pase del 1000ms * también puedo usar un acumulador y la otra variable que sume un semiciclo y reste al siguiente * si están dentro de cierto límite, los pulsos son parecidos y puedo estimar que es una lectura válida * lo que estaría bueno, sería ponerle nombres un poco más descriptivos a las variables * por ej que una variable auxiliar o temporal se llame aux o temp * el minimo se llame min, el mázimo max, etc. No a, b, c, c_0, a_2, _aux0, etc * lo que hace es correr nsteps veces un bucle y guarda el ancho del pulso * en un array de nsteps elementos, después compara todos y guarda el más grande * contra el más chico, de esa forma sabe si es tolerable la variación */ while(!HAL_GPIO_ReadPin(GPIOB, RADAR_Pin)); // espera un nivel alto, para saber el contexto inicial for(i=0; i < nsteps; i++){ //_delayUsec(50); // qué poronga hace este delay??... chau //AFUERA /* * HIGH LEVEL ...‾‾‾‾‾‾‾‾... */ while(HAL_GPIO_ReadPin(GPIOB, RADAR_Pin)){ // aumenta un contador int de 16 bits inicializado en 0 mientras dure el pulso alto // mentira, solamente espera que el valor deje de ser 1 } // acá si salió del while significa que llegó el final del pulso // acá espera la friolera de 20 ms (a 1 kHz son 20 pulsos) // tampoco sé para qué hace esto 😅 // aaaacá está la papa, auxA tiene el ancho del pulso alto en algún momento // si lo guardo y comparo con el ancho de un pulso 20 ms después, // me debería mostrar la consistencia entre anchos de 2 pulsos aleatorios del tren de pulsos // si este delay lo pongo al principio no tengo que resincronizarme con los pulsos HAL_Delay(20); /* * FALLING EDGE ‾‾‾‾|_____ * qué pasa si cae en un nivel alto después del delay de 20ms?? gg * bueno, espero un par de pulsos más, así lo agarro completo */ while(HAL_GPIO_ReadPin(GPIOB, RADAR_Pin)); while(!HAL_GPIO_ReadPin(GPIOB, RADAR_Pin)); while(HAL_GPIO_ReadPin(GPIOB, RADAR_Pin)){ // acá una vez que empieza un nivel alto aleatorio, aumenta el valor de un entero de 16 bits // en el array de contener intentos _A_n[i]++; } /* * FALLING EDGE ‾‾‾|___ * en este punto ya tengo dos variables (A y B) con el largo de pulsos separados 20 ms uno del otro * mentira, tengo el ancho del pulso del enésimo bucle for */ // necesito guardar el más grande (A) y el más chico (B) y sacar la diferencia (0) if(i == 0){ /* para la primera vuelta, el máximo y el mínimo son lo mismo * */ auxA = _A_n[0]; auxB = _A_n[0]; } if(_A_n[i] > auxA){ // ahora, si esta vuelta es más grande que auxA, guardo en auxA auxA = _A_n[i]; } if(_A_n[i] < auxB){ // pero si esta vuelta es más chica que auxB, guardo en auxB auxB = _A_n[i]; } } // end FOR /* * me interesa saber la diferencia entre el más grande y el más chico * ya que esa diferencia es el fucking jitter, calculado de forma directa! * */ aux0 = auxA - auxB; /* * otra cosa que me interesa es el valor medio de aux0 en el tiempo * dice cuánto se incrementa el jitter * puedo hacer mean = (aux0(n) + mean)/2 */ meanJitter = (aux0 + meanJitter)/2; //ToDo: hacer configurable maxjitter y nsteps // hacer que desde alguna parte pueda poner los valores y un "send" para establecerlos // revisar los docs if(aux0 < maxJITTER){ // y si el resultado está dentro de lo permitido... // puedo tomar el tiempo T que demoran n pulsos // GetTick() se configura automáticamente con hal init // https://stackoverflow.com/questions/42747128/does-hal-gettick-return-ticks-or-milliseconds-and-how-to-measure-in-microsec timerTick_0 = HAL_GetTick(); for(i=0; i<(100*nsteps); i++){ while(HAL_GPIO_ReadPin(GPIOB, RADAR_Pin)); while(!HAL_GPIO_ReadPin(GPIOB, RADAR_Pin)); } // T_00ms contiene los ms x100 de cada pulso // o sea T_00ms == 100 significa que cada periodo fue de 1 ms // después se implementa la matemática para pasar de T a velocidad // la frecuencia mucho no me sirve, pero sería (100/T_00ms)x10³ T_00ms = (HAL_GetTick() - timerTick_0)/nsteps; } else{ T_00ms = 0; } } /* ################################################## * * USER CODE END WHILE * * ################################################## * */ /* USER CODE BEGIN 3 */ /* USER CODE END 3 */ }
Estructura del informe
Palabras clave Dedicatoria y agradecimientos Resumen Abstract Índice de Figuras Índice de Tablas 1. Introducción 1.1 Contexto temático 1.2 Definición del problema 1.3 Motivación 1.4 Objetivos 1.4.1 Objetivo general 1.4.2 Objetivos específicos 1.5 Contribución esperada y alcance 1.6 Metodología 2. Marco teórico 2.1 Internet de las cosas (IoT) 2.1.1 ¿Qué es IoT o ‘Internet de las cosas’? 2.1.2 IoT Industrial 2.2 Bases de Datos 2.2.1 Redis 2.2.2 InfluxDB 2.3 STM32 2.3.1 STM32F103 2.4 Arquitectura ARM 2.4.1 H3 Quad-core Cortex-A7 2.4.2 Linux sobre Plataformas ARM 2.5 Lenguajes de programación 2.5.1 Lenguaje C 2.5.2 Python en Sistemas Embebidos 2.6 Radar Doppler Microondas 2.6.1 Generalidades 2.6.1.1 Introducción, Principios Básicos y Características Generales 2.6.1.2 Radar Doppler 2.6.1.3 Bandas de Radiofrecuencia y Aplicaciones 2.6.1.4 Bandas I/J (Radares de Banda X y Ku) 2.6.1.5 Implementación del radar Doppler 2.6.2 Uso en metrología legal 2.6.3 Filtrado Analógico 2.6.4 Filtrado Digital 2.6.4.1 Filtrado por Autocorrelación 3. Diseño 3.1 Diseño del Sistema 3.1.1 Diagrama General del Sistema Propuesto 3.1.2 Selección de Dispositivos de Cómputo (MCUs y CPUs) 3.1.2.1 Selección de los microcontroladores 3.1.2.2 Selección de los CPU para los gateways 3.1.3 Selección de Sensores y Periféricos 3.1.4 Selección de Software 3.1.5 Diseño del Endpoint 3.1.6 Diseño del Gateway 3.1.7 Diseño de la Aplicación Web 4. Implementación 4.1 Enfoque y metodología 4.2 Implementación del Endpoint 4.2.1 Implementación del contador de frecuencia y filtrado 4.2.1.1 Contador de frecuencia 4.2.1.2 Filtrado 4.2.2 Implementación de las comunicaciones 4.2.3 Display 4.2.4 Acondicionamiento de la entrada de señal del radar 4.3 Implementación del Gateway 4.4 Implementación de la aplicación web 5. Pruebas 5.1 Optimización del filtro autocorrelador 5.1.1 Mediciones en reposo / solo ruido de fondo 5.1.2 Mediciones de la señal de calibración 5.1.3 Costo computacional de leer el GPIO 5.2 Pruebas de interferencia 5.3 Simulación con un generador de señales 5.4 Pruebas sobre vehículos 6. Análisis de Resultados Experimentales y Discusión 7. Conclusiones 7.1 Recomendaciones para versiones futuras Bibliografía Anexo A: Bucle infinito del endpoint Anexo B: Callbacks del MCU B.1 Interrupción del temporizador B.2 Interrupción DMA (Buffer UART Rx) Anexo C: Bucle infinito del gateway
Notas de Presentación
Comenzar con una Historia o Anécdota
Comienza con una historia o anécdota que conecte emocionalmente con la audiencia. Diapositivas 1 - 5. (3-4 minutos)
- Presentación inicial
- Motivación del proyecto
Introducción y motivación Creo que jamás le he dedicado más tiempo a algún proyecto que a este. La idea detrás de este proyecto se basa en la percepción vs. la realidad de la velocidad al conducir. Por ejemplo, cuando manejamos no estamos constantemente mirando el velocímetro. Después de horas en una autopista a 120 km/h, es fácil entrar a un pueblo y seguir yendo a 60 km/h sin darse cuenta. Este fenómeno es común. El proyecto busca ayudar a los conductores a ser conscientes de su velocidad real y no solo de la percibida.
Qué sucede si uno va por un camino y de pronto ve un cartel luminoso que muestra la velocidad que llevás? 🤔. Pueden pasar dos cosas, o te das cuenta que vas más rápido de lo que pensabas, o tal vez vas bien y mantenés el ritmo o lo usás para organizar con la gente del barrio un torneo para ver quién pasa más rápido (hay estudios sobre esto). Sin embargo, es probable que la mayoría ajuste su conducción para ir más despacio. Esta simple retroalimentación puede hacer una gran diferencia en la seguridad vial, especialmente en zonas urbanas o críticas.
—
Presentar la Solución de Forma Clara
Introduce tu solución sin entrar en demasiados detalles técnicos, centrándote en cómo mejora la situación. Diapositivas 6, 7. Mostrar los componentes principales de la PoC. (4-5 minutos)
- Descripción del sistema
- Elección de componentes (por qué radar Doppler, etc.)
- Escalabilidad y comparación con soluciones comerciales
La Solución
El proyecto se basa en desarrollar un sistema que mide la velocidad de los vehículos utilizando un radar Doppler de microondas y luego muestra esa información en tiempo real en una pantalla LED. Los datos también se almacenan para análisis futuros, dado que el costo de implementar esta característica es relativamente bajo y las ventajas son muchas: esto permite entender mejor los patrones de velocidad y tomar medidas de seguridad y reglas de tránsito más efectivas.
El sistema está diseñado con la escalabilidad en mente. Aunque la primera versión no soporta múltiples sensores y puntos de control, la arquitectura adoptada permite agregar estos componentes en el futuro sin necesidad de un rediseño significativo. Fue elegido el radar Doppler por varias razones: es más fiable que los tubos neumáticos que se desgastan con el tráfico, o que el ultrasonido que falla con el clima adverso, o que los loops inductivos o placas piezoeléctricas que requieren levantar el pavimento para su instalación.
Se investigaron las soluciones comerciales existentes, que aunque son efectivas, suelen ser caras y opacas en su funcionamiento. Se apuntó a una solución más económica, modular y transparente, sin perder de vista la capacidad de medir la velocidad de manera precisa.
—
Destacar los Beneficios
Enfatiza los beneficios de tu proyecto de manera que el público pueda ver su valor.
Beneficios e impacto
Estos sistemas de retroalimentación dinámica y en tiempo real de la velocidad están probados que disminuyen, en promedio, unos 8 Km/h la velocidad en una zona. En el percentil 75, se disminuye en promedio 11 Km/h. Teniendo en cuenta que con la velocidad aumenta casi de forma exponencial la gravedad de las lesiones ante un choque, en el largo plazo, implementar los indicadores ayuda a hacer más seguras ciertas zonas críticas, como túneles, puentes, curvas pronunciadas y zonas urbanas o con animales.
—
Vista Previa de la Presentación
Ofrece una breve vista previa de lo que cubrirás en la presentación.
Diseño e implementación
En las próximas diapositivas les cuento, a grandes rasgos, sobre cómo funciona el sistema, los componentes clave que utilizamos, los resultados obtenidos hasta ahora en esta primera versión y cómo este proyecto puede crecer y adaptarse en el futuro.
«acá hablo sobre los componentes y algoritmos utilizados»
- Hardware:
- Radar Doppler: Utilizado para medir la velocidad de los vehículos.
- STM32: Microcontrolador encargado del procesamiento de datos del radar.
- Transceivers: Facilitan la comunicación entre los diferentes módulos del sistema.
- Orange Pi: Mini computadora para procesamiento central y gestión de datos.
- Software y Bases de Datos:
- Redis: Base de datos en memoria para almacenamiento rápido y recuperación de datos.
- InfluxDB: Base de datos optimizada para series temporales, esencial para almacenar y analizar datos históricos de velocidad.
- Trama de Comunicaciones:
- Diseño y desarrollo de una trama de comunicaciones eficiente y adaptada a la transmisión de datos entre el MCU y la Orange Pi.
- Filtrado de la señal:
- Diseño e implementación del filtrado digital de la señal del radar Doppler.
—
Resultados
- Objetivo cumplido: Se logró desarrollar la plataforma de adquisición de datos de telemetría.
- Recomendaciones: Instalar el sistema cerca del área de recolección de datos para mejorar la precisión, considerando el retraso de 1 segundo en la presentación de datos.
- Ventaja principal: Flexibilidad para operar con diversos dispositivos y sensores.
- Precisión y velocidad aceptables: El sistema muestra una precisión y velocidad de operación adecuadas, con visualización de datos efectiva utilizando InfluxDB Cloud.
Reflexiones
Reflexiones sobre IoT
En el universo de los artefactos y soluciones basadas en IoT, uno investigando se encuentra que la simplicidad del concepto se ve afectada por el nombre: conectar cosas a Internet. A grandes rasgos, IoT pretende dotar de cierta inteligencia a objetos cotidianos, como una cafetera, por ejemplo, conectándola a un cronómetro o un timer para así garantizar café a la mañana (o a un horario en particular). Aunque la definición del problema y la solución son claras (obtener café a tal hora), la implementación, al entrar en el universo IoT, implica la inserción de microcontroladores, código y conexiones inalámbricas en dispositivos cotidianos para permitir su programación, habiendo podido, probablemente, lograr el mismo objetivo con una complejidad menor del sistema. Este sobredimensionamiento de soluciones, si bien facilita la comunicación y colaboración entre dispositivos; y con algo de suerte y buenos criterios de diseño, mejora la escalabilidad de los sistemas, también aporta retos significativos. Aparecen dos potenciales problemas: la seguridad del dispositivo y la percepción de valor del usuario.
Desde la perspectiva de la Seguridad, el historial de la industria de IoT no es el mejor, lo cual, tanto en entornos personales como industriales, genera cierta inquietud sobre la seguridad y protección de los datos. La conectividad generalizada, aunque resulta prometedora, también abre la puerta a posibles abusos, un tema que ha sido subrayado con preocupación en algunos sectores (industriales y de la salud, por ejemplo).
La reflexión sobre IoT del ámbito hogareño (el consumer grade) viene a que la etiqueta “inteligente” aplicada a IoT muy a menudo se traduce en la capacidad de operar un dispositivo mediante una aplicación móvil. En muchos casos, esto implica una implementación compleja de una simple conectividad inalámbrica, ofreciendo finalmente una utilidad bastante limitada en comparación con las expectativas generadas en el consumidor por la etiqueta de ser un artefacto “inteligente”.
Criterios de diseño y sobredimensionamiento de soluciones
Un principio fundamental en el diseño es que la solución más simple suele ser la más adecuada. Sin embargo, existe una tendencia a diseñar pensando en las características y capacidades de la tecnología que queremos usar, habilitando e instalando todo lo posible y agregando funciones “por las dudas”. A medida que el producto madura, este enfoque suele requerir una limpieza del diseño para eliminar la complejidad innecesaria y centrarse en la funcionalidad esencial.
El diseñador Dieter Rams (some German mf) enfatizaba que “el mejor diseño es el menor diseño posible”. El concepto remarca la importancia de la simplicidad y la funcionalidad sobre la complejidad innecesaria.
Story time: he visto sitios web, por ejemplo, con implementaciones demasiado complejas, innecesariamente complejas, como un caso específico donde había dos ambientes (Dev/QA y Producción) con varios contenedores, pero los desarrolladores y los que se encargaban de mantener el sitio nunca se pusieron de acuerdo en cómo hacer los pases a Producción, entonces los cambios se realizaban directamente en el storage del ambiente productivo en Azure. Había un servicio de frontdoor y una CDN para un sitio que era solo un formulario y contenido estático. Este es un claro ejemplo de los males del sobredimensionamiento de soluciones. La simplicidad no solo mejora la eficiencia, la velocidad de ejecución y abarata costos, sino que también facilita el mantenimiento y la seguridad del sistema.
