Sensore
corrente/tensione INA219

ultimo aggiornamento 26 febbraio 2018


 

Indice

Descrizione

Questa breakout board prodotta dalla Adafruit dal costo di circa 4€ risolverà tutti i vostri problemi di controllo dell'alimentazione. Invece di lottare con due multimetri , si può semplicemente utilizzare il comodo circuito integrato INA219B prodotto dalla Texas Instruments montato su questo modulo sia per misurare sia la tensione DC sia l'assorbimento di corrente con 1 % di precisione trasmettendo i dati tramite protocollo I2C.  Sul modulo sono già presenti tutti i componenti necessari per il funzionamento dell’integrato INA219B.
E' disponibile un'apposita libreria per l'utilizzo tramite Arduino.

homotix

Il sensore può essere acquistato sul sito codice HMT219B

PCBA

OurPCB

Downloads:

Software:
Libreria Arduino completo di esempio di codice

Hardware:
File Eagle completi per la breakout board INA219
Data Sheet del  chipI NA219

Caratteristiche

Filmato illustrativo

Come funziona

L’integrato si presenta in package SOT23-8 e può essere alimentato con una tensione VS compresa tra 3 e 5V permettendo di misurare la tensione DC, con un valore massimo di +26V con 1 % di precisione trasmettendo i dati al processore tramite il protocollo I2C; è un’interfaccia digitale molto diffusa, utilizzata per la comunicazione a corto raggio tra differenti tipi di circuiti integrati, basata su un bus composto di due soli fili.

INA219 - Zerø-Drift, Bi-Directional CURRENT/POWER MONITOR with I2C™ Interface

Piedinatura Datasheet Foto dell'integrato

Nello schema a blocchi è possibile vedere un amplificatore di precisione che misura la tensione ai capi della resistenza shunt di rilevamento, che nella nostra scheda ha un valore di 0,1 ohm, 1 %.  Poiché la differenza massima d’ingresso dell'amplificatore è ± 320mV significa che può misurare fino a ± 3.2 Ampere.

Con un convertitore interno ADC a 12 bit, la risoluzione è di ± 0.8mA, nella gamma ±3.2°, mentre con il guadagno interno impostato al minimo, la corrente massima misurabile sarà di ±400mA con la risoluzione di 0,1 mA.
Il modulo ha un pin head di sei pin (in modo da poter collegare facilmente questo sensore a una basetta), così come una morsettiera a vite con un passo di 3,5 mm in modo da poter collegare il carico.
Con riferimento allo schema elettrico, la parte principale del circuito è quella che ruota intorno al sensore INA219, al pin 1 e 2, VIN+ e VIN- ed è collegata la resistenza di misura dal valore di 0,1Ω 1%.
L'alimentazione che può variare da un minimo di 3 a un massimo di 5V, è fornita al pin 4 (terminale positivo) e al pin 3 (terminale negativo), dove è presente il condensatore di disaccoppiamento da 100nF.
Tramite il livello logico fornito ai pin 7 e 8 (A0 e A1), viene scelto l'indirizzo della scheda che può essere: 0x40, 0x41, 0x44 , 0x45.
Per modificarlo, occorre eventualmente, depositare una goccia di stagno sui ponticelli SJ1 o SJ2, nel caso non sia selezionato, il valore di default sarà 0x40.

I pin dell'interfaccia I2C sono rappresentati dal pin 5 (SCL - Serial Clock Line) per il clock e 6 (SDA - Serial DAta) per i dati.

Sul connettore d'uscita JP1sono riportati:

Libreria per gestione modulo

Per utilizzare il sensore, occorre installare l’apposita libreria che è disponibile a questo link, oppure utilizzando l'apposita funzione presente nell'IDE che permette la gestione delle Librerie

Funzioni di assegnazione e inizializzazione

 Adafruit_INA219 (uint8_t addr = INA219_ADDRESS);

Questa funzione crea l’oggetto Adafruit_INA219 con relativo indirizzo, se questo non è specificato, è utilizzato quello di default (0x40). Se invece si utilizza più di un modulo INA219, occorrerà definire per ognuno, un proprio indirizzo tra quelli disponibili.

 void begin (void);

 Questa istruzione inizializza la comunicazione I2C con il dispositivo Adafruit_INA219 utilizzando i valori di configurazione predefiniti.

Funzioni di lettura del sensore:

float getBusVoltage_V (void);

Legge la tensione tra GND e V. Questa è la tensione totale vista dal circuito in esame. (Tensione di alimentazione - tensione shunt). Il valore di ritorno è in Volt.

float getShuntVoltage_mV (void);

Legge la tensione tra V e V +. Questa è la caduta di tensione misurata ai capi del resistore shunt. Il valore di ritorno è in millivolt.

float getCurrent_mA (void);

Legge l'attuale corrente ricavata tramite la legge Ohm dalla tensione shunt misurata. Il valore di ritorno è in milliampere.

Utilizzo del modulo

Per ricavare la tensione della batteria e la corrente assorbita dal carico, occorre far riferimento alla legge di Ohm(dal nome del fisico tedesco George Simon Alfred Ohm): è una legge fisica che mette in relazione la corrente con la tensione in un resistore. Si avrà quindi una relazione di semplice proporzionalità che può essere scritta nel seguente modo:

V = R • I

dove V è la tensione ai capi del resistore (misurata tramite un multimetro impostato come Voltmetro), I è la corrente che lo attraversa (misurata tramite un multimetro impostato come Amperometro), mentre R è il valore ohmico di resistenza.

Conoscendo la corrente I che scorre in un resistore di valore R, mediante la legge di Ohm, possiamo quindi calcolare il valore della tensione V ai capi del resistore. In modo analogo, potremmo ricavare altre incognite, per esempio conoscendo la corrente e la tensione, possiamo calcolare R:

R = V/I

Oppure conoscendo la tensione e la resistenza possiamo calcolare la corrente.

I = V/R

La potenza P si misura in watt (W) ed è il prodotto della tensione V espressa in volt (V) per la corrente I espressa in ampere (A):

P = V • I

Il collegamento

Per testare il dispositivo, si è realizzato un semplice circuito, in cui il sensore è utilizzato per la lettura della tensione di alimentazione, la corrente e la potenza assorbita da un piccolo motore elettrico.

Nell’esempio riportato nella foto, si è utilizzato un Micro Pro prodotto dalla SparkFun, (codice DEV-12640) che è una piccola scheda che monta un processore ATmega32U4, questo fornisce la connettività on-board, per cui non è necessario utilizzare un'interfaccia esterna USB.
Per mostrare i dati letti dal sensore, si è utilizzato un piccolo display monocromo 128x32 I2C OLED (20 x 35mm ) prodotto anch’esso dalla Adafruit (codice prodotto 931) che presenta una diagonale di 1" , ma è molto leggibile dato l'alto contrasto di un display OLED.

Il sensore e il display sono dotati di interfaccia I2C e potranno essere collegati sulla stessa rete. I due moduli hanno un diverso indirizzo che vale 0x40, per il sensore e 0x3C per il display.

Se si utilizza la scheda Arduino UNO, i pin dell’interfaccia I2C sono rappresentati dal pin A4 (SDA) e A5 (SCL) che permettono di realizzare una comunicazione nello standard I2C a due fili, in abbinamento alla libreria Wire.

Abbiamo ancora bisogno di connettere il pin RES del display ad un pin IN/OUT digitale, nel nostro caso al PIN 4, anche se potrà essere diverso, variando il valore indicato nel programma.
Le caratteristiche di alimentazione, sia del modulo sensore sia del display, sono simili e possono variare tra i 3 e 5 V, permettendo di utilizzarli in una varietà di schede di controllo molto vasta.
Per questo, oltre che a schede tipo Arduino UNO, Arduino MEGA2560 e Arduino Leonardo, potranno essere collegati alla scheda Arduino DUE che lavora con logica a 3,3 V.
Utilizzando entrambi i dispositivi, il bus I2C (che usa solo due pin), sono lasciate libere molte porte digitali utilizzabili per altri scopi.
Sarà altresì, possibile inserire altri dispositivi dotati di bus I2C, curando solo che abbiano tutti un indirizzo diverso.
Va verificato che i vari dispositivi lavorino tutti con la medesima tensione; in caso contrario, occorrerà inserire dei traslatori di livello.
Uno di questi potrebbe essere il convertitore di livello logico a 4 canali bidirezionale della Adafruit (codice 757)Sarà possibile avere moduli I2C con livelli logici (3,3-5V) diversi, presenti sulla stessa linea del bus.
 

Il programma di gestione

Il programma di gestione è molto semplice, il listato è sufficientemente commentato per comprenderne il funzionamento.

Programma 

Gestire il modulo sensore e il modulo display sarebbe piuttosto complesso, fortunatamente la stessa Adafruit ha messo a disposizione delle apposite librerie che semplificano la scrittura del programma, possono essere scaricate dal sito del produttore, in particolare sono necessarie:

Per il giusto funzionamento del display, occorrerà modificare all’interno del file Adafruit_SSD1306.h della libreria, la linea che definisce la dimensione del display per cui si dovranno cercare le linee:

 #define SSD1306_128_64
//#define SSD1306_128_32

 E si dovrà modificarle in:

 //#define SSD1306_128_64
#define SSD1306_128_32

Dopo il caricamento delle varie librerie, l’inizializzazione del sensore e del display, il programma legge ciclicamente i dati rilevati dal sensore, mostrandoli sul display oled.

 

/*####################################################################
 FILE: minitester.ino
 VERSION: 1.0
 Descrizione: Programma di minitester con utilizzo dei seguenti componenti
 Adafruit https://www.adafruit.com/
 
 Monochrome 128x32 I2C OLED graphic display[ID:931]
 Tutorials: http://www.adafruit.com/products/931#tutorials 
 INA219  High Side DC Current Sensor Breakout - 26V ±3.2A Max[ID:904]
 Tutorials: [[http://www.adafruit.com/products/904#tutorials]]
 
 Ultima modifica il 22/5/2014
 Applicazione realizzata da Adriano Gandolfo
 Sito https://www.adrirobot.it
 Blog http://it.emcelettronica.com/author/adrirobot/
 This example code is in the public domain.
 #################################################################### */


#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

#include <Adafruit_INA219.h>
Adafruit_INA219 ina219;

void setup()   {                
  //Impostazione modulo INA219
  uint32_t currentFrequency;
  ina219.begin();
  // Impostazione modulo display con indirizzo I2C addr 0x3C
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  // Cancellazione schermo e buffer
  display.clearDisplay();
  // Messaggio iniziale
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println("www.adrirobot.it");
  display.setTextColor(BLACK, WHITE); // Inverte il colore del testo
  display.println("Voltmetro digitale");
  display.display();
  delay(2000);
}

void loop()
{
  float shuntvoltage = 0;
  float busvoltage = 0;
  float current_mA = 0;
  float loadvoltage = 0;

  shuntvoltage = ina219.getShuntVoltage_mV();
  busvoltage = ina219.getBusVoltage_V();
  current_mA = ina219.getCurrent_mA();
  loadvoltage = busvoltage + (shuntvoltage / 1000);

  display.clearDisplay();   // clears the screen and buffer
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.print("V:"); display.print(loadvoltage, 2); display.println(" V");
  display.print("A:"); display.print(current_mA,1); display.println(" mA");
  display.display();
  delay(2000);
  display.clearDisplay();   // clears the screen and buffer
  display.setCursor(0,0);
  display.println("Potenza");
  display.print((current_mA*loadvoltage)/1000);  display.print(" W");
  display.display();
  delay(2000);
}

Articoli in cui si parla del sensore

Molti lettori sapranno che dal 16 gennaio 2014 è in vendita, presso le edicole, l'opera ROBI edita dalla DeAgostini, la cui vendita on-line, invece, era già iniziata l'11 novembre 2013. Venduta a fascicoli, permette la costruzione di un piccolo robot umanoide alto 34 cm, i movimenti del corpo sono dati da 20 servomotori digitali, mentre una scheda di riconoscimento vocale, gli permette di comprendere dei comandi e rispondere a tono in lingua italiana.
Il robot non dispone, però, di sensori quali: temperatura, luminosità, controllo del consumo della batteria, una possibilità era di realizzare un piccolo modulo da inserire all'interno del corpo del robot.
L’occasione è arrivata con il contest dal titolo “50 schede in regalo basate su ARM Cortex: Infineon premia le vostre idee che offre l’opportunità di ricevere scheda XMC 2GO un Evaluation Kit per microcontrollore basata su un XMC1100.
Vedremo in quest’articolo quali sono i componenti scelti per la sua realizzazione.

Il sensore e il display qui utilizzati erano già stati presentati nell’articolo “L'Evaluation Kit XMC 2GO di Infineon come scheda sensori per i robot ROBI".
Il sensore tipo INA219 prodotto dalla Texas Instruments, permette di misurare la tensione e la corrente fornite da una fonte di energia, nel nostro caso una batteria, comunicando i dati mediante un’interfaccia I2C.
L’integrato controlla sia la caduta shunt sia la tensione di alimentazione, con tempi di conversione e filtraggio programmabili. I dati vengono mostrati su un piccolo display di tipo OLED, anch'esso connesso tramite l’interfaccia I2C.
In quest’articolo, ne vedremo l’utilizzo per controllare il funzionamento di un piccolo motore elettrico. Per la sua gestione, si è utilizzato un modulo Arduino, rendendo il dispositivo facile da programmare usufruendo delle librerie già disponibili.

Elenco revisioni:
26/02/2018 Aggiornato pagina
17/10/2014 Inserito segnalazione nuovo articolo su Elettronica Open Source
30/05/2014 Emissione preliminare
Private Policy Cookie Policy Termini e Condizioni