Uno splendido kit per entrare nel mondo degli analizzatori logici con Arduino : Zeroplus Arduino Starter Kit with Logic Analyzer
La ZeroPlus è un’ azienda Taiwanese che realizza degli ottimi Analizzatori Logici. Ho già avuto occasione tempo fa di parlarvi di loro con un PDF che spiega l’utilizzo dei loro analizzatori logici , anzi, se siete interessati a questi strumenti, scaricatelo perchè anche se è un tutorial sull’utilizzo specifico per la Zeroplus, ci sono numerose informazioni utili che possono aiutare a chiarire alcuni concetti.
Lo strumento di cui si parla nell’articolo è stato gentilmente offerto da Zeroplus – Produttore di Analizzatori logici professionali
Indice dei contenuti
Cos’è un analizzatore logico?
Molti hanno familiarità con l’oscilloscopio, che è uno strumento utilizzato principalmente per osservare l’andamento nel tempo di segnali analogici (ma viene usato in maniera minore anche per segnali digitali qualora servano soltanto pochi canali). Un analizzatore logico nasce specificamente per studiare e analizzare segnali digitali, decodificarli e quindi scoprire la logica di comunicazione, il protocollo. A differenza di un oscilloscopio che generalmente ha 1, 2 o 4 canali, un analizzatore logico ne ha 8, 16 o 32 e nasce in maniera specifica per segnali digitali, quindi le soglie di tensione in ingresso sui canali sono basse, generalmente 5.5 / 6V.
Immaginate ora di avere un microcontrollore che comunica con un altro circuito integrato e che abbiamo bisogno di scoprire in che modo comunicano: dalle prime osservazioni dei collegamenti sul circuito, spesso si riesce a capire che tipo di collegamento (layer fisico) viene utilizzato: se ci sono due linee potrebbe essere una UART (RX e TX), se magari sulle due linee notiamo delle resistenze di pull-up allora potrebbe essere un I2C ma anche un semplice SPI (Data e Clock), con 3 linee forse è un SPI (Data, Clock, Circuit Select) ma nulla vieta che possa essere una USART sincrona (TX,RX,Clock), con 8 linee potrebbe essere un bus parallelo… e così via, certo si tratta sempre di supposizioni! Insomma possiamo avere un’idea di massima del modo in cui comunicano, ma il protocollo, ovvero il modo con cui i due dispositivi si scambiano messaggi (ma soprattutto: quali messaggi!), spesso potrebbe essere sconosciuto oppure potremmo avere bisogno, ad esempio, di eseguire un debug su una linea di comunicazione nota che non ne vuole sapere di funzionare.
A questo punto entra in gioco l’analizzatore logico: si collega una sonda (un canale) ad ogni linea di comunicazione (ecco perchè il minimo numeri di canali di un analizzatore logico è generalmente 8) e si lascia partire l’acquisizione: sul display (che può essere il display del PC se si utilizza un analizzatore PC-Based, che generalmente è il tipo più comune di questi dispositivi) compare la sequenza di segnali, 0 e 1, di ogni canale, ognuno con il suo tempo e soprattutto ogni canale compare sopra il successivo:
Il software degli analizzatori logici Zeroplus evidenzia il timing dei segnali, permette di selezionare la modalità trigger (ovvero dopo quale evento deve partire l’acquisizione) e permette di raggruppare le linee dati in un bus e quindi decodificare la trasmissione, rendendoci semplice e rapido il capire il protocollo con il quale i dispositivi comunicano.
Apparentemente sembra una cosa complicata, ma vi assicuro che non lo è, e per certi versi saper utilizzare un analizzatore logico è affascinante e anche divertente: spesso si scoprono cose di cui non avevamo idea e visualizzare materialmente la comunicazione tra due dispositivi aiuta a fissare nella mente alcuni concetti.
Arduino Starter Kit with Logic Analyzer – Contenuto
Con questo Kit la Zeroplus ha realizzato qualcosa di nuovo: non è il solito starter kit che trovate a quattro soldi su ebay in cui vi vengono buttati in una scatola decine di sensori, spesso di bassa qualità, con i quali la maggior parte delle volte dovete cavarvela da soli (quando funzionano): no! Ad un prezzo accessibile vi permette di avere uno strumento professionale utilissimo: un analizzatore logico chiamato LAP-Educator (8 canali, 75/100MHz) dotato di un suo software che permette di decodificare poco meno di un centinaio di protocolli di comunicazione, un Arduino UNO (originale) con la sua base in plexiglass (che, oltre ad essere più sicuro perchè isola la scheda dal banco, permette anche di agganciare la scheda alla breadboard) nonchè tutta una serie di componenti e schede per realizzare i primi esperimenti:
- Una breadboard da 830 punti di ottima manifattura
- Una scheda con su 4 led RGB ad alta luminosità pilotati da un IO expander PCF8574 (I2C)
- Una scheda sensore di suono
- Un display LCD di qualità 16×2 basato su controller HD44780
- Una scheda che converte da USB tipo A a USB tipo B con un pin-strip: questa viene utilizzata per sniffare i dati passanti sul bus USB.
- Un motorino a 3V
- Una LDR (Light Dependent Resistor), utilizzato come sensore di luce
- Un sensore di temperatura analogico LM335
- 5 pulsanti da PCB di tipo “grande” (12x12mm), anche noti come tactile-switch
- 5 led verdi da 5mm
- 10 resistenze
- 2 condensatori ceramici
- Un trimmer
- Un portabatterie per 2 pile stilo (AA)
- Un set di 20 cavetti jumper colorati maschio-maschio (anche noti come cavetti du-pont), utilizzati per le connessioni su breadboard
Ci sono quindi gli accessori dell’analizzatore logico: i cavetti du-pont femmina-femmina (il flat da 8 utilizzato per gli i canali, quello da 2 bianco/nero utilizzato per CLK/DATA e quello singolo bianco per i canali accessori) e le 10 pinzette colorate.
A corredo di tutto questo c’è la scatola di plastica con setti divisori che permette di tenere ordinate le cose e un libro illustrato (o meglio: un set di schede illustrate) da 120 pagine diviso per sezioni. Le schede sono in lingua inglese, plastificate e ben realizzate sotto tutti i punti di vista. Anche i cavi USB inclusi (uno per Arduino e l’altro per l’analizzatore logico) sono di ottima qualità: vi sembrerà strano ma molti lesinano sui cavi USB utilizzando prodotti di pessima manifattura e spesso capitano i malfunzionamenti più assurdi che fanno perdere tantissimo tempo proprio perchè pensare che sia il cavo il componente difettoso è sempre l’ultimo passo.
In questo video vi illustro l’unboxing del kit:
Giusto per farvi capire l’accuratezza con la quale sono state realizzate le schede illustrate vi allego qui due scansioni. Per ogni esperimento, a parte il testo con le spiegazioni, c’è anche il diagramma circuitale seguito da un’illustrazione di come vanno collegati i componenti sulla breadboard:
Come vedete sono addirittura illustrati i codici colore delle resistenze e il pinout dei componenti: insomma davvero non ci sono scuse. C’è la parte iniziale che illustra l’installazione del software e degli esempi e quindi una descrizione del software dell’analizzatore logico e di Arduino IDE.
Gli esercizi
Passiamo al contenuto delle schede illustrate. Dopo una parte introduttiva che mostra come sono strutturati i software che andremo ad utilizzare, ci sono i primi tutorial che permettono di familiarizzare con il nostro nuovo strumento: il primo di tutti serve ad imparare i concetti di base dell’acquisizione logica e ne segue un altro in cui si analizza la comunicazione seriale di Arduino, farò una panoramica di questi primi due esempi più in basso.
Seguono quindi:
- Imparare ad utilizzare il Protocol Decoder, che è una funzione integrata dei software della Zeroplus che permette di decodificare i pacchetti catturati con l’analizzatore logico. Nel software, versione attuale, ci sono ben 86 protocol decoder che vi permettono di decodificare da subito una enorme varietà di protocolli di comunicazione da quelli più comuni a quelli meno utilizzati (UART, I2C, SPI, One-Wire, IRDA, Canbus, USB 1.1 ecc).
- Familiarizzare con Arduino IDE. Viene spiegato come è strutturato un programma scritto in Arduino IDE e si realizza il primo circuito con un pulsante e un led per capire i concetti di in input e output su un microcontrollore
Man mano gli esempi si fanno sempre più interessanti:
- Utilizzare una fotoresistenza. Qui viene introdotto il concetto di porta analogica. L’analizzatore logico viene utilizzato per leggere i valori in uscita dal sensore sfruttando un bus a 8 bit piuttosto che la porta seriale: questo, chiaramente, per fare sempre esercizio con l’analizzatore logico.
- Utilizzare insieme fotoresistenza e sensore di suono. Viene introtto il Delay.
Il capitolo successivo prevede quindi un’applicazione interessante: Risolvere un problema utilizzando l’analizzatore logico. In pratica lo sketch fa in modo che un led si accenda nel momento in cui il valore analogico restituito dalla fotoresistenza raggiunga un certo valore (il led si accende con un determinato valore di luminosità ambientale). Tale valore, però, non è fisso (altrimenti sarebbe stato semplice leggerlo dal codice!) ma viene definito all’avvio tramite la generazione di un numero Random. Si dovrà quindi utilizzare l’analizzatore logico per capire qual’è questo valore. Oltre ad essere un bell’esercizio pratico, introduce anche la funzione per la generazione dei numeri casuali.
Gli esempi proseguono e diventano sempre di più applicazioni pratiche nel mondo reale:
- Rilevare la temperatura tramite un sensore e regolare la velocità di un motore in PWM in base alla temperatura misurata.
- Utilizzare il display LCD e quindi l’analizzatore logico per catturare i dati sul bus di comunicazione dell’LCD.
- Utilizzare l’analizzatore logico per catturare i dati che transitano sulla porta USB ed utilizzare le tecniche di compressione degli analizzatori Zeroplus per estendere il range di dati catturati. Questo esempio non prevede Arduino ma l’utilizzo dell’adattatore da USB A a USB B che viene utilizzato per sniffare i dati passanti sul bus USB.
- Infine: Capire il protocollo I2C ed imparare a fare reverse engineering per risalire al protocollo di comunicazione. In questo esempio viene utilizzata la schedina con i LED RGB pilotati in I2C.
Bene, ora che abbiamo fatto una panoramica del kit e degli esperimenti, cominciamo dall’inizio:
Installazione dei software
Per poter utilizzare l’analizzatore logico, dovete scaricare il suo software che si chiama ZP-Studio. Andate alla pagina: http://www.zeroplus.com.tw/logic-analyzer_en/technical_support.php
Nel campo Product al punto 1 selezionate “Arduino Starter Kit with Logic Analyzer”:
Nel campo Series, stessa cosa:
Al punto 2 vi consiglio di non selezionare nulla in modo che vi vengano mostrati tutti i downloads disponibili. Premete quindi il pulsante Search. Vi vengono elencate tutte le versioni di software e manuali disponibili. In cima ci sono sempre le ultime versioni:
Scaricate sia L’user manual, che vi sarà sempre utile, che il software. Ci sono due opzioni: WEB e FTP, provate con WEB, se lo scaricamento è troppo lento provate con FTP. Cliccando su “Description” sotto il numero di versione, si espande una finestra dalla quale è possibile scaricare il file zip con gli esempi di programmazione per Arduino IDE, con i quali seguire gli esperimenti mostrati nelle schede:
La Mirifica ha anche un archivio dove potete scaricare tutta la documentazione e il software nel caso non riusciste a scaricarlo dal sito ufficiale, l’archivio è raggiungibile qui:
http://docs.mirifica.eu/Zeroplus.com.tw/LAP-Educator/
Non si tratta di un mirror ma di un archivio, per cui potrebbe capitare che sul sito della Mirifica non ci siano gli ultimi aggiornamenti. Volendo, manuale e Sketches di esempio sono scaricabili anche in fondo a questo articolo.
L’installazione del software ZP-Studio è semplice e non richiede nessun accorgimento particolare. Dopo aver installato il software possiamo collegare l’analizzatore logico e attendere che venga riconosciuto dal sistema, dopodichè il software può essere avviato.
Resta quindi da installare Arduino IDE se non l’avete già. Potete scaricare l’ultima versione dal sito ufficiale (non Arduino Web editor, ma Arduino IDE, un po’ più in basso nella pagina): https://www.arduino.cc/en/Main/Software
Il primo esercizio con Arduino e l’Analizzatore logico
Il primo esercizio serve unicamente ad introdurre i concetti di base dell’analizzatore logico. Le schede sono chiaramente più sintetiche di come sto scrivendo io adesso, quindi non spaventatevi. Colleghiamo Arduino UNO e L’analizzatore logico. Facciamo doppio click sullo sketch da utilizzare per questo esperimento, che si chiama LogicAcquisitionAndSoftwareTutorial: si aprirà Arduino IDE con lo sketch.
Dal menù strumenti assicuriamoci che in “Scheda:” sia selezionato “Arduino/Genuino UNO” e selezioniamo la porta COM corretta creata da Arduino UNO (nel mio caso è COM44, nel vostro caso è sicuramente diversa):
Tutta la parte delle schede precedente a questo capitolo vi ha già spiegato le parti principali di Arduino IDE, per cui non mi dilungherò ulteriormente. Carichiamo lo sketch su Arduino cliccando sul pulsante con la freccia verso destra e attendiamo la fine del caricamento (che si capisce quando nella finestra terminale di Arduino IDE compare la riga con i quantitativi di memoria utilizzati dal programma appena caricato).
Dal menù Strumenti clicchiamo Monitor Seriale. Si apre il serial monitor di Arduino IDE, assicuriamoci di aver selezionato 9600 nel campo del baudrate in basso a destra. Nella finestra del terminale dopo pochi secondi deve comparire un menù (se questo non accade, premete il pulsante di reset su Arduino: è quello che si trova affianco al connettore USB):
Ora colleghiamo l’analizzatore logico: il canale A0 va collegato all’IO digitale n°8. Sull’analizzatore logico innestate il flat da 8 cavi femmina/femmina (fate combaciare i colori!), quindi usando un cavetto jumper maschio-maschio collegate il cavo marrone al pin digitale 8 di Arduino:
Lanciamo quindi ZP-Studio (le cose che scriverò di seguito, relativamente al settaggio dei parametri di acquisizione, sono spiegate nei capitoli precedenti del manuale a corredo del kit). Impostare il Trigger su A0 sul fronte di salita (Rising Edge: questo significa che lo strumento avvierà l’acquisizione nel momento in cui rileverà un segnale in salita, ovvero che passa da 0 a 1, sul canale A0):
Cliccare sul pulsante per le impostazioni di campionamento (Sample Settings):
E cambiare i parametri come da immagine seguente:
ovvero:
- Velocità di campionamento: 100MHz (questo valore deve sempre essere almeno 4 volte superiore alla frequenza del segnale da analizzare, quando non la si conosce allora si può iniziare impostandola al massimo dopodichè facciamo le opportune valutazioni e scendiamo col valore).
- Memoria da utilizzare: 32K (questo è il numero di campioni, vedete che con le impostazioni attuali si riuscirà a campionare una porzione di segnale lunga 327.68µS)
- Livello per il Trigger (da inserire a mano nella casella): 2.5V (Arduino segue la logica TTL a 5V, per cui sotto 0.8V il livello è da intendere come basso, sopra 2.0V è da intendere come alto, tutto quello che c’è in mezzo è sconosciuto/imprevedibile. Mettendoci un po’ più alti ci assicuriamo di rilevare i livelli giusti).
- Posizione del Trigger: 10% (questo vuol dire che, nella porzione di segnale che andremo ad acquisire, il 10% della memoria sarà utilizzata per campionare la parte di segnale che è precedente al Trigger)
Premiamo quindi OK sulla finestra del Sample Settings. Bene, ora possiamo dare via all’acquisizione. Dal Serial Monitor di Arduino IDE, nella barra sopra digitiamo 1 e diamo invio
Questo passaggio, in realtà, non serve a nulla, perchè lo Sketch esegue già normalmente la funzione 1 del menù, ovvero generare un clock sul pin8, ma l’ho messo per farvi capire la logica di funzionamento (e anche perchè le altre voci del menù, necessarie per proseguire con l’esercizio, richiedono comunque di essere selezionate!).
Da ZP-Studio premiamo il tasto play che avvia l’acquisizione:
Dopo qualche frazione di secondo abbiamo a video lo stato dell’acquisizione:
Sotto, nella zona “Navigator” c’è la panoramica di tutta la porzione di segnale acquisito, sopra invece c’è uno zoom, nel quale è possibile spostarsi, dove vengono indicati i tempi per ogni livello, vediamo che (tralasciamo i canali da A1 ad A7 su cui non c’è collegato nulla). Vediamo che c’è un segnale a livello basso che dura 32.75uS seguito da un livello alto che dura 294.93uS. La somma dei tempi è appunto 327.68uS, che abbiamo visto essere il tempo totale che possiamo acquisire con le impostazioni correnti.
La barra verticale rossa con la T sopra è la posizione del trigger: tutto quello che viene prima (che si trova a sinistra della barra) è quel 10% di segnale che abbiamo messo nelle impostazioni.
Diciamo pure che apparentemente non c’è nulla di emozionante, ma questo, in realtà è perchè abbiamo un po’ esagerato con le impostazioni! Ricordate che abbiamo impostato 100MHz come frequenza di acquisizione: questo vuol dire che lo strumento controlla la linea 100mila volte in un secondo e ne memorizza lo stato, probabilmente è troppo per questo segnale? Boh! Proviamo ad impostare una frequenza di campionamento più bassa… magari i nostri 100mila campionamenti, dato che sono tantissimi, in sequenza, velocissimi, sono capitati tutti in una parte del segnale che era a livello alto… Torniamo quindi nel menù Sample Settings, lasciamo tutti i parametri invariati ma cambiamo soltanto la frequenza di campionamento: impostiamola a 400KHz.
Premiamo nuovamente il pulsante di avvio acquisizione. AAhhhh!!! Ora la cosa è più interessante!
Vedete che ora sul canale si nota chiaramente un’onda quadra! Quindi le supposizioni erano valide: stavamo campionando così velocemente che tutta la memoria veniva sprecata all’interno di un fronte a livello alto.
Torniamo un attimo nel menù delle impostazioni di acquisizione. Notiamo che c’è questo pulsante:
Questo pulsante serve per abilitare la compressione: con questa modalità lo strumento non campiona di continuo, ad intervalli regolari, ma soltanto al cambio di stato del segnale. In questo caso però, consuma il doppio della memoria perchè per poter eseguire un’analisi del segnale deve anche memorizzare il tempo in cui il cambio di stato si è verificato altrimenti l’analisi non servirebbe a nulla. Premiamolo e ripetiamo l’acquisizione.
Questa volta l’acquisizione durerà molto di più! (circa 18.5 secondi), questo perchè lo strumento, da impostazioni, deve saturare il quantitativo di memoria che abbiamo impostato (32K) e memorizzando soltanto i cambi di stato (con i relativi tempi) e considerando la frequenza del segnale che stiamo analizzando, si riusciranno ad acquisire molti più campioni, ovvero una porzione di segnale molto più lunga.
Anche in questo caso abbiamo esagerato: nella zona inferiore dove c’è la panoramica del segnale, le onde quadre sono talmente fitte che non si vede più nulla!
Andiamo nella parte superiore dove c’è lo zoom del segnale. Tenendo premuto CTRL e agendo sulla rotella del mouse possiamo fare Zoom IN/OUT. Altre funzioni interessanti sono accessibili dal tasto destro. Ad esempio possiamo visualizzare la frequenza invece del tempo premendo il tasto destro e selezionando Waveform display -> Frequency:
L’esercizio prosegue utilizzando lo stesso sketch ma aggiungendo gli altri canali. Mi fermo qui.
Il concetto di protocollo
L’esercizio successivo prevede l’analisi del (anzi: di UN) protocollo seriale. Lo sketch da caricare è quello che si chiama SerialInterface. Lo sketch invia semplicemente sulla seriale di Arduino la stringa “True” se il pin digitale 8 è a livello alto (condizione di default perchè viene abilitata la resistenza di pullup interna) o “False” se è a livello basso.
Prima ho detto analisi “di UN” protocollo seriale perchè di protocolli seriali, in realtà, ce ne sono tanti anche se ormai abbiamo preso il vizio chiamare “seriale” quello che in realtà si chiama UART; seriale è un nome generico che indica che i dati sono trasmessi in serie (un bit dopo l’altro sulla stessa linea di comunicazione) piuttosto che in parallelo (ogni bit trasmesso INSIEME agli altri sfruttando più linee di comunicazione).
L’UART (Universal Asynchronous Receiver Transmitter) è un protocollo standard di comunicazione usato da tutti i microcontrollori, è asincrono (non ha una linea di clock ma le transizioni da un livello all’altro sono definite da una frequenza fissa, che è rappresentata dal baud rate) e prevede due linee di comunicazione (Ricezione e Trasmissione).
Dopo aver caricato lo Sketch, il canale A0 dell’analizzatore logico va collegato al pin digitale 1/TX di Arduino UNO. Come frequenza di campionamento, rispetto all’esempio precedente, ho lasciato 400KHz con compressione, ho soltanto abbassato il numero di campioni a 2K. Avviando l’acquisizione possiamo vedere una serie di segnali con durate differenti (agite sui controlli di Zoom: CTRL+rotella per poter visualizzare tutto il segnale come nell’immagine seguente):
Adesso facciamo una cosa interessante: aggiungiamo un Protocol Decoder, che è una funzione software che analizza il segnale in automatico e ci fornisce dati interessanti. Il protocolo decoder va aggiunto ad un canale. Noi abbiamo già selezionato di default il canale A0 (per selezionare un canale basta cliccarci sopra). A destra dove c’è “Protocol Decoders” premere sul pulsante +:
In realtà sto illustrando questi passaggi nella maniera più lunga perchè UART, se ci fate caso, è già disponibile sotto (questo è un elenco di protocolli preferiti), ma voglio farvi vedere tutti i passaggi, che saranno necessari quando il protocollo che vi servirà non sarà ancora elencato nell’elenco!
Compare la finestra in cui si sceglie il protocollo (attualmente abbiamo una scelta di ben 86 protocolli!):
L’UART si trova sotto la voce “IC Interface”, espandere la voce cliccando sul tastino + e selezionare UART che si trova come ultima scelta. Premere quindi il pulsante Next. Ci troviamo con la finestra che permette di settare le impostazioni del protocollo:
A parte il baud rate, che volendo, oltre che essere scelto da un menù a tendina (scegliete 9600), può essere anche impostato su “Auto” e il software lo calcola da solo, gli altri parametri di comunicazione dobbiamo impostarli a mano. Lasciamo tutto da default e premiamo next. In questa finestra possiamo eliminare i canali non utilizzati selezionando yes (è solo una funzione puramente estetica):
Premendo su Finish, le onde quadre che vedevamo prima si trasformano in qualcosa di più interessante:
I segnali sono stati raggruppati in blocchi significativi: le zone di colore verde rappresentano il singolo byte trasmesso (gli 8 bit di dati del protocollo) e dentro c’è scritto il valore esadecimale del byte. In ciano sono evidenziati i bit di start e in rosso i bit di stop.
Adesso clicchiamo con il tasto destro sul nome del bus e selezioniamo Numeric base/Encoding -> ASCII:
Questa funzione è normalmente accessibile anche dal menù Opzioni che è l’icona a forma di Ingranaggio affianco ai pulsanti di ridimensionamento della finestra del software
Ecco quello che succede:
I dati ora sono leggibili anche da un umano. Vediamo chiaramente che i dati riportano la parola “True”. L’ultimo dato è vuoto perchè è il carattere di nuova linea, 0x0A, che sappiamo bene si tratta di un carattere non visibile. Il carattere di nuova linea è generato dalla parte di codice
Serial.print("\n"); |
Non mi dilungo ulteriormente altrimenti spoilero tutto il manuale!
Se avete cliccato “Yes” alla domanda “Delete all other buses and channels” e ora non sapete più come far ricomparire tutti gli altri canali, basta che cliccate col tasto destro sul nome del bus e scegliete “Restore Default Channels”.
Dove acquistare il Kit
Il kit è disponibile su Mirifica in questa pagina.
Downloads
Aggiungo qui il download degli sketch e del manuale alle ultime versioni presenti al momento della stesura di questo articolo, ma fate riferimento al sito ufficiale per le versioni più aggiornate.
- Manuale ZP Studio (inglese) (716 download)
- Sketches Arduino IDE Zeroplus Arduino Starter Kit (547 download)
Per divertimento, dato che sulle schede non è illustrato in chiaro il funzionamento della scheda led RGB (perchè dovete fare voi reverse engineering), ho realizzato un semplice sketch che accende i 4 led con colori diversi (ma questo è uno spoiler, quindi non scaricatelo!).