Sensore ultimo aggiornamento 26 febbraio 2018 |
|
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.
Il sensore può essere acquistato sul sito codice HMT219B
Downloads:
Software:
Libreria Arduino completo di esempio di codice
Hardware:
File Eagle completi per la breakout board INA219
Data Sheet del chipI NA219
Utilizzo del chip INA219B;
Resistore di corrente 0,1 ohm 1 % 2W;
Tensione di alimentazione del carico sino a +26 V;
Misura di corrente sino a ± 3.2A , con una risoluzione di ± 0.8mA;
Misure del PCB 23x 20 mm
Questa scheda / chip utilizza indirizzi gli indirizzi I2C 7 bit 0x40 , 0x41 , 0x44 , 0x45 , selezionabile con ponticelli)
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:
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.
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
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 è molto semplice, il listato è sufficientemente commentato per comprenderne il funzionamento.
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 |