Il sensore MPL3115A2 illustrato in questo articolo è prodotto da Freescale (ora NXP)può essere utilizzato come barometro, altimetro e termometro.
Il dispositivo ha una risoluzione tipica di 1,5 Pascal, e può misurare un’altitudine con una risoluzione di 0,3 metri (rispetto al BMP180 che può fare 0,17 m).
In questo caso il sensore è montato su un modulo realizzato dalla Adafruit codice 1893
Il sensore MPL3115A2 ha alcuni vantaggi rispetto ai sensori BMP180/ BMP280 , come le uscite interupt per un consumo di energia ultra-basso, ed è anche molto più facile da leggere l’altitudine con un calcolo dell’altimetro incorporato, e non è richiesta nessuna lettura di calibrazione.
MPL3115A2 I2C Precision Altimeter
Come detto il chip MPL3115A2 oltre che come barometro e altimetro, può essere utilizzato come termometro con una precisione tipica di ± 1 ° C (± 3 ° C max).
Indice
Circuito elettrico del modulo
Il chip richiede una tensione di 2-3,6 V sia per l’alimentazione e tensioni logiche, per questo motivo sulla breakout è presente un regolatore a 3 V tipo MIC5225-3.3 e uno traslatore del livello logico realizzato tramite due MOSFET tipo BSS138.
Per qui risulta facile da interfacciare con qualsiasi Arduino o microcontrollore con funzionalità I2C.
Uso del sensore
L’ uso del sensore è semplice. Ad esempio, se si utilizza un Arduino, è sufficiente collegare il pin VDD al pin di tensione 5V, GND a terra, SCL a I2C Clock (pin A5 su un UNO) e SDA a I2C Data (A4 su un UNO).
Sarà poi necessario scarica la libreria Arduino MPL3115A2 e il codice di esempio per il calcolo della temperatura, della pressione e dell’altitudine di base.
Una volta installata la libreria e caricato lo sketch di esempi, sarà immediatamente possibile leggere i dati di temperatura, pressione e altitudine stampati nella console seriale.
Caratteristiche del modulo
Dimensioni: 18 x 19 x 2 mm
Peso: 1,2 g
Vin: da 3 a 5,5 V CC
Logica: da 3 a 5 V.
Range di rilevamento della pressione: 50-110 kPa (fino a 10Km di altitudine)
Risoluzione 1,5 Pa / 0,3 m di altitudine
Questa scheda / chip utilizza l’indirizzo I2C a 7 bit 0x60
Libreria di gestione
Per la gestione del modulo sono disponibili varie librerie, una è quella fornita da Adafruit, ma quella utilizzata è quella realizzata dalla SparkFun, che produce un modulo simile, ma che non dispone del regolatore di tensione e del traslatore di livelli.
La libreria fornisce le seguenti funzioni:
- begin() Gets sensor on the I2C bus.
- readAltitude() Returns float with meters above sealevel. Ex: 1638.94
- readAltitudeFt() Returns float with feet above sealevel. Ex: 5376.68
- readPressure() Returns float with barometric pressure in Pa. Ex: 83351.25
- readTemp() Returns float with current temperature in Celsius. Ex: 23.37
- readTempF() Returns float with current temperature in Fahrenheit. Ex: 73.96
- setModeBarometer() Puts the sensor into Pascal measurement mode.
- setModeAltimeter() Puts the sensor into altimetery mode.
- setModeStandy() Puts the sensor into Standby mode. Required when changing CTRL1 register.
- setModeActive() Start taking measurements!
- setOversampleRate(byte) Sets the # of samples from 1 to 128. See datasheet.
- enableEventFlags() Sets the fundamental event flags. Required during setup.
Per caricare la libreria si utilizzerà la specifica funzione dell’IDE di Arduino, Gestione libreria. Sarà sufficiente ricercare “sparkfun MPL3115A2” ,quella utilizzata è la versione 1.2.4 e poi cliccare sul tasto Installa.
Programma di test
Per il primo test sarà sufficiente collegare il modulo ad Arduino seguendo queste indicazioni:
- 5V di Arduino al pin Vin del modulo
- GND di Arduino con pin GND del modulo
- Pin A5 di Arduino con pin SDA del modulo
- A4 di Arduino con pin SCL del modulo
Si caricherà lo sketch sotto riportato e di attiverà il monito seriale dove sarà possibile leggere i valori letti dal sensore.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | #include <Wire.h> #include "SparkFunMPL3115A2.h" //Create an instance of the object MPL3115A2 myPressure; void setup() { Wire.begin(); // Join i2c bus Serial.begin(9600); // Start serial for output Serial.println("Test sensore MPL3115A2"); myPressure.begin(); // Get sensor online //Configure the sensor myPressure.setModeAltimeter(); // Measure altitude above sea level in meters //myPressure.setModeBarometer(); // Measure pressure in Pascals from 20 to 110 kPa myPressure.setOversampleRate(7); // Set Oversample to the recommended 128 myPressure.enableEventFlags(); // Enable all three pressure and temp event flags } void loop() { float altitude = myPressure.readAltitude(); Serial.print("Altitudine(m):"); Serial.print(altitude, 2); float pressure = myPressure.readPressure(); Serial.print(" Pressione(Pa):"); Serial.print(pressure, 2); float temperature = myPressure.readTemp(); Serial.print(" Temp(C):"); Serial.print(temperature, 2); Serial.println(); } |
Programma con utilizzo display OLE
Una versione più sofisticato del sensore è quello di mostrare i valori letti su un piccolo display OLED, per fare questo si è utilizzato il Multi test shield le cui caratteristiche sono riportate nell’articolo Multi test shield per moduli e sensori compatibile Arduino.
Il display OLED utilizzato ha una diagonale di 0.95″, una risoluzione di 96×64 pixel, 65536 Colori ed è basato sul driver SSD1331 è dotato di interfaccia di comando SPI e può essere alimentato con una tensione compresa tra i 3.3V – 5V. Vedere Display OLED 0,95″ 96×64 SSD1331 SPI
Sullo shield sono già presenti tutti i collegamenti per la connessione del display ed è presente il connettore JP15 su cui sono presenti i pin per il collegamento di un modulo con interfaccia I2C.
Lo schema da realizzarsi è quello riportato nell’immagine seguente
caricato il programma, i dati saranno visualizzati sul display e aggiornati ogni secondo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | // Impostazione display OLED #include <Adafruit_GFX.h> #include <Adafruit_SSD1331.h> #include <SPI.h> // Definizione dei pin di collegamento #define sclk 13 #define mosi 11 #define cs 10 #define rst 9 #define dc 8 Adafruit_SSD1331 display = Adafruit_SSD1331(cs, dc, rst); // Impostazione sensore MPL3115A2 #include <Wire.h> #include "SparkFunMPL3115A2.h" MPL3115A2 myPressure; //Create an instance of the object // Definizione dei colori #define BLACK 0x0000 #define BLUE 0x001F #define RED 0xF800 #define GREEN 0x07E0 #define CYAN 0x07FF #define MAGENTA 0xF81F #define YELLOW 0xFFE0 #define WHITE 0xFFFF void setup() { Serial.begin(9600); display.begin(); Serial.println("Test sensore MPL3115A2"); Wire.begin(); // Attiva i2c bus myPressure.begin(); // Attiva il sensore //Configurazione sensore myPressure.setModeAltimeter(); // Measure altitude above sea level in meters myPressure.setOversampleRate(7); // Set Oversample to the recommended 128 myPressure.enableEventFlags(); // Enable all three pressure and temp event flags // Messaggio iniziale display.fillScreen(BLACK); display.setTextSize(1); display.setTextColor(BLUE); display.setRotation(2); //Ruota display display.setCursor(0, 0); display.println("www.adrirobot.it"); display.println(""); display.setTextColor(GREEN); display.println("Multitest shield"); display.println(""); display.println(" TEST SENSORE"); display.println(""); display.println(" MPL3115A2"); delay(3000); } void loop() { // Uscita su monitor seriale float altitude = myPressure.readAltitude(); Serial.print("Altitudine(m):"); Serial.print(altitude, 2); float pressure = myPressure.readPressure(); Serial.print(" Pressione(Pa):"); Serial.print(pressure, 2); float temperature = myPressure.readTemp(); Serial.print(" Temp(C):"); Serial.print(temperature, 2); Serial.println(); // Uscita su display OLED display.fillScreen(BLACK); display.setCursor(0, 0); display.setTextSize(1); display.setTextColor(MAGENTA); display.println("VALORI MISURATI"); display.println(""); display.setTextColor(WHITE); display.print("Altit.(m):"); display.setTextColor(RED); display.println(altitude, 1); display.println(""); display.setTextColor(WHITE); display.print("Pres.(Pa):"); display.setTextColor(GREEN); display.println(pressure, 1); display.println(""); display.setTextColor(WHITE); display.print("Temp. (C):"); display.setTextColor(YELLOW); display.println(temperature, 1); delay (1000); // Pausa di 1 secondo } |