terça-feira, maio 31, 2022

Uma Briga Feia com o BMP280

No post anterior eu descrevi o sensor de pressão e temperatura BMP280. O passo seguinte era fazer um teste prático, o que parecia ser bastante simples (fiz até as gravações iniciais para o meu canal do YouTube). Uma semana (incluindo algumas sessões frenéticas de testes) e mais quatro placas depois acho que consegui algum resultado.

As cinco placas. A primeira é a do alto à esquerda.
As da direita tem uma borda de cobre nos furos de fixação
As duas de baixo são as últimas que eu comprei


A minha tentativa inicial foi usar o sensor com uma XIAO RP2040, operando em I2C. Para testes eu usei estas poucas linhas em MicroPython que listam os dispositivos I2C encontrados e tenta ler o registrador de identificação do BMP280.

from machine import Pin, I2C

i2c = I2C(1, scl=Pin(7), sda=Pin(6), freq=100000)
print(i2c.scan())
addr = 0x76
chip_id = i2c.readfrom_mem(addr, 0xD0, 1)
print (int(chip_id[0]))

Não funcionou, a placa não era encontrada. Fiz uma série de testes, sem sucesso. Experimentei trocar o BMP280 pelo BMP180 (acertando as conexões com o módulo) e funcionou de primeira. Concluí que a placa estava defeituosa e comprei mais duas em uma outra loja.

Menos de dois dias depois, chegaram as novas placas e fui testar. Não funcionou. Experimentei ligar simultaneamente no I2C a primeira BMP280 e a BMP180 e passou a funcionar... Concluí que era problema dos pull-ups do I2C e experimentei desconectar o BMP180 e colocar resistores externos. Funcionou... por algum tempo. Várias tentativas depois não tiveram sucesso. Detalhe: eu já tinha tentado antes, sem sucesso, resistores externos (eu cheguei a pensar que fosse o valor dos resistores). Mexe daqui, mexe dali, funcionou algumas vezes (sem o BMP180 e sem resistores) quando eu estava com a mão sobre a placa (não consegui determinar o local exato nem reproduzir facilmente).

Resolvi variar outras coisas. Além do XIAO RP2040 (com MicroPython) eu testei com uma Pi Pico (MicroPython e CircuitPython), uma XIAO original (MicroPython e Arduino) e um Arduino Uno (Arduino). No total foram 3 protoboards e um monte de jumpers diferentes. Testei também o modo SPI. O resultado foi que muito raramente funcionava quando aperto a mão sobre a primeira placa. As outras duas placas não deram sinal de funcionamento.

Eu já estava desistindo (o título original deste post era "Apanhando do BMP280"), quando, num último teste, a placa original passou a funcionar. Só que os resultados não estavam muito confiáveis, talvez porque num dos testes eu espetei no lugar errado da protoboard e a placa aqueceu um pouco...

Inconformado, resolvi comprar mais duas placas no Mercado Livre. Achei uma loja que oferecia um "BMP 280 azul". Hoje, dois dias depois, chegaram,. Soldei os conectores, testei e ... funcionam!

Um detalhe é que todas as placas tem o mesmo circuito e praticamente o mesmo layout, mas são claramente de três fabricantes diferentes. Acabei achando o circuito do módulo (abaixo). A placa possui pull-ups de 10k para os sinais SDI, SCK e CSB e um pull-down de 10k para o sinal SDO. Desta forma CSB e SDO podem ser deixados em aberto para operar em I2C com endereço 0x76. Inicialmente eu estava forçando externamente estes sinais, mas não é necessário.

O circuito do módulo.

As placas lilás vão para a caixa de "suspeitos" (eufemismo para não admitir que comprei peças defeituosas ou, mais comum, as queimei). Vou seguir em frente ignorando-as para manter alguma sanidade mental.

Um comentário:

Marcello Meira disse...

Oi Daniel, tudo bem?
Achei curiosa essa sua postagem por que eu também tive problemas com o BMP280 "roxinho" há alguns anos. Comprei ele e um BMP180 e tive exatamente os mesmos resultados que você: o primeiro nunca funcionou, enquanto o segundo pegou de primeira. Achei que tivesse queimado a placa ao soldar os conectores, já que minha técnica de solda não é muito apurada... hehehe.. Mas enfim, essa plaquinha vai ficar sem resposta e vida que segue.

Grande abraço e tudo de bom!