Tabla de contenido:

Arduino UNO Logic Sniffer: 8 pasos (con imágenes)
Arduino UNO Logic Sniffer: 8 pasos (con imágenes)

Video: Arduino UNO Logic Sniffer: 8 pasos (con imágenes)

Video: Arduino UNO Logic Sniffer: 8 pasos (con imágenes)
Video: 35 видео со страшными призраками: мегасборник 2023 года [V1] 2024, Mes de julio
Anonim
Sniffer lógico Arduino UNO
Sniffer lógico Arduino UNO

Este proyecto comenzó como un simple experimento. Durante mi investigación sobre la hoja de datos de ATMEGA328P para otro proyecto, encontré algo bastante interesante. La unidad de captura de entrada Timer1. Permite que nuestro microcontrolador Arduino UNO detecte un borde de señal, almacene una marca de tiempo y active una interrupción, todo en hardware.

Luego me pregunté en qué aplicación podría ser útil y cómo probarlo. Como quiero obtener un analizador lógico desde hace algún tiempo, decidí intentar implementar uno en mi placa Arduino UNO, solo para probar la función y ver si podemos obtener buenos resultados con ella.

No soy el único que tuvo esta idea, y encontrará muchas de ellas simplemente buscando en Google "Arduino Logic Analyzer". Al comienzo del proyecto, como acababa de comenzar como un experimento, ni siquiera sabía que la gente ya lo había hecho y me impresionaron los buenos resultados que lograron con esta pequeña pieza de hardware. Sin embargo, no pude encontrar otro proyecto usando la unidad de captura de entrada, así que si ya ha visto esto, ¡hágamelo saber!

Para resumir, mi analizador lógico:

  • Tener un canal
  • Tener una interfaz gráfica,
  • Comunicarse con la interfaz a través de USB,
  • Ejecutar en una placa Arduino UNO.

Finalmente tendrá una profundidad de memoria de 800 muestras y pudo capturar con éxito un mensaje UART de 115200 baudios (realmente no lo probé a velocidades más altas).

Este instructivo contiene las partes de "cómo funciona" y "cómo usarlo" de este proyecto, por lo que para aquellos que no están interesados en el aspecto técnico, pueden saltar directamente al paso 4.

Suministros

Quería mantener el analizador lo más simple posible, por lo que requería muy poco hardware.

Necesitará:

  • Una placa Arduino UNO (o equivalente siempre que se base en la MCU ATMEGA328P),
  • Un ordenador,
  • Algo para depurar (otra placa Arduino UNO funciona bien para hacer algunas pruebas).

El código para Arduino UNO y la interfaz web se puede encontrar aquí. También necesitará el software p5.serialcontrol y PulseView.

Paso 1: Principio de funcionamiento

Principio de funcionamiento
Principio de funcionamiento

La idea es sencilla. Usted elige la configuración de captura y hace clic en "adquirir". La interfaz web los enviará al software p5.serialcontrol, que nos permite usar la interfaz serial desde un navegador, ya que no puede acceder directamente. El software p5.serialcontrol luego transmite la información a la placa Arduino UNO, que captura los datos y los envía de regreso a la interfaz a través de la misma ruta.

¡Fácil! Bueno … Como no soy muy bueno en la programación de interfaces Hombre / Máquina o en tecnologías web, la mía es ciertamente un poco fea y con errores. Pero me permite iniciar una captura y recuperar mis datos, que es para lo que ha sido diseñado, así que creo que está bien. Para un trabajo de análisis más serio, importo mis registros a PulseView, que es fácil de usar y ofrece un buen conjunto de características y decodificadores de protocolo, como veremos más adelante.

La unidad de captura de entrada de Arduino UNO se puede configurar para usar diferentes divisiones de reloj, reduciendo así la resolución, pero aumentando el retraso antes del desbordamiento. También puede activarse al subir, bajar o en ambos flancos para comenzar a capturar los datos.

Paso 2: Arduino UNO Sketch

Bosquejo de Arduino UNO
Bosquejo de Arduino UNO

Escribí y compilé el boceto con Arduino IDE. Primero comencé configurando el Timer1 en modo de operación "Normal" escribiendo en sus registros TCCR1A y TCCR1B en la configuración (). Luego hice algunas funciones para facilitar un poco su uso en el futuro, como la de configurar la división de reloj llamada "setTim1PSC ()". También escribí funciones para activar y desactivar la unidad de captura de entrada Timer1 y las interrupciones de desbordamiento.

Agregué la matriz de "muestras", que contendrá los datos adquiridos. Es una matriz global que configuré en "volatile" para evitar que el compilador hiciera optimizaciones y la pusiera en flash, como estaba haciendo durante mis primeras compilaciones. Lo definí como una matriz "uint16_t", ya que el Timer1 también es de 16 bits, con una longitud de 810. Dejamos de capturar en 800 valores, pero como la prueba se realiza fuera de las interrupciones por razones obvias de velocidad, elegí mantener 10 más valores para evitar desbordes. Con algunas variables adicionales para el resto del código, el boceto usa 1313 bytes (88%) de memoria, dejándonos con 235 bytes de RAM libre. Ya tenemos un alto uso de memoria y no quería agregar más capacidad de muestra, ya que podría causar comportamientos extraños debido a muy poco espacio en la memoria.

En mi búsqueda por aumentar siempre la velocidad de ejecución, usé punteros de función en lugar de declaraciones if dentro de las interrupciones, para reducir su tiempo de ejecución al mínimo. El pin de captura siempre será el número 8 de Arduino UNO, ya que es el único conectado a la unidad de captura de entrada del Timer1.

El proceso de captura se muestra en la imagen de arriba. Comienza cuando Arduino UNO recibe un marco de datos UART válido, que contiene la configuración de captura deseada. Luego procesamos esas configuraciones configurando los registros correctos para capturar en el borde elegido y usamos la división de reloj correcta. Luego habilitamos la interrupción PCINT0 (cambio de pin) para detectar el primer flanco de señal. Cuando lo obtenemos, restablecemos el valor del Timer1, deshabilitamos la interrupción PCINT0 y habilitamos la interrupción de la ICU (Unidad de captura de entrada). A partir de ese momento, cualquier flanco descendente / ascendente de la señal (dependiendo de la configuración elegida), activará la unidad de captura de entrada, guardando así una marca de tiempo de este evento en el registro ICR1 y ejecutando una interrupción. En esta interrupción colocamos el valor del registro ICR1 en nuestra matriz de "muestras" e incrementamos el índice para la siguiente captura. Cuando el Timer1 o la matriz se desbordan, deshabilitamos la interrupción de captura y enviamos los datos a la interfaz web a través de UART.

Decidí usar una interrupción de cambio de pin para activar la captura, ya que la unidad de captura de entrada solo permite capturar en uno u otro borde, no en ambos. También causa un problema cuando desea capturar ambos bordes. Entonces, mi solución ha sido invertir el bit que controla la selección de borde en el registro de control de captura de entrada en cada muestra recuperada. De esa manera perdemos velocidad de ejecución, pero aún podemos usar las funcionalidades de la unidad de captura de entrada.

Entonces, como habrá notado, en realidad no capturamos cada muestra en intervalos de tiempo fijos, sino que capturamos el momento en el que ocurre una transición de señal. Si hubiéramos capturado una muestra en cada ciclo de reloj, incluso con la división de reloj más alta, habríamos llenado el búfer en aproximadamente 0.1s, asumiendo que estábamos usando el tipo uint8_t, que es el más pequeño en la memoria sin usar estructuras.

Paso 3: Interfaz web y P5.js

Interfaz web y P5.js
Interfaz web y P5.js

Como indica el título, la interfaz web se creó con la ayuda de p5.js. Para aquellos que aún no lo saben, les recomiendo que visiten el sitio web, ya que es una biblioteca realmente buena. Se basa en Processing, es fácil de usar, le permite obtener buenos resultados muy rápido y está bien documentado. Es por todas esas razones que elegí esta biblioteca. También utilicé la biblioteca quicksettings.js para los menús, la biblioteca grafica.js para trazar mis datos y la biblioteca p5.serialport para comunicarme con Arduino UNO.

No dedicaré demasiado tiempo a la interfaz, ya que la diseñé para la vista previa de datos y el control de la configuración, y también porque no era el tema de mi experimento en absoluto. Sin embargo, explicaré en las siguientes partes los diferentes pasos para utilizar todo el sistema, explicando así los distintos controles disponibles.

Paso 4: configuración del sistema

Lo primero es descargar Arduino UNO y el código de interfaz aquí si aún no lo ha hecho. A continuación, puede reprogramar su placa Arduino UNO con el boceto "UNO_LS.ino" a través del IDE de Arduino.

Debería haber descargado el software p5.serialcontrol de su repositorio github. Debe obtener el archivo zip que coincida con su sistema operativo (solo lo probé en Windows). Extraiga el zip en una carpeta, inicie el ejecutable que se encuentra en él y déjelo así. No intente conectarse a ningún puerto serie, simplemente déjelo funcionando en segundo plano, se utilizará como relé.

Abra la carpeta "Interfaz". Debería encontrar un archivo llamado "index.html". Ábralo en su navegador, es la interfaz web.

¡Y eso es! No necesita descargar bibliotecas adicionales, todo debe estar incluido en el paquete que proporcioné.

Paso 5: Conexión, configuración y adquisición

Conexión, configuración y adquisición
Conexión, configuración y adquisición

Para conectar la interfaz a la placa Arduino UNO, simplemente seleccione el puerto correspondiente en la lista y presione el botón "Abrir". Si la operación fue exitosa, el mensaje de "estado" debería mostrar algo como "COMX abierto".

Ahora puede elegir sus opciones de captura. Primero está la selección de bordes. Te recomiendo que uses siempre "Ambos", ya que te dará la mejor representación de la señal real. Si la configuración de "Ambos" no captura la señal (si la frecuencia de la señal es demasiado alta, por ejemplo), puede probar con la configuración de borde "Ascendente" o "Descendente", dependiendo de la señal que intente ver.

El segundo ajuste es la división del reloj. Le dará la resolución a la que podrá capturar la señal. Puede elegir establecer el factor de división en "8", "64", "256" y "1024". La placa Arduino UNO utiliza un cuarzo de 16MHz para sincronizar el microcontrolador, por lo que la frecuencia de muestreo será "16MHz / factor de división". Tenga cuidado con esta configuración, ya que también determinará durante cuánto tiempo podrá capturar una señal. Como el Timer1 es un temporizador de 16 bits, el tiempo de captura permitido antes del desbordamiento será "(2 ^ 16) * (factor de división) / 16MHz". Dependiendo de la configuración que elija, variará entre ~ 33ms y 4.2s. Mantenga su elección en su mente, la necesitará más adelante.

El último ajuste es el cancelador de ruido. No realicé muchas pruebas en él, y no lo necesitará en el 99% de los casos, así que déjelo sin marcar. Para aquellos que todavía tienen curiosidad al respecto, pueden buscar el cancelador de ruido en la sección Temporizador / Contador1 de la hoja de datos del ATMEGA328P.

No olvide conectar el pin 8 de la placa Arduino UNO a su señal y conecte las conexiones a tierra para tener la misma referencia de voltaje tanto para el circuito de prueba como para el analizador lógico. Si necesita aislamiento de tierra, o necesita medir señales con niveles diferentes de 5V, probablemente necesitará agregar un optoaislador a su circuito.

Una vez que todo esté configurado correctamente, puede presionar el botón "Adquirir".

Paso 6: captura de resultados y exportación de datos CSV

Captura de resultados y exportación de datos CSV
Captura de resultados y exportación de datos CSV

Una vez que su Arduino UNO finalice una captura, enviará automáticamente los datos a la interfaz web, que los trazará. Puede acercar o alejar el zoom con el control deslizante derecho y recorrer las muestras con el inferior.

El gráfico solo le ofrece una vista previa y no tiene ninguna herramienta de análisis de datos. Por lo tanto, para realizar un análisis más detallado de sus datos, deberá importarlos a PulseView.

El primer paso es exportar un archivo csv que contenga todos sus datos. Para hacerlo, solo necesita hacer clic en el botón "Exportar" de la interfaz web. Guarde su archivo en una ubicación conocida cuando se le solicite.

Ahora abra PulseView. En la barra de menú superior, haga clic en "Abrir" (icono de carpeta) y seleccione "Importar valores separados por comas …". Seleccione el archivo csv generado previamente que contiene sus datos.

Aparecerá una pequeña ventana. Deje todo como está, solo necesita modificar la configuración de "Samplerate" de acuerdo con el factor de división de reloj elegido para la captura. Su frecuencia de muestreo será "16MHz / (factor de división)". Luego haga clic en "Aceptar", su señal debería aparecer en la pantalla.

Paso 7: Análisis de la señal PulseView

Análisis de señal PulseView
Análisis de señal PulseView

PulseView incluye muchos decodificadores de protocolo. Para acceder a ellos, haga clic en "Agregar decodificador de protocolo" en la barra de menú superior (herramienta más a la derecha). Para mi experimento, acabo de enviar un mensaje UART simple a 9600 baudios, así que busqué "UART".

Agregará un canal con una etiqueta a su izquierda (como la de sus datos). Al hacer clic en la etiqueta, puede cambiar la configuración del decodificador. Después de elegir los correctos, pude recuperar el mismo mensaje que el enviado por mi dispositivo de prueba. Esto muestra que todo el sistema funciona como se esperaba.

Paso 8: Conclusión

Conclusión
Conclusión

Incluso si el proyecto fue, al principio, un experimento, estoy contento con los resultados que obtuve. Pude muestrear señales UART a hasta 115200 baudios en el modo de borde "Ambos" sin ningún problema, e incluso logré subir a 230400 baudios en el modo de borde "descendente". Puede ver mi configuración de prueba en la imagen de arriba.

Mi implementación tiene varios inconvenientes, comenzando por el hecho de que solo puede capturar una señal a la vez, ya que solo el pin 8 de Arduino UNO tiene "capacidad de captura de entrada". Si está buscando un analizador lógico Arduino con más canales, consulte el de Catoblepas.

No puede esperar que un Arduino UNO pueda capturar señales con altas frecuencias (algunos MHz), ya que solo tiene una frecuencia de 16MHz (si alguien lo hizo, me interesaría ver su método). Sin embargo, todavía estoy impresionado por los resultados que podemos obtener de este microcontrolador ATMEGA328P.

No creo que vaya a trabajar mucho en el código. Realicé mis experimentos y obtuve los resultados que estaba buscando. Pero si alguien quiere contribuir, siéntase libre de modificar y redistribuir todo o parte de mi código.

Ese fue mi primer Instructable, y creo que uno largo. Espero que haya sido una lectura interesante para ti.

¡Avíseme si encuentra errores o si tiene alguna pregunta!

Recomendado: