Sommario:

Arduino Atmospheric Tape Measure/ MS5611 GY63 GY86 Dimostrazione: 4 passaggi (con immagini)
Arduino Atmospheric Tape Measure/ MS5611 GY63 GY86 Dimostrazione: 4 passaggi (con immagini)

Video: Arduino Atmospheric Tape Measure/ MS5611 GY63 GY86 Dimostrazione: 4 passaggi (con immagini)

Video: Arduino Atmospheric Tape Measure/ MS5611 GY63 GY86 Dimostrazione: 4 passaggi (con immagini)
Video: Высотомер с использованием платы Arduino и GY63 с датчиком MS5611. 2024, Dicembre
Anonim
Arduino Atmospheric Tape Measure/ Dimostrazione MS5611 GY63 GY86
Arduino Atmospheric Tape Measure/ Dimostrazione MS5611 GY63 GY86

Questo è davvero un barometro/altimetro ma vedrai il motivo del titolo guardando il video.

Il sensore di pressione MS5611, presente sulle schede breakout Arduino GY63 e GY86, offre prestazioni straordinarie. In una giornata tranquilla misurerà la tua altezza entro 0,2 m. Questo è effettivamente misurare la distanza dalla tua testa allo spazio esterno e sottrarla dalla distanza dei tuoi piedi allo spazio esterno (misurando la pressione, che è il peso dell'aria sopra). Questo spettacolare dispositivo ha una portata che misurerà comodamente l'altezza dell'Everest e può anche misurare fino a pochi pollici.

Questo progetto aveva lo scopo di: un progetto per le scuole, un esempio di modifica del codice Arduino e un buon punto di partenza per esplorare utilizzando il sensore MS5611. Ci sono molte domande del forum da parte di coloro che hanno difficoltà con questo sensore. L'approccio qui rende l'utilizzo molto semplice. Dopo aver svolto questo progetto sarai ben attrezzato per sviluppare altre applicazioni relative alla pressione.

Ogni sensore ha le proprie costanti di calibrazione che devono essere lette e utilizzate per correggere i dati. C'è una libreria disponibile per aiutare a guidarli. Il codice mostrato qui utilizza la libreria per eseguire le letture, quindi le converte in altezza e le visualizza su uno schermo LCD.

Per prima cosa invieremo i dati al monitor seriale sul PC/laptop per i test iniziali. Questi mostrano un po' di rumore e quindi aggiungiamo un filtro per appianarli. Quindi aggiungeremo un display LCD in modo che l'unità possa funzionare in modo indipendente e tu possa provare a misurare la tua altezza o qualsiasi altra cosa.

Nota che la scheda GY63 ha solo il sensore di pressione MS5611. La GY86 è chiamata scheda a 10 gradi di libertà e include anche un accelerometro a 3 assi, un giroscopio a 3 assi e un magnetometro a 3 assi per pochi $ in più.

Avrai bisogno:

1. Arduino UNO (o altro con piedinatura standard) e il suo cavo USB

2. Scheda breakout GY63 o GY86

3. 4 cavi Dupont maschio-femmina - o cavo di collegamento

4. Scudo per tastiera LCD Arduino

5. Batteria da 9 V e piombo

6. Ciabatta da 2,54 mm (opzionale ma consigliata)

Preparazione

Scarica l'IDE Arduino (ambiente di sviluppo integrato) da:

Alcuni bit tecnici per interesse

L'MS5611 offre le sue grandi prestazioni calcolando la media di un gran numero di misurazioni. Può effettuare 4096 misurazioni analogiche a 3 byte (24 bit) in soli 8 ms e fornire il valore medio. Deve misurare sia la pressione che la temperatura in modo che i dati di pressione possano essere corretti per la temperatura interna. Quindi può fornire circa 60 coppie di letture di pressione e temperatura al secondo.

La scheda tecnica è disponibile su:

La comunicazione avviene tramite I2C. Quindi altri sensori I2C possono condividere il bus (come nel caso della scheda GY86 10DOF dove tutti i chip sono su I2C).

Passaggio 1: ottenere una libreria MS5611

Molti dei sensori Arduino utilizzano una libreria standard inclusa nell'IDE Arduino o sono forniti con un file zip con una libreria che può essere facilmente installata. Questo tende a non essere il caso dei sensori MS5611. Tuttavia, una ricerca ha trovato: https://github.com/gronat/MS5611 che ha una libreria per MS5611, inclusa l'esecuzione della correzione della temperatura.

opzione 1

Vai al sito Web sopra, fai clic su "Clona o scarica" e seleziona "Scarica ZIP". Questo dovrebbe fornire MS5611-master.zip alla directory dei download. Ora, se lo desideri, spostalo in una cartella dove potrai trovarlo in futuro. Uso una directory chiamata "dati" aggiunta alle mie cartelle Arduino.

Sfortunatamente il file.zip scaricato non include alcuno schizzo di esempio e sarebbe bello aggiungere la libreria e gli esempi all'IDE di Arduino. C'è un esempio minimo nel file README.md che può essere copiato e incollato in uno schizzo e salvato. Questo è un modo per andare avanti.

opzione 2

Per semplificare l'esecuzione del codice in questa istruzione ho aggiunto l'esempio minimo sopra e gli esempi mostrati qui alla libreria e ho allegato un file.zip di seguito che verrà installato nell'IDE di Arduino.

Scarica il file zip qui sotto. Spostalo in una cartella migliore se lo desideri.

Avvia l'IDE Arduino. Fare clic su Schizzo>Includi libreria>Aggiungi file zip e selezionare il file. Riavvia l'IDE. L'IDE ora avrà sia la libreria installata che tutti gli esempi mostrati qui. Verificare facendo clic su File> esempi >> MS5611-master. Dovrebbero essere elencati tre schizzi.

Passaggio 2: collega il sensore ad Arduino e prova

Collega il sensore ad Arduino e prova
Collega il sensore ad Arduino e prova
Collega il sensore ad Arduino e prova
Collega il sensore ad Arduino e prova

Le schede GY63/GY86 di solito vengono fornite con intestazioni ma non saldate. Quindi è una tua scelta saldare le intestazioni in posizione e utilizzare i cavi Dupont maschio-femmina o (come ho deciso) i cavi di saldatura direttamente sulla scheda e aggiungere pin al cavo da collegare all'Arduino. Quest'ultima opzione è migliore se pensi di voler saldare la scheda in un progetto in un secondo momento. Il primo è meglio se vuoi usare la tavola per la sperimentazione. Dissaldare i cavi è molto più semplice di un'intestazione pin.

I collegamenti necessari sono:

GY63/GY86 Arduino

VCC - Alimentazione 5v GND - GND Massa SCL - A5 I2C clock >SDA - A4 I2C dati

Collegare la scheda del sensore all'Arduino come sopra e collegare l'Arduino al PC/laptop tramite il suo cavo USB. Coprire anche il sensore con del materiale opaco/nero. Il sensore è sensibile alla luce (come avviene per la maggior parte di questo tipo di sensore).

Avvia l'IDE Arduino. Clic:

File>esempi>>MS5611-master>MS5611data2serial.

Una nuova istanza dell'IDE apparirà con lo schizzo. Fare clic sul pulsante di caricamento (freccia a destra).

Quindi avviare il plotter seriale – fare clic su Strumenti>Plotter seriale e, se necessario, impostare il baud su 9600. I dati inviati sono la pressione in Pascal. Dopo circa un secondo verrà ridimensionato e alzando e abbassando il sensore di, diciamo, 0,3 m dovrebbe mostrare un abbassamento e un aumento della traccia (un'altezza inferiore è una pressione maggiore).

I dati hanno un po' di rumore. Vedi la prima trama sopra. Questo può essere attenuato usando un filtro digitale (uno strumento davvero utile).

L'equazione del filtro è:

valore = valore + K(nuovo-valore)

dove "valore" sono i dati filtrati e "nuovo" è l'ultimo misurato. Se K=1 non c'è filtraggio. Per valori inferiori di K i dati vengono livellati con una costante di tempo di T/K dove T è il tempo tra i campioni. Qui T è di circa 17 ms, quindi un valore di 0,1 fornisce una costante di tempo di 170 ms o circa 1/6 di secondo.

Il filtro può essere aggiunto da:

Aggiungi una variabile per i dati filtrati prima di setup():

float filtrato = 0;

Quindi aggiungere l'equazione del filtro dopo la pressione = …. linea.

filtrato = filtrato + 0,1*(filtrato a pressione);

È una buona idea inizializzare il valore filtrato alla prima lettura. Quindi aggiungi un'istruzione "if" attorno alla riga sopra che fa questo in modo che assomigli a:

if(filtrato != 0){

filtrato = filtrato + 0,1*(filtrato a pressione); } else { filtrato = pressione; // prima lettura quindi imposta filtrato su lettura }

Il test '!=' è 'non uguale'. Quindi, se "filtrato" non è uguale a 0, viene eseguita l'equazione del filtro, ma se lo è, viene impostata la lettura della pressione.

Infine dobbiamo cambiare "pressione" in "filtrato" nell'istruzione Serial.println in modo da vedere il valore filtrato.

Il miglior apprendimento si ottiene apportando le modifiche sopra riportate manualmente. Tuttavia ho incluso questi nell'esempio MS5611data2serialWfilter. Quindi se ci sono problemi l'esempio può essere caricato.

Ora carica il codice su Arduino e osserva il miglioramento. Vedi il secondo grafico sopra e nota che la scala Y è espansa x2.

Prova un valore più basso per la costante del filtro, diciamo 0,02 invece di 0,1, e vedi la differenza. I dati sono più fluidi ma con una risposta più lenta. Questo è un compromesso che deve essere cercato quando si utilizza questo semplice filtro. La caratteristica è la stessa di un filtro RC (resistenza e capacità) ampiamente utilizzato nei circuiti elettronici.

Passaggio 3: rendilo autonomo

Ora aggiungeremo uno scudo per tastiera LCD, convertiremo la pressione in altezza in metri e la mostreremo sul display. Aggiungeremo anche la possibilità di azzerare il valore premendo il pulsante "Seleziona" del tastierino.

Con lo shield LCD su Arduino il sensore dovrà essere collegato allo shield LCD. Sfortunatamente gli schermi LCD di solito vengono forniti senza le prese appropriate. Quindi le opzioni sono fare connessioni a saldare o ottenere una presa multipla. La presa multipla è disponibile su ebay per non molto di più del costo delle spese di spedizione. Fai una ricerca su "presa multipla da 2,54 mm" e cerca quelli simili a quelli su Arduino. Questi di solito sono disponibili in lunghezze di 36 o 40 pin. Eviterei quelli a spillo tornito in quanto non sono abbastanza profondi per i cavi standard Dupont.

La presa multipla deve essere tagliata a misura e il taglio deve essere eseguito nello stesso punto di un perno. Quindi, per una striscia di 6 spilli, rimuovi il settimo perno con alcune pinze sottili, quindi taglia in quel punto usando un seghetto per metalli junior. Limo le estremità per renderle pulite.

Assicurati che non ci siano ponti di saldatura quando li saldi sulla scheda.

Con la decisione appropriata sul collegamento del sensore, collega lo schermo LCD all'Arduino e collega il sensore agli stessi pin, ma ora sullo schermo LCD.

Prepara anche la batteria e il cavo. Ho creato il mio vantaggio da parti nel mio cestino dei rifiuti, ma sono disponibili anche su ebay, inclusa una bella opzione che include una scatola della batteria e un interruttore. Cerca su "Minione PP3 da 2,1 mm".

Il consumo di corrente è di circa 80mA. Quindi, se vuoi funzionare per più di qualche minuto, considera una batteria da 9 V più grande rispetto al PP3.

Passaggio 4: aggiungere il codice per l'altitudine e il display LCD

Image
Image

Dobbiamo fare un po' più di codifica per convertire la pressione in altezza e guidare il display.

All'inizio dello schizzo aggiungi la libreria di visualizzazione e indica quali pin vengono utilizzati:

#includere

// inizializza la libreria con i numeri dei pin di interfaccia LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

Successivamente abbiamo bisogno di alcune variabili e una funzione per leggere i pulsanti della tastiera. Questi sono tutti collegati all'ingresso analogico A0. Ogni pulsante fornisce una tensione diversa ad A0. Una ricerca su "codice dei pulsanti di protezione lcd arduino" ha trovato un buon codice su:

www.dfrobot.com/wiki/index.php/Arduino_LCD_KeyPad_Shield_(SKU:_DFR0009)#Sample_Code

Aggiungi questo codice prima di setup():

// definisce alcuni valori usati dal pannello e dai pulsanti

int lcd_key = 0; int adc_key_in = 0; #define btnRIGHT 0 #define btnUP 1 #define btnDOWN 2 #define btnLEFT 3 #define btnSELECT 4 #define btnNONE 5 // legge i pulsanti int read_LCD_buttons() { adc_key_in = analogRead(0); // leggiamo il valore dal sensore // i miei pulsanti quando vengono letti sono centrati su questi valori: 0, 144, 329, 504, 741 // aggiungiamo circa 50 a quei valori e controlliamo se siamo vicini if (adc_key_in > 1000) restituisce btnNONE; // La rendiamo la prima opzione per motivi di velocità poiché sarà il risultato più probabile se (adc_key_in < 50) return btnRIGHT; if (adc_key_in < 250) return btnUP; if (adc_key_in < 450) return btnDOWN; if (adc_key_in < 650) return btnLEFT; if (adc_key_in < 850) return btnSELECT; return btnNONE; // quando tutti gli altri falliscono, restituisci questo… }

L'altitudine viene solitamente azzerata al punto di partenza. Quindi abbiamo bisogno di variabili sia per l'altezza che per il riferimento. Aggiungi questi prima di setup() e la funzione sopra:

galleggiante metro;

rif galleggiante = 0;

La conversione dalla pressione in Pascal a metri è quasi esattamente una divisione per 12 a livello del mare. Questa formula va bene per la maggior parte delle misurazioni a terra. Esistono formule più accurate che sono più appropriate per la conversione ad alta quota. Usali se hai intenzione di usarlo per registrare l'altitudine di un volo in mongolfiera.

Il riferimento deve essere impostato alla prima lettura di pressione in modo da iniziare a quota zero e quando viene premuto il pulsante SELECT. Aggiungere, dopo il codice del filtro e prima dell'istruzione Serial.println:

if(rif == 0){

ref = filtrato/12.0; } if(read_LCD_buttons() == btnSELECT) { ref = filtrato/12.0; }

Dopo questo aggiungi il calcolo dell'altezza:

mtr = ref - filtrato/12.0;

Infine, modifica l'istruzione Serial.println per inviare "mtr" anziché "filtrato" e aggiungi il codice per inviare "mtr" al display LCD:

Serial.println(mtr); // Invia pressione via seriale (UART)

lcd.setCursor(0, 1); // riga 2 lcd.print(mtr);

Tutte le modifiche qui sono incluse nell'esempio MS5611data2lcd. Caricalo come nel passaggio 2.

C'è un'ultima mod che è utile. Il display è difficile da leggere quando viene aggiornato 60 volte al secondo. Il nostro filtro sta livellando i dati con una costante di tempo di circa 0,8 secondi. Quindi aggiornare il display ogni 0,3 secondi sembra abbastanza.

Quindi aggiungi un contatore dopo tutte le altre definizioni di variabile all'inizio dello schizzo (ad esempio dopo float ref=0;):

int i = 0;

Quindi aggiungi il codice per incrementare 'i' e un'istruzione 'if' da eseguire quando arriva a 20, quindi reimpostalo su zero e sposta i comandi Serial e lcd all'interno dell'istruzione 'if' in modo che vengano eseguiti solo ogni ventesima lettura:

io += 1;

if(i>=20) { Serial.println(mtr); // Invia pressione via seriale (UART) lcd.setCursor(0, 1); // riga 2 lcd.print(mtr); io = 0; }

Non ho incluso un esempio con quest'ultima modifica per incoraggiare l'inserimento manuale del codice che aiuta l'apprendimento.

Questo progetto dovrebbe fornire un buon punto di partenza, ad esempio per un barometro digitale. Per coloro che potrebbero voler considerare l'uso nei modelli RC, cercare OpenXvario per il codice che abilita un altimetro e un variometro per i sistemi di telemetria Frsky e Turnigy 9x.

Consigliato: