Taula de continguts:

Arduino UNO Logic Sniffer: 8 passos (amb imatges)
Arduino UNO Logic Sniffer: 8 passos (amb imatges)

Vídeo: Arduino UNO Logic Sniffer: 8 passos (amb imatges)

Vídeo: Arduino UNO Logic Sniffer: 8 passos (amb imatges)
Vídeo: Could this tiny tube of metal fix our broken suspension? - Edd China's Workshop Diaries 28 2024, Desembre
Anonim
Sniffer Arduino UNO Logic
Sniffer Arduino UNO Logic

Aquest projecte va començar com un simple experiment. Durant la meva investigació sobre el full de dades de l’ATMEGA328P per a un altre projecte, vaig trobar alguna cosa bastant interessant. La unitat de captura d’entrada Timer1. Permet al microcontrolador del nostre Arduino UNO detectar una vora de senyal, emmagatzemar una marca de temps i activar una interrupció, tot en maquinari.

Llavors em vaig preguntar en quina aplicació podria ser útil i com provar-la. Com que fa temps que vull obtenir un analitzador de lògica, vaig decidir provar d’implementar-ne un a la meva placa Arduino UNO, només per provar la funció i veure si en podem obtenir bons resultats.

No sóc l'únic que va tenir aquesta idea, i en trobareu moltes amb només cercar a Google "Arduino Logic Analyzer". Al principi del projecte, ja que tot just començava com un experiment, ni tan sols era conscient que la gent ja el fes i em va impressionar els bons resultats que van obtenir amb aquest petit maquinari. Tot i això, no he pogut trobar un altre projecte amb la unitat de captura d’entrada, així que, si ja ho heu vist, feu-m’ho saber.

En resum, el meu analitzador de lògica:

  • Teniu un canal,
  • Tenir una interfície gràfica,
  • Comunicar-se amb la interfície mitjançant USB,
  • Executeu-vos en una placa Arduino UNO.

Finalment tindrà una profunditat de memòria de 800 mostres i va poder capturar amb èxit un missatge UART de 115200 bauds (realment no el vaig provar a velocitats més altes).

Aquesta instrucció conté tant les parts "com funciona" com "com s'utilitza" d'aquest projecte, de manera que per a aquells que no estiguin interessats per la part tècnica, podeu passar directament al pas 4.

Subministraments

Volia mantenir l’analitzador el més senzill possible, de manera que requeria molt poc maquinari.

Necessitarà:

  • Una placa Arduino UNO (o equivalent sempre que es basi en la MCU ATMEGA328P),
  • Un ordinador,
  • Alguna cosa a depurar (una altra placa Arduino UNO funciona bé per fer algunes proves).

Podeu trobar el codi tant de l’Arduino UNO com de la interfície web. També necessiteu el control p5.serialcontrol i el programari PulseView.

Pas 1: principi de treball

Principi de funcionament
Principi de funcionament

La idea és senzilla. Escolliu la configuració de captura i feu clic a "adquirir". La interfície web els enviarà al programari p5.serialcontrol, que ens permet utilitzar la interfície sèrie des d’un navegador, ja que no hi pot accedir directament. A continuació, el programari p5.serialcontrol retransmet la informació a la placa Arduino UNO, que captura les dades i les torna a enviar a la interfície pel mateix camí.

Fàcil! Bé … Com que no sóc molt bo en la programació de la interfície Humà / Màquina ni en les tecnologies web, la meva és sens dubte una mica lletja i equivocada. Però em permet iniciar una captura i recuperar les meves dades, que és per a què han estat dissenyades, així que crec que està bé. Per a treballs d’anàlisi més seriosos, importo els meus registres a PulseView, que és fàcil d’utilitzar i ofereix un bon conjunt de funcions i descodificadors de protocols, com veurem més endavant.

La unitat de captura d'entrada d'Arduino UNO es pot configurar per utilitzar diferents divisions de rellotge, reduint així la resolució, però augmentant el retard abans del desbordament. També pot activar-se en ascens, descens o ambdues vores per començar a capturar les dades.

Pas 2: Arduino UNO Sketch

Arduino UNO Sketch
Arduino UNO Sketch

Vaig escriure i recopilar l'esbós amb l'IDE Arduino. Primer vaig començar configurant el temporitzador1 en mode d'operació "Normal" escrivint als seus registres TCCR1A i TCCR1B a la configuració (). Després vaig fer algunes funcions per facilitar-ne una mica el seu ús en el futur, com ara la de configurar la divisió de rellotge anomenada "setTim1PSC ()". També he escrit funcions per activar i desactivar la unitat de captura d’entrada Timer1 i les interrupcions de desbordament.

He afegit la matriu "samples", que contindrà les dades adquirides. És una matriu global que he configurat com a "volàtil" per evitar que el compilador faci optimitzacions i el posi en flash, tal com estava fent durant les meves primeres compilacions. El vaig definir com una matriu "uint16_t", ja que el temporitzador 1 també és de 16 bits, amb una longitud de 810. Deixem de capturar a 800 valors, però com que la prova es fa fora de les interrupcions per motius de velocitat òbvies, vaig optar per mantenir-ne 10 més valors per evitar el desbordament. Amb algunes variables addicionals per a la resta del codi, l'esbós utilitza 1313 bytes (88%) de memòria, deixant-nos 235 bytes de RAM lliure. Ja tenim un ús elevat de la memòria i no volia afegir més capacitat de mostra, ja que podria provocar comportaments estranys a causa del poc espai de memòria.

En la meva intenció d’augmentar sempre la velocitat d’execució, he utilitzat indicadors de funcions en lloc de sentències if dins de les interrupcions, per reduir el seu temps d’execució al mínim. El pin de captura serà sempre l’Arduino UNO número 8, ja que és l’únic connectat a la unitat de captura d’entrada del Timer1.

El procés de captura es mostra a la imatge superior. Comença quan Arduino UNO rep un marc de dades UART vàlid que conté els paràmetres de captura desitjats. A continuació, processem aquests paràmetres configurant els registres adequats per capturar-los a la vora triada i utilitzant la divisió de rellotge adequada. A continuació, activem la interrupció PCINT0 (pin change) per detectar la primera vora del senyal. Quan ho aconseguim, restablim el valor del temporitzador1, desactivem la interrupció PCINT0 i activem la interrupció ICU (Input Capture Unit). A partir d’aquest moment, qualsevol vora descendent / ascendent del senyal (en funció de la configuració escollida) activarà la unitat de captura d’entrada, guardant així una marca de temps d’aquest esdeveniment al registre ICR1 i executant una interrupció. En aquesta interrupció, posem el valor del registre ICR1 a la nostra matriu "samples" i incrementem l'índex per a la següent captura. Quan el Timer1 o la matriu es desborden, desactivem la interrupció de captura i tornem a enviar les dades a la interfície web mitjançant UART.

Vaig decidir utilitzar una interrupció de canvi de pin per activar la captura, ja que la unitat de captura d’entrada només permet capturar en una o altra vora, no en tots dos. També causa un problema quan es volen capturar les dues vores. La meva solució ha estat llavors invertir el bit que controla la selecció de vores al registre de control de captura d’entrada a cada mostra recuperada. D’aquesta manera perdem la velocitat d’execució, però encara podem utilitzar les funcionalitats de la unitat de captura d’entrada.

Per tant, com és possible que hàgiu notat, realment no capturem cada mostra a intervals de temps fixos, sinó que capturem el moment en què passa una transició de senyal. Si haguéssim capturat una mostra a cada cicle de rellotge, fins i tot amb la divisió de rellotge més alta, hauríem omplert la memòria intermèdia en aproximadament 0,1 segons, suposant que utilitzàvem el tipus uint8_t, que és el més petit de la memòria sense utilitzar estructures.

Pas 3: interfície web i P5.js

Interfície web i P5.js
Interfície web i P5.js

Com indica el títol, la interfície web es va fer amb l'ajut de p5.js. Per a aquells que encara no ho saben, us recomano anar a consultar el lloc web, ja que és una bona biblioteca. Es basa en el processament, és fàcil d’utilitzar, permet obtenir bons resultats molt ràpidament i està ben documentat. És per tot això que he escollit aquesta biblioteca. També he utilitzat la biblioteca quicksettings.js per als menús, la de grafica.js per representar les meves dades i la biblioteca p5.serialport per comunicar-me amb Arduino UNO.

No dedicaré massa temps a la interfície, ja que l’acabo de dissenyar per a la previsualització de dades i el control de la configuració, i també perquè no va ser objecte del meu experiment. Tanmateix, explicaré a les següents parts els diferents passos per utilitzar tot el sistema, explicant així els diferents controls disponibles.

Pas 4: Configuració del sistema

El primer és descarregar aquí el codi de la interfície Arduino UNO i la interfície, si encara no ho heu fet. A continuació, podeu reprogramar la vostra placa Arduino UNO amb l'esbós "UNO_LS.ino" mitjançant l'IDE Arduino.

Hauríeu d’haver descarregat el programari p5.serialcontrol des del seu dipòsit github. Heu d’aconseguir que el fitxer zip coincideixi amb el vostre sistema operatiu (només el vaig provar a Windows). Extraieu el fitxer zip d’una carpeta, inicieu l’executable que hi trobareu i deixeu-lo així. No intenteu connectar-vos a cap port sèrie, deixeu-lo funcionant en segon pla, s'utilitzarà com a relé.

Obriu la carpeta "Interfície". Heu de trobar un fitxer anomenat "index.html". Obriu-lo al navegador, és la interfície web.

I ja està! No necessiteu descarregar biblioteques addicionals, tot hauria d'estar inclòs al paquet que he proporcionat.

Pas 5: connexió, configuració i adquisició

Connexió, configuració i adquisició
Connexió, configuració i adquisició

Per connectar la interfície a la placa Arduino UNO, només cal seleccionar el port corresponent de la llista i prémer el botó "Obrir". Si l'operació ha estat correcta, el missatge "estat" hauria de mostrar alguna cosa com "COMX obert".

Ara podeu triar les opcions de captura. El primer és la selecció de vores. Us recomano que utilitzeu sempre "Ambdues", ja que us proporcionarà la millor representació del senyal real. Si el paràmetre "Tots dos" no capta el senyal (per exemple, si la freqüència del senyal és massa alta), podeu provar amb la configuració de la vora "Augment" o "Baixada", en funció del senyal que intenteu veure.

El segon paràmetre és la divisió del rellotge. Us donarà la resolució a la qual podreu captar el senyal. Podeu establir el factor de divisió entre "8", "64", "256" i "1024". La placa Arduino UNO utilitza un quars de 16 MHz per controlar el microcontrolador, de manera que la freqüència de mostreig serà de "16 MHz / factor de divisió". Aneu amb compte amb aquesta configuració, ja que també determinarà durant quant de temps podreu captar un senyal. Com que el temporitzador 1 és un temporitzador de 16 bits, el temps de captura permès abans del desbordament serà "(2 ^ 16) * (factor de divisió) / 16 MHz". Depenent de la configuració que hàgiu triat, oscil·larà entre ~ 33ms i 4.2s. Tingueu present la vostra elecció, la necessitareu més endavant.

El darrer paràmetre és el cancel·lador de soroll. No hi he realitzat moltes proves i no el necessitareu en el 99% dels casos, així que deixeu-lo sense comprovar. Per a aquells que encara en tinguin curiositat, podeu cercar el cancel·lador de soroll a la secció Temporitzador / Comptador1 del full de dades de l’ATMEGA328P.

No us oblideu de connectar el pin 8 de la placa Arduino UNO al vostre senyal i connectar les bases per tenir la mateixa referència de voltatge tant per al circuit de prova com per a l’analitzador lògic. Si necessiteu aïllament a terra o necessiteu mesurar senyals amb nivells diferents de 5V, probablement haureu d'afegir un optoaïllador al vostre circuit.

Un cop tot estigui configurat correctament, podeu prémer el botó "Adquirir".

Pas 6: Captureu resultats i exporteu dades CSV

Captureu resultats i exporteu dades CSV
Captureu resultats i exporteu dades CSV

Un cop el vostre Arduino UNO finalitzi la captura, envia automàticament les dades a la interfície web, que les traçarà. Podeu ampliar o reduir la imatge amb el control lliscant dret i recórrer les mostres amb la inferior.

La trama només us proporciona una vista prèvia i no disposa d’eines d’anàlisi de dades. Per tant, per dur a terme anàlisis addicionals de les vostres dades, haureu d’importar-les a PulseView.

El primer pas és exportar un fitxer CSV que contingui totes les vostres dades. Per fer-ho, només cal que feu clic al botó "Exporta" des de la interfície web. Deseu el fitxer en una ubicació coneguda quan se us demani.

Ara obriu PulseView. A la barra de menú superior, feu clic a "Obre" (icona de carpeta) i seleccioneu "Importa valors separats per comes …". Seleccioneu el fitxer CSV generat anteriorment que conté les vostres dades.

Apareixerà una finestra petita. Deixeu-ho tot tal qual, només heu de modificar la configuració "Samplerate" d'acord amb el factor de divisió del rellotge escollit per a la captura. La freqüència de mostreig serà de "16 MHz / (factor de divisió)". A continuació, feu clic a "D'acord", el vostre senyal hauria d'aparèixer a la pantalla.

Pas 7: anàlisi del senyal PulseView

Anàlisi de senyal PulseView
Anàlisi de senyal PulseView

PulseView inclou molts descodificadors de protocols. Per accedir-hi, feu clic a "Afegeix descodificador de protocol" a la barra de menú superior (eina més dreta). Per al meu experiment, acabo d’enviar un senzill missatge UART a 9600 bauds, de manera que he cercat "UART".

Afegirà un canal amb una etiqueta a l'esquerra (igual que el de les vostres dades). En fer clic a l’etiqueta, podeu canviar la configuració del descodificador. Després d’escollir els adequats, he pogut recuperar el mateix missatge que el que envia el dispositiu my test. Això demostra que tot el sistema funciona com s’esperava.

Pas 8: Conclusió

Conclusió
Conclusió

Fins i tot si el projecte era, al principi, un experiment, estic content amb els resultats obtinguts. Vaig poder provar senyals UART fins a 115200 bauds en mode de vora "Tots dos" sense cap problema, i fins i tot vaig aconseguir pujar a 230400 bauds en mode de vora "Falling". Podeu veure la configuració de la meva prova a la imatge superior.

La meva implementació té diversos inconvenients, començant pel fet que només pot capturar un senyal a la vegada, ja que només el pin 8 d'Arduino UNO és "capaç de capturar l'entrada". Si esteu cercant un analitzador lògic Arduino amb més canals, aneu a comprovar el de Catoblepas.

No podeu esperar que un Arduino UNO pugui captar senyals amb altes freqüències (alguns MHz), ja que només es marca a 16 MHz (si algú ho fes, m’interessaria veure el seu mètode). Tot i això, encara estic impressionat pels resultats que podem obtenir d’aquest microcontrolador ATMEGA328P.

No crec que faré molta feina sobre el codi. Vaig dur a terme els meus experiments i vaig obtenir els resultats que cercava. Però si algú vol contribuir, no dubteu a modificar i redistribuir tot o part del meu codi.

Aquest va ser el meu primer instructiu, i crec que és llarg. Espero que hagi estat una lectura interessant per a vosaltres.

Feu-me saber si trobeu errors o si teniu cap pregunta.

Recomanat: