Taula de continguts:
- Subministraments
- Pas 1: principi de treball
- Pas 2: Arduino UNO Sketch
- Pas 3: interfície web i P5.js
- Pas 4: Configuració del sistema
- Pas 5: connexió, configuració i adquisició
- Pas 6: Captureu resultats i exporteu dades CSV
- Pas 7: anàlisi del senyal PulseView
- Pas 8: Conclusió
Vídeo: Arduino UNO Logic Sniffer: 8 passos (amb imatges)
2024 Autora: John Day | [email protected]. Última modificació: 2024-01-30 08:11
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
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
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
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ó
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
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
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ó
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:
Sniffer de partícules: 6 passos (amb imatges)
Particle Sniffer: Mentre treballava amb els projectes anteriors sobre l’avaluació de PM2.5, vaig notar l’inconvenient de no poder localitzar les fonts puntuals de contaminació per partícules petites. La majoria de mostreigs fets pels municipis i les imatges de satèl·lit recopilen fonts àmplies que no
Com fer un dron amb Arduino UNO - Feu un Quadcopter amb microcontrolador: 8 passos (amb imatges)
Com fer un dron amb Arduino UNO | Feu un Quadcopter amb microcontrolador: Introducció Visiteu el meu canal de YouTube Un drone és un gadget (producte) molt car de comprar. En aquest post vaig a discutir, com ho faig a bon preu ?? I com pots fer-ho així a un preu barat … Bé, a l'Índia tots els materials (motors, ESC
Com desmuntar un ordinador amb passos i imatges senzills: 13 passos (amb imatges)
Com desmuntar un ordinador amb passos i imatges senzills: és una instrucció sobre com desmuntar un ordinador. La majoria dels components bàsics són modulars i fàcilment eliminables. Tanmateix, és important que us organitzeu al respecte. Això us ajudarà a evitar la pèrdua de peces i també a fer el muntatge
Llum d'enregistrament controlat Midi per a Logic Pro X: 9 passos (amb imatges)
Llum de gravació controlada Midi per a Logic Pro X: aquest tutorial proporciona informació sobre com construir i programar una interfície MIDI bàsica per controlar una llum de gravació mitjançant Logic Pro X. La imatge mostra un diagrama de blocs de tot el sistema des de l’ordinador Mac que executa Logic Pro. X a l'esquerra cap al Sai
Pen tester de nivell lògic TTL: 5 passos (amb imatges)
Llapis de proves de nivell lògic TTL: bolígraf de proves de polaritat & Bolígraf de proves de nivell lògic TTL. Aquest bolígraf de proves de polaritat és lleugerament diferent perquè és capaç de provar els nivells de TTL i mostra l’estat en una pantalla de 7 segments amb les lletres: " H " (Alt) per al nivell lògic "