Verificare la comunicazione I2C con l’analizzatore Digital Discovery e LabVIEW

 

 

Arduino, la piattaforma open source per eccellenza, è ampiamente utilizzata per la realizzazione di diversi sistemi e applicazioni. È possibile programmarla con un linguaggio tipo C++ e ricorrere a numerose librerie per eseguire una serie di operazioni semplici o più complicate senza doverne scrivere il relativo codice, perché ciascuna, opportunamente inclusa nello sketch, si occupa in toto di svolgere una certa funzione.
È anche possibile collegare alla piattaforma Arduino diversi sensori per acquisire, ad esempio, dati ambientali.
La semplicità di utilizzo si scontra -a volte- con la difficoltà di debug del codice: ciò è dovuto al fatto che Arduino non ha uno strumento di debug personalizzato. In situazioni del genere può essere utile ricorrere a un analizzatore logico per ricercare problemi di collegamento o di comunicazione in fase di debug di un progetto: ad esempio, se non è possibile comunicare con un sensore collegato tramite I²C, la soluzione è utilizzare un analizzatore logico per visualizzare il diagramma temporale e verificare ciò che transita lungo il bus allo scopo di individuare il problema.
In questo articolo vi spiegheremo come utilizzare lo strumento Digilent Digital Discovery (utilizzato come Logic Analyzer e Pattern Generator) e LabVIEW per effettuare il debug della comunicazione I²C tra una board Arduino Uno e un sensore di temperatura Digilent Pmod TMP3.

 

Hardware richiesti

  1. Arduino Uno

Arduino Uno è la scheda di prototipazione basata sul microcontrollore ATmega328P. E’ dotato di 14 pin digitali utilizzabili come input/output (di cui 6 utilizzabili come output PWM), 6 ingressi analogici, un quarzo a 16 MHz, una connessione di tipo USB, un connettore di alimentazione e un pulsante di reset. 

  1. Pmod TMP3

Il Pmod TMP3 è un sensore di temperatura ambientale basato sul componente Microchip TCN75A. E’ possibile impostare la risoluzione di lettura fino ad un massimo di 12 bit e impostare un trigger che indichi quando viene raggiunta una soglia di temperatura definita dall’utente.

  1. Digital Discovery

Digilent Digital Discovery™ è un analizzatore di stati logici e un generatore di pattern che può essere configurato e utilizzato come uno tra i seguenti strumenti:

  1. Analizzatore logico digitale a 32 canali (1.2…3.3V CMOS, 8 canali a 800MS/s*, 16 canali a 400MS/s*, e 32 canali a 200MS/s)
  2. Analizzatore digitale di bus (SPI, I²C, UART, CAN, Parallel)
  3. Generatore di pattern a 16 canali (1.2…3.3V CMOS, 100MS/s)
  4. I/O a 16 canali virtuali digitali con pulsanti, switch, e LED – perfetto per applicazioni di logic training
  5. Un alimentatore programmabile a 1.2…3.3V/100mA.
    La stessa tensione alimenta i buffer di ingresso del Logic Analyzer e quelli di ingresso/uscita del Pattern Generator, per mantenere la compatibilità a livello logico con il circuito in prova.

 

Software richiesti

  1. Arduino IDE

Arduino IDE è il software per programmare le schede Arduino e funziona su Linux, Windows, e Mac OS. Sarà necessario per caricare il codice usato per leggere il sensore Pmod TMP3 

  1. NI LabVIEW

NI LabVIEW offre un approccio di programmazione grafica per aiutarti a visualizzare ogni aspetto della tua applicazione, inclusa la configurazione hardware, i dati di misurazione e il debug. Vantaggi dell’utilizzo di LabVIEW:

  • Programmazione grafica intuitiva
  • Connessione semplificata a moltissimi hardware
  • Gestione e visualizzazione dei dati acquisiti
  • Interoperabilità con altri strumenti software 

Per questo esempio utilizzeremo la versione gratuita NI LabVIEW Community Edition

 

Configurazione hardware

Innanzitutto, è necessario collegare il Pmod TMP3 ad Arduino Uno seguendo gli schemi e le istruzioni di cablaggio seguenti.
Successivamente bisognerà caricare lo
sketch Pmod TMP3 su Arduino Uno tramite l’IDE di Arduino.

Pmod TMP3 Pin Arduino Uno Pin
VCC 3V3
GND GND
SCL A5 (SCL)
SDA A4 (SDA)
 

 

 

 
   
   
   
   

Dopo aver caricato correttamente lo sketch, sarete in grado di visualizzare i dati letti dal sensore.

La temperatura viene visualizzata nel monitor seriale.

 

 


Il Pmod TMP3 comunica con Arduino Uno tramite il protocollo di comunicazione I2C. Per capire come funziona il protocollo, puoi analizzare i segnali digitali con il  Digital Discovery. Per il test segui i seguenti collegamenti.

 

  1. Collegare SCL di Pmod TMP3 al Digital Discovery DIO 24
  2. Collegare SDA di Pmod TMP3 al Digital Discovery DIO 25
  3. Collegare GND di Pmod TMP 3 al Digital Discovery Ground

 

 

Configurazione Software

È necessario creare un VI per poter utilizzare le librerie e le funzioni in WaveForms Software Development Kit (SDK).
WaveForms SDK fornisce l’accesso a un’API (application programming interface) pubblica che offre agli utenti la possibilità di creare applicazioni personalizzate per PC.

 

Creare librerie condivise in VI

Aprire NI LabVIEW e creare un nuovo Blank VI. Dalla barra del menu, aprire Tools → Import → Shared Library (.dll)…. Cliccare su Create VIs for a shared library, e quindi su Next.

Selezionare C:WindowsSystem32dwf.dll come libreria condivisa e C:Program Files (x86)DigilentWaveFormsSDKincdwf.h come header file, poi cliccare su Next.

 

 

Lasciare la finestra successiva così com’è, e e quindi cliccare sul pulsante Next .
Dopo che l’header file è stato analizzato, verrà visualizzato un elenco delle funzioni disponibili.
La procedura guidata creerà un VI per le funzioni selezionate. Premi su
Next per continuare.

 

 

Nella finestra seguente, è possibile impostare il nome e la posizione della libreria VI.
Per impostazione predefinita, il Wizard crea la libreria nella cartella delle librerie utente di LabVIEW, con lo stesso nome di quella condivisa (dwf in questo caso). Premere
Next per continuare.

 

 

Nella finestra Select Error Handling Mode, selezionare Simple Error Handling.

 

Alcune proprietà possono essere modificate di seguito, ma poiché la libreria dwf contiene diverse centinaia di funzioni, consigliamo di lasciare ogni funzione con le impostazioni predefinite e modificare quelle necessarie solo prima di utilizzarle.

Dopo aver visualizzato un riepilogo, la procedura guidata inizia a generare i VI dalle funzioni della libreria condivisa. Il processo richiede tempo.
Quando il processo di generazione è terminato, la libreria VI è pronta per l’uso.

 

 

Modificare I VI generati

Nel caso di alcune funzioni, potrebbe essere necessario apportare alcune modifiche al VI generato, prima di utilizzarlo. Per farlo, aprire LabVIEW, creare un nuovo Blank VI, poi aprire il diagramma a blocchi (con Ctrl+E, o dalla barra del menu sotto il menu di  Window ). Fare clic con il pulsante destro del mouse sul diagramma vuoto e selezionare User Libraries → dwf → VIs, quindi inserire nel diagramma a blocchi la funzione che si desidera utilizzare. In questo esempio modificheremo il VI F Dwf Digital I2c Read (è possibile utilizzare il pulsante di ricerca per trovare una funzione specifica).

Fare doppio clic su un VI per aprirne il contenuto, quindi aprire il diagramma a blocchi (con Ctrl + E, o dalla barra dei menu sotto il menu Window ). Vedrai la definizione della funzione, e sotto di essa, un unico blocco con controlli sul lato di ingresso (a sinistra) e indicatori sul lato di uscita (a destra).

Da qui, è possibile modificare la funzione come si desidera. In questo tutorial modificheremo il tipo di dati letti nel buffer.

 

 

Fare doppio clic sul blocco (il rettangolo arancione), poi selezionare Parameters nella finestra visualizzata.

 

 

Nel WaveForms SDK Reference Manual cercare le funzioni che si intende personalizzare. In questo caso modificheremo la funzione FDwfDigitalI2cRead.
La descrizione della funzione mostra che il buffer per i dati letti (rgbRx) è di tipo unsigned char.

 

 

In LabVIEW, dalla finestra Parameters, selezionare rgbRx per modificare il tipo di dato, infatti questa funzione può essere utilizzata più facilmente se i dati vengono memorizzati in un array di caratteri. Dal menu a tendina Type selezionare Array, mentre dal menu Data type selezionare Unsigned 8-bit Integer (ha le stesse dimensioni di un unsigned char). Confermare le modifiche.

 

 

Cancellare gli elementi di controllo e di segnalazione connessi al parametro selezionato dal diagramma a blocchi. Cancellare anche i relativi collegamenti.
Cliccare il tasto destro del mouse sul parametro rgbRx (lato di uscita a destra del blocco), quindi seleziona crea indicatore. Poiché il parametro selezionato è un buffer per i dati letti, non è necessario creare un elemento di controllo per esso. Premere Ctrl + U per riorganizzare il diagramma.

 

 

Fare doppio clic sull’indicatore creato per evidenziarlo sul pannello frontale. Nell’angolo in alto a destra del pannello frontale, fare clic su un terminale vuoto (quadrato bianco sul selettore del terminale – 1), quindi fare clic sul campo dell’indicatore rgbRx (2).

Salvare le modifiche e chiudere il pannello frontale. È possibile notare che un terminale di uscita è apparso sul blocco del VI modificato, con il nome rgbRx di tipo Unsigned 8-bit Integer Array.

 

 

Scaricare e decomprimere questo file di esempio spy_tmp3.zip , successivamente aprirlo con LabVIEW Community.
Tutte le funzioni utilizzate nell’esempio possono essere utilizzate nel proprio VI.

Dopo aver collegato i dispositivi e dopo aver specificato le linee DIO utilizzate e l’indirizzo slave, il programma può essere avviato con il pulsante Run sul pannello frontale. I termometri mostrano la stessa temperatura rilevata da Arduino, mentre nel rispettivo campo di testo i dati grezzi ricevuti possono essere visualizzati in formato esadecimale.

 

Progettazione di strumentazione virtuale

Uno strumento virtuale di LabVIEW è costituito da due parti: il pannello frontale e il diagramma a blocchi.

Il pannello frontale contiene tutti i controlli e gli indicatori per l’input e l’output dei dati e funge da interfaccia utente quando il programma è in esecuzione.

Il diagramma a blocchi contiene i blocchi che sono presenti sul pannello frontale, così come altri blocchi necessari per l’elaborazione delle informazioni e le connessioni tra questi blocchi.

È possibile aggiungere un nuovo blocco ad entrambe le finestre facendo clic con il pulsante destro del mouse su uno spazio vuoto nella finestra corrispondente e selezionando il blocco richiesto da una libreria. I blocchi già presenti nella finestra possono essere modificati facendo clic con il tasto destro sul rispettivo blocco. Di seguito verranno presentati il pannello frontale e il diagramma a blocchi di questo esempio.

Pannello frontale

Il pannello frontale contiene il pulsante Stop, che arresta il programma e chiude Digital Discovery per renderlo disponibile ad altri software, oltre a tre elementi di controllo: i campi di input per la definizione delle linee DIO di Digital Discovery collegate alle linee dati e clock I2C di Arduino e un campo di immissione per l’inserimento dell’indirizzo dello slave I2C in formato esadecimale.

Sotto gli elementi di controllo, sono posizionati due termometri per mostrare la temperatura misurata in gradi, in Celsius e Fahrenheit. In basso ci sono due campi di testo: uno per indicare gli errori e uno per visualizzare i dati ricevuti in formato esadecimale.

Diagramma a blocchi

In questo esempio, il diagramma a blocchi ha tre parti principali.

La prima parte è responsabile della configurazione della Digital Discovery .

La prima funzione (F Dwf Device Close All) chiude tutti gli strumenti di test e misurazione Digilent al fine di renderli disponibili per questo programma.

La funzione F Dwf Device Open con il parametro di input -1 apre il primo dispositivo disponibile e invia il gestore del dispositivo per tutte le altre funzioni di questo VI.

La frequenza di clock I2C è impostata su 100 KHz, quindi vengono definiti i pin SCL e SDA.
I pin DIO del Digital Discovery sono numerati da 24 (in modalità predefinita), quindi 24 deve essere sottratto dai numeri immessi: in questo modo, 24 diventa DIO 0 e 25 diventa DIO 1.
La funzione F Dwf Digital I2c Clear controlla i pull-up sulle linee dei dati seriali e del clock e restituisce 0 in caso di errore nella connessione.

 

 

La ricezione continua dei dati viene avviata solo se non si sono verificati errori durante il controllo pull-up.
Se il controllo fallisce, viene visualizzato un messaggio di errore e la ricezione dei dati non viene avviata.

Ad ogni iterazione di un ciclo while, vengono ricevuti 2 byte di dati dall’indirizzo definito sul pannello frontale.
La funzione F Dwf Digital I2c Read viene modificata, quindi il buffer dei dati di lettura viene emesso in un Unsigned Integer Array a 8 bit e non in una stringa
(vedi:
Modificare i VI generati).

I due byte ricevuti vengono concatenati e spostati a destra con quattro bit, quindi i dati grezzi vengono convertiti in gradi Celsius e Fahrenheit e visualizzati sul pannello frontale con l’aiuto dei termometri. I byte ricevuti vengono convertiti in stringhe esadecimali, quindi concatenati con “0x” e visualizzati nel rispettivo campo sul pannello frontale.

Il ciclo viene chiuso in caso di errore o quando viene premuto il pulsante Stop.

 

 

Quando si esce dal loop, i parametri dello strumento digitale in ingresso e in uscita vengono ripristinati, quindi il dispositivo viene chiuso per renderlo disponibile per altri software. Nel caso vengano riscontrati degli errori, questi vengono risolti.

 

Con questo tutorial abbiamo voluto mostrare come uno strumento come il Digital Discovery può essere fondamentale per verificare la connessione tra diversi dispositivi hardware.
Le potenzialità del Digital Discovery non si fermano qui. 

Scopri tutte le caratteristiche nella scheda tecnica del Digital Discovery

 

2 Commenti

  1. Buongiorno, mi piacerebbe tanto poter usare Arduino Uno e LabVIEW per relizzare il mio mini birrificio, io non ci capisco niente ne su Arduino e LabView. C'è qualcuno a cui posso rivolegrmi. Grazie
    • Ciao Maurizio, puoi utilizzare il nostro servizio di consulenza per realizzare il tuo progetto: https://design.futuragroupsrl.it/

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Menu