Als u werkt aan een luchtkwaliteitsmonitoring project en de beschikbare ruimte beperkt is, dan is SparkFun’s nieuwste Qwiic-breakoutboard met de BMV080-sensor van Bosch Sensortec mogelijk precies wat u nodig hebt. Dit is niet zomaar een verkleinde versie van bestaande fijnstofsensoren, maar een volwaardige sensor met uitstekende prestaties in een ongelooflijk compact formaat.

Ultracompact ontwerp

Met afmetingen van slechts 4,4 mm × 3,0 mm × 3,0 mm is de BMV080 momenteel de kleinste fijnstofsensor op de markt. Volgens Bosch Sensortec is hij meer dan 450 keer kleiner dan vergelijkbare apparaten. Dankzij dit extreem kleine formaat is montage op een breakoutboard bijzonder praktisch, en dat is precies wat SparkFun heeft gedaan. Ze zijn zelfs nog een stap verder gegaan door ook een praktische behuizing te ontwerpen, wat het gebruiksgemak verder vergroot.

 
Sparkfun-air-quality-pm1pm25pm10-sensor-bmv080
De BMV080 (binnen de groene cirkel) meet 4,4 mm × 3,0 mm × 3,0 mm.

Geen ventilator nodig

De BMV080 maakt gebruik van geïntegreerde lasers en fotodiodes om in real time fijnstofdeeltjes met een diameter van 2,5 µm of kleiner (PM2.5) te detecteren. Ook de concentraties van PM1.0 en PM10 worden berekend. De sensor meet vrij bewegende deeltjes in de omgevingslucht rond het apparaat. Daardoor is er geen ventilator, speciale luchtinlaat of kanaal nodig, wat de sensor stiller, energiezuiniger en eenvoudiger in te bouwen maakt in compacte behuizingen.

Bosch Sensortec levert de BMV080 op een klein module, die SparkFun op een breakoutboard heeft gemonteerd samen met een Qwiic I²C-connector volgens de SparkFun-standaard voor gemakkelijke toegang. Als I²C om welke reden dan ook niet gebruikt kan worden, kan een 0,1" pinheader worden gemonteerd voor een SPI-aansluiting. Dit vereist echter enige aanpassing op de printplaat.

Kwetsbaar maar goed beschermd

De BMV080 is een gevoelige component, en daarom heeft SparkFun een behuizing ontworpen met een geïntegreerd filter dat de sensor beschermt tegen verontreiniging zoals vingerafdrukken en stof. Dit is vooral nuttig voor afgedichte of weerbestendige ontwerpen. Het filter lijkt zwart, maar belemmert het laserlicht niet. De laser heeft een golflengte van 850 nm (nabij-infrarood) en valt onder Klasse 1. Dit betekent dat het apparaat onder alle normale gebruiksomstandigheden als veilig wordt beschouwd, ook bij direct kijken met het blote oog.

Voor het gebruik van de luchtkwaliteitssensor is een softwarebibliotheek vereist. Bosch Sensortec biedt een SDK voor de BMV080 waarop SparkFun een Arduino bibliotheek heeft gebaseerd. De SparkFun-bibliotheek wordt als een standaard Arduino-bibliotheek geïnstalleerd, maar om toegang te krijgen tot de SDK van Bosch Sensortec moet eerst een formulier worden ingevuld om het archief te kunnen downloaden. Vervolgens moeten er meerdere (16 voor een volledige installatie) vooraf gecompileerde bibliotheken uit het Bosch-archief handmatig worden gekopieerd naar de SparkFun-bibliotheek. Dit is enigszins omslachtig, maar maakt wel duidelijk welke processoren worden ondersteund.

Ondersteunde platforms

De ondersteunde MCU-platforms zijn ESP32 (inclusief S2 en S3) en Arm Cortex M0+, M33, M4(F) en M7(F). Ook Raspberry Pi- en x86-platforms worden ondersteund. Niet ondersteund zijn echter de Arduino UNO R3 (AVR) en R4 (Renesas). Dit is jammer, aangezien de UNO R4 een Qwiic-connector heeft en ik deze oorspronkelijk wilde gebruiken voor mijn testopstelling. In plaats daarvan moest ik draden solderen naar een Raspberry Pi Pico met een Arm Cortex M0+-kern (of een ESP32-module). Deze beperking is toe te schrijven aan Bosch Sensortec en niet aan SparkFun. Misschien wordt dit in de toekomst toegevoegd?
 
Bvm080 test system
De testopstelling met SDA op pin 2 en SCL op pin 3. De witte draad is de IRQ-lijn.

Eerste poging

Met een Qwiic-connector gesoldeerd op een Raspberry Pi Pico (SDA op pin 4, SCL op pin 5) heb ik het voorbeeldscript Example_01_BasicReadings geüpload. Dit leverde de volgende metingen op in de Seriële Monitor:
 
BMV080 Example 1 - Basic Readings
BMV080 found!
BMV080 set to continuous mode
PM10: ovf           PM2.5: ovf          PM1: ovf
PM10: ovf           PM2.5: ovf          PM1: ovf
PM10: ovf           PM2.5: ovf          PM1: ovf             Obstructed

Er is dus ofwel een probleem, of ik bevind mij in een sterk vervuilde omgeving. Beide veronderstellingen kunnen helaas waar zijn, aangezien ik geen referentie heb om mee te vergelijken. Het uitvoeren van het voorbeeldscript Example_02_DutyCycle leverde vergelijkbare resultaten op.

Beste SDK ooit?

Voordat ik het module zou terugsturen of weggooien, besloot ik de SDK van Bosch nader te onderzoeken. Tot mijn aangename verrassing bleek dit een zeer volledige en goed gedocumenteerde SDK te zijn, en niet slechts een verzameling vooraf gecompileerde bibliotheken. Daarin vond ik een voorbeeld voor de Arm Cortex-M0+, gericht op een Adafruit RP2040 Feather-board. Om dit voorbeeld te gebruiken met mijn Raspberry Pi Pico moest ik SDA verbinden met pin 2, SCL met pin 3, en een draad solderen van de IRQ-pin van het BMV080-module (naast de Qwiic-connector) naar pin 7 van de Pico. Daarnaast moest ik het bestand main.cpp aanpassen zodat de ingebouwde LED van de Pico op pin 25 wordt gebruikt in plaats van pin 13. Dit vereiste het wijzigen van de definitie van BSP_IO_PORT_PIN_13 en ook het corrigeren van regel 181 (of daaromtrent) waar de LED wordt geschakeld en pin 13 hard gecodeerd is. Hieronder volgen mijn wijzigingen:
 
#define BSP_IO_PORT_PIN_13 (25u)
digitalWrite(BSP_IO_PORT_PIN_13, !digitalRead(BSP_IO_PORT_PIN_13));

In het bestand combridge.cpp moet het I²C-adres van het module worden gewijzigd naar 0x57, het standaardadres van het SparkFun-module:
 
#define BMV080_I2C_ADDRESS    0x57

Eén opdracht om te compileren

Het compileren van het programma is nu eenvoudig: navigeer in een opdrachtregelterminal, bijvoorbeeld Windows PowerShell, naar de SDK-map api_examples\arm_cortex_m0plus en voer vervolgens het volgende commando uit:
 
./build_arm_cortex_m0plus.cmd i2c

Een internetverbinding is vereist, aangezien het script de benodigde toolchain downloadt en installeert voordat het voorbeeld wordt gecompileerd. Bij mij werkte dit probleemloos. Omdat ik niet gewend ben aan SDK’s die zo soepel functioneren, was ik oprecht onder de indruk. Complimenten aan Bosch Sensortec!

Voor het uploaden van het uitvoerbare bestand moet het UF2-bestand worden gelokaliseerd. Dit komt om onduidelijke redenen niet in de map Bin terecht zoals de andere binaries, maar blijft in de map Build. Zet de Pico in bootloadermodus en kopieer het UF2-bestand ernaartoe. Verrassing: het BMV080-module begon nu echte data uit te sturen!

 
Serial monitor working smoke2
Particulate matter values after striking a few matches.

RTOS vereist

Tijdens dit hele proces viel het mij op dat de Bosch Sensortec SDK verwees naar het Mbed RTOS. Dit bracht mij op het idee om het SparkFun-voorbeeld opnieuw te compileren met gebruik van de Arduino Mbed OS RP2040 Boards (voorheen gebruikte ik het RP2040 Arduino-pakket van Earle Philhower), en ditmaal werkte het! (Ter herinnering: de SparkFun-bibliotheek verwacht SDA op pin 4 en SCL op pin 5; de IRQ-pin wordt niet gebruikt in het voorbeeld dat ik probeerde.)

Conclusie

De Qwiic fijnstofsensor van SparkFun met Bosch’s BMV080 is een compacte maar capabele oplossing voor luchtkwaliteitsmetingen, gericht op toepassingen waar ruimte, energieverbruik en eenvoud cruciaal zijn. Dankzij real-time detectie van fijnstof, flexibele communicatieinterfaces en een doordacht behuizingsontwerp is dit een geschikte keuze voor milieusensorische toepassingen.

De softwareondersteuning van SparkFun mist wat documentatie, maar de SDK van Bosch Sensortec is uitstekend. Zodra duidelijk is dat de meeste voorbeelden ontworpen zijn voor gebruik met een RTOS zoals het (verouderde) Mbed OS, is het mogelijk om met de BMV080 nauwkeurig fijnstofconcentraties te meten.