Índice:

Fita métrica atmosférica Arduino / MS5611 GY63 GY86 Demonstração: 4 etapas (com fotos)
Fita métrica atmosférica Arduino / MS5611 GY63 GY86 Demonstração: 4 etapas (com fotos)

Vídeo: Fita métrica atmosférica Arduino / MS5611 GY63 GY86 Demonstração: 4 etapas (com fotos)

Vídeo: Fita métrica atmosférica Arduino / MS5611 GY63 GY86 Demonstração: 4 etapas (com fotos)
Vídeo: [Vídeo 5] Serie ARDUINO - BMP085 (Temperatura e Pressão) 2024, Novembro
Anonim
Demonstração de fita métrica atmosférica Arduino / MS5611 GY63 GY86
Demonstração de fita métrica atmosférica Arduino / MS5611 GY63 GY86

Este é realmente um barômetro / altímetro, mas você verá o motivo do título olhando para o vídeo.

O sensor de pressão MS5611, encontrado nas placas breakout Arduino GY63 e GY86, oferece um desempenho incrível. Em um dia calmo, ele medirá sua altura dentro de 0,2 m. Isso é efetivamente medir a distância de sua cabeça ao espaço sideral e subtraí-la da distância de seus pés ao espaço sideral (medindo a pressão - ou seja, o peso do ar acima). Este dispositivo espetacular tem um alcance que mede confortavelmente a altura do Everest - e também pode medir até alguns centímetros.

Este projeto teve como objetivo: um projeto de escolas, um exemplo de modificação do código do Arduino e um bom ponto de partida para explorar usando o sensor MS5611. Há muitas perguntas no fórum de quem tem dificuldades com este sensor. A abordagem aqui torna seu uso muito simples. Depois de fazer este projeto, você estará bem equipado para desenvolver outras aplicações relacionadas à pressão.

Cada sensor tem suas próprias constantes de calibração que precisam ser lidas e usadas para corrigir os dados. Há uma biblioteca disponível para ajudar a conduzi-los. O código mostrado aqui usa a biblioteca para fazer leituras e depois as converte em altura e as exibe em um escudo LCD.

Primeiro, enviaremos os dados para o monitor serial no PC / laptop para os testes iniciais. Eles mostram algum ruído, então adicionamos um filtro para suavizá-los. Em seguida, adicionaremos um display LCD para que a unidade possa funcionar de forma independente e você possa tentar medir sua altura - ou qualquer outra coisa.

Observe que a placa GY63 tem apenas o sensor de pressão MS5611. O GY86 é chamado de placa de 10 graus de liberdade e também inclui um acelerômetro de 3 eixos, um giroscópio de 3 eixos e um magnetômetro de 3 eixos por apenas alguns $ a mais.

Você vai precisar de:

1. Arduino UNO (ou outro com pinagem padrão) e seu cabo USB

2. Placa de breakout GY63 ou GY86

3. 4 condutores Dupont macho-fêmea - ou fio de conexão

4. Blindagem do teclado LCD Arduino

5. bateria de 9v e chumbo

6. Tira de soquete de 2,54 mm (opcional, mas recomendado)

Preparação

Baixe o Arduino IDE (ambiente de desenvolvimento integrado) em:

Alguns detalhes técnicos de interesse

O MS5611 oferece excelente desempenho ao calcular a média de um grande número de medições. Ele pode fazer 4096 medições analógicas de 3 bytes (24 bits) em apenas 8 ms e fornecer o valor médio. Ele deve medir a pressão e a temperatura para que os dados de pressão possam ser corrigidos para a temperatura interna. Portanto, ele pode fornecer cerca de 60 pares de leituras de pressão e temperatura por segundo.

A folha de dados está disponível em:

As comunicações são via I2C. Portanto, outros sensores I2C podem compartilhar o barramento (como é o caso da placa GY86 10DOF onde todos os chips estão em I2C).

Etapa 1: Obtenha uma biblioteca MS5611

Muitos dos sensores do Arduino usam uma biblioteca padrão incluída com o IDE do Arduino ou são fornecidos com um arquivo zip com uma biblioteca que pode ser facilmente instalada. Isso tende a não ser o caso dos sensores MS5611. Porém uma pesquisa encontrada: https://github.com/gronat/MS5611 que possui uma biblioteca para o MS5611, incluindo a realização de correção de temperatura.

Opção 1

Vá para o site acima, clique em ‘Clonar ou baixar’ e selecione ‘Baixar ZIP’. Isso deve entregar o MS5611-master.zip ao seu diretório de downloads. Agora, se desejar, mova-o para uma pasta onde poderá encontrá-lo no futuro. Eu uso um diretório chamado ‘dados’ adicionado às minhas pastas do Arduino.

Infelizmente, o arquivo.zip baixado não inclui nenhum esboço de exemplo e seria bom adicionar a biblioteca e os exemplos ao IDE do Arduino. Há um exemplo mínimo no arquivo README.md que pode ser copiado e colado em um esboço e salvo. Esta é uma maneira de começar.

opção 2

Para facilitar a execução do código neste instrutível, adicionei o exemplo mínimo acima e os exemplos mostrados aqui à biblioteca e anexei um arquivo.zip abaixo que será instalado no IDE do Arduino.

Baixe o arquivo zip abaixo. Mova-o para uma pasta melhor, se desejar.

Inicie o IDE Arduino. Clique em Esboço> Incluir biblioteca> Adicionar arquivo zip e selecione o arquivo. Reinicie o IDE. O IDE agora terá a biblioteca instalada e todos os exemplos mostrados aqui. Verifique clicando em Arquivo> exemplos >> MS5611-mestre. Três esboços devem ser listados.

Etapa 2: conectar o sensor ao Arduino e testar

Conecte o sensor ao Arduino e teste
Conecte o sensor ao Arduino e teste
Conecte o sensor ao Arduino e teste
Conecte o sensor ao Arduino e teste

As placas GY63 / GY86 geralmente vêm com conectores, mas não soldadas. Portanto, é sua escolha soldar os conectores no lugar e usar cabos Dupont macho-fêmea ou (como eu decidi) soldar os cabos diretamente na placa e adicionar pinos ao cabo para conectar ao Arduino. A última opção é melhor se você acha que pode querer soldar a placa em um projeto mais tarde. O primeiro é melhor se você quiser usar a placa para experimentação. Desoldar cabos é muito mais fácil do que um cabeçalho de pino.

As conexões necessárias são:

GY63 / GY86 Arduino

VCC - energia 5v GND - terra GND SCL - relógio A5 I2C> SDA - dados A4 I2C

Anexe a placa do sensor ao Arduino como acima e conecte o Arduino ao PC / laptop por meio de seu cabo USB. Cubra também o sensor com algum material opaco / preto. O sensor é sensível à luz (como é o caso da maioria desse tipo de sensor).

Inicie o IDE Arduino. Clique:

Arquivo> exemplos >> MS5611-master> MS5611data2serial.

Uma nova instância do IDE aparecerá com o esboço. Clique no botão de upload (seta para a direita).

Em seguida, inicie a plotadora serial - clique em Ferramentas> Plotadora serial e, se necessário, defina a taxa de transmissão para 9600. Os dados enviados são a pressão em Pascals. Depois de um segundo ou mais, ele será redimensionado e elevar e abaixar o sensor em, digamos, 0,3 m deve mostrar como abaixar e elevar o traço (altura mais baixa é pressão mais alta).

Os dados têm algum ruído. Veja o primeiro gráfico acima. Isso pode ser suavizado usando um filtro digital (uma ferramenta muito útil).

A equação do filtro é:

valor = valor + K (novo valor)

onde ‘valor’ são os dados filtrados e ‘novo’ são os últimos medidos. Se K = 1 não há filtragem. Para valores mais baixos de K, os dados são suavizados com uma constante de tempo de T / K, onde T é o tempo entre as amostras. Aqui, T está em torno de 17ms, portanto, um valor de 0,1 dá uma constante de tempo de 170ms ou cerca de 1 / 6s.

O filtro pode ser adicionado por:

Adicione uma variável para os dados filtrados antes da configuração ():

flutuador filtrado = 0;

Em seguida, adicione a equação do filtro após a pressão =…. linha.

filtrado = filtrado + 0,1 * (filtrado por pressão);

É uma boa ideia inicializar o valor filtrado para a primeira leitura. Portanto, adicione uma instrução 'if' ao redor da linha acima para que tenha a seguinte aparência:

if (filtrado! = 0) {

filtrado = filtrado + 0,1 * (filtrado por pressão); } else {filtrado = pressão; // primeira leitura, portanto, defina filtrada para leitura}

O teste ‘! =’ É ‘diferente’. Portanto, se ‘filtrado’ não for igual a 0, a equação do filtro é executada, mas se for, é definida para a leitura de pressão.

Por último, precisamos alterar "pressão" para "filtrada" na instrução Serial.println para que possamos ver o valor filtrado.

O melhor aprendizado é obtido fazendo as alterações acima manualmente. No entanto, incluí-os no exemplo MS5611data2serialWfilter. Portanto, se houver problemas, o exemplo pode ser carregado.

Agora faça o upload do código para o Arduino e veja a melhoria. Veja o segundo gráfico acima e observe que a escala Y é expandida x2.

Tente um valor mais baixo para a constante do filtro, digamos 0,02 em vez de 0,1, e veja a diferença. Os dados são mais suaves, mas com uma resposta mais lenta. Este é um compromisso que deve ser buscado ao usar este filtro simples. A característica é a mesma de um filtro RC (resistência e capacitância) amplamente utilizado em circuitos eletrônicos.

Etapa 3: torná-lo autônomo

Agora vamos adicionar um escudo de teclado LCD, converter a pressão em altura em metros e mostrá-la no visor. Também adicionaremos a capacidade de zerar o valor pressionando o botão ‘Selecionar’ do teclado.

Com a blindagem do LCD no Arduino, o sensor deverá ser conectado à blindagem do LCD. Infelizmente, os protetores de LCD geralmente vêm sem os soquetes apropriados. Portanto, as opções são fazer conexões de solda ou obter algumas réguas de soquete. A tira de soquete está disponível no ebay por não muito mais do que o custo da postagem. Faça uma pesquisa por 'tira de soquete de 2,54 mm' e procure por aqueles que são semelhantes aos do Arduino. Eles geralmente vêm em comprimentos de 36 ou 40 pinos. Eu evitaria os pinos girados, pois eles não são profundos o suficiente para os cabos padrão da Dupont.

A tira de encaixe deve ser cortada no comprimento certo e o corte deve ser feito no mesmo lugar que um alfinete. Portanto, para uma tira de 6 pinos - remova o sétimo pino com um alicate fino e, em seguida, corte nesse local usando uma serra de metal júnior. Eu lixo as pontas para deixá-las bem organizadas.

Certifique-se de que não haja pontes de solda ao soldá-los na placa.

Com a decisão apropriada de conectar o sensor, conecte a blindagem do LCD no Arduino e conecte o sensor com os mesmos pinos - mas agora na blindagem do LCD.

Prepare também a bateria e o cabo. Eu criei meu chumbo com peças na minha lixeira, mas elas também estão disponíveis no ebay - incluindo uma boa opção que inclui uma caixa de bateria e um interruptor. Pesquise por ‘PP3 cabo de 2,1 mm’.

O consumo atual está em torno de 80ma. Portanto, se você quiser funcionar por mais do que alguns minutos, considere uma bateria de 9v maior do que a PP3.

Etapa 4: adicionar código para altitude e o LCD

Image
Image

Precisamos fazer um pouco mais de codificação para converter a pressão em altura e direcionar a tela.

No início do esboço, adicione a biblioteca de exibição e diga quais pinos são usados:

#incluir

// inicializa a biblioteca com os números dos pinos da interface LiquidCrystal lcd (8, 9, 4, 5, 6, 7);

Em seguida, precisamos de algumas variáveis e uma função para ler os botões do teclado. Todos estão conectados à entrada analógica A0. Cada botão fornece uma voltagem diferente para A0. Uma pesquisa em "código de botões de escudo lcd arduino" encontrou um bom código em:

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

Adicione este código antes de configurar ():

// define alguns valores usados pelo painel e botões

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 // leia os botões int read_LCD_buttons () {adc_key_in = analogRead (0); // ler o valor do sensor // meus botões quando lidos estão centralizados nestes valores: 0, 144, 329, 504, 741 // adicionamos aproximadamente 50 a esses valores e verificamos se estamos próximos se (adc_key_in> 1000) return btnNONE; // Tornamos esta a primeira opção por motivos de velocidade, pois será o resultado mais provável if (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 todos os outros falharem, retorne isso …}

A altitude geralmente é zerada no ponto inicial. Portanto, precisamos de variáveis para altura e referência. Adicione-os antes de setup () e a função acima:

float mtr;

float ref = 0;

A conversão de pressão em Pascals para metros é quase exatamente uma divisão por 12 no nível do mar. Esta fórmula é adequada para a maioria das medições baseadas no solo. Existem fórmulas mais precisas que são mais apropriadas para conversão em grandes altitudes. Use-os se for usar para registrar a altitude de um voo de balão.

A referência deve ser definida para a primeira leitura de pressão para que comecemos na altura zero e quando o botão SELECIONAR for pressionado. Adicione, após o código do filtro e antes da instrução Serial.println:

if (ref == 0) {

ref = filtrado / 12,0; } if (read_LCD_buttons () == btnSELECT) {ref = filtrado / 12,0; }

Depois disso, adicione o cálculo da altura:

mtr = ref - filtrado / 12,0;

Por último, altere a instrução Serial.println para enviar 'mtr' em vez de 'filtrado' e adicione o código para enviar 'mtr' ao LCD:

Serial.println (mtr); // Enviar pressão via serial (UART)

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

Todas as alterações aqui estão incluídas no exemplo MS5611data2lcd. Carregue como na etapa 2.

Existe um último mod que é útil. O display é difícil de ler quando está sendo atualizado 60 vezes por segundo. Nosso filtro está suavizando os dados com uma constante de tempo em torno de 0,8 s. Portanto, atualizar a tela a cada 0,3s parece suficiente.

Portanto, adicione um contador após todas as outras definições de variáveis no início do esboço (por exemplo, após float ref = 0;):

int i = 0;

Em seguida, adicione o código para incrementar 'i' e uma instrução 'if' para executar quando chegar a 20 e, em seguida, defina-o de volta para zero e mova os comandos Serial e LCD dentro da instrução 'if' para que sejam executados apenas a cada 20 leituras:

i + = 1;

if (i> = 20) {Serial.println (mtr); // Enviar pressão via serial (UART) lcd.setCursor (0, 1); // linha 2 lcd.print (mtr); i = 0; }

Não incluí um exemplo com esta última modificação para encorajar a digitação manual do código, o que ajuda no aprendizado.

Este projeto deve fornecer um bom ponto de partida, por exemplo, para um barômetro digital. Para aqueles que podem querer considerar o uso em modelos RC - procure OpenXvario para o código que habilita um altímetro e variômetro para sistemas de telemetria Frsky e Turnigy 9x.

Recomendado: